@beyondwork/docx-react-component 1.0.28 → 1.0.29
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/canonical-document-BLEbzL2J.d.cts +844 -0
- package/dist/canonical-document-BLEbzL2J.d.ts +844 -0
- package/dist/chunk-2FJS5GZM.js +763 -0
- package/dist/chunk-2FJS5GZM.js.map +1 -0
- package/{src/core/commands/section-layout-commands.ts → dist/chunk-2OQBZS3F.js} +106 -340
- package/dist/chunk-2OQBZS3F.js.map +1 -0
- package/dist/chunk-2S7W4KFO.js +127 -0
- package/dist/chunk-2S7W4KFO.js.map +1 -0
- package/dist/chunk-2TG72QSW.js +3874 -0
- package/dist/chunk-2TG72QSW.js.map +1 -0
- package/{src/core/commands/table-structure-commands.ts → dist/chunk-36QNIZBO.js} +126 -315
- package/dist/chunk-36QNIZBO.js.map +1 -0
- package/dist/chunk-4AQOYAW4.js +3069 -0
- package/dist/chunk-4AQOYAW4.js.map +1 -0
- package/dist/chunk-4D5EWJ3P.js +77 -0
- package/dist/chunk-4D5EWJ3P.js.map +1 -0
- package/dist/chunk-5FN54NDH.js +2257 -0
- package/dist/chunk-5FN54NDH.js.map +1 -0
- package/dist/chunk-BOYGQYRQ.js +7306 -0
- package/dist/chunk-BOYGQYRQ.js.map +1 -0
- package/dist/chunk-CN3XMECL.js +212 -0
- package/dist/chunk-CN3XMECL.js.map +1 -0
- package/dist/chunk-EBI3BX6U.js +164 -0
- package/dist/chunk-EBI3BX6U.js.map +1 -0
- package/dist/chunk-EILUG3VB.js +1275 -0
- package/dist/chunk-EILUG3VB.js.map +1 -0
- package/dist/chunk-FUDY333O.js +70 -0
- package/dist/chunk-FUDY333O.js.map +1 -0
- package/dist/chunk-GBVOWFIK.js +1237 -0
- package/dist/chunk-GBVOWFIK.js.map +1 -0
- package/dist/chunk-H4TQ3H3Y.js +262 -0
- package/dist/chunk-H4TQ3H3Y.js.map +1 -0
- package/{src/core/commands/style-commands.ts → dist/chunk-JGB3IXZO.js} +40 -113
- package/dist/chunk-JGB3IXZO.js.map +1 -0
- package/dist/chunk-KD2QRQPY.js +4342 -0
- package/dist/chunk-KD2QRQPY.js.map +1 -0
- package/dist/chunk-KLMXQVYK.js +369 -0
- package/dist/chunk-KLMXQVYK.js.map +1 -0
- package/dist/chunk-KZUG5KFQ.js +214 -0
- package/dist/chunk-KZUG5KFQ.js.map +1 -0
- package/{src/core/state/text-transaction.ts → dist/chunk-QDAQ4CJU.js} +79 -236
- package/dist/chunk-QDAQ4CJU.js.map +1 -0
- package/{src/legal/bookmarks.ts → dist/chunk-RMH72RZI.js} +44 -130
- package/dist/chunk-RMH72RZI.js.map +1 -0
- package/dist/chunk-SWKWQZXM.js +117 -0
- package/dist/chunk-SWKWQZXM.js.map +1 -0
- package/{src/core/commands/formatting-commands.ts → dist/chunk-TJBP2K4T.js} +196 -536
- package/dist/chunk-TJBP2K4T.js.map +1 -0
- package/dist/chunk-TLCEAQDQ.js +542 -0
- package/dist/chunk-TLCEAQDQ.js.map +1 -0
- package/{src/core/commands/text-commands.ts → dist/chunk-UZXBISGO.js} +86 -142
- package/dist/chunk-UZXBISGO.js.map +1 -0
- package/dist/chunk-WGBAKP3Q.js +3220 -0
- package/dist/chunk-WGBAKP3Q.js.map +1 -0
- package/dist/compare/index.cjs +5475 -0
- package/dist/compare/index.cjs.map +1 -0
- package/dist/compare/index.d.cts +114 -0
- package/dist/compare/index.d.ts +114 -0
- package/dist/compare/index.js +731 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/core/commands/formatting-commands.cjs +828 -0
- package/dist/core/commands/formatting-commands.cjs.map +1 -0
- package/dist/core/commands/formatting-commands.d.cts +63 -0
- package/dist/core/commands/formatting-commands.d.ts +63 -0
- package/dist/core/commands/formatting-commands.js +37 -0
- package/dist/core/commands/formatting-commands.js.map +1 -0
- package/dist/core/commands/image-commands.cjs +2023 -0
- package/dist/core/commands/image-commands.cjs.map +1 -0
- package/dist/core/commands/image-commands.d.cts +58 -0
- package/dist/core/commands/image-commands.d.ts +58 -0
- package/dist/core/commands/image-commands.js +18 -0
- package/dist/core/commands/image-commands.js.map +1 -0
- package/dist/core/commands/section-layout-commands.cjs +477 -0
- package/dist/core/commands/section-layout-commands.cjs.map +1 -0
- package/dist/core/commands/section-layout-commands.d.cts +62 -0
- package/dist/core/commands/section-layout-commands.d.ts +62 -0
- package/dist/core/commands/section-layout-commands.js +21 -0
- package/dist/core/commands/section-layout-commands.js.map +1 -0
- package/dist/core/commands/style-commands.cjs +214 -0
- package/dist/core/commands/style-commands.cjs.map +1 -0
- package/dist/core/commands/style-commands.d.cts +13 -0
- package/dist/core/commands/style-commands.d.ts +13 -0
- package/dist/core/commands/style-commands.js +9 -0
- package/dist/core/commands/style-commands.js.map +1 -0
- package/dist/core/commands/table-structure-commands.cjs +1883 -0
- package/dist/core/commands/table-structure-commands.cjs.map +1 -0
- package/dist/core/commands/table-structure-commands.d.cts +59 -0
- package/dist/core/commands/table-structure-commands.d.ts +59 -0
- package/dist/core/commands/table-structure-commands.js +12 -0
- package/dist/core/commands/table-structure-commands.js.map +1 -0
- package/dist/core/commands/text-commands.cjs +2391 -0
- package/dist/core/commands/text-commands.cjs.map +1 -0
- package/dist/core/commands/text-commands.d.cts +24 -0
- package/dist/core/commands/text-commands.d.ts +24 -0
- package/dist/core/commands/text-commands.js +28 -0
- package/dist/core/commands/text-commands.js.map +1 -0
- package/dist/core/selection/mapping.cjs +200 -0
- package/dist/core/selection/mapping.cjs.map +1 -0
- package/dist/core/selection/mapping.d.cts +2 -0
- package/dist/core/selection/mapping.d.ts +2 -0
- package/dist/core/selection/mapping.js +31 -0
- package/dist/core/selection/mapping.js.map +1 -0
- package/dist/core/state/editor-state.cjs +2278 -0
- package/dist/core/state/editor-state.cjs.map +1 -0
- package/dist/core/state/editor-state.d.cts +2 -0
- package/dist/core/state/editor-state.d.ts +2 -0
- package/dist/core/state/editor-state.js +26 -0
- package/dist/core/state/editor-state.js.map +1 -0
- package/dist/index.cjs +38553 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +7856 -0
- package/dist/index.js.map +1 -0
- package/dist/io/docx-session.cjs +16236 -0
- package/dist/io/docx-session.cjs.map +1 -0
- package/dist/io/docx-session.d.cts +21 -0
- package/dist/io/docx-session.d.ts +21 -0
- package/dist/io/docx-session.js +18 -0
- package/dist/io/docx-session.js.map +1 -0
- package/dist/legal/index.cjs +3900 -0
- package/dist/legal/index.cjs.map +1 -0
- package/dist/legal/index.d.cts +86 -0
- package/dist/legal/index.d.ts +86 -0
- package/dist/legal/index.js +616 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/public-types-7ZL_94cz.d.ts +1573 -0
- package/dist/public-types-CeMaDueh.d.cts +1573 -0
- package/dist/public-types.cjs +19 -0
- package/dist/public-types.cjs.map +1 -0
- package/dist/public-types.d.cts +2 -0
- package/dist/public-types.d.ts +2 -0
- package/dist/public-types.js +1 -0
- package/dist/public-types.js.map +1 -0
- package/dist/runtime/document-runtime.cjs +11140 -0
- package/dist/runtime/document-runtime.cjs.map +1 -0
- package/dist/runtime/document-runtime.d.cts +231 -0
- package/dist/runtime/document-runtime.d.ts +231 -0
- package/dist/runtime/document-runtime.js +21 -0
- package/dist/runtime/document-runtime.js.map +1 -0
- package/dist/structural-helpers-CilgOVhh.d.cts +10 -0
- package/dist/structural-helpers-q0Gd-eBN.d.ts +10 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +313 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +1 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js +23 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +1 -0
- package/dist/ui-tailwind/index.cjs +4833 -0
- package/dist/ui-tailwind/index.cjs.map +1 -0
- package/dist/ui-tailwind/index.d.cts +617 -0
- package/dist/ui-tailwind/index.d.ts +617 -0
- package/dist/ui-tailwind/index.js +575 -0
- package/dist/ui-tailwind/index.js.map +1 -0
- package/package.json +61 -41
- package/src/README.md +0 -85
- package/src/api/README.md +0 -26
- package/src/api/public-types.ts +0 -1421
- package/src/api/session-state.ts +0 -60
- package/src/compare/diff-engine.ts +0 -623
- package/src/compare/export-redlines.ts +0 -280
- package/src/compare/index.ts +0 -25
- package/src/compare/snapshot.ts +0 -97
- package/src/component-inventory.md +0 -99
- package/src/core/README.md +0 -10
- package/src/core/commands/README.md +0 -3
- package/src/core/commands/image-commands.ts +0 -373
- package/src/core/commands/index.ts +0 -1757
- package/src/core/commands/list-commands.ts +0 -565
- package/src/core/commands/paragraph-layout-commands.ts +0 -339
- package/src/core/commands/review-commands.ts +0 -108
- package/src/core/commands/structural-helpers.ts +0 -309
- package/src/core/schema/README.md +0 -3
- package/src/core/schema/text-schema.ts +0 -516
- package/src/core/search/search-text.ts +0 -357
- package/src/core/selection/README.md +0 -3
- package/src/core/selection/mapping.ts +0 -289
- package/src/core/selection/review-anchors.ts +0 -183
- package/src/core/state/README.md +0 -3
- package/src/core/state/editor-state.ts +0 -892
- package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
- package/src/formats/xlsx/io/parse-sheet.ts +0 -459
- package/src/formats/xlsx/io/parse-styles.ts +0 -59
- package/src/formats/xlsx/io/parse-workbook.ts +0 -75
- package/src/formats/xlsx/io/serialize-shared-strings.ts +0 -72
- package/src/formats/xlsx/io/serialize-sheet.ts +0 -333
- package/src/formats/xlsx/io/serialize-styles.ts +0 -98
- package/src/formats/xlsx/io/serialize-workbook.ts +0 -429
- package/src/formats/xlsx/io/xlsx-session.ts +0 -314
- package/src/formats/xlsx/model/cell.ts +0 -189
- package/src/formats/xlsx/model/sheet.ts +0 -326
- package/src/formats/xlsx/model/styles.ts +0 -118
- package/src/formats/xlsx/model/workbook.ts +0 -453
- package/src/formats/xlsx/runtime/cell-commands.ts +0 -567
- package/src/formats/xlsx/runtime/sheet-commands.ts +0 -206
- package/src/formats/xlsx/runtime/workbook-runtime.ts +0 -177
- package/src/formats/xlsx/runtime/workbook-transaction.ts +0 -822
- package/src/index.ts +0 -101
- package/src/io/README.md +0 -10
- package/src/io/docx-session.ts +0 -2882
- package/src/io/export/README.md +0 -3
- package/src/io/export/export-session.ts +0 -220
- package/src/io/export/minimal-docx.ts +0 -115
- package/src/io/export/reattach-preserved-parts.ts +0 -54
- package/src/io/export/serialize-comments.ts +0 -947
- package/src/io/export/serialize-footnotes.ts +0 -399
- package/src/io/export/serialize-headers-footers.ts +0 -372
- package/src/io/export/serialize-main-document.ts +0 -1376
- package/src/io/export/serialize-numbering.ts +0 -118
- package/src/io/export/serialize-revisions.ts +0 -389
- package/src/io/export/serialize-runtime-revisions.ts +0 -269
- package/src/io/export/serialize-tables.ts +0 -174
- package/src/io/export/split-review-boundaries.ts +0 -356
- package/src/io/normalize/README.md +0 -3
- package/src/io/normalize/normalize-text.ts +0 -639
- package/src/io/ooxml/README.md +0 -3
- package/src/io/ooxml/highlight-colors.ts +0 -39
- package/src/io/ooxml/numbering-sentinels.ts +0 -44
- package/src/io/ooxml/parse-comments.ts +0 -846
- package/src/io/ooxml/parse-complex-content.ts +0 -287
- package/src/io/ooxml/parse-fields.ts +0 -834
- package/src/io/ooxml/parse-footnotes.ts +0 -896
- package/src/io/ooxml/parse-headers-footers.ts +0 -1169
- package/src/io/ooxml/parse-inline-media.ts +0 -461
- package/src/io/ooxml/parse-main-document.ts +0 -2877
- package/src/io/ooxml/parse-numbering.ts +0 -432
- package/src/io/ooxml/parse-revisions.ts +0 -931
- package/src/io/ooxml/parse-settings.ts +0 -184
- package/src/io/ooxml/parse-shapes.ts +0 -296
- package/src/io/ooxml/parse-styles.ts +0 -463
- package/src/io/ooxml/parse-tables.ts +0 -618
- package/src/io/ooxml/parse-theme.ts +0 -346
- package/src/io/ooxml/part-manifest.ts +0 -136
- package/src/io/ooxml/revision-boundaries.ts +0 -351
- package/src/io/opc/README.md +0 -3
- package/src/io/opc/corrupt-package.ts +0 -166
- package/src/io/opc/docx-package.ts +0 -74
- package/src/io/opc/package-reader.ts +0 -325
- package/src/io/opc/package-writer.ts +0 -273
- package/src/io/source-package-provenance.ts +0 -241
- package/src/legal/cross-references.ts +0 -414
- package/src/legal/defined-terms.ts +0 -203
- package/src/legal/index.ts +0 -32
- package/src/legal/signature-blocks.ts +0 -259
- package/src/model/README.md +0 -3
- package/src/model/canonical-document.ts +0 -2632
- package/src/model/cds-1.0.0.ts +0 -212
- package/src/model/snapshot.ts +0 -649
- package/src/preservation/README.md +0 -3
- package/src/preservation/markup-compatibility.ts +0 -48
- package/src/preservation/opaque-fragment-store.ts +0 -89
- package/src/preservation/opaque-region.ts +0 -233
- package/src/preservation/package-preservation.ts +0 -113
- package/src/preservation/preserved-part-manifest.ts +0 -56
- package/src/preservation/relationship-retention.ts +0 -57
- package/src/preservation/store.ts +0 -185
- package/src/review/README.md +0 -16
- package/src/review/store/README.md +0 -3
- package/src/review/store/comment-anchors.ts +0 -70
- package/src/review/store/comment-remapping.ts +0 -154
- package/src/review/store/comment-store.ts +0 -331
- package/src/review/store/comment-thread.ts +0 -109
- package/src/review/store/revision-actions.ts +0 -394
- package/src/review/store/revision-store.ts +0 -312
- package/src/review/store/revision-types.ts +0 -171
- package/src/review/store/runtime-comment-store.ts +0 -43
- package/src/runtime/README.md +0 -3
- package/src/runtime/ai-action-policy.ts +0 -764
- package/src/runtime/document-layout.ts +0 -332
- package/src/runtime/document-navigation.ts +0 -603
- package/src/runtime/document-runtime.ts +0 -3159
- package/src/runtime/document-search.ts +0 -145
- package/src/runtime/numbering-prefix.ts +0 -216
- package/src/runtime/page-layout-estimation.ts +0 -212
- package/src/runtime/read-only-diagnostics-runtime.ts +0 -241
- package/src/runtime/review-runtime.ts +0 -44
- package/src/runtime/revision-runtime.ts +0 -107
- package/src/runtime/session-capabilities.ts +0 -192
- package/src/runtime/story-context.ts +0 -164
- package/src/runtime/story-targeting.ts +0 -162
- package/src/runtime/surface-projection.ts +0 -1357
- package/src/runtime/table-commands.ts +0 -173
- package/src/runtime/table-schema.ts +0 -309
- package/src/runtime/view-state.ts +0 -477
- package/src/runtime/virtualized-rendering.ts +0 -258
- package/src/runtime/workflow-markup.ts +0 -353
- package/src/ui/README.md +0 -30
- package/src/ui/WordReviewEditor.tsx +0 -4086
- package/src/ui/browser-export.ts +0 -52
- package/src/ui/comments/README.md +0 -3
- package/src/ui/compatibility/README.md +0 -3
- package/src/ui/editor-command-bag.ts +0 -120
- package/src/ui/editor-runtime-boundary.ts +0 -1457
- package/src/ui/editor-shell-view.tsx +0 -142
- package/src/ui/editor-surface/README.md +0 -3
- package/src/ui/editor-surface-controller.tsx +0 -61
- package/src/ui/headless/comment-decoration-model.ts +0 -124
- package/src/ui/headless/preserve-editor-selection.ts +0 -5
- package/src/ui/headless/revision-decoration-model.ts +0 -128
- package/src/ui/headless/selection-helpers.ts +0 -54
- package/src/ui/headless/selection-toolbar-model.ts +0 -34
- package/src/ui/headless/use-editor-keyboard.ts +0 -103
- package/src/ui/review/README.md +0 -3
- package/src/ui/runtime-snapshot-selectors.ts +0 -197
- package/src/ui/shared/revision-filters.ts +0 -31
- package/src/ui/status/README.md +0 -3
- package/src/ui/theme/README.md +0 -3
- package/src/ui/toolbar/README.md +0 -3
- package/src/ui/workflow-surface-blocked-rails.ts +0 -94
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -64
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +0 -129
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +0 -114
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +0 -34
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +0 -386
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -186
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +0 -139
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +0 -128
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
- package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
- package/src/ui-tailwind/editor-surface/perf-probe.ts +0 -179
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -184
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +0 -31
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -427
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
- package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -876
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -504
- package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -168
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +0 -61
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -129
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -58
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -944
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -436
- package/src/ui-tailwind/index.ts +0 -62
- package/src/ui-tailwind/page-chrome-model.ts +0 -27
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -406
- package/src/ui-tailwind/review/tw-health-panel.tsx +0 -149
- package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
- package/src/ui-tailwind/status/tw-status-bar.tsx +0 -61
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -52
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -1064
- package/src/ui-tailwind/tw-review-workspace.tsx +0 -1417
- package/src/validation/README.md +0 -3
- package/src/validation/compatibility-engine.ts +0 -634
- package/src/validation/compatibility-report.ts +0 -161
- package/src/validation/diagnostics.ts +0 -204
- package/src/validation/docx-comment-proof.ts +0 -707
- package/src/validation/import-diagnostics.ts +0 -128
- package/src/validation/low-priority-word-surfaces.ts +0 -373
- /package/{src → dist}/ui-tailwind/theme/editor-theme.css +0 -0
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { FocusEventHandler } from "react";
|
|
3
|
-
import * as Tooltip from "@radix-ui/react-tooltip";
|
|
4
|
-
import { Check, MessageSquare, Pencil, X } from "lucide-react";
|
|
5
|
-
|
|
6
|
-
import type { SuggestionCardModel } from "../../ui/headless/selection-toolbar-model";
|
|
7
|
-
import { preserveEditorSelectionMouseDown } from "../../ui/headless/preserve-editor-selection";
|
|
8
|
-
|
|
9
|
-
export interface TwSuggestionCardProps {
|
|
10
|
-
model: SuggestionCardModel;
|
|
11
|
-
onFocusCapture?: FocusEventHandler<HTMLDivElement>;
|
|
12
|
-
onBlurCapture?: FocusEventHandler<HTMLDivElement>;
|
|
13
|
-
onAccept?: () => void;
|
|
14
|
-
onReject?: () => void;
|
|
15
|
-
onEditSuggestion?: () => void;
|
|
16
|
-
onAddComment?: () => void;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const focusRingClass =
|
|
20
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-canvas";
|
|
21
|
-
|
|
22
|
-
export function TwSuggestionCard(props: TwSuggestionCardProps) {
|
|
23
|
-
const contextLabel = summarizeSuggestionContext(props.model);
|
|
24
|
-
const commentDisabled = !props.model.canAddComment;
|
|
25
|
-
const tooltipLabel = commentDisabled
|
|
26
|
-
? props.model.disabledReason ?? "Commenting is unavailable for this selection"
|
|
27
|
-
: "Comment on suggestion";
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<div
|
|
31
|
-
data-testid="suggestion-card"
|
|
32
|
-
className="inline-flex max-w-[min(28rem,calc(100vw-2rem))] flex-col gap-2 rounded-2xl border border-border/80 bg-canvas px-3 py-2 shadow-xl ring-1 ring-border/80"
|
|
33
|
-
onFocusCapture={props.onFocusCapture}
|
|
34
|
-
onBlurCapture={props.onBlurCapture}
|
|
35
|
-
role="group"
|
|
36
|
-
aria-label="Suggestion actions"
|
|
37
|
-
>
|
|
38
|
-
<div className="flex items-start justify-between gap-3">
|
|
39
|
-
<div className="min-w-0">
|
|
40
|
-
<div className="text-[11px] font-semibold uppercase tracking-[0.12em] text-warning">
|
|
41
|
-
{props.model.kindLabel}
|
|
42
|
-
</div>
|
|
43
|
-
<div className="mt-1 max-w-[16rem] truncate text-sm text-primary">
|
|
44
|
-
{props.model.previewText}
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
{contextLabel ? (
|
|
48
|
-
<div className="shrink-0 rounded-full bg-accent-soft px-2 py-0.5 text-[10px] font-medium uppercase tracking-[0.08em] text-accent">
|
|
49
|
-
{contextLabel}
|
|
50
|
-
</div>
|
|
51
|
-
) : null}
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
<div className="flex flex-wrap items-center gap-1.5">
|
|
55
|
-
<SuggestionActionButton
|
|
56
|
-
icon={<Check className="h-3.5 w-3.5" />}
|
|
57
|
-
label="Accept suggestion"
|
|
58
|
-
disabled={!props.model.canAccept}
|
|
59
|
-
tone="accept"
|
|
60
|
-
onClick={props.onAccept}
|
|
61
|
-
/>
|
|
62
|
-
<SuggestionActionButton
|
|
63
|
-
icon={<X className="h-3.5 w-3.5" />}
|
|
64
|
-
label="Reject suggestion"
|
|
65
|
-
disabled={!props.model.canReject}
|
|
66
|
-
tone="reject"
|
|
67
|
-
onClick={props.onReject}
|
|
68
|
-
/>
|
|
69
|
-
<SuggestionActionButton
|
|
70
|
-
icon={<Pencil className="h-3.5 w-3.5" />}
|
|
71
|
-
label="Edit suggestion"
|
|
72
|
-
disabled={!props.model.canEditSuggestion}
|
|
73
|
-
tone="neutral"
|
|
74
|
-
onClick={props.onEditSuggestion}
|
|
75
|
-
/>
|
|
76
|
-
<Tooltip.Root>
|
|
77
|
-
<Tooltip.Trigger asChild>
|
|
78
|
-
<button
|
|
79
|
-
type="button"
|
|
80
|
-
aria-label="Comment on suggestion"
|
|
81
|
-
disabled={commentDisabled}
|
|
82
|
-
onMouseDown={preserveEditorSelectionMouseDown}
|
|
83
|
-
onClick={props.onAddComment}
|
|
84
|
-
className={`inline-flex h-8 items-center gap-1 rounded-lg border border-border px-2.5 text-xs font-medium text-secondary transition-colors hover:bg-surface disabled:cursor-not-allowed disabled:opacity-40 ${focusRingClass}`}
|
|
85
|
-
>
|
|
86
|
-
<MessageSquare className="h-3.5 w-3.5" />
|
|
87
|
-
Comment
|
|
88
|
-
</button>
|
|
89
|
-
</Tooltip.Trigger>
|
|
90
|
-
<Tooltip.Portal>
|
|
91
|
-
<Tooltip.Content
|
|
92
|
-
className="rounded-md bg-primary px-2 py-1 text-xs text-white shadow-md z-50"
|
|
93
|
-
sideOffset={6}
|
|
94
|
-
>
|
|
95
|
-
{tooltipLabel}
|
|
96
|
-
</Tooltip.Content>
|
|
97
|
-
</Tooltip.Portal>
|
|
98
|
-
</Tooltip.Root>
|
|
99
|
-
</div>
|
|
100
|
-
</div>
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function summarizeSuggestionContext(model: SuggestionCardModel): string | null {
|
|
105
|
-
const labels = model.badges.map((badge) => badge.label.trim()).filter(Boolean);
|
|
106
|
-
if (labels.length === 0) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
const summary = labels.slice(0, 2).join(" · ");
|
|
110
|
-
return summary.length > 36 ? `${summary.slice(0, 33)}...` : summary;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function SuggestionActionButton(props: {
|
|
114
|
-
icon: React.ReactNode;
|
|
115
|
-
label: string;
|
|
116
|
-
disabled: boolean;
|
|
117
|
-
tone: "accept" | "reject" | "neutral";
|
|
118
|
-
onClick?: () => void;
|
|
119
|
-
}) {
|
|
120
|
-
const toneClass = props.tone === "accept"
|
|
121
|
-
? "border-emerald-500/30 bg-emerald-500/10 text-emerald-700 hover:bg-emerald-500/15 dark:text-emerald-300"
|
|
122
|
-
: props.tone === "reject"
|
|
123
|
-
? "border-rose-500/30 bg-rose-500/10 text-rose-700 hover:bg-rose-500/15 dark:text-rose-300"
|
|
124
|
-
: "border-border text-secondary hover:bg-surface";
|
|
125
|
-
|
|
126
|
-
return (
|
|
127
|
-
<button
|
|
128
|
-
type="button"
|
|
129
|
-
aria-label={props.label}
|
|
130
|
-
disabled={props.disabled}
|
|
131
|
-
onMouseDown={preserveEditorSelectionMouseDown}
|
|
132
|
-
onClick={props.onClick}
|
|
133
|
-
className={`inline-flex h-8 items-center gap-1 rounded-lg border px-2.5 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-40 ${toneClass} ${focusRingClass}`}
|
|
134
|
-
>
|
|
135
|
-
{props.icon}
|
|
136
|
-
{props.label.replace(" suggestion", "").replace(" on suggestion", "")}
|
|
137
|
-
</button>
|
|
138
|
-
);
|
|
139
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
import type { StyleCatalogSnapshot } from "../../api/public-types";
|
|
4
|
-
import { preserveEditorSelectionMouseDown } from "../../ui/headless/preserve-editor-selection";
|
|
5
|
-
|
|
6
|
-
export interface TwTableContextToolbarProps {
|
|
7
|
-
disabled: boolean;
|
|
8
|
-
tableStyles: StyleCatalogSnapshot["tables"];
|
|
9
|
-
onSetTableStyle?: (styleId: string) => void;
|
|
10
|
-
onAddRowBefore?: () => void;
|
|
11
|
-
onAddRowAfter?: () => void;
|
|
12
|
-
onAddColumnBefore?: () => void;
|
|
13
|
-
onAddColumnAfter?: () => void;
|
|
14
|
-
onDeleteRow?: () => void;
|
|
15
|
-
onDeleteColumn?: () => void;
|
|
16
|
-
onMergeCells?: () => void;
|
|
17
|
-
onSplitCell?: () => void;
|
|
18
|
-
onSetCellBackground?: (color: string) => void;
|
|
19
|
-
onDeleteTable?: () => void;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const CELL_COLORS = [
|
|
23
|
-
"#ffffff",
|
|
24
|
-
"#f0f0ee",
|
|
25
|
-
"#dbeafe",
|
|
26
|
-
"#fef3c7",
|
|
27
|
-
"#dcfce7",
|
|
28
|
-
"#fce7f3",
|
|
29
|
-
] as const;
|
|
30
|
-
|
|
31
|
-
export function TwTableContextToolbar(props: TwTableContextToolbarProps) {
|
|
32
|
-
return (
|
|
33
|
-
<div
|
|
34
|
-
data-testid="table-context-toolbar"
|
|
35
|
-
className="flex flex-wrap items-center gap-2 rounded-xl border border-border bg-canvas px-3 py-2 shadow-sm"
|
|
36
|
-
>
|
|
37
|
-
<span className="text-[10px] font-semibold uppercase tracking-[0.12em] text-tertiary">
|
|
38
|
-
Table
|
|
39
|
-
</span>
|
|
40
|
-
|
|
41
|
-
<select
|
|
42
|
-
aria-label="Table style"
|
|
43
|
-
className="h-8 rounded-md border border-border bg-canvas px-2 text-xs text-primary disabled:opacity-40"
|
|
44
|
-
disabled={props.disabled || props.tableStyles.length === 0 || !props.onSetTableStyle}
|
|
45
|
-
onMouseDown={preserveEditorSelectionMouseDown}
|
|
46
|
-
onChange={(event) => props.onSetTableStyle?.(event.target.value)}
|
|
47
|
-
defaultValue=""
|
|
48
|
-
>
|
|
49
|
-
<option value="" disabled>Table style</option>
|
|
50
|
-
{props.tableStyles.map((style) => (
|
|
51
|
-
<option key={style.styleId} value={style.styleId}>
|
|
52
|
-
{style.displayName}
|
|
53
|
-
</option>
|
|
54
|
-
))}
|
|
55
|
-
</select>
|
|
56
|
-
|
|
57
|
-
<ToolbarButton ariaLabel="Add row above" disabled={props.disabled} onClick={props.onAddRowBefore}>
|
|
58
|
-
Row above
|
|
59
|
-
</ToolbarButton>
|
|
60
|
-
<ToolbarButton ariaLabel="Add row below" disabled={props.disabled} onClick={props.onAddRowAfter}>
|
|
61
|
-
Row below
|
|
62
|
-
</ToolbarButton>
|
|
63
|
-
<ToolbarButton ariaLabel="Delete row" disabled={props.disabled} onClick={props.onDeleteRow}>
|
|
64
|
-
Delete row
|
|
65
|
-
</ToolbarButton>
|
|
66
|
-
<ToolbarButton ariaLabel="Add column left" disabled={props.disabled} onClick={props.onAddColumnBefore}>
|
|
67
|
-
Column left
|
|
68
|
-
</ToolbarButton>
|
|
69
|
-
<ToolbarButton ariaLabel="Add column right" disabled={props.disabled} onClick={props.onAddColumnAfter}>
|
|
70
|
-
Column right
|
|
71
|
-
</ToolbarButton>
|
|
72
|
-
<ToolbarButton ariaLabel="Delete column" disabled={props.disabled} onClick={props.onDeleteColumn}>
|
|
73
|
-
Delete column
|
|
74
|
-
</ToolbarButton>
|
|
75
|
-
<ToolbarButton ariaLabel="Merge cells" disabled={props.disabled} onClick={props.onMergeCells}>
|
|
76
|
-
Merge
|
|
77
|
-
</ToolbarButton>
|
|
78
|
-
<ToolbarButton ariaLabel="Split cell" disabled={props.disabled} onClick={props.onSplitCell}>
|
|
79
|
-
Split
|
|
80
|
-
</ToolbarButton>
|
|
81
|
-
|
|
82
|
-
<div className="flex items-center gap-1">
|
|
83
|
-
<span className="text-[11px] text-secondary">Fill</span>
|
|
84
|
-
{CELL_COLORS.map((color) => (
|
|
85
|
-
<button
|
|
86
|
-
key={color}
|
|
87
|
-
type="button"
|
|
88
|
-
aria-label={`Set cell fill ${color}`}
|
|
89
|
-
disabled={props.disabled || !props.onSetCellBackground}
|
|
90
|
-
onMouseDown={preserveEditorSelectionMouseDown}
|
|
91
|
-
onClick={() => props.onSetCellBackground?.(color)}
|
|
92
|
-
className="h-6 w-6 rounded border border-border disabled:opacity-40"
|
|
93
|
-
style={{ backgroundColor: color }}
|
|
94
|
-
/>
|
|
95
|
-
))}
|
|
96
|
-
</div>
|
|
97
|
-
|
|
98
|
-
<ToolbarButton ariaLabel="Delete table" danger disabled={props.disabled} onClick={props.onDeleteTable}>
|
|
99
|
-
Delete table
|
|
100
|
-
</ToolbarButton>
|
|
101
|
-
</div>
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function ToolbarButton(props: {
|
|
106
|
-
ariaLabel: string;
|
|
107
|
-
children: React.ReactNode;
|
|
108
|
-
danger?: boolean;
|
|
109
|
-
disabled: boolean;
|
|
110
|
-
onClick?: () => void;
|
|
111
|
-
}) {
|
|
112
|
-
return (
|
|
113
|
-
<button
|
|
114
|
-
type="button"
|
|
115
|
-
aria-label={props.ariaLabel}
|
|
116
|
-
disabled={props.disabled || !props.onClick}
|
|
117
|
-
onMouseDown={preserveEditorSelectionMouseDown}
|
|
118
|
-
onClick={props.onClick}
|
|
119
|
-
className={`inline-flex h-8 items-center rounded-md px-2 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-40 ${
|
|
120
|
-
props.danger
|
|
121
|
-
? "text-danger hover:bg-danger/10"
|
|
122
|
-
: "text-primary hover:bg-surface"
|
|
123
|
-
}`}
|
|
124
|
-
>
|
|
125
|
-
{props.children}
|
|
126
|
-
</button>
|
|
127
|
-
);
|
|
128
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { AlertTriangle } from "lucide-react";
|
|
3
|
-
|
|
4
|
-
export interface TwUnsavedModalProps {
|
|
5
|
-
open: boolean;
|
|
6
|
-
message?: string;
|
|
7
|
-
onDiscard: () => void;
|
|
8
|
-
onCancel: () => void;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function TwUnsavedModal(props: TwUnsavedModalProps) {
|
|
12
|
-
if (!props.open) return null;
|
|
13
|
-
|
|
14
|
-
return (
|
|
15
|
-
<div className="fixed inset-0 z-50 flex items-center justify-center">
|
|
16
|
-
{/* Backdrop */}
|
|
17
|
-
<div
|
|
18
|
-
className="absolute inset-0 bg-black/30 backdrop-blur-sm"
|
|
19
|
-
onClick={props.onCancel}
|
|
20
|
-
/>
|
|
21
|
-
|
|
22
|
-
{/* Modal */}
|
|
23
|
-
<div className="relative mx-4 w-full max-w-md rounded-xl bg-canvas p-6 shadow-lg ring-1 ring-border">
|
|
24
|
-
<div className="flex items-start gap-3">
|
|
25
|
-
<div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-warning-soft">
|
|
26
|
-
<AlertTriangle className="h-5 w-5 text-warning" />
|
|
27
|
-
</div>
|
|
28
|
-
<div className="flex-1">
|
|
29
|
-
<h3 className="text-base font-semibold text-primary">
|
|
30
|
-
Unsaved changes
|
|
31
|
-
</h3>
|
|
32
|
-
<p className="mt-1.5 text-sm text-secondary leading-relaxed">
|
|
33
|
-
{props.message ??
|
|
34
|
-
"You have unsaved changes that will be lost. Your work is being autosaved, but the latest edits may not be saved yet."}
|
|
35
|
-
</p>
|
|
36
|
-
</div>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
<div className="mt-5 flex justify-end gap-2">
|
|
40
|
-
<button
|
|
41
|
-
type="button"
|
|
42
|
-
onClick={props.onCancel}
|
|
43
|
-
className="rounded-lg px-4 py-2 text-sm font-medium text-secondary hover:bg-surface transition-colors"
|
|
44
|
-
>
|
|
45
|
-
Keep editing
|
|
46
|
-
</button>
|
|
47
|
-
<button
|
|
48
|
-
type="button"
|
|
49
|
-
onClick={props.onDiscard}
|
|
50
|
-
className="rounded-lg bg-danger px-4 py-2 text-sm font-medium text-white hover:bg-danger/90 transition-colors"
|
|
51
|
-
>
|
|
52
|
-
Discard changes
|
|
53
|
-
</button>
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Prompts the browser's native "unsaved changes" dialog when the user
|
|
5
|
-
* tries to close the tab or navigate away while `shouldWarn` is true.
|
|
6
|
-
*/
|
|
7
|
-
export function useBeforeUnload(shouldWarn: boolean): void {
|
|
8
|
-
useEffect(() => {
|
|
9
|
-
if (!shouldWarn) return;
|
|
10
|
-
|
|
11
|
-
function handleBeforeUnload(event: BeforeUnloadEvent) {
|
|
12
|
-
event.preventDefault();
|
|
13
|
-
// Modern browsers ignore custom messages and show their own.
|
|
14
|
-
event.returnValue = "";
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
18
|
-
return () => window.removeEventListener("beforeunload", handleBeforeUnload);
|
|
19
|
-
}, [shouldWarn]);
|
|
20
|
-
}
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
export type PerfProbeKind =
|
|
2
|
-
| "typing"
|
|
3
|
-
| "selection"
|
|
4
|
-
| "runtime.create"
|
|
5
|
-
| "snapshot.surface"
|
|
6
|
-
| "snapshot.compatibility"
|
|
7
|
-
| "snapshot.navigation"
|
|
8
|
-
| "pm.rebuild"
|
|
9
|
-
| "pm.decorations"
|
|
10
|
-
| "pm.mount"
|
|
11
|
-
| "shell.render"
|
|
12
|
-
| "workspace.chrome"
|
|
13
|
-
| "selection.sync";
|
|
14
|
-
|
|
15
|
-
export interface PerfProbeSample {
|
|
16
|
-
token: string;
|
|
17
|
-
kind: PerfProbeKind;
|
|
18
|
-
durationMs: number;
|
|
19
|
-
recordedAt: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
interface PendingProbe {
|
|
23
|
-
kind: PerfProbeKind;
|
|
24
|
-
startedAt: number;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
interface PerfProbeState {
|
|
28
|
-
enabled?: boolean;
|
|
29
|
-
nextToken?: number;
|
|
30
|
-
pending?: Record<string, PendingProbe>;
|
|
31
|
-
samples?: PerfProbeSample[];
|
|
32
|
-
maxSamples?: number;
|
|
33
|
-
invalidationCounts?: Record<string, number>;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface PerfProbeSummary {
|
|
37
|
-
samples: PerfProbeSample[];
|
|
38
|
-
latest: Partial<Record<PerfProbeKind, PerfProbeSample | null>>;
|
|
39
|
-
invalidationCounts: Record<string, number>;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
declare global {
|
|
43
|
-
interface Window {
|
|
44
|
-
__DOCX_REACT_PERF_PROBE__?: PerfProbeState;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function startPerfProbe(kind: PerfProbeKind): string | null {
|
|
49
|
-
const state = getEnabledState();
|
|
50
|
-
if (!state) {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const token = `${kind}-${state.nextToken ?? 0}`;
|
|
55
|
-
state.nextToken = (state.nextToken ?? 0) + 1;
|
|
56
|
-
state.pending ??= {};
|
|
57
|
-
state.pending[token] = {
|
|
58
|
-
kind,
|
|
59
|
-
startedAt: performance.now(),
|
|
60
|
-
};
|
|
61
|
-
return token;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export function finishPerfProbe(token: string | null | undefined): PerfProbeSample | null {
|
|
65
|
-
if (!token) {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
const state = getEnabledState();
|
|
69
|
-
if (!state?.pending?.[token]) {
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const pending = state.pending[token];
|
|
74
|
-
delete state.pending[token];
|
|
75
|
-
|
|
76
|
-
const sample: PerfProbeSample = {
|
|
77
|
-
token,
|
|
78
|
-
kind: pending.kind,
|
|
79
|
-
durationMs: performance.now() - pending.startedAt,
|
|
80
|
-
recordedAt: Date.now(),
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
pushSample(state, sample);
|
|
84
|
-
|
|
85
|
-
return sample;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function recordPerfSample(
|
|
89
|
-
kind: PerfProbeKind,
|
|
90
|
-
durationMs = 0,
|
|
91
|
-
): PerfProbeSample | null {
|
|
92
|
-
const state = getEnabledState();
|
|
93
|
-
if (!state) {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const token = `${kind}-${state.nextToken ?? 0}`;
|
|
98
|
-
state.nextToken = (state.nextToken ?? 0) + 1;
|
|
99
|
-
const sample: PerfProbeSample = {
|
|
100
|
-
token,
|
|
101
|
-
kind,
|
|
102
|
-
durationMs,
|
|
103
|
-
recordedAt: Date.now(),
|
|
104
|
-
};
|
|
105
|
-
pushSample(state, sample);
|
|
106
|
-
return sample;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export function incrementInvalidationCounter(
|
|
110
|
-
counter: string,
|
|
111
|
-
amount = 1,
|
|
112
|
-
): number {
|
|
113
|
-
const state = getEnabledState();
|
|
114
|
-
if (!state) {
|
|
115
|
-
return 0;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
state.invalidationCounts ??= {};
|
|
119
|
-
state.invalidationCounts[counter] =
|
|
120
|
-
(state.invalidationCounts[counter] ?? 0) + amount;
|
|
121
|
-
return state.invalidationCounts[counter]!;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export function getLatestPerfSummary(): PerfProbeSummary | null {
|
|
125
|
-
const state = getEnabledState();
|
|
126
|
-
const samples = state?.samples ?? [];
|
|
127
|
-
if (!state || samples.length === 0) {
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return {
|
|
132
|
-
samples: [...samples],
|
|
133
|
-
latest: buildLatestSampleMap(samples),
|
|
134
|
-
invalidationCounts: { ...(state.invalidationCounts ?? {}) },
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export function resetPerfProbeState(): void {
|
|
139
|
-
const state = getEnabledState();
|
|
140
|
-
if (!state) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
state.nextToken = 0;
|
|
144
|
-
state.pending = {};
|
|
145
|
-
state.samples = [];
|
|
146
|
-
state.invalidationCounts = {};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function getEnabledState(): PerfProbeState | null {
|
|
150
|
-
if (typeof window === "undefined") {
|
|
151
|
-
return null;
|
|
152
|
-
}
|
|
153
|
-
const state = window.__DOCX_REACT_PERF_PROBE__;
|
|
154
|
-
if (!state?.enabled) {
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
return state;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function pushSample(state: PerfProbeState, sample: PerfProbeSample): void {
|
|
161
|
-
state.samples ??= [];
|
|
162
|
-
state.samples.push(sample);
|
|
163
|
-
const maxSamples = state.maxSamples ?? 20;
|
|
164
|
-
if (state.samples.length > maxSamples) {
|
|
165
|
-
state.samples.splice(0, state.samples.length - maxSamples);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function buildLatestSampleMap(
|
|
170
|
-
samples: PerfProbeSample[],
|
|
171
|
-
): Partial<Record<PerfProbeKind, PerfProbeSample | null>> {
|
|
172
|
-
const latest: Partial<Record<PerfProbeKind, PerfProbeSample | null>> = {};
|
|
173
|
-
for (const sample of [...samples].reverse()) {
|
|
174
|
-
if (latest[sample.kind] === undefined) {
|
|
175
|
-
latest[sample.kind] = sample;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return latest;
|
|
179
|
-
}
|