@beyondwork/docx-react-component 1.0.369 → 1.0.370

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -122282,7 +122282,97 @@ var DEFAULT_CHROME_STRINGS = {
122282
122282
  modeEditDisabledReason: "Editing is not available in this document.",
122283
122283
  typingOffNoticeTitle: "Typing is off in review",
122284
122284
  typingOffNoticeDetail: "Use Suggest change to propose an edit.",
122285
- typingOffNoticeSuggestingDetail: "Changes are made as suggestions."
122285
+ typingOffNoticeSuggestingDetail: "Changes are made as suggestions.",
122286
+ ribbonTabsLabel: "Ribbon tabs",
122287
+ expandRibbonLabel: "Expand ribbon",
122288
+ collapseRibbonLabel: "Collapse ribbon",
122289
+ analyticsTabBodyLabel: "Analytics tab body",
122290
+ analyticsUnavailable: "Analytics unavailable",
122291
+ reviewTabBodyLabel: "Review tab body",
122292
+ workflowTabBodyLabel: "Workflow tab body",
122293
+ notAvailableCommandHandler: "Not available: command handler not supplied by the toolbar host.",
122294
+ scopeBreakdownLabel: "Scope breakdown",
122295
+ commandPaletteLabel: "Open command palette",
122296
+ toggleAnalyticsLabel: "Toggle analytics",
122297
+ customScopeLabel: "Custom scope",
122298
+ customScopeNameLabel: "Custom scope name",
122299
+ closeCustomScopeDialogLabel: "Close custom scope dialog",
122300
+ addCommentLabel: "Add comment",
122301
+ trackedChangesLabel: "Track Changes",
122302
+ trackedChangesOnLabel: "Tracking on",
122303
+ trackedChangesOffLabel: "Tracking off",
122304
+ trackedChangesOnTitle: "Tracking on: new edits are recorded as redlines",
122305
+ trackedChangesOffTitle: "Tracking off: new edits are applied directly",
122306
+ showTrackedChangesSidebarLabel: "Show tracked changes in sidebar",
122307
+ showCommentsSidebarLabel: "Show comments in sidebar",
122308
+ trackedChangesPanelLabel: "Tracked changes panel",
122309
+ commentsPanelLabel: "Comments panel",
122310
+ compareLabel: "Compare",
122311
+ compareDocumentLabel: "Compare document",
122312
+ compareWithAnotherDocumentLabel: "Compare with another document",
122313
+ chooseDocumentToCompareLabel: "Choose document to compare",
122314
+ moreLabel: "More",
122315
+ pagesLabel: "Pages",
122316
+ charsLabel: "Chars",
122317
+ exportLabel: "Export",
122318
+ blockedLabel: "Blocked",
122319
+ readyLabel: "Ready",
122320
+ itemsLabel: "Items",
122321
+ changesLabel: "Changes",
122322
+ commentsLabel: "Comments",
122323
+ opaqueLabel: "Opaque",
122324
+ scopesLabel: "Scopes",
122325
+ tasksLabel: "Tasks",
122326
+ approvalsLabel: "Approvals",
122327
+ analyticsLabel: "Analytics",
122328
+ homeTabLabel: "Home",
122329
+ insertTabLabel: "Insert",
122330
+ layoutTabLabel: "Layout",
122331
+ reviewTabLabel: "Review",
122332
+ workflowTabLabel: "Workflow",
122333
+ defaultDocumentTitle: "Document",
122334
+ defaultWordmark: "COMPOSER",
122335
+ resolveBlockersAction: "Resolve blockers",
122336
+ reviewPendingChangesAction: "Review pending changes",
122337
+ openCommentThreadAction: "Open comment thread",
122338
+ documentReadyAction: "Document ready",
122339
+ documentGroupLabel: "Document",
122340
+ reviewGroupLabel: "Review",
122341
+ riskGroupLabel: "Risk",
122342
+ workflowGroupLabel: "Workflow",
122343
+ scopesGroupLabel: "Scopes",
122344
+ toolsGroupLabel: "Tools",
122345
+ nextGroupLabel: "Next",
122346
+ savedLabel: "Saved",
122347
+ unsavedLabel: "Unsaved",
122348
+ exportBlockedLabel: "Export blocked",
122349
+ pageAnchoredStoriesNotShownLabel: "Page-anchored stories not shown",
122350
+ trackChangesAuthoringLabel: "Track changes authoring",
122351
+ zoomControlsLabel: "Zoom controls",
122352
+ zoomOutLabel: "Zoom out",
122353
+ zoomLevelLabel: "Zoom level",
122354
+ zoomInLabel: "Zoom in",
122355
+ workspaceViewLabel: "Workspace view",
122356
+ canvasViewLabel: "Canvas view",
122357
+ pageViewLabel: "Page view",
122358
+ markupDisplayLabel: "Markup display",
122359
+ trackingOnDetail: "Tracking on: new typing, insertions, deletions, and formatting changes become redlines.",
122360
+ trackingOffDetail: "Tracking off: new edits are applied directly. Existing markup display is controlled separately.",
122361
+ workflowScopeControlsLabel: "Workflow scope controls",
122362
+ createCustomWorkflowScopeLabel: "Create custom workflow scope",
122363
+ customScopeModeInputLabel: "Custom scope mode",
122364
+ customScopeColorInputLabel: "Custom scope color",
122365
+ scopeColorPlaceholder: "#64748b",
122366
+ metadataKeyPlaceholderLabel: "Key",
122367
+ metadataValuePlaceholderLabel: "Value",
122368
+ customLabel: "Custom",
122369
+ nameLabel: "Name",
122370
+ modeLabel: "Mode",
122371
+ colorLabel: "Color",
122372
+ metadataLabelText: "Metadata",
122373
+ addLabel: "Add",
122374
+ cancelLabel: "Cancel",
122375
+ createLabel: "Create"
122286
122376
  };
