@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.
@@ -122270,7 +122270,97 @@ var DEFAULT_CHROME_STRINGS = {
122270
122270
  modeEditDisabledReason: "Editing is not available in this document.",
122271
122271
  typingOffNoticeTitle: "Typing is off in review",
122272
122272
  typingOffNoticeDetail: "Use Suggest change to propose an edit.",
122273
- typingOffNoticeSuggestingDetail: "Changes are made as suggestions."
122273
+ typingOffNoticeSuggestingDetail: "Changes are made as suggestions.",
122274
+ ribbonTabsLabel: "Ribbon tabs",
122275
+ expandRibbonLabel: "Expand ribbon",
122276
+ collapseRibbonLabel: "Collapse ribbon",
122277
+ analyticsTabBodyLabel: "Analytics tab body",
122278
+ analyticsUnavailable: "Analytics unavailable",
122279
+ reviewTabBodyLabel: "Review tab body",
122280
+ workflowTabBodyLabel: "Workflow tab body",
122281
+ notAvailableCommandHandler: "Not available: command handler not supplied by the toolbar host.",
122282
+ scopeBreakdownLabel: "Scope breakdown",
122283
+ commandPaletteLabel: "Open command palette",
122284
+ toggleAnalyticsLabel: "Toggle analytics",
122285
+ customScopeLabel: "Custom scope",
122286
+ customScopeNameLabel: "Custom scope name",
122287
+ closeCustomScopeDialogLabel: "Close custom scope dialog",
122288
+ addCommentLabel: "Add comment",
122289
+ trackedChangesLabel: "Track Changes",
122290
+ trackedChangesOnLabel: "Tracking on",
122291
+ trackedChangesOffLabel: "Tracking off",
122292
+ trackedChangesOnTitle: "Tracking on: new edits are recorded as redlines",
122293
+ trackedChangesOffTitle: "Tracking off: new edits are applied directly",
122294
+ showTrackedChangesSidebarLabel: "Show tracked changes in sidebar",
122295
+ showCommentsSidebarLabel: "Show comments in sidebar",
122296
+ trackedChangesPanelLabel: "Tracked changes panel",
122297
+ commentsPanelLabel: "Comments panel",
122298
+ compareLabel: "Compare",
122299
+ compareDocumentLabel: "Compare document",
122300
+ compareWithAnotherDocumentLabel: "Compare with another document",
122301
+ chooseDocumentToCompareLabel: "Choose document to compare",
122302
+ moreLabel: "More",
122303
+ pagesLabel: "Pages",
122304
+ charsLabel: "Chars",
122305
+ exportLabel: "Export",
122306
+ blockedLabel: "Blocked",
122307
+ readyLabel: "Ready",
122308
+ itemsLabel: "Items",
122309
+ changesLabel: "Changes",
122310
+ commentsLabel: "Comments",
122311
+ opaqueLabel: "Opaque",
122312
+ scopesLabel: "Scopes",
122313
+ tasksLabel: "Tasks",
122314
+ approvalsLabel: "Approvals",
122315
+ analyticsLabel: "Analytics",
122316
+ homeTabLabel: "Home",
122317
+ insertTabLabel: "Insert",
122318
+ layoutTabLabel: "Layout",
122319
+ reviewTabLabel: "Review",
122320
+ workflowTabLabel: "Workflow",
122321
+ defaultDocumentTitle: "Document",
122322
+ defaultWordmark: "COMPOSER",
122323
+ resolveBlockersAction: "Resolve blockers",
122324
+ reviewPendingChangesAction: "Review pending changes",
122325
+ openCommentThreadAction: "Open comment thread",
122326
+ documentReadyAction: "Document ready",
122327
+ documentGroupLabel: "Document",
122328
+ reviewGroupLabel: "Review",
122329
+ riskGroupLabel: "Risk",
122330
+ workflowGroupLabel: "Workflow",
122331
+ scopesGroupLabel: "Scopes",
122332
+ toolsGroupLabel: "Tools",
122333
+ nextGroupLabel: "Next",
122334
+ savedLabel: "Saved",
122335
+ unsavedLabel: "Unsaved",
122336
+ exportBlockedLabel: "Export blocked",
122337
+ pageAnchoredStoriesNotShownLabel: "Page-anchored stories not shown",
122338
+ trackChangesAuthoringLabel: "Track changes authoring",
122339
+ zoomControlsLabel: "Zoom controls",
122340
+ zoomOutLabel: "Zoom out",
122341
+ zoomLevelLabel: "Zoom level",
122342
+ zoomInLabel: "Zoom in",
122343
+ workspaceViewLabel: "Workspace view",
122344
+ canvasViewLabel: "Canvas view",
122345
+ pageViewLabel: "Page view",
122346
+ markupDisplayLabel: "Markup display",
122347
+ trackingOnDetail: "Tracking on: new typing, insertions, deletions, and formatting changes become redlines.",
122348
+ trackingOffDetail: "Tracking off: new edits are applied directly. Existing markup display is controlled separately.",
122349
+ workflowScopeControlsLabel: "Workflow scope controls",
122350
+ createCustomWorkflowScopeLabel: "Create custom workflow scope",
122351
+ customScopeModeInputLabel: "Custom scope mode",
122352
+ customScopeColorInputLabel: "Custom scope color",
122353
+ scopeColorPlaceholder: "#64748b",
122354
+ metadataKeyPlaceholderLabel: "Key",
122355
+ metadataValuePlaceholderLabel: "Value",
122356
+ customLabel: "Custom",
122357
+ nameLabel: "Name",
122358
+ modeLabel: "Mode",
122359
+ colorLabel: "Color",
122360
+ metadataLabelText: "Metadata",
122361
+ addLabel: "Add",
122362
+ cancelLabel: "Cancel",
122363
+ createLabel: "Create"
122274
122364
  };