122287
122377
  function resolveChromeStrings(overrides) {
122288
122378
  if (!overrides) return DEFAULT_CHROME_STRINGS;
@@ -184729,6 +184819,7 @@ var CUSTOM_SCOPE_COLOR_SWATCHES = [
184729
184819
  "#0891b2"
184730
184820
  ];
184731
184821
  function TwScopePostureMenu(props) {
184822
+ const strings = useChromeStrings();
184732
184823
  const [customOpen, setCustomOpen] = import_react11.default.useState(false);
184733
184824
  const iconOnly = props.responsiveTier === "mobile" || props.responsiveTier === "compact";
184734
184825
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
@@ -184736,8 +184827,9 @@ function TwScopePostureMenu(props) {
184736
184827
  {
184737
184828
  className: `relative flex min-w-0 items-center ${iconOnly ? "gap-px" : "gap-1"}`,
184738
184829
  "data-testid": props["data-testid"] ?? "workflow-scope-palette",
184830
+ "data-chrome-unit-id": "chrome.ribbon",
184739
184831
  "data-ribbon-control": "direct-scope-palette",
184740
- "aria-label": "Workflow scope controls",
184832
+ "aria-label": strings.workflowScopeControlsLabel,
184741
184833
  role: "group",
184742
184834
  children: [
184743
184835
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "flex shrink-0 items-center gap-px", children: SCOPE_POSTURE_MENU_ENTRIES.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
@@ -184764,9 +184856,9 @@ function TwScopePostureMenu(props) {
184764
184856
  "button",
184765
184857
  {
184766
184858
  type: "button",
184767
- "aria-label": "Create custom workflow scope",
184859
+ "aria-label": strings.createCustomWorkflowScopeLabel,
184768
184860
  "aria-expanded": customOpen,
184769
- title: "Custom scope",
184861
+ title: strings.customScopeLabel,
184770
184862
  disabled: !props.onCreateCustomScope,
184771
184863
  onMouseDown: preserveEditorSelectionMouseDown,
184772
184864
  onClick: () => setCustomOpen((value) => !value),
@@ -184778,7 +184870,7 @@ function TwScopePostureMenu(props) {
184778
184870
  "data-label-visibility": iconOnly ? "icon-only" : "text",
184779
184871
  children: [
184780
184872
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TwGlyphIcon, { name: "plus", className: "h-3.5 w-3.5 text-accent" }),
184781
- iconOnly ? null : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "Custom" })
184873
+ iconOnly ? null : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: strings.customLabel })
184782
184874
  ]
184783
184875
  }
184784
184876
  ),
@@ -184794,6 +184886,7 @@ function TwScopePostureMenu(props) {
184794
184886
  );
184795
184887
  }
184796
184888
  function CustomScopeDialog(props) {
184889
+ const strings = useChromeStrings();
184797
184890
  const [mode, setMode] = import_react11.default.useState("suggest");
184798
184891
  const [color, setColor] = import_react11.default.useState(CUSTOM_SCOPE_COLOR_SWATCHES[0]);
184799
184892
  const [metadataRows, setMetadataRows] = import_react11.default.useState([0]);
@@ -184839,12 +184932,12 @@ function CustomScopeDialog(props) {
184839
184932
  },
184840
184933
  children: [
184841
184934
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
184842
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-semibold text-[var(--ink-primary)]", children: "Custom scope" }),
184935
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-semibold text-[var(--ink-primary)]", children: strings.customScopeLabel }),
184843
184936
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
184844
184937
  "button",
184845
184938
  {
184846
184939
  type: "button",
184847
- "aria-label": "Close custom scope dialog",
184940
+ "aria-label": strings.closeCustomScopeDialogLabel,
184848
184941
  onMouseDown: preserveEditorSelectionMouseDown,
184849
184942
  onClick: props.onClose,
184850
184943
  className: ds38IconButtonClass,
@@ -184853,19 +184946,19 @@ function CustomScopeDialog(props) {
184853
184946
  )
184854
184947
  ] }),
184855
184948
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("label", { className: "grid gap-1 font-medium text-[var(--ink-secondary)]", children: [
184856
- "Name",
184949
+ strings.nameLabel,
184857
184950
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
184858
184951
  "input",
184859
184952
  {
184860
184953
  autoFocus: true,
184861
- "aria-label": "Custom scope name",
184954
+ "aria-label": strings.customScopeNameLabel,
184862
184955
  name: "scope-label",
184863
184956
  className: ds38SmallInputClass
184864
184957
  }
184865
184958
  )
184866
184959
  ] }),
184867
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", role: "group", "aria-label": "Custom scope mode", children: [
184868
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: "Mode" }),
184960
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", role: "group", "aria-label": strings.customScopeModeInputLabel, children: [
184961
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: strings.modeLabel }),
184869
184962
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "flex flex-wrap gap-1", children: ["edit", "suggest", "comment", "view"].map((entry) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
184870
184963
  "button",
184871
184964
  {
@@ -184886,8 +184979,8 @@ function CustomScopeDialog(props) {
184886
184979
  entry
184887
184980
  )) })
184888
184981
  ] }),
184889
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", role: "group", "aria-label": "Custom scope color", children: [
184890
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: "Color" }),
184982
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", role: "group", "aria-label": strings.customScopeColorInputLabel, children: [
184983
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: strings.colorLabel }),
184891
184984
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center gap-1", children: [
184892
184985
  CUSTOM_SCOPE_COLOR_SWATCHES.map((swatch) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
184893
184986
  "button",
@@ -184908,9 +185001,9 @@ function CustomScopeDialog(props) {
184908
185001
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
184909
185002
  "input",
184910
185003
  {
184911
- "aria-label": "Custom scope color",
185004
+ "aria-label": strings.customScopeColorInputLabel,
184912
185005
  name: "scope-color",
184913
- placeholder: "#64748b",
185006
+ placeholder: strings.scopeColorPlaceholder,
184914
185007
  className: `${ds38SmallInputClass} w-24`
184915
185008
  }
184916
185009
  )
@@ -184918,7 +185011,7 @@ function CustomScopeDialog(props) {
184918
185011
  ] }),
184919
185012
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", children: [
184920
185013
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center justify-between", children: [
184921
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: "Metadata" }),
185014
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: strings.metadataLabelText }),
184922
185015
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
184923
185016
  "button",
184924
185017
  {
@@ -184926,7 +185019,7 @@ function CustomScopeDialog(props) {
184926
185019
  onMouseDown: preserveEditorSelectionMouseDown,
184927
185020
  onClick: () => setMetadataRows((rows) => [...rows, Date.now()]),
184928
185021
  className: `${ds38TextButtonClass} h-6 px-1.5 text-[10px] text-[var(--accent-primary)]`,
184929
- children: "Add"
185022
+ children: strings.addLabel
184930
185023
  }
184931
185024
  )
184932
185025
  ] }),
@@ -184936,7 +185029,7 @@ function CustomScopeDialog(props) {
184936
185029
  {
184937
185030
  "aria-label": `Metadata key ${index + 1}`,
184938
185031
  name: "metadata-key",
184939
- placeholder: "Key",
185032
+ placeholder: strings.metadataKeyPlaceholderLabel,
184940
185033
  className: ds38SmallInputClass
184941
185034
  }
184942
185035
  ),
@@ -184945,7 +185038,7 @@ function CustomScopeDialog(props) {
184945
185038
  {
184946
185039
  "aria-label": `Metadata value ${index + 1}`,
184947
185040
  name: "metadata-value",
184948
- placeholder: "Value",
185041
+ placeholder: strings.metadataValuePlaceholderLabel,
184949
185042
  className: ds38SmallInputClass
184950
185043
  }
184951
185044
  ),
@@ -184978,7 +185071,7 @@ function CustomScopeDialog(props) {
184978
185071
  onMouseDown: preserveEditorSelectionMouseDown,
184979
185072
  onClick: props.onClose,
184980
185073
  className: ds38TextButtonClass,
184981
- children: "Cancel"
185074
+ children: strings.cancelLabel
184982
185075
  }
184983
185076
  ),
184984
185077
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
@@ -184987,7 +185080,7 @@ function CustomScopeDialog(props) {
184987
185080
  type: "submit",
184988
185081
  disabled: pending || !props.onCreate,
184989
185082
  className: `h-7 rounded-[var(--r-2)] bg-[var(--accent-primary)] px-2 text-[length:var(--tx-xs)] font-semibold text-white disabled:cursor-not-allowed disabled:opacity-40 ${ds38ControlFocusClass}`,
184990
- children: "Create"
185083
+ children: strings.createLabel
184991
185084
  }
184992
185085
  )
184993
185086
  ] })
@@ -185167,6 +185260,7 @@ function toneClass(tone) {
185167
185260
  // src/ui-tailwind/toolbar/tw-role-action-region.tsx
185168
185261
  var import_jsx_runtime10 = require("react/jsx-runtime");
185169
185262
  function TwRoleActionRegion(props) {
185263
+ const strings = useChromeStrings();
185170
185264
  const responsiveTier = props.responsiveTier ?? (props.compactMode ? "compact" : "standard");
185171
185265
  const order = resolveRoleActionOrder(props.role, props.chromeMode);
185172
185266
  const inlineIds = [];
@@ -185202,6 +185296,7 @@ function TwRoleActionRegion(props) {
185202
185296
  "div",
185203
185297
  {
185204
185298
  className: "flex min-w-0 shrink-0 items-stretch",
185299
+ "data-chrome-unit-id": "chrome.ribbon",
185205
185300
  "data-testid": props["data-testid"] ?? `role-action-region-${props.chromeMode ?? props.role}`,
185206
185301
  "data-role": props.role,
185207
185302
  "data-mode": props.chromeMode,
@@ -185218,7 +185313,7 @@ function TwRoleActionRegion(props) {
185218
185313
  },
185219
185314
  id
185220
185315
  )) }, group3.key)),
185221
- overflowIds.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwRibbonGroup, { label: "More", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RoleActionOverflow, { ids: overflowIds, props }) }) : null
185316
+ overflowIds.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwRibbonGroup, { label: strings.moreLabel, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RoleActionOverflow, { ids: overflowIds, props }) }) : null
185222
185317
  ]
185223
185318
  }
185224
185319
  );
@@ -185368,6 +185463,7 @@ function roleOverflowLabel(role) {
185368
185463
  }
185369
185464
  function RoleActionButton(arg) {
185370
185465
  const { id, props, responsiveTier } = arg;
185466
+ const strings = useChromeStrings();
185371
185467
  const hideText = shouldUseIconOnlyRoleAction(id, responsiveTier);
185372
185468
  const reviewQueueTotal = props.reviewQueue?.totalCount ?? 0;
185373
185469
  const adjudicationProtected = props.capabilities?.adjudicationBlockedByProtection ?? false;
@@ -185379,7 +185475,7 @@ function RoleActionButton(arg) {
185379
185475
  "button",
185380
185476
  {
185381
185477
  type: "button",
185382
- "aria-label": "Add comment",
185478
+ "aria-label": strings.addCommentLabel,
185383
185479
  disabled: !props.canAddComment || !props.onAddComment,
185384
185480
  onMouseDown: preserveEditorSelectionMouseDown,
185385
185481
  onClick: props.onAddComment,
@@ -185388,7 +185484,7 @@ function RoleActionButton(arg) {
185388
185484
  children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwGlyphIcon, { name: "comment", className: "h-3.5 w-3.5" })
185389
185485
  }
185390
185486
  ) }),
185391
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: "Add comment" }) })
185487
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: strings.addCommentLabel }) })
185392
185488
  ] });
185393
185489
  case "review-compare-document":
185394
185490
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
@@ -185399,7 +185495,7 @@ function RoleActionButton(arg) {
185399
185495
  }
185400
185496
  );
185401
185497
  case "review-track-changes-toggle": {
185402
- const trackChangesLabel = "Track Changes";
185498
+ const trackChangesLabel = strings.trackedChangesLabel;
185403
185499
  const trackedChangesAuthoringEnabled = props.trackedChangesAuthoringEnabled ?? false;
185404
185500
  const onTrackedChangesAuthoringChange = props.onTrackedChangesAuthoringChange ?? props.onShowTrackedChangesChange;
185405
185501
  const trackChangesTooltip = trackedChangesAuthoringEnabled ? "Tracking on: new typing, insertions, deletions, and formatting changes become redlines." : "Tracking off: new edits are applied directly. Existing markup display is controlled in the status bar.";
@@ -185412,7 +185508,7 @@ function RoleActionButton(arg) {
185412
185508
  "aria-label": trackChangesLabel,
185413
185509
  disabled: props.capabilities ? !sessionCanTrackChangesAuthoring(props.capabilities) : false,
185414
185510
  onMouseDown: preserveEditorSelectionMouseDown,
185415
- title: trackedChangesAuthoringEnabled ? "Tracking on: new edits are recorded as redlines" : "Tracking off: new edits are applied directly",
185511
+ title: trackedChangesAuthoringEnabled ? strings.trackedChangesOnTitle : strings.trackedChangesOffTitle,
185416
185512
  className: [
185417
185513
  "inline-flex h-6 items-center justify-center gap-1 rounded-[var(--radius-sm)] px-2",
185418
185514
  "text-[length:var(--text-xs)] font-medium text-[var(--ink-secondary)]",
@@ -185426,7 +185522,7 @@ function RoleActionButton(arg) {
185426
185522
  "data-testid": "role-review-track-changes-toggle",
185427
185523
  children: [
185428
185524
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwGlyphIcon, { name: "edit", className: "h-3.5 w-3.5" }),
185429
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: trackedChangesAuthoringEnabled ? "Tracking on" : "Tracking off" })
185525
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: trackedChangesAuthoringEnabled ? strings.trackedChangesOnLabel : strings.trackedChangesOffLabel })
185430
185526
  ]
185431
185527
  }
185432
185528
  ) }),
@@ -185439,7 +185535,7 @@ function RoleActionButton(arg) {
185439
185535
  "button",
185440
185536
  {
185441
185537
  type: "button",
185442
- "aria-label": "Show tracked changes in sidebar",
185538
+ "aria-label": strings.showTrackedChangesSidebarLabel,
185443
185539
  disabled: !props.onReviewSidebarTrackedChanges,
185444
185540
  onMouseDown: preserveEditorSelectionMouseDown,
185445
185541
  onClick: props.onReviewSidebarTrackedChanges,
@@ -185448,7 +185544,7 @@ function RoleActionButton(arg) {
185448
185544
  children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwGlyphIcon, { name: "diff", className: "h-3.5 w-3.5" })
185449
185545
  }
185450
185546
  ) }),
185451
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: "Tracked changes panel" }) })
185547
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: strings.trackedChangesPanelLabel }) })
185452
185548
  ] });
185453
185549
  case "comments-panel":
185454
185550
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Tooltip.Root, { children: [
@@ -185456,7 +185552,7 @@ function RoleActionButton(arg) {
185456
185552
  "button",
185457
185553
  {
185458
185554
  type: "button",
185459
- "aria-label": "Show comments in sidebar",
185555
+ "aria-label": strings.showCommentsSidebarLabel,
185460
185556
  disabled: !props.onReviewSidebarComments,
185461
185557
  onMouseDown: preserveEditorSelectionMouseDown,
185462
185558
  onClick: props.onReviewSidebarComments,
@@ -185465,7 +185561,7 @@ function RoleActionButton(arg) {
185465
185561
  children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwGlyphIcon, { name: "comment", badge: "alert", className: "h-3.5 w-3.5" })
185466
185562
  }
185467
185563
  ) }),