122275
122365
  function resolveChromeStrings(overrides) {
122276
122366
  if (!overrides) return DEFAULT_CHROME_STRINGS;
@@ -184946,6 +185036,7 @@ var CUSTOM_SCOPE_COLOR_SWATCHES = [
184946
185036
  "#0891b2"
184947
185037
  ];
184948
185038
  function TwScopePostureMenu(props) {
185039
+ const strings = useChromeStrings();
184949
185040
  const [customOpen, setCustomOpen] = import_react11.default.useState(false);
184950
185041
  const iconOnly = props.responsiveTier === "mobile" || props.responsiveTier === "compact";
184951
185042
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
@@ -184953,8 +185044,9 @@ function TwScopePostureMenu(props) {
184953
185044
  {
184954
185045
  className: `relative flex min-w-0 items-center ${iconOnly ? "gap-px" : "gap-1"}`,
184955
185046
  "data-testid": props["data-testid"] ?? "workflow-scope-palette",
185047
+ "data-chrome-unit-id": "chrome.ribbon",
184956
185048
  "data-ribbon-control": "direct-scope-palette",
184957
- "aria-label": "Workflow scope controls",
185049
+ "aria-label": strings.workflowScopeControlsLabel,
184958
185050
  role: "group",
184959
185051
  children: [
184960
185052
  /* @__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)(
@@ -184981,9 +185073,9 @@ function TwScopePostureMenu(props) {
184981
185073
  "button",
184982
185074
  {
184983
185075
  type: "button",
184984
- "aria-label": "Create custom workflow scope",
185076
+ "aria-label": strings.createCustomWorkflowScopeLabel,
184985
185077
  "aria-expanded": customOpen,
184986
- title: "Custom scope",
185078
+ title: strings.customScopeLabel,
184987
185079
  disabled: !props.onCreateCustomScope,
184988
185080
  onMouseDown: preserveEditorSelectionMouseDown,
184989
185081
  onClick: () => setCustomOpen((value) => !value),
@@ -184995,7 +185087,7 @@ function TwScopePostureMenu(props) {
184995
185087
  "data-label-visibility": iconOnly ? "icon-only" : "text",
184996
185088
  children: [
184997
185089
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TwGlyphIcon, { name: "plus", className: "h-3.5 w-3.5 text-accent" }),
184998
- iconOnly ? null : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "Custom" })
185090
+ iconOnly ? null : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: strings.customLabel })
184999
185091
  ]
185000
185092
  }
185001
185093
  ),
@@ -185011,6 +185103,7 @@ function TwScopePostureMenu(props) {
185011
185103
  );
185012
185104
  }
185013
185105
  function CustomScopeDialog(props) {
185106
+ const strings = useChromeStrings();
185014
185107
  const [mode, setMode] = import_react11.default.useState("suggest");
185015
185108
  const [color, setColor] = import_react11.default.useState(CUSTOM_SCOPE_COLOR_SWATCHES[0]);
185016
185109
  const [metadataRows, setMetadataRows] = import_react11.default.useState([0]);
@@ -185056,12 +185149,12 @@ function CustomScopeDialog(props) {
185056
185149
  },
185057
185150
  children: [
185058
185151
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
185059
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-semibold text-[var(--ink-primary)]", children: "Custom scope" }),
185152
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-semibold text-[var(--ink-primary)]", children: strings.customScopeLabel }),
185060
185153
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
185061
185154
  "button",
185062
185155
  {
185063
185156
  type: "button",
185064
- "aria-label": "Close custom scope dialog",
185157
+ "aria-label": strings.closeCustomScopeDialogLabel,
185065
185158
  onMouseDown: preserveEditorSelectionMouseDown,
185066
185159
  onClick: props.onClose,
185067
185160
  className: ds38IconButtonClass,
@@ -185070,19 +185163,19 @@ function CustomScopeDialog(props) {
185070
185163
  )
185071
185164
  ] }),
185072
185165
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("label", { className: "grid gap-1 font-medium text-[var(--ink-secondary)]", children: [
185073
- "Name",
185166
+ strings.nameLabel,
185074
185167
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
185075
185168
  "input",
185076
185169
  {
185077
185170
  autoFocus: true,
185078
- "aria-label": "Custom scope name",
185171
+ "aria-label": strings.customScopeNameLabel,
185079
185172
  name: "scope-label",
185080
185173
  className: ds38SmallInputClass
185081
185174
  }
185082
185175
  )
185083
185176
  ] }),
185084
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", role: "group", "aria-label": "Custom scope mode", children: [
185085
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: "Mode" }),
185177
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", role: "group", "aria-label": strings.customScopeModeInputLabel, children: [
185178
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: strings.modeLabel }),
185086
185179
  /* @__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)(
185087
185180
  "button",
185088
185181
  {
@@ -185103,8 +185196,8 @@ function CustomScopeDialog(props) {
185103
185196
  entry
185104
185197
  )) })
185105
185198
  ] }),
185106
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", role: "group", "aria-label": "Custom scope color", children: [
185107
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: "Color" }),
185199
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", role: "group", "aria-label": strings.customScopeColorInputLabel, children: [
185200
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: strings.colorLabel }),
185108
185201
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center gap-1", children: [
185109
185202
  CUSTOM_SCOPE_COLOR_SWATCHES.map((swatch) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
185110
185203
  "button",
@@ -185125,9 +185218,9 @@ function CustomScopeDialog(props) {
185125
185218
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
185126
185219
  "input",
185127
185220
  {
185128
- "aria-label": "Custom scope color",
185221
+ "aria-label": strings.customScopeColorInputLabel,
185129
185222
  name: "scope-color",
185130
- placeholder: "#64748b",
185223
+ placeholder: strings.scopeColorPlaceholder,
185131
185224
  className: `${ds38SmallInputClass} w-24`
185132
185225
  }
185133
185226
  )
@@ -185135,7 +185228,7 @@ function CustomScopeDialog(props) {
185135
185228
  ] }),
185136
185229
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "grid gap-1", children: [
185137
185230
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center justify-between", children: [
185138
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: "Metadata" }),
185231
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-medium text-[var(--ink-secondary)]", children: strings.metadataLabelText }),
185139
185232
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
185140
185233
  "button",
185141
185234
  {
@@ -185143,7 +185236,7 @@ function CustomScopeDialog(props) {
185143
185236
  onMouseDown: preserveEditorSelectionMouseDown,
185144
185237
  onClick: () => setMetadataRows((rows) => [...rows, Date.now()]),
185145
185238
  className: `${ds38TextButtonClass} h-6 px-1.5 text-[10px] text-[var(--accent-primary)]`,
185146
- children: "Add"
185239
+ children: strings.addLabel
185147
185240
  }
185148
185241
  )
185149
185242
  ] }),
@@ -185153,7 +185246,7 @@ function CustomScopeDialog(props) {
185153
185246
  {
185154
185247
  "aria-label": `Metadata key ${index + 1}`,
185155
185248
  name: "metadata-key",
185156
- placeholder: "Key",
185249
+ placeholder: strings.metadataKeyPlaceholderLabel,
185157
185250
  className: ds38SmallInputClass
185158
185251
  }
185159
185252
  ),
@@ -185162,7 +185255,7 @@ function CustomScopeDialog(props) {
185162
185255
  {
185163
185256
  "aria-label": `Metadata value ${index + 1}`,
185164
185257
  name: "metadata-value",
185165
- placeholder: "Value",
185258
+ placeholder: strings.metadataValuePlaceholderLabel,
185166
185259
  className: ds38SmallInputClass
185167
185260
  }
185168
185261
  ),
@@ -185195,7 +185288,7 @@ function CustomScopeDialog(props) {
185195
185288
  onMouseDown: preserveEditorSelectionMouseDown,
185196
185289
  onClick: props.onClose,
185197
185290
  className: ds38TextButtonClass,
185198
- children: "Cancel"
185291
+ children: strings.cancelLabel
185199
185292
  }
185200
185293
  ),
185201
185294
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
@@ -185204,7 +185297,7 @@ function CustomScopeDialog(props) {
185204
185297
  type: "submit",
185205
185298
  disabled: pending || !props.onCreate,
185206
185299
  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}`,
185207
- children: "Create"
185300
+ children: strings.createLabel
185208
185301
  }
185209
185302
  )
185210
185303
  ] })
@@ -185384,6 +185477,7 @@ function toneClass(tone) {
185384
185477
  // src/ui-tailwind/toolbar/tw-role-action-region.tsx
185385
185478
  var import_jsx_runtime10 = require("react/jsx-runtime");
185386
185479
  function TwRoleActionRegion(props) {
185480
+ const strings = useChromeStrings();
185387
185481
  const responsiveTier = props.responsiveTier ?? (props.compactMode ? "compact" : "standard");
185388
185482
  const order = resolveRoleActionOrder(props.role, props.chromeMode);
185389
185483
  const inlineIds = [];
@@ -185419,6 +185513,7 @@ function TwRoleActionRegion(props) {
185419
185513
  "div",
185420
185514
  {
185421
185515
  className: "flex min-w-0 shrink-0 items-stretch",
185516
+ "data-chrome-unit-id": "chrome.ribbon",
185422
185517
  "data-testid": props["data-testid"] ?? `role-action-region-${props.chromeMode ?? props.role}`,
185423
185518
  "data-role": props.role,
185424
185519
  "data-mode": props.chromeMode,
@@ -185435,7 +185530,7 @@ function TwRoleActionRegion(props) {
185435
185530
  },
185436
185531
  id
185437
185532
  )) }, group3.key)),
185438
- overflowIds.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwRibbonGroup, { label: "More", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RoleActionOverflow, { ids: overflowIds, props }) }) : null
185533
+ 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
185439
185534
  ]
185440
185535
  }
185441
185536
  );
@@ -185585,6 +185680,7 @@ function roleOverflowLabel(role) {
185585
185680
  }
185586
185681
  function RoleActionButton(arg) {
185587
185682
  const { id, props, responsiveTier } = arg;
185683
+ const strings = useChromeStrings();
185588
185684
  const hideText = shouldUseIconOnlyRoleAction(id, responsiveTier);
185589
185685
  const reviewQueueTotal = props.reviewQueue?.totalCount ?? 0;
185590
185686
  const adjudicationProtected = props.capabilities?.adjudicationBlockedByProtection ?? false;
@@ -185596,7 +185692,7 @@ function RoleActionButton(arg) {
185596
185692
  "button",
185597
185693
  {
185598
185694
  type: "button",
185599
- "aria-label": "Add comment",
185695
+ "aria-label": strings.addCommentLabel,
185600
185696
  disabled: !props.canAddComment || !props.onAddComment,
185601
185697
  onMouseDown: preserveEditorSelectionMouseDown,
185602
185698
  onClick: props.onAddComment,
@@ -185605,7 +185701,7 @@ function RoleActionButton(arg) {
185605
185701
  children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwGlyphIcon, { name: "comment", className: "h-3.5 w-3.5" })
185606
185702
  }
185607
185703
  ) }),
185608
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: "Add comment" }) })
185704
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: strings.addCommentLabel }) })
185609
185705
  ] });
185610
185706
  case "review-compare-document":
185611
185707
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
@@ -185616,7 +185712,7 @@ function RoleActionButton(arg) {
185616
185712
  }
185617
185713
  );
185618
185714
  case "review-track-changes-toggle": {
185619
- const trackChangesLabel = "Track Changes";
185715
+ const trackChangesLabel = strings.trackedChangesLabel;
185620
185716
  const trackedChangesAuthoringEnabled = props.trackedChangesAuthoringEnabled ?? false;
185621
185717
  const onTrackedChangesAuthoringChange = props.onTrackedChangesAuthoringChange ?? props.onShowTrackedChangesChange;
185622
185718
  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.";
@@ -185629,7 +185725,7 @@ function RoleActionButton(arg) {
185629
185725
  "aria-label": trackChangesLabel,
185630
185726
  disabled: props.capabilities ? !sessionCanTrackChangesAuthoring(props.capabilities) : false,
185631
185727
  onMouseDown: preserveEditorSelectionMouseDown,
185632
- title: trackedChangesAuthoringEnabled ? "Tracking on: new edits are recorded as redlines" : "Tracking off: new edits are applied directly",
185728
+ title: trackedChangesAuthoringEnabled ? strings.trackedChangesOnTitle : strings.trackedChangesOffTitle,
185633
185729
  className: [
185634
185730
  "inline-flex h-6 items-center justify-center gap-1 rounded-[var(--radius-sm)] px-2",
185635
185731
  "text-[length:var(--text-xs)] font-medium text-[var(--ink-secondary)]",
@@ -185643,7 +185739,7 @@ function RoleActionButton(arg) {
185643
185739
  "data-testid": "role-review-track-changes-toggle",
185644
185740
  children: [
185645
185741
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwGlyphIcon, { name: "edit", className: "h-3.5 w-3.5" }),
185646
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: trackedChangesAuthoringEnabled ? "Tracking on" : "Tracking off" })
185742
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: trackedChangesAuthoringEnabled ? strings.trackedChangesOnLabel : strings.trackedChangesOffLabel })
185647
185743
  ]
185648
185744
  }
185649
185745
  ) }),
@@ -185656,7 +185752,7 @@ function RoleActionButton(arg) {
185656
185752
  "button",
185657
185753
  {
185658
185754
  type: "button",
185659
- "aria-label": "Show tracked changes in sidebar",
185755
+ "aria-label": strings.showTrackedChangesSidebarLabel,
185660
185756
  disabled: !props.onReviewSidebarTrackedChanges,
185661
185757
  onMouseDown: preserveEditorSelectionMouseDown,
185662
185758
  onClick: props.onReviewSidebarTrackedChanges,
@@ -185665,7 +185761,7 @@ function RoleActionButton(arg) {
185665
185761
  children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwGlyphIcon, { name: "diff", className: "h-3.5 w-3.5" })
185666
185762
  }
185667
185763
  ) }),
185668
- /* @__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" }) })
185764
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: strings.trackedChangesPanelLabel }) })
185669
185765
  ] });
185670
185766
  case "comments-panel":
185671
185767
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Tooltip.Root, { children: [
@@ -185673,7 +185769,7 @@ function RoleActionButton(arg) {
185673
185769
  "button",
185674
185770
  {
185675
185771
  type: "button",
185676
- "aria-label": "Show comments in sidebar",
185772
+ "aria-label": strings.showCommentsSidebarLabel,
185677
185773
  disabled: !props.onReviewSidebarComments,
185678
185774
  onMouseDown: preserveEditorSelectionMouseDown,
185679
185775
  onClick: props.onReviewSidebarComments,
@@ -185682,7 +185778,7 @@ function RoleActionButton(arg) {
185682
185778
  children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TwGlyphIcon, { name: "comment", badge: "alert", className: "h-3.5 w-3.5" })
185683
185779
  }
185684
185780
  ) }),
185685
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: "Comments panel" }) })
185781
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tooltip.Content, { className: ds38TooltipClass, sideOffset: 6, children: strings.commentsPanelLabel }) })
185686
185782
  ] });
185687
185783
  case "editor-scope-posture-menu":
185688
185784
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
@@ -186042,14 +186138,15 @@ function IconTextButton(arg) {
186042
186138
  );
186043
186139
  }
186044
186140
  function ReviewCompareDocumentButton(props) {
186141
+ const strings = useChromeStrings();
186045
186142
  const inputRef = import_react12.default.useRef(null);
186046
186143
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
186047
186144
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
186048
186145
  IconTextButton,
186049
186146
  {
186050
186147
  icon: twGlyphIconComponent("diff"),
186051
- text: "Compare",
186052
- ariaLabel: "Compare with another document",
186148
+ text: strings.compareLabel,
186149
+ ariaLabel: strings.compareWithAnotherDocumentLabel,
186053
186150
  disabled: props.disabled,
186054
186151
  onClick: () => inputRef.current?.click(),
186055
186152
  "data-testid": props.testId ?? "role-review-compare-document"
@@ -186062,7 +186159,7 @@ function ReviewCompareDocumentButton(props) {
186062
186159
  type: "file",
186063
186160
  accept: ".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document",
186064
186161
  className: "sr-only",
186065
- "aria-label": "Choose document to compare",
186162
+ "aria-label": strings.chooseDocumentToCompareLabel,
186066
186163
  disabled: props.disabled,
186067
186164
  onChange: (event) => {
186068
186165
  const file = event.currentTarget.files?.[0];
@@ -186080,14 +186177,15 @@ function ReviewCompareDocumentButton(props) {
186080
186177
  ] });
186081
186178
  }
186082
186179
  function CompareMenuRow(arg) {
186180
+ const strings = useChromeStrings();
186083
186181
  const inputRef = import_react12.default.useRef(null);
186084
186182
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
186085
186183
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
186086
186184
  MenuRow,
186087
186185
  {
186088
186186
  icon: twGlyphIconComponent("diff"),
186089
- label: "Compare document",
186090
- ariaLabel: "Compare with another document",
186187
+ label: strings.compareDocumentLabel,
186188
+ ariaLabel: strings.compareWithAnotherDocumentLabel,
186091
186189
  disabled: arg.disabled,
186092
186190
  onClick: () => inputRef.current?.click()
186093
186191
  }
@@ -186099,7 +186197,7 @@ function CompareMenuRow(arg) {
186099
186197
  type: "file",
186100
186198
  accept: ".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document",
186101
186199
  className: "sr-only",
186102
- "aria-label": "Choose document to compare",
186200
+ "aria-label": strings.chooseDocumentToCompareLabel,
186103
186201
  disabled: arg.disabled,
186104
186202
  onChange: (event) => {
186105
186203
  const file = event.currentTarget.files?.[0];
@@ -186198,6 +186296,7 @@ function TwRibbonTab(props) {
186198
186296
  "button",
186199
186297
  {
186200
186298
  type: "button",
186299
+ "data-chrome-unit-id": "chrome.ribbon",
186201
186300
  role: "tab",
186202
186301
  "aria-selected": selected,
186203
186302
  "aria-label": label,
@@ -186235,15 +186334,24 @@ function TwRibbonTab(props) {
186235
186334
 
186236
186335
  // src/ui-tailwind/toolbar/tw-ribbon-tab-strip.tsx
186237
186336
  var import_jsx_runtime13 = require("react/jsx-runtime");
186238
- var TAB_DESCRIPTORS = [
186239
- { id: "home", label: "Home" },
186240
- { id: "insert", label: "Insert" },
186241
- { id: "layout", label: "Layout" },
186242
- { id: "review", label: "Review" },
186243
- { id: "workflow", label: "Workflow" },
186244
- { id: "analytics", label: "Analytics" }
186337
+ var TAB_IDS = [
186338
+ "home",
186339
+ "insert",
186340
+ "layout",
186341
+ "review",
186342
+ "workflow",
186343
+ "analytics"
186245
186344
  ];
186246
186345
  function TwRibbonTabStrip(props) {
186346
+ const strings = useChromeStrings();
186347
+ const tabLabels = {
186348
+ home: strings.homeTabLabel,
186349
+ insert: strings.insertTabLabel,
186350
+ layout: strings.layoutTabLabel,
186351
+ review: strings.reviewTabLabel,
186352
+ workflow: strings.workflowTabLabel,
186353
+ analytics: strings.analyticsLabel
186354
+ };
186247
186355
  const responsiveTier = props.responsiveTier ?? "standard";
186248
186356
  const isMobile = responsiveTier === "mobile";
186249
186357
  const disabledSet = import_react14.default.useMemo(
@@ -186254,6 +186362,7 @@ function TwRibbonTabStrip(props) {
186254
186362
  "div",
186255
186363
  {
186256
186364
  "data-testid": "ribbon-tab-strip",
186365
+ "data-chrome-unit-id": "chrome.ribbon",
186257
186366
  "data-ribbon-layer": "tabs",
186258
186367
  "data-responsive-tier": responsiveTier,
186259
186368
  className: [
@@ -186265,22 +186374,22 @@ function TwRibbonTabStrip(props) {
186265
186374
  "div",
186266
186375
  {
186267
186376
  role: "tablist",
186268
- "aria-label": "Ribbon tabs",
186377
+ "aria-label": strings.ribbonTabsLabel,
186269
186378
  className: [
186270
186379
  "flex min-w-0 shrink items-end gap-0",
186271
186380
  "overflow-x-auto overflow-y-hidden [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
186272
186381
  ].join(" "),
186273
- children: TAB_DESCRIPTORS.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
186382
+ children: TAB_IDS.map((id) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
186274
186383
  TwRibbonTab,
186275
186384
  {
186276
- id: tab.id,
186277
- label: tab.label,
186278
- selected: tab.id === props.activeTab,
186279
- disabled: disabledSet.has(tab.id),
186385
+ id,
186386
+ label: tabLabels[id],
186387
+ selected: id === props.activeTab,
186388
+ disabled: disabledSet.has(id),
186280
186389
  responsiveTier,
186281
186390
  onSelect: props.onTabChange
186282
186391
  },
186283
- tab.id
186392
+ id
186284
186393
  ))
186285
186394
  }
186286
186395
  ),
@@ -186292,10 +186401,10 @@ function TwRibbonTabStrip(props) {
186292
186401
  type: "button",
186293
186402
  "data-testid": "ribbon-collapse-toggle",
186294
186403
  "aria-pressed": props.collapsed,
186295
- "aria-label": props.collapsed ? "Expand ribbon" : "Collapse ribbon",
186404
+ "aria-label": props.collapsed ? strings.expandRibbonLabel : strings.collapseRibbonLabel,
186296
186405
  onClick: props.onCollapseToggle,
186297
186406
  "data-label-visibility": isMobile ? "icon-only" : "text",
186298
- title: isMobile ? props.collapsed ? "Expand ribbon" : "Collapse ribbon" : void 0,
186407
+ title: isMobile ? props.collapsed ? strings.expandRibbonLabel : strings.collapseRibbonLabel : void 0,
186299
186408
  className: [
186300
186409
  "inline-flex h-6 items-center rounded text-[length:var(--text-xs)] text-[var(--ink-secondary)]",
186301
186410
  "transition-colors duration-[var(--t-fast)] hover:bg-[var(--bg-hover)] hover:text-[var(--ink-primary)]",
@@ -186317,15 +186426,17 @@ function TwRibbonTabStrip(props) {
186317
186426
  // src/ui-tailwind/toolbar/tw-ribbon-tab-body-analytics.tsx
186318
186427
  var import_jsx_runtime14 = require("react/jsx-runtime");
186319
186428
  function TwRibbonTabBodyAnalytics(props) {
186429
+ const strings = useChromeStrings();
186320
186430
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
186321
186431
  "div",
186322
186432
  {
186323
186433
  "data-testid": "ribbon-tab-body-analytics",
186434
+ "data-chrome-unit-id": "chrome.ribbon",
186324
186435
  "data-ribbon-tab-body": "analytics",
186325
186436
  "data-ribbon-body-density": "standard",
186326
- "aria-label": "Analytics tab body",
186437
+ "aria-label": strings.analyticsTabBodyLabel,
186327
186438
  className: "flex h-full min-w-0 flex-nowrap items-center overflow-hidden px-0 py-0",
186328
- children: props.children ?? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "px-3 text-[length:var(--text-xs)] text-tertiary", children: "Analytics unavailable" })
186439
+ children: props.children ?? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "px-3 text-[length:var(--text-xs)] text-tertiary", children: strings.analyticsUnavailable })
186329
186440
  }
186330
186441
  );
186331
186442
  }
@@ -186343,12 +186454,14 @@ var GROUP_LABEL = {
186343
186454
  symbol: "Symbol"
186344
186455
  };
186345
186456
  function TwRibbonTabBodyInsert(props) {
186457
+ const strings = useChromeStrings();
186346
186458
  const entries = filterRegistryByTab("insert");
186347
186459
  const byGroup = groupEntriesByGroup(entries);
186348
186460
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
186349
186461
  "div",
186350
186462
  {
186351
186463
  "data-testid": "ribbon-tab-body-insert",
186464
+ "data-chrome-unit-id": "chrome.ribbon",
186352
186465
  "data-ribbon-tab-body": "insert",
186353
186466
  "data-ribbon-body-density": "compact",
186354
186467
  className: "flex h-full min-w-0 flex-nowrap items-center gap-1 overflow-hidden px-3 py-0",
@@ -186359,7 +186472,7 @@ function TwRibbonTabBodyInsert(props) {
186359
186472
  "data-testid": `ribbon-tab-body-insert-entry-${id}`,
186360
186473
  "data-ribbon-entry-id": id,
186361
186474
  disabled: true,
186362
- title: "Not available: command handler not supplied by the toolbar host.",
186475
+ title: strings.notAvailableCommandHandler,
186363
186476
  className: "inline-flex h-6 items-center rounded px-1.5 text-[length:var(--text-xs)] text-[var(--ink-secondary)] opacity-50",
186364
186477
  children: labelForEntry(id)
186365
186478
  },
@@ -186399,6 +186512,7 @@ var GROUP_LABEL2 = {
186399
186512
  ruler: "Ruler"
186400
186513
  };
186401
186514
  function TwRibbonTabBodyLayout(props) {
186515
+ const strings = useChromeStrings();
186402
186516
  const entries = filterRegistryByTab("layout");
186403
186517
  const byGroup = {};
186404
186518
  for (const entry of entries) {
@@ -186410,6 +186524,7 @@ function TwRibbonTabBodyLayout(props) {
186410
186524
  "div",
186411
186525
  {
186412
186526
  "data-testid": "ribbon-tab-body-layout",
186527
+ "data-chrome-unit-id": "chrome.ribbon",
186413
186528
  "data-ribbon-tab-body": "layout",
186414
186529
  "data-ribbon-body-density": "compact",
186415
186530
  className: "flex h-full min-w-0 flex-nowrap items-center gap-1 overflow-hidden px-3 py-0",
@@ -186420,7 +186535,7 @@ function TwRibbonTabBodyLayout(props) {
186420
186535
  "data-testid": `ribbon-tab-body-layout-entry-${id}`,
186421
186536
  "data-ribbon-entry-id": id,
186422
186537
  disabled: true,
186423
- title: "Not available: command handler not supplied by the toolbar host.",
186538
+ title: strings.notAvailableCommandHandler,
186424
186539
  className: "inline-flex h-6 items-center rounded px-1.5 text-[length:var(--text-xs)] text-[var(--ink-secondary)] opacity-50",
186425
186540
  children: labelForEntry2(id)
186426
186541
  },
@@ -186441,13 +186556,15 @@ function labelForEntry2(id) {
186441
186556
  // src/ui-tailwind/toolbar/tw-ribbon-tab-body-mode.tsx
186442
186557
  var import_jsx_runtime17 = require("react/jsx-runtime");
186443
186558
  function TwRibbonTabBodyMode(props) {
186559
+ const strings = useChromeStrings();
186444
186560
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
186445
186561
  "div",
186446
186562
  {
186447
186563
  "data-testid": `ribbon-tab-body-${props.tab}`,
186564
+ "data-chrome-unit-id": "chrome.ribbon",
186448
186565
  "data-ribbon-tab-body": props.tab,
186449
186566
  "data-ribbon-body-density": "compact",
186450
- "aria-label": "Workflow tab body",
186567
+ "aria-label": strings.workflowTabBodyLabel,
186451
186568
  className: "flex h-full min-w-0 flex-nowrap items-center gap-1 overflow-hidden px-3 py-0",
186452
186569
  children: props.children ?? null
186453
186570
  }
@@ -186457,13 +186574,15 @@ function TwRibbonTabBodyMode(props) {
186457
186574
  // src/ui-tailwind/toolbar/tw-ribbon-tab-body-review.tsx
186458
186575
  var import_jsx_runtime18 = require("react/jsx-runtime");
186459
186576
  function TwRibbonTabBodyReview(props) {
186577
+ const strings = useChromeStrings();
186460
186578
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
186461
186579
  "div",
186462
186580
  {
186463
186581
  "data-testid": "ribbon-tab-body-review",
186582
+ "data-chrome-unit-id": "chrome.ribbon",
186464
186583
  "data-ribbon-tab-body": "review",
186465
186584
  "data-ribbon-body-density": "compact",
186466
- "aria-label": "Review tab body",
186585
+ "aria-label": strings.reviewTabBodyLabel,
186467
186586
  className: "flex h-full min-w-0 flex-nowrap items-center gap-1 overflow-hidden px-3 py-0",
186468
186587
  children: props.children ?? null
186469
186588
  }
@@ -186506,6 +186625,7 @@ function TwDisplayModeSelector(props) {
186506
186625
  "button",
186507
186626
  {
186508
186627
  type: "button",
186628
+ "data-chrome-unit-id": "chrome.ribbon",
186509
186629
  disabled: props.disabled,
186510
186630
  "data-testid": props["data-testid"] ?? "display-mode-selector-trigger",
186511
186631
  "data-ribbon-control": "compact-selector",
@@ -193760,6 +193880,7 @@ function TwToolbarIconButton(props) {
193760
193880
  "button",
193761
193881
  {
193762
193882
  type: "button",
193883
+ "data-chrome-unit-id": "chrome.ribbon",
193763
193884
  "aria-label": props.label,
193764
193885
  "aria-pressed": props.active ?? void 0,
193765
193886
  "data-active": props.active ? "true" : void 0,
@@ -197560,6 +197681,11 @@ function TwModePill(props) {
197560
197681
 
197561
197682
  // src/ui-tailwind/toolbar/tw-shell-header.tsx
197562
197683
  var import_jsx_runtime32 = require("react/jsx-runtime");
197684
+ var DEFAULT_SHELL_HEADER_MODES = [
197685
+ { id: "edit", label: DEFAULT_CHROME_STRINGS.modeEditLabel },
197686
+ { id: "review", label: DEFAULT_CHROME_STRINGS.reviewTabLabel },
197687
+ { id: "workflow", label: DEFAULT_CHROME_STRINGS.workflowTabLabel }
197688
+ ];
197563
197689
  var POSTURE_HUES = {
197564
197690
  ready: "var(--sem-success)",
197565
197691
  unsaved: "var(--accent-primary)",
@@ -197567,8 +197693,9 @@ var POSTURE_HUES = {
197567
197693
  blocked: "var(--sem-error)"
197568
197694
  };
197569
197695
  function TwShellHeader(props) {
197570
- const title = props.documentTitle ?? props.brand ?? "Document";
197571
- const wordmark = props.wordmark ?? "COMPOSER";
197696
+ const strings = useChromeStrings();
197697
+ const title = props.documentTitle ?? props.brand ?? strings.defaultDocumentTitle;
197698
+ const wordmark = props.wordmark ?? strings.defaultWordmark;
197572
197699
  const posture = props.posture ?? (props.saveState === "dirty" || props.saveState === "saving" ? "unsaved" : "ready");
197573
197700
  const responsiveTier = props.responsiveTier ?? "wide";
197574
197701
  const atLeastCompact = responsiveTier !== "mobile";
@@ -197681,8 +197808,8 @@ function TwShellHeader(props) {
197681
197808
  type: "button",
197682
197809
  "data-testid": "tw-shell-header__command",
197683
197810
  "data-chrome-command-trigger": "true",
197684
- "aria-label": "Open command palette",
197685
- title: "Open command palette",
197811
+ "aria-label": strings.commandPaletteLabel,
197812
+ title: strings.commandPaletteLabel,
197686
197813
  disabled: props.commandPaletteDisabled,
197687
197814
  onClick: props.onOpenCommandPalette,
197688
197815
  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)]",
@@ -197702,13 +197829,13 @@ function TwShellHeader(props) {
197702
197829
  {
197703
197830
  type: "button",
197704
197831
  "data-testid": "tw-shell-header__analytics",
197705
- "aria-label": "Toggle analytics",
197832
+ "aria-label": strings.toggleAnalyticsLabel,
197706
197833
  "aria-pressed": props.analyticsActive ?? false,
197707
197834
  onClick: props.onToggleAnalytics,
197708
197835
  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)]",
197709
197836
  children: [
197710
197837
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(TwGlyphIcon, { name: "bar-blocks", className: "h-3.5 w-3.5", "aria-hidden": "true" }),
197711
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: atLeastStandard ? "inline" : "hidden", children: "Analytics" })
197838
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: atLeastStandard ? "inline" : "hidden", children: strings.analyticsLabel })
197712
197839
  ]
197713
197840
  }
197714
197841
  ) : null,
@@ -197776,6 +197903,7 @@ function isSafeShellHref(href) {
197776
197903
  // src/ui-tailwind/toolbar/tw-analytics-ribbon.tsx
197777
197904
  var import_jsx_runtime33 = require("react/jsx-runtime");
197778
197905
  function TwAnalyticsRibbon(props) {
197906
+ const strings = useChromeStrings();
197779
197907
  const commentThreads = props.comments?.threads ?? [];
197780
197908
  const resolvedCommentIds = props.comments?.resolvedCommentIds ?? [];
197781
197909
  const revisions = props.trackedChanges?.revisions ?? [];
@@ -197796,7 +197924,7 @@ function TwAnalyticsRibbon(props) {
197796
197924
  const scopeCount = scopeRailSegments.length;
197797
197925
  const toolCount = props.toolRegistry?.editorActions.length ?? props.toolRegistry?.commandPalette.length ?? 0;
197798
197926
  const state = blocked4 > 0 ? "blocked" : openComments + pendingChanges + tasks + approvals === 0 ? "empty" : "ready";
197799
- const recentAction = props.contextAnalytics?.nextActions[0]?.label ?? (blocked4 > 0 ? "Resolve blockers" : pendingChanges > 0 ? "Review pending changes" : openComments > 0 ? "Open comment thread" : "Document ready");
197927
+ const recentAction = props.contextAnalytics?.nextActions[0]?.label ?? (blocked4 > 0 ? strings.resolveBlockersAction : pendingChanges > 0 ? strings.reviewPendingChangesAction : openComments > 0 ? strings.openCommentThreadAction : strings.documentReadyAction);
197800
197928
  const nextActions = (props.contextAnalytics?.nextActions ?? []).slice(0, 2).map((action) => action.label);
197801
197929
  const visibleNextActions = nextActions.length > 0 ? nextActions : [recentAction];
197802
197930
  return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
@@ -197804,34 +197932,35 @@ function TwAnalyticsRibbon(props) {
197804
197932
  {
197805
197933
  className: "flex h-full min-w-0 flex-1 items-center overflow-hidden px-1",
197806
197934
  "data-testid": "tw-analytics-ribbon",
197935
+ "data-chrome-unit-id": "chrome.ribbon",
197807
197936
  "data-region": "rib-analytics",
197808
197937
  "data-analytics-state": state,
197809
197938
  "data-analytics-review-items": totalReviewItems,
197810
197939
  "data-analytics-tool-registry-count": toolCount,
197811
197940
  children: [
197812
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: "Document", children: [
197813
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Pages", value: props.pageCount == null ? "..." : String(props.pageCount) }),
197814
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Chars", value: formatCompactNumber(props.documentStats?.storyLength ?? 0) }),
197815
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Export", value: props.exportBlocked ? "Blocked" : "Ready", tone: props.exportBlocked ? "blocked" : "ready" })
197941
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: strings.documentGroupLabel, children: [
197942
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.pagesLabel, value: props.pageCount == null ? "..." : String(props.pageCount) }),
197943
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.charsLabel, value: formatCompactNumber(props.documentStats?.storyLength ?? 0) }),
197944
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.exportLabel, value: props.exportBlocked ? strings.blockedLabel : strings.readyLabel, tone: props.exportBlocked ? "blocked" : "ready" })
197816
197945
  ] }),
197817
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: "Review", children: [
197818
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Items", value: String(totalReviewItems), tone: totalReviewItems > 0 ? "attention" : "neutral" }),
197819
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Changes", value: pendingChanges, color: "var(--sem-warning)" }),
197820
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Comments", value: openComments, color: "var(--markup-comment-ink)" })
197946
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: strings.reviewGroupLabel, children: [
197947
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.itemsLabel, value: String(totalReviewItems), tone: totalReviewItems > 0 ? "attention" : "neutral" }),
197948
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.changesLabel, value: pendingChanges, color: "var(--sem-warning)" }),
197949
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.commentsLabel, value: openComments, color: "var(--markup-comment-ink)" })
197821
197950
  ] }),
197822
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: "Risk", children: [
197823
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Opaque", value: String(props.documentStats?.opaqueFragmentCount ?? 0), tone: (props.documentStats?.opaqueFragmentCount ?? 0) > 0 ? "attention" : "neutral" }),
197824
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Blocked", value: String(blocked4), tone: blocked4 > 0 ? "blocked" : "neutral" })
197951
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: strings.riskGroupLabel, children: [
197952
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.opaqueLabel, value: String(props.documentStats?.opaqueFragmentCount ?? 0), tone: (props.documentStats?.opaqueFragmentCount ?? 0) > 0 ? "attention" : "neutral" }),
197953
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.blockedLabel, value: String(blocked4), tone: blocked4 > 0 ? "blocked" : "neutral" })
197825
197954
  ] }),
197826
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: "Workflow", children: [
197827
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: "Scopes", value: String(scopeCount) }),
197828
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Tasks", value: tasks, color: "var(--mode-workflow)" }),
197829
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Approvals", value: approvals, color: "var(--scope-review-marker)" }),
197830
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: "Blocked", value: blocked4, color: "var(--sem-error)" })
197955
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TwRibbonGroup, { label: strings.workflowGroupLabel, children: [
197956
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FactCell, { label: strings.scopesLabel, value: String(scopeCount) }),
197957
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.tasksLabel, value: tasks, color: "var(--mode-workflow)" }),
197958
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.approvalsLabel, value: approvals, color: "var(--scope-review-marker)" }),
197959
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MetricCell, { label: strings.blockedLabel, value: blocked4, color: "var(--sem-error)" })
197831
197960
  ] }),
197832
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: "Scopes", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ScopeBreakdown, { segments: scopeRailSegments }) }),
197833
- 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,
197834
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: "Next", children: visibleNextActions.slice(0, 2).map((action, index) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
197961
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: strings.scopesGroupLabel, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ScopeBreakdown, { segments: scopeRailSegments, label: strings.scopeBreakdownLabel }) }),
197962
+ 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,
197963
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TwRibbonGroup, { label: strings.nextGroupLabel, children: visibleNextActions.slice(0, 2).map((action, index) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
197835
197964
  "span",
197836
197965
  {
197837
197966
  className: "max-w-28 truncate px-1 text-[length:var(--tx-xs)] font-medium text-[var(--ink-secondary)]",
@@ -197885,7 +198014,7 @@ function ScopeBreakdown(props) {
197885
198014
  "div",
197886
198015
  {
197887
198016
  className: "flex h-2 w-28 overflow-hidden rounded-[var(--r-1)] bg-[var(--bg-muted)]",
197888
- "aria-label": "Scope breakdown",
198017
+ "aria-label": props.label,
197889
198018
  role: "img",
197890
198019
  children: [
197891
198020
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(BreakdownSegment, { value: counts.edit, total, color: "var(--scope-edit-marker)" }),
@@ -205194,6 +205323,7 @@ var STATUS_POSTURE_PIP_CLASS = {
205194
205323
  blocked: "bg-[var(--sem-error)]"
205195
205324
  };
205196
205325
  function TwStatusBar(props) {
205326
+ const strings = useChromeStrings();
205197
205327
  const responsiveTier = props.responsiveTier ?? "wide";
205198
205328
  const atLeastCompact = responsiveTier !== "mobile";
205199
205329
  const atLeastStandard = responsiveTier === "standard" || responsiveTier === "wide";
@@ -205203,7 +205333,7 @@ function TwStatusBar(props) {
205203
205333
  const showPosture = segmentVisible("status-save-state");
205204
205334
  const preservationStatusMessage = getPreserveOnlyStatusMessage(props.preserveOnlyCount);
205205
205335
  const savePosture = props.isDirty ? "unsaved" : "ready";
205206
- const saveLabel = props.isDirty ? "Unsaved" : "Saved";
205336
+ const saveLabel = props.isDirty ? strings.unsavedLabel : strings.savedLabel;
205207
205337
  const showExportPosture = showPosture && props.isExportBlocked;
205208
205338
  const showOpenChangesPosture = showPosture && props.changeCount > 0;
205209
205339
  const openChangesLabel = `${props.changeCount} ${props.changeCount === 1 ? "change" : "changes"}`;
@@ -205233,7 +205363,7 @@ function TwStatusBar(props) {
205233
205363
  const showZoomControls = (props.zoomLevel != null || props.onZoomChange) && segmentVisible("status-zoom");
205234
205364
  const trackingEnabled = Boolean(props.trackedChangesAuthoringEnabled);
205235
205365
  const trackingDisabled = props.trackedChangesAuthoringDisabled === true || !props.onTrackedChangesAuthoringChange;
205236
- 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.";
205366
+ const trackingTitle = trackingEnabled ? strings.trackingOnDetail : strings.trackingOffDetail;
205237
205367
  const trackingControlTitle = trackingDisabled && props.trackedChangesAuthoringDisabledReason ? props.trackedChangesAuthoringDisabledReason : trackingTitle;
205238
205368
  const statusChromeMode = segmentVisible("status-mode") ? normalizeStatusChromeMode(props.chromeMode) : null;
205239
205369
  const modeLabel = statusChromeMode ? formatStatusChromeModeLabel(statusChromeMode) : null;
@@ -205312,7 +205442,7 @@ function TwStatusBar(props) {
205312
205442
  className: "inline-flex items-center gap-1",
205313
205443
  "data-testid": "status-bar-posture-export",
205314
205444
  "data-posture": "blocked",
205315
- title: "Export blocked",
205445
+ title: strings.exportBlockedLabel,
205316
205446
  children: [
205317
205447
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205318
205448
  "span",
@@ -205321,7 +205451,7 @@ function TwStatusBar(props) {
205321
205451
  className: `h-1.5 w-1.5 shrink-0 rounded-[1px] ${STATUS_POSTURE_PIP_CLASS.blocked}`
205322
205452
  }
205323
205453
  ),
205324
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: atLeastCompact ? "" : "hidden", children: "Export blocked" })
205454
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: atLeastCompact ? "" : "hidden", children: strings.exportBlockedLabel })
205325
205455
  ]
205326
205456
  }
205327
205457
  ) : null,
@@ -205355,7 +205485,7 @@ function TwStatusBar(props) {
205355
205485
  className: "flex shrink-0 items-center overflow-hidden",
205356
205486
  "data-testid": "status-bar-page-anchored-stories",
205357
205487
  "data-chrome-unit-id": "status-page-anchored-stories",
205358
- "aria-label": "Page-anchored stories not shown",
205488
+ "aria-label": strings.pageAnchoredStoriesNotShownLabel,
205359
205489
  title: `${hiddenStoryCount} page-anchored ${hiddenStoryCount === 1 ? "story" : "stories"} (headers, footers, notes) ${hiddenStoryCount === 1 ? "is" : "are"} not shown in this view`,
205360
205490
  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: [
205361
205491
  hiddenStoryCount,
@@ -205370,12 +205500,12 @@ function TwStatusBar(props) {
205370
205500
  className: `flex shrink-0 items-center overflow-hidden ${isWide ? "w-[8.75rem]" : atLeastCompact ? "w-[4rem]" : "w-7"}`,
205371
205501
  "data-testid": "status-bar-track-changes",
205372
205502
  "data-chrome-unit-id": "status-track-changes",
205373
- "aria-label": "Track changes authoring",
205503
+ "aria-label": strings.trackChangesAuthoringLabel,
205374
205504
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
205375
205505
  "button",
205376
205506
  {
205377
205507
  type: "button",
205378
- "aria-label": "Track Changes",
205508
+ "aria-label": strings.trackedChangesLabel,
205379
205509
  "aria-pressed": trackingEnabled,
205380
205510
  disabled: trackingDisabled,
205381
205511
  onClick: () => props.onTrackedChangesAuthoringChange?.(!trackingEnabled),
@@ -205412,7 +205542,7 @@ function TwStatusBar(props) {
205412
205542
  className: `shrink-0 items-center gap-1 overflow-hidden ${atLeastStandard ? "flex" : "hidden"} ${isWide ? "w-[8.75rem]" : "w-[4.25rem]"}`,
205413
205543
  "data-testid": "status-bar-markup-mode",
205414
205544
  "data-chrome-unit-id": "status-markup-display",
205415
- "aria-label": "Markup display",
205545
+ "aria-label": strings.markupDisplayLabel,
205416
205546
  children: [
205417
205547
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205418
205548
  "div",
@@ -205549,13 +205679,13 @@ function TwStatusBar(props) {
205549
205679
  className: "flex w-11 shrink-0 items-center gap-px",
205550
205680
  "data-testid": "status-bar-workspace-mode",
205551
205681
  "data-chrome-unit-id": "status-workspace-view",
205552
- "aria-label": "Workspace view",
205682
+ "aria-label": strings.workspaceViewLabel,
205553
205683
  children: [
205554
205684
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205555
205685
  StatusChromeButton,
205556
205686
  {
205557
205687
  active: props.workspace === "canvas",
205558
- ariaLabel: "Canvas view",
205688
+ ariaLabel: strings.canvasViewLabel,
205559
205689
  disabled: !props.onWorkspaceModeChange,
205560
205690
  onClick: () => props.onWorkspaceModeChange?.("canvas"),
205561
205691
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(TwGlyphIcon, { name: "desktop", className: "h-3 w-3", "aria-hidden": "true" })
@@ -205565,7 +205695,7 @@ function TwStatusBar(props) {
205565
205695
  StatusChromeButton,
205566
205696
  {
205567
205697
  active: props.workspace === "page",
205568
- ariaLabel: "Page view",
205698
+ ariaLabel: strings.pageViewLabel,
205569
205699
  disabled: !props.onWorkspaceModeChange,
205570
205700
  onClick: () => props.onWorkspaceModeChange?.("page"),
205571
205701
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(TwGlyphIcon, { name: "document", className: "h-3 w-3", "aria-hidden": "true" })
@@ -205585,13 +205715,13 @@ function TwStatusBar(props) {
205585
205715
  ].join(" "),
205586
205716
  "data-testid": "status-bar-zoom",
205587
205717
  "data-chrome-unit-id": "status-zoom",
205588
- "aria-label": "Zoom controls",
205718
+ "aria-label": strings.zoomControlsLabel,
205589
205719
  children: [
205590
205720
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205591
205721
  "button",
205592
205722
  {
205593
205723
  type: "button",
205594
- "aria-label": "Zoom out",
205724
+ "aria-label": strings.zoomOutLabel,
205595
205725
  disabled: !canDecreaseZoom,
205596
205726
  onClick: () => applyZoom(zoomPercent - STATUS_ZOOM_BUTTON_STEP),
205597
205727
  className: [
@@ -205603,7 +205733,7 @@ function TwStatusBar(props) {
205603
205733
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
205604
205734
  "input",
205605
205735
  {
205606
- "aria-label": "Zoom level",
205736
+ "aria-label": strings.zoomLevelLabel,
205607
205737
  type: "range",
205608
205738
  min: Math.min(STATUS_ZOOM_MIN, Math.floor(zoomPercent / STATUS_ZOOM_STEP) * STATUS_ZOOM_STEP),
205609
205739
  max: STATUS_ZOOM_MAX,
@@ -205634,7 +205764,7 @@ function TwStatusBar(props) {
205634
205764
  "button",
205635
205765
  {
205636
205766
  type: "button",
205637
- "aria-label": "Zoom in",
205767
+ "aria-label": strings.zoomInLabel,
205638
205768
  disabled: !canIncreaseZoom,
205639
205769
  onClick: () => applyZoom(zoomPercent + STATUS_ZOOM_BUTTON_STEP),
205640
205770
  className: [
@@ -293278,6 +293408,15 @@ var WordReviewEditorInner = (0, import_react105.forwardRef)(
293278
293408
  focusRelativeRegion(shell, shortcut.direction);
293279
293409
  return;
293280
293410
  }
293411
+ case "focus-rail": {
293412
+ internalChromeControllerRef.current?.openRailTab("comments");
293413
+ const focusRail = () => {
293414
+ shellRef.current?.querySelector('[data-wre-region="review-rail"]')?.focus();
293415
+ };
293416
+ focusRail();
293417
+ queueMicrotask(focusRail);
293418
+ return;
293419
+ }
293281
293420
  case "toggle-formatting":
293282
293421
  if (shortcut.mark === "bold") {
293283
293422
  commands.onToggleBold?.();