185468
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: "Comments panel" }) })
185564
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: strings.commentsPanelLabel }) })
185469
185565
  ] });
185470
185566
  case "editor-scope-posture-menu":
185471
185567
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
@@ -185825,14 +185921,15 @@ function IconTextButton(arg) {
185825
185921
  );
185826
185922
  }
185827
185923
  function ReviewCompareDocumentButton(props) {
185924
+ const strings = useChromeStrings();
185828
185925
  const inputRef = import_react12.default.useRef(null);
185829
185926
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
185830
185927
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
185831
185928
  IconTextButton,
185832
185929
  {
185833
185930
  icon: twGlyphIconComponent("diff"),
185834
- text: "Compare",
185835
- ariaLabel: "Compare with another document",
185931
+ text: strings.compareLabel,
185932
+ ariaLabel: strings.compareWithAnotherDocumentLabel,
185836
185933
  disabled: props.disabled,
185837
185934
  onClick: () => inputRef.current?.click(),
185838
185935
  "data-testid": props.testId ?? "role-review-compare-document"
@@ -185845,7 +185942,7 @@ function ReviewCompareDocumentButton(props) {
185845
185942
  type: "file",
185846
185943
  accept: ".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document",
185847
185944
  className: "sr-only",
185848
- "aria-label": "Choose document to compare",
185945
+ "aria-label": strings.chooseDocumentToCompareLabel,
185849
185946
  disabled: props.disabled,
185850
185947
  onChange: (event) => {
185851
185948
  const file = event.currentTarget.files?.[0];
@@ -185863,14 +185960,15 @@ function ReviewCompareDocumentButton(props) {
185863
185960
  ] });
185864
185961
  }
185865
185962
  function CompareMenuRow(arg) {
185963
+ const strings = useChromeStrings();
185866
185964
  const inputRef = import_react12.default.useRef(null);
185867
185965
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
185868
185966
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
185869
185967
  MenuRow,
185870
185968
  {
185871
185969
  icon: twGlyphIconComponent("diff"),
185872
- label: "Compare document",
185873
- ariaLabel: "Compare with another document",
185970
+ label: strings.compareDocumentLabel,
185971
+ ariaLabel: strings.compareWithAnotherDocumentLabel,
185874
185972
  disabled: arg.disabled,
185875
185973
  onClick: () => inputRef.current?.click()
185876
185974
  }
@@ -185882,7 +185980,7 @@ function CompareMenuRow(arg) {
185882
185980
  type: "file",
185883
185981
  accept: ".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document",
185884
185982
  className: "sr-only",
185885
- "aria-label": "Choose document to compare",
185983
+ "aria-label": strings.chooseDocumentToCompareLabel,
185886
185984
  disabled: arg.disabled,
185887
185985
  onChange: (event) => {
185888
185986
  const file = event.currentTarget.files?.[0];
@@ -185981,6 +186079,7 @@ function TwRibbonTab(props) {
185981
186079
  "button",
185982
186080
  {
185983
186081
  type: "button",
186082
+ "data-chrome-unit-id": "chrome.ribbon",
185984
186083
  role: "tab",
185985
186084
  "aria-selected": selected,
185986
186085
  "aria-label": label,
@@ -186018,15 +186117,24 @@ function TwRibbonTab(props) {
186018
186117
 
186019
186118
  // src/ui-tailwind/toolbar/tw-ribbon-tab-strip.tsx
186020
186119
  var import_jsx_runtime13 = require("react/jsx-runtime");
186021
- var TAB_DESCRIPTORS = [
186022
- { id: "home", label: "Home" },
186023
- { id: "insert", label: "Insert" },
186024
- { id: "layout", label: "Layout" },
186025
- { id: "review", label: "Review" },
186026
- { id: "workflow", label: "Workflow" },
186027
- { id: "analytics", label: "Analytics" }
186120
+ var TAB_IDS = [
186121
+ "home",
186122
+ "insert",
186123
+ "layout",
186124
+ "review",
186125
+ "workflow",
186126
+ "analytics"
186028
186127
  ];
186029
186128
  function TwRibbonTabStrip(props) {
186129
+ const strings = useChromeStrings();
186130
+ const tabLabels = {
186131
+ home: strings.homeTabLabel,
186132
+ insert: strings.insertTabLabel,
186133
+ layout: strings.layoutTabLabel,
186134
+ review: strings.reviewTabLabel,
186135
+ workflow: strings.workflowTabLabel,
186136
+ analytics: strings.analyticsLabel
186137
+ };
186030
186138
  const responsiveTier = props.responsiveTier ?? "standard";
186031
186139
  const isMobile = responsiveTier === "mobile";
186032
186140
  const disabledSet = import_react14.default.useMemo(
@@ -186037,6 +186145,7 @@ function TwRibbonTabStrip(props) {
186037
186145
  "div",
186038
186146
  {
186039
186147
  "data-testid": "ribbon-tab-strip",
186148
+ "data-chrome-unit-id": "chrome.ribbon",
186040
186149
  "data-ribbon-layer": "tabs",
186041
186150
  "data-responsive-tier": responsiveTier,
186042
186151
  className: [
@@ -186048,22 +186157,22 @@ function TwRibbonTabStrip(props) {
186048
186157
  "div",
186049
186158
  {
186050
186159
  role: "tablist",
186051
- "aria-label": "Ribbon tabs",
186160
+ "aria-label": strings.ribbonTabsLabel,
186052
186161
  className: [
186053
186162
  "flex min-w-0 shrink items-end gap-0",
186054
186163
  "overflow-x-auto overflow-y-hidden [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
186055
186164
  ].join(" "),
186056
- children: TAB_DESCRIPTORS.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
186165
+ children: TAB_IDS.map((id) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
186057
186166
  TwRibbonTab,
186058
186167
  {
186059
- id: tab.id,
186060
- label: tab.label,
186061
- selected: tab.id === props.activeTab,
186062
- disabled: disabledSet.has(tab.id),
186168
+ id,
186169
+ label: tabLabels[id],
186170
+ selected: id === props.activeTab,
186171
+ disabled: disabledSet.has(id),
186063
186172
  responsiveTier,
186064
186173
  onSelect: props.onTabChange
186065
186174
  },
186066
- tab.id
186175
+ id
186067
186176
  ))
186068
186177
  }
186069
186178
  ),
@@ -186075,10 +186184,10 @@ function TwRibbonTabStrip(props) {
186075
186184
  type: "button",
186076
186185
  "data-testid": "ribbon-collapse-toggle",
186077
186186
  "aria-pressed": props.collapsed,
186078
- "aria-label": props.collapsed ? "Expand ribbon" : "Collapse ribbon",
186187
+ "aria-label": props.collapsed ? strings.expandRibbonLabel : strings.collapseRibbonLabel,
186079
186188
  onClick: props.onCollapseToggle,
186080
186189
  "data-label-visibility": isMobile ? "icon-only" : "text",
186081
- title: isMobile ? props.collapsed ? "Expand ribbon" : "Collapse ribbon" : void 0,
186190
+ title: isMobile ? props.collapsed ? strings.expandRibbonLabel : strings.collapseRibbonLabel : void 0,
186082
186191
  className: [
186083
186192
  "inline-flex h-6 items-center rounded text-[length:var(--text-xs)] text-[var(--ink-secondary)]",
186084
186193
  "transition-colors duration-[var(--t-fast)] hover:bg-[var(--bg-hover)] hover:text-[var(--ink-primary)]",
@@ -186100,15 +186209,17 @@ function TwRibbonTabStrip(props) {
186100
186209
  // src/ui-tailwind/toolbar/tw-ribbon-tab-body-analytics.tsx
186101
186210
  var import_jsx_runtime14 = require("react/jsx-runtime");
186102
186211
  function TwRibbonTabBodyAnalytics(props) {
186212
+ const strings = useChromeStrings();
186103
186213
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
186104
186214
  "div",
186105
186215
  {
186106
186216
  "data-testid": "ribbon-tab-body-analytics",
186217
+ "data-chrome-unit-id": "chrome.ribbon",
186107
186218
  "data-ribbon-tab-body": "analytics",
186108
186219
  "data-ribbon-body-density": "standard",
186109
- "aria-label": "Analytics tab body",
186220
+ "aria-label": strings.analyticsTabBodyLabel,
186110
186221
  className: "flex h-full min-w-0 flex-nowrap items-center overflow-hidden px-0 py-0",
186111
- children: props.children ?? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "px-3 text-[length:var(--text-xs)] text-tertiary", children: "Analytics unavailable" })
186222
+ children: props.children ?? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "px-3 text-[length:var(--text-xs)] text-tertiary", children: strings.analyticsUnavailable })
186112
186223
  }
186113
186224
  );
186114
186225
  }
@@ -186126,12 +186237,14 @@ var GROUP_LABEL = {
186126
186237
  symbol: "Symbol"
186127
186238
  };
186128
186239
  function TwRibbonTabBodyInsert(props) {
186240
+ const strings = useChromeStrings();
186129
186241
  const entries = filterRegistryByTab("insert");
186130
186242
  const byGroup = groupEntriesByGroup(entries);
186131
186243
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
186132
186244
  "div",
186133
186245
  {
186134
186246
  "data-testid": "ribbon-tab-body-insert",
186247
+ "data-chrome-unit-id": "chrome.ribbon",
186135
186248
  "data-ribbon-tab-body": "insert",
186136
186249
  "data-ribbon-body-density": "compact",
186137
186250
  className: "flex h-full min-w-0 flex-nowrap items-center gap-1 overflow-hidden px-3 py-0",
@@ -186142,7 +186255,7 @@ function TwRibbonTabBodyInsert(props) {
186142
186255
  "data-testid": `ribbon-tab-body-insert-entry-${id}`,
186143
186256
  "data-ribbon-entry-id": id,
186144
186257
  disabled: true,
186145
- title: "Not available: command handler not supplied by the toolbar host.",
186258
+ title: strings.notAvailableCommandHandler,
186146
186259
  className: "inline-flex h-6 items-center rounded px-1.5 text-[length:var(--text-xs)] text-[var(--ink-secondary)] opacity-50",
186147
186260
  children: labelForEntry(id)
186148
186261
  },
@@ -186182,6 +186295,7 @@ var GROUP_LABEL2 = {
186182
186295
  ruler: "Ruler"
186183
186296
  };
186184
186297
  function TwRibbonTabBodyLayout(props) {
186298
+ const strings = useChromeStrings();
186185
186299
  const entries = filterRegistryByTab("layout");
186186
186300
  const byGroup = {};
186187
186301
  for (const entry of entries) {
@@ -186193,6 +186307,7 @@ function TwRibbonTabBodyLayout(props) {
186193
186307
  "div",
186194
186308
  {
186195
186309
  "data-testid": "ribbon-tab-body-layout",
186310
+ "data-chrome-unit-id": "chrome.ribbon",
186196
186311
  "data-ribbon-tab-body": "layout",
186197
186312
  "data-ribbon-body-density": "compact",
186198
186313
  className: "flex h-full min-w-0 flex-nowrap items-center gap-1 overflow-hidden px-3 py-0",
@@ -186203,7 +186318,7 @@ function TwRibbonTabBodyLayout(props) {
186203
186318
  "data-testid": `ribbon-tab-body-layout-entry-${id}`,
186204
186319
  "data-ribbon-entry-id": id,
186205
186320
  disabled: true,
186206
- title: "Not available: command handler not supplied by the toolbar host.",
186321
+ title: strings.notAvailableCommandHandler,
186207
186322
  className: "inline-flex h-6 items-center rounded px-1.5 text-[length:var(--text-xs)] text-[var(--ink-secondary)] opacity-50",
186208
186323
  children: labelForEntry2(id)
186209
186324
  },
@@ -186224,13 +186339,15 @@ function labelForEntry2(id) {
186224
186339
  // src/ui-tailwind/toolbar/tw-ribbon-tab-body-mode.tsx
186225
186340
  var import_jsx_runtime17 = require("react/jsx-runtime");
186226
186341
  function TwRibbonTabBodyMode(props) {
186342
+ const strings = useChromeStrings();
186227
186343
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
186228
186344
  "div",
186229
186345
  {
186230
186346
  "data-testid": `ribbon-tab-body-${props.tab}`,
186347
+ "data-chrome-unit-id": "chrome.ribbon",
186231
186348
  "data-ribbon-tab-body": props.tab,
186232
186349
  "data-ribbon-body-density": "compact",
186233
- "aria-label": "Workflow tab body",
186350
+ "aria-label": strings.workflowTabBodyLabel,
186234
186351
  className: "flex h-full min-w-0 flex-nowrap items-center gap-1 overflow-hidden px-3 py-0",
186235
186352
  children: props.children ?? null
186236
186353
  }
@@ -186240,13 +186357,15 @@ function TwRibbonTabBodyMode(props) {
186240
186357
  // src/ui-tailwind/toolbar/tw-ribbon-tab-body-review.tsx
186241
186358
  var import_jsx_runtime18 = require("react/jsx-runtime");
186242
186359
  function TwRibbonTabBodyReview(props) {
186360
+ const strings = useChromeStrings();
186243
186361
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
186244
186362
  "div",
186245
186363
  {
186246
186364
  "data-testid": "ribbon-tab-body-review",
186365
+ "data-chrome-unit-id": "chrome.ribbon",
186247
186366
  "data-ribbon-tab-body": "review",
186248
186367
  "data-ribbon-body-density": "compact",
186249
- "aria-label": "Review tab body",
186368
+ "aria-label": strings.reviewTabBodyLabel,
186250
186369
  className: "flex h-full min-w-0 flex-nowrap items-center gap-1 overflow-hidden px-3 py-0",
186251
186370
  children: props.children ?? null
186252
186371
  }
@@ -186289,6 +186408,7 @@ function TwDisplayModeSelector(props) {
186289
186408
  "button",
186290
186409
  {
186291
186410
  type: "button",
186411
+ "data-chrome-unit-id": "chrome.ribbon",
186292
186412
  disabled: props.disabled,
186293
186413
  "data-testid": props["data-testid"] ?? "display-mode-selector-trigger",
186294
186414
  "data-ribbon-control": "compact-selector",
@@ -193543,6 +193663,7 @@ function TwToolbarIconButton(props) {
193543
193663
  "button",
193544
193664
  {
193545
193665
  type: "button",
193666
+ "data-chrome-unit-id": "chrome.ribbon",
193546
193667
  "aria-label": props.label,
193547
193668
  "aria-pressed": props.active ?? void 0,
193548
193669
  "data-active": props.active ? "true" : void 0,
@@ -197343,6 +197464,11 @@ function TwModePill(props) {
197343
197464
 
197344
197465
  // src/ui-tailwind/toolbar/tw-shell-header.tsx
197345
197466
  var import_jsx_runtime32 = require("react/jsx-runtime");
197467
+ var DEFAULT_SHELL_HEADER_MODES = [
197468
+ { id: "edit", label: DEFAULT_CHROME_STRINGS.modeEditLabel },
197469
+ { id: "review", label: DEFAULT_CHROME_STRINGS.reviewTabLabel },
197470
+ { id: "workflow", label: DEFAULT_CHROME_STRINGS.workflowTabLabel }
197471
+ ];
197346
197472
  var POSTURE_HUES = {
197347
197473
  ready: "var(--sem-success)",
197348
197474
  unsaved: "var(--accent-primary)",
@@ -197350,8 +197476,9 @@ var POSTURE_HUES = {
197350
197476
  blocked: "var(--sem-error)"
197351
197477
  };
197352
197478
  function TwShellHeader(props) {
197353
- const title = props.documentTitle ?? props.brand ?? "Document";
197354
- const wordmark = props.wordmark ?? "COMPOSER";
197479
+ const strings = useChromeStrings();
197480
+ const title = props.documentTitle ?? props.brand ?? strings.defaultDocumentTitle;
197481
+ const wordmark = props.wordmark ?? strings.defaultWordmark;
197355
197482
  const posture = props.posture ?? (props.saveState === "dirty" || props.saveState === "saving" ? "unsaved" : "ready");
197356
197483
  const responsiveTier = props.responsiveTier ?? "wide";
197357
197484
  const atLeastCompact = responsiveTier !== "mobile";
@@ -197464,8 +197591,8 @@ function TwShellHeader(props) {
197464
197591
  type: "button",
197465
197592
  "data-testid": "tw-shell-header__command",
197466
197593
  "data-chrome-command-trigger": "true",
197467
- "aria-label": "Open command palette",
197468
- title: "Open command palette",
197594
+ "aria-label": strings.commandPaletteLabel,
197595
+ title: strings.commandPaletteLabel,
197469
197596
  disabled: props.commandPaletteDisabled,
197470
197597
  onClick: props.onOpenCommandPalette,
197471
197598
  className: "inline-flex h-7 w-7 items-center justify-center rounded text-[var(--ink-secondary)] transition-colors hover:bg-[var(--bg-hover)] hover:text-[var(--ink-primary)] disabled:cursor-not-allowed disabled:opacity-40 focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]",
@@ -197485,13 +197612,13 @@ function TwShellHeader(props) {
197485
197612
  {
197486
197613
  type: "button",
197487
197614
  "data-testid": "tw-shell-header__analytics",
197488
- "aria-label": "Toggle analytics",
197615
+ "aria-label": strings.toggleAnalyticsLabel,
197489
197616
  "aria-pressed": props.analyticsActive ?? false,
197490
197617
  onClick: props.onToggleAnalytics,
197491
197618
  className: "inline-flex h-7 items-center gap-1.5 rounded px-2 text-[length:var(--tx-sm)] font-medium text-[var(--ink-secondary)] transition-colors hover:bg-[var(--bg-hover)] hover:text-[var(--ink-primary)] aria-pressed:bg-[var(--accent-soft)] aria-pressed:text-[var(--accent-on-soft)] focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]",
197492
197619
  children: [
197493
197620
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(TwGlyphIcon, { name: "bar-blocks", className: "h-3.5 w-3.5", "aria-hidden": "true" }),
197494
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: atLeastStandard ? "inline" : "hidden", children: "Analytics" })
197621
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: atLeastStandard ? "inline" : "hidden", children: strings.analyticsLabel })
197495
197622
  ]
197496
197623
  }
197497
197624
  ) : null,
@@ -197559,6 +197686,7 @@ function isSafeShellHref(href) {
197559
197686
  // src/ui-tailwind/toolbar/tw-analytics-ribbon.tsx
197560
197687
  var import_jsx_runtime33 = require("react/jsx-runtime");
197561
197688
  function TwAnalyticsRibbon(props) {
197689
+ const strings = useChromeStrings();
197562
197690
  const commentThreads = props.comments?.threads ?? [];
197563
197691
  const resolvedCommentIds = props.comments?.resolvedCommentIds ?? [];
197564
197692
  const revisions = props.trackedChanges?.revisions ?? [];
@@ -197579,7 +197707,7 @@ function TwAnalyticsRibbon(props) {
197579
197707
  const scopeCount = scopeRailSegments.length;
197580
197708
  const toolCount = props.toolRegistry?.editorActions.length ?? props.toolRegistry?.commandPalette.length ?? 0;
197581
197709
  const state = blocked4 > 0 ? "blocked" : openComments + pendingChanges + tasks + approvals === 0 ? "empty" : "ready";
197582
- const recentAction = props.contextAnalytics?.nextActions[0]?.label ?? (blocked4 > 0 ? "Resolve blockers" : pendingChanges > 0 ? "Review pending changes" : openComments > 0 ? "Open comment thread" : "Document ready");
197710
+ const recentAction = props.contextAnalytics?.nextActions[0]?.label ?? (blocked4 > 0 ? strings.resolveBlockersAction : pendingChanges > 0 ? strings.reviewPendingChangesAction : openComments > 0 ? strings.openCommentThreadAction : strings.documentReadyAction);
197583
197711
  const nextActions = (props.contextAnalytics?.nextActions ?? []).slice(0, 2).map((action) => action.label);
197584
197712
  const visibleNextActions = nextActions.length > 0 ? nextActions : [recentAction];
197585
197713
  return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
@@ -197587,34 +197715,35 @@ function TwAnalyticsRibbon(props) {
197587
197715
  {
197588
197716
  className: "flex h-full min-w-0 flex-1 items-center overflow-hidden px-1",
197589
197717
  "data-testid": "tw-analytics-ribbon",
197718
+ "data-chrome-unit-id": "chrome.ribbon",
197590
197719
  "data-region": "rib-analytics",
197591
197720
  "data-analytics-state": state,
197592
197721
  "data-analytics-review-items": totalReviewItems,
197593
197722
  "data-analytics-tool-registry-count": toolCount,
197594
197723
  children: [
197595
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: "Document", children: [
197596
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Pages", value: props.pageCount == null ? "..." : String(props.pageCount) }),
197597
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Chars", value: formatCompactNumber(props.documentStats?.storyLength ?? 0) }),
197598
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Export", value: props.exportBlocked ? "Blocked" : "Ready", tone: props.exportBlocked ? "blocked" : "ready" })
197724
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: strings.documentGroupLabel, children: [
197725
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.pagesLabel, value: props.pageCount == null ? "..." : String(props.pageCount) }),
197726
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.charsLabel, value: formatCompactNumber(props.documentStats?.storyLength ?? 0) }),
197727
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.exportLabel, value: props.exportBlocked ? strings.blockedLabel : strings.readyLabel, tone: props.exportBlocked ? "blocked" : "ready" })
197599
197728
  ] }),
197600
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: "Review", children: [
197601
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Items", value: String(totalReviewItems), tone: totalReviewItems > 0 ? "attention" : "neutral" }),
197602
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Changes", value: pendingChanges, color: "var(--sem-warning)" }),
197603
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Comments", value: openComments, color: "var(--markup-comment-ink)" })
197729
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: strings.reviewGroupLabel, children: [
197730
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.itemsLabel, value: String(totalReviewItems), tone: totalReviewItems > 0 ? "attention" : "neutral" }),
197731
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.changesLabel, value: pendingChanges, color: "var(--sem-warning)" }),
197732
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.commentsLabel, value: openComments, color: "var(--markup-comment-ink)" })
197604
197733
  ] }),
197605
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: "Risk", children: [
197606
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Opaque", value: String(props.documentStats?.opaqueFragmentCount ?? 0), tone: (props.documentStats?.opaqueFragmentCount ?? 0) > 0 ? "attention" : "neutral" }),
197607
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Blocked", value: String(blocked4), tone: blocked4 > 0 ? "blocked" : "neutral" })
197734
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: strings.riskGroupLabel, children: [
197735
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.opaqueLabel, value: String(props.documentStats?.opaqueFragmentCount ?? 0), tone: (props.documentStats?.opaqueFragmentCount ?? 0) > 0 ? "attention" : "neutral" }),
197736
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.blockedLabel, value: String(blocked4), tone: blocked4 > 0 ? "blocked" : "neutral" })
197608
197737
  ] }),
197609
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: "Workflow", children: [
197610
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Scopes", value: String(scopeCount) }),
197611
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Tasks", value: tasks, color: "var(--mode-workflow)" }),
197612
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Approvals", value: approvals, color: "var(--scope-review-marker)" }),
197613
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Blocked", value: blocked4, color: "var(--sem-error)" })
197738
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: strings.workflowGroupLabel, children: [
197739
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.scopesLabel, value: String(scopeCount) }),
197740
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.tasksLabel, value: tasks, color: "var(--mode-workflow)" }),
197741
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.approvalsLabel, value: approvals, color: "var(--scope-review-marker)" }),
197742
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.blockedLabel, value: blocked4, color: "var(--sem-error)" })
197614
197743
  ] }),
197615
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: "Scopes", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ScopeBreakdown, { segments: scopeRailSegments }) }),
197616
- toolCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: "Tools", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Tools", value: String(toolCount) }) }) : null,
197617
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: "Next", children: visibleNextActions.slice(0, 2).map((action, index) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
197744
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: strings.scopesGroupLabel, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ScopeBreakdown, { segments: scopeRailSegments, label: strings.scopeBreakdownLabel }) }),
197745
+ toolCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: strings.toolsGroupLabel, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.toolsGroupLabel, value: String(toolCount) }) }) : null,
197746
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: strings.nextGroupLabel, children: visibleNextActions.slice(0, 2).map((action, index) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
197618
197747
  "span",
197619
197748
  {
197620
197749
  className: "max-w-28 truncate px-1 text-[length:var(--tx-xs)] font-medium text-[var(--ink-secondary)]",
@@ -197668,7 +197797,7 @@ function ScopeBreakdown(props) {
197668
197797
  "div",
197669
197798
  {
197670
197799
  className: "flex h-2 w-28 overflow-hidden rounded-[var(--r-1)] bg-[var(--bg-muted)]",
197671
- "aria-label": "Scope breakdown",
197800
+ "aria-label": props.label,
197672
197801
  role: "img",
197673
197802
  children: [
197674
197803
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(BreakdownSegment, { value: counts.edit, total, color: "var(--scope-edit-marker)" }),
@@ -204977,6 +205106,7 @@ var STATUS_POSTURE_PIP_CLASS = {
204977
205106
  blocked: "bg-[var(--sem-error)]"
204978
205107
  };
204979
205108
  function TwStatusBar(props) {
205109
+ const strings = useChromeStrings();
204980
205110
  const responsiveTier = props.responsiveTier ?? "wide";
204981
205111
  const atLeastCompact = responsiveTier !== "mobile";
204982
205112
  const atLeastStandard = responsiveTier === "standard" || responsiveTier === "wide";
@@ -204986,7 +205116,7 @@ function TwStatusBar(props) {
204986
205116
  const showPosture = segmentVisible("status-save-state");
204987
205117
  const preservationStatusMessage = getPreserveOnlyStatusMessage(props.preserveOnlyCount);
204988
205118
  const savePosture = props.isDirty ? "unsaved" : "ready";
204989
- const saveLabel = props.isDirty ? "Unsaved" : "Saved";
205119
+ const saveLabel = props.isDirty ? strings.unsavedLabel : strings.savedLabel;
204990
205120
  const showExportPosture = showPosture && props.isExportBlocked;
204991
205121
  const showOpenChangesPosture = showPosture && props.changeCount > 0;
204992
205122
  const openChangesLabel = `${props.changeCount} ${props.changeCount === 1 ? "change" : "changes"}`;
@@ -205016,7 +205146,7 @@ function TwStatusBar(props) {
205016
205146
  const showZoomControls = (props.zoomLevel != null || props.onZoomChange) && segmentVisible("status-zoom");
205017
205147
  const trackingEnabled = Boolean(props.trackedChangesAuthoringEnabled);
205018
205148
  const trackingDisabled = props.trackedChangesAuthoringDisabled === true || !props.onTrackedChangesAuthoringChange;
205019
- const trackingTitle = trackingEnabled ? "Tracking on: new typing, insertions, deletions, and formatting changes become redlines." : "Tracking off: new edits are applied directly. Existing markup display is controlled separately.";
205149
+ const trackingTitle = trackingEnabled ? strings.trackingOnDetail : strings.trackingOffDetail;
205020
205150
  const trackingControlTitle = trackingDisabled && props.trackedChangesAuthoringDisabledReason ? props.trackedChangesAuthoringDisabledReason : trackingTitle;
205021
205151
  const statusChromeMode = segmentVisible("status-mode") ? normalizeStatusChromeMode(props.chromeMode) : null;
205022
205152
  const modeLabel = statusChromeMode ? formatStatusChromeModeLabel(statusChromeMode) : null;
@@ -205095,7 +205225,7 @@ function TwStatusBar(props) {
205095
205225
  className: "inline-flex items-center gap-1",
205096
205226
  "data-testid": "status-bar-posture-export",
205097
205227
  "data-posture": "blocked",
205098
- title: "Export blocked",
205228
+ title: strings.exportBlockedLabel,
205099
205229
  children: [
205100
205230
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205101
205231
  "span",
@@ -205104,7 +205234,7 @@ function TwStatusBar(props) {
205104
205234
  className: `h-1.5 w-1.5 shrink-0 rounded-[1px] ${STATUS_POSTURE_PIP_CLASS.blocked}`
205105
205235
  }
205106
205236
  ),
205107
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: atLeastCompact ? "" : "hidden", children: "Export blocked" })
205237
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: atLeastCompact ? "" : "hidden", children: strings.exportBlockedLabel })
205108
205238
  ]
205109
205239
  }
205110
205240
  ) : null,
@@ -205138,7 +205268,7 @@ function TwStatusBar(props) {
205138
205268
  className: "flex shrink-0 items-center overflow-hidden",
205139
205269
  "data-testid": "status-bar-page-anchored-stories",
205140
205270
  "data-chrome-unit-id": "status-page-anchored-stories",
205141
- "aria-label": "Page-anchored stories not shown",
205271
+ "aria-label": strings.pageAnchoredStoriesNotShownLabel,
205142
205272
  title: `${hiddenStoryCount} page-anchored ${hiddenStoryCount === 1 ? "story" : "stories"} (headers, footers, notes) ${hiddenStoryCount === 1 ? "is" : "are"} not shown in this view`,
205143
205273
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("span", { className: "inline-flex h-5 items-center gap-1 rounded-[var(--r-2)] px-1.5 text-[var(--text-secondary)]", children: [
205144
205274
  hiddenStoryCount,
@@ -205153,12 +205283,12 @@ function TwStatusBar(props) {
205153
205283
  className: `flex shrink-0 items-center overflow-hidden ${isWide ? "w-[8.75rem]" : atLeastCompact ? "w-[4rem]" : "w-7"}`,
205154
205284
  "data-testid": "status-bar-track-changes",
205155
205285
  "data-chrome-unit-id": "status-track-changes",
205156
- "aria-label": "Track changes authoring",
205286
+ "aria-label": strings.trackChangesAuthoringLabel,
205157
205287
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
205158
205288
  "button",
205159
205289
  {
205160
205290
  type: "button",
205161
- "aria-label": "Track Changes",
205291
+ "aria-label": strings.trackedChangesLabel,
205162
205292
  "aria-pressed": trackingEnabled,
205163
205293
  disabled: trackingDisabled,
205164
205294
  onClick: () => props.onTrackedChangesAuthoringChange?.(!trackingEnabled),
@@ -205195,7 +205325,7 @@ function TwStatusBar(props) {
205195
205325
  className: `shrink-0 items-center gap-1 overflow-hidden ${atLeastStandard ? "flex" : "hidden"} ${isWide ? "w-[8.75rem]" : "w-[4.25rem]"}`,
205196
205326
  "data-testid": "status-bar-markup-mode",
205197
205327
  "data-chrome-unit-id": "status-markup-display",
205198
- "aria-label": "Markup display",
205328
+ "aria-label": strings.markupDisplayLabel,
205199
205329
  children: [
205200
205330
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205201
205331
  "div",
@@ -205332,13 +205462,13 @@ function TwStatusBar(props) {
205332
205462
  className: "flex w-11 shrink-0 items-center gap-px",
205333
205463
  "data-testid": "status-bar-workspace-mode",
205334
205464
  "data-chrome-unit-id": "status-workspace-view",
205335
- "aria-label": "Workspace view",
205465
+ "aria-label": strings.workspaceViewLabel,
205336
205466
  children: [
205337
205467
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205338
205468
  StatusChromeButton,
205339
205469
  {
205340
205470
  active: props.workspace === "canvas",
205341
- ariaLabel: "Canvas view",
205471
+ ariaLabel: strings.canvasViewLabel,
205342
205472
  disabled: !props.onWorkspaceModeChange,
205343
205473
  onClick: () => props.onWorkspaceModeChange?.("canvas"),
205344
205474
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(TwGlyphIcon, { name: "desktop", className: "h-3 w-3", "aria-hidden": "true" })
@@ -205348,7 +205478,7 @@ function TwStatusBar(props) {
205348
205478
  StatusChromeButton,
205349
205479
  {
205350
205480
  active: props.workspace === "page",
205351
- ariaLabel: "Page view",
205481
+ ariaLabel: strings.pageViewLabel,
205352
205482
  disabled: !props.onWorkspaceModeChange,
205353
205483
  onClick: () => props.onWorkspaceModeChange?.("page"),
205354
205484
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(TwGlyphIcon, { name: "document", className: "h-3 w-3", "aria-hidden": "true" })
@@ -205368,13 +205498,13 @@ function TwStatusBar(props) {
205368
205498
  ].join(" "),
205369
205499
  "data-testid": "status-bar-zoom",
205370
205500
  "data-chrome-unit-id": "status-zoom",
205371
- "aria-label": "Zoom controls",
205501
+ "aria-label": strings.zoomControlsLabel,
205372
205502
  children: [
205373
205503
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205374
205504
  "button",
205375
205505
  {
205376
205506
  type: "button",
205377
- "aria-label": "Zoom out",
205507
+ "aria-label": strings.zoomOutLabel,
205378
205508
  disabled: !canDecreaseZoom,
205379
205509
  onClick: () => applyZoom(zoomPercent - STATUS_ZOOM_BUTTON_STEP),
205380
205510
  className: [
@@ -205386,7 +205516,7 @@ function TwStatusBar(props) {
205386
205516
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205387
205517
  "input",
205388
205518
  {
205389
- "aria-label": "Zoom level",
205519
+ "aria-label": strings.zoomLevelLabel,
205390
205520
  type: "range",
205391
205521
  min: Math.min(STATUS_ZOOM_MIN, Math.floor(zoomPercent / STATUS_ZOOM_STEP) * STATUS_ZOOM_STEP),
205392
205522
  max: STATUS_ZOOM_MAX,
@@ -205417,7 +205547,7 @@ function TwStatusBar(props) {
205417
205547
  "button",
205418
205548
  {
205419
205549
  type: "button",
205420
- "aria-label": "Zoom in",
205550
+ "aria-label": strings.zoomInLabel,
205421
205551
  disabled: !canIncreaseZoom,
205422
205552
  onClick: () => applyZoom(zoomPercent + STATUS_ZOOM_BUTTON_STEP),
205423
205553
  className: [
@@ -293064,6 +293194,15 @@ var WordReviewEditorInner = (0, import_react105.forwardRef)(
293064
293194
  focusRelativeRegion(shell, shortcut.direction);
293065
293195
  return;
293066
293196
  }
293197
+ case "focus-rail": {
293198
+ internalChromeControllerRef.current?.openRailTab("comments");
293199
+ const focusRail = () => {
293200
+ shellRef.current?.querySelector('[data-wre-region="review-rail"]')?.focus();
293201
+ };
293202
+ focusRail();
293203
+ queueMicrotask(focusRail);
293204
+ return;
293205
+ }
293067
293206
  case "toggle-formatting":
293068
293207
  if (shortcut.mark === "bold") {
293069
293208
  commands.onToggleBold?.();