@beyondwork/docx-react-component 1.0.27 → 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 +64 -54
- package/src/README.md +0 -85
- package/src/api/README.md +0 -26
- package/src/api/public-types.ts +0 -1418
- 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/collab-review-sync.ts +0 -254
- 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 -4097
- 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 -63
- 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-collab-plugins.ts +0 -40
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -178
- 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 -973
- 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,111 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
import type { SelectionSnapshot, SurfaceInlineSegment } from "../../api/public-types";
|
|
4
|
-
import type { CommentDecorationModel } from "../../ui/headless/comment-decoration-model";
|
|
5
|
-
import { getCommentHighlightClass, getCommentRangeState, type MarkupDisplay } from "../../ui/headless/comment-decoration-model";
|
|
6
|
-
import type { RevisionDecorationModel } from "../../ui/headless/revision-decoration-model";
|
|
7
|
-
import { getRevisionHighlightClass, shouldHideInCleanMode } from "../../ui/headless/revision-decoration-model";
|
|
8
|
-
import { createSelectionSnapshot, selectionTouchesRange } from "../../ui/headless/selection-helpers";
|
|
9
|
-
import { TwInlineToken } from "./tw-inline-token";
|
|
10
|
-
|
|
11
|
-
export interface TwSegmentViewProps {
|
|
12
|
-
segment: SurfaceInlineSegment;
|
|
13
|
-
selection: SelectionSnapshot;
|
|
14
|
-
markupDisplay: MarkupDisplay;
|
|
15
|
-
commentDecorations?: CommentDecorationModel;
|
|
16
|
-
revisionDecorations?: RevisionDecorationModel;
|
|
17
|
-
onSelectionChange?: (selection: SelectionSnapshot) => void;
|
|
18
|
-
onCommentActivated?: (commentId: string) => void;
|
|
19
|
-
onRevisionActivated?: (revisionId: string) => void;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function TwSegmentView(props: TwSegmentViewProps) {
|
|
23
|
-
const { segment, selection, markupDisplay } = props;
|
|
24
|
-
|
|
25
|
-
// Non-text segments delegate to TwInlineToken
|
|
26
|
-
if (segment.kind === "tab" || segment.kind === "hard_break" || segment.kind === "image" || segment.kind === "opaque_inline") {
|
|
27
|
-
return (
|
|
28
|
-
<TwInlineToken
|
|
29
|
-
segment={segment}
|
|
30
|
-
selection={selection}
|
|
31
|
-
markupDisplay={markupDisplay}
|
|
32
|
-
commentDecorations={props.commentDecorations}
|
|
33
|
-
onSelectionChange={props.onSelectionChange}
|
|
34
|
-
/>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (segment.kind !== "text") {
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Text segment: render character-by-character for click-to-position editing
|
|
43
|
-
const characters = Array.from(segment.text);
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<>
|
|
47
|
-
{characters.map((character, index) => {
|
|
48
|
-
const from = segment.from + index;
|
|
49
|
-
const to = from + 1;
|
|
50
|
-
const isSelected = selectionTouchesRange(selection, from, to);
|
|
51
|
-
|
|
52
|
-
// Hide deletions in clean mode
|
|
53
|
-
if (shouldHideInCleanMode(props.revisionDecorations, from, to) && markupDisplay === "clean") {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const commentClass = getCommentHighlightClass(props.commentDecorations, from, to, markupDisplay);
|
|
58
|
-
const revisionClass = getRevisionHighlightClass(props.revisionDecorations, from, to, markupDisplay);
|
|
59
|
-
|
|
60
|
-
// Check if clicking this char should activate a comment or revision
|
|
61
|
-
const commentState = getCommentRangeState(props.commentDecorations, from, to);
|
|
62
|
-
const overlappingComment = commentState.overlapping[0];
|
|
63
|
-
|
|
64
|
-
// Build mark classes
|
|
65
|
-
let markClasses = "";
|
|
66
|
-
if (segment.marks) {
|
|
67
|
-
if (segment.marks.includes("bold")) markClasses += "font-bold ";
|
|
68
|
-
if (segment.marks.includes("italic")) markClasses += "italic ";
|
|
69
|
-
if (segment.marks.includes("underline")) markClasses += "underline ";
|
|
70
|
-
if (segment.marks.includes("strikethrough")) markClasses += "line-through ";
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const hyperlinkClass = segment.hyperlinkHref
|
|
74
|
-
? "text-accent underline decoration-1 underline-offset-2 "
|
|
75
|
-
: "";
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<button
|
|
79
|
-
key={`${segment.segmentId}-${from}`}
|
|
80
|
-
type="button"
|
|
81
|
-
tabIndex={-1}
|
|
82
|
-
onMouseDown={(event) => {
|
|
83
|
-
event.preventDefault();
|
|
84
|
-
props.onSelectionChange?.(createSelectionSnapshot(to));
|
|
85
|
-
|
|
86
|
-
// Activate comment/revision on click if decorated
|
|
87
|
-
if (overlappingComment) {
|
|
88
|
-
props.onCommentActivated?.(overlappingComment.commentId);
|
|
89
|
-
}
|
|
90
|
-
}}
|
|
91
|
-
data-comment-id={overlappingComment?.commentId}
|
|
92
|
-
className={[
|
|
93
|
-
"relative inline border-none bg-transparent cursor-text whitespace-pre p-0 m-0",
|
|
94
|
-
"text-[15px] text-primary leading-normal",
|
|
95
|
-
commentClass,
|
|
96
|
-
revisionClass,
|
|
97
|
-
markClasses,
|
|
98
|
-
hyperlinkClass,
|
|
99
|
-
isSelected ? "bg-surface-hover rounded-[3px]" : "",
|
|
100
|
-
].filter(Boolean).join(" ")}
|
|
101
|
-
>
|
|
102
|
-
{character}
|
|
103
|
-
{selection.isCollapsed && selection.anchor === from ? (
|
|
104
|
-
<span aria-hidden="true" className="absolute left-0 top-[0.1em] w-0.5 h-[1em] bg-accent rounded-full animate-wre-blink pointer-events-none" />
|
|
105
|
-
) : null}
|
|
106
|
-
</button>
|
|
107
|
-
);
|
|
108
|
-
})}
|
|
109
|
-
</>
|
|
110
|
-
);
|
|
111
|
-
}
|
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ProseMirror NodeView implementations for table nodes.
|
|
3
|
-
*
|
|
4
|
-
* These NodeViews render table structure as proper HTML tables with
|
|
5
|
-
* colspan/rowspan support for merged cells. Horizontal merges come
|
|
6
|
-
* directly from `colspan`/`gridSpan`. Vertical merges can be rendered
|
|
7
|
-
* from either explicit `rowspan` attrs or OOXML `verticalMerge`
|
|
8
|
-
* chains when upstream projection has not yet materialized row spans.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { Node as PMNode } from "prosemirror-model";
|
|
12
|
-
import type { NodeViewConstructor, ViewMutationRecord } from "prosemirror-view";
|
|
13
|
-
|
|
14
|
-
const TABLE_LAYOUT_SYNC_EVENT = "pm-table-layout-sync";
|
|
15
|
-
|
|
16
|
-
interface TableCellLayout {
|
|
17
|
-
cellIndex: number;
|
|
18
|
-
colSpan: number;
|
|
19
|
-
hidden: boolean;
|
|
20
|
-
rowSpan: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
interface OpenVerticalMerge {
|
|
24
|
-
col: number;
|
|
25
|
-
colSpan: number;
|
|
26
|
-
continuedThisRow: boolean;
|
|
27
|
-
layout: TableCellLayout;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
interface OpenExplicitRowSpan {
|
|
31
|
-
col: number;
|
|
32
|
-
colSpan: number;
|
|
33
|
-
remainingRows: number;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function readRowPadding(node: PMNode, side: "gridBefore" | "gridAfter"): number {
|
|
37
|
-
const value = node.attrs[side];
|
|
38
|
-
return typeof value === "number" && value > 0 ? value : 0;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function sumGridColumns(
|
|
42
|
-
gridColumns: readonly number[],
|
|
43
|
-
start: number,
|
|
44
|
-
count: number,
|
|
45
|
-
): number {
|
|
46
|
-
let total = 0;
|
|
47
|
-
for (let index = start; index < start + count; index += 1) {
|
|
48
|
-
total += gridColumns[index] ?? 0;
|
|
49
|
-
}
|
|
50
|
-
return total;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function removePaddingCells(rowElement: HTMLTableRowElement): void {
|
|
54
|
-
for (const cell of Array.from(rowElement.cells)) {
|
|
55
|
-
if (cell.hasAttribute("data-row-padding")) {
|
|
56
|
-
cell.remove();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function createPaddingCell(colSpan: number, widthTwips: number): HTMLTableCellElement {
|
|
62
|
-
const cell = document.createElement("td");
|
|
63
|
-
cell.setAttribute("data-row-padding", "true");
|
|
64
|
-
cell.setAttribute("aria-hidden", "true");
|
|
65
|
-
cell.colSpan = Math.max(1, colSpan);
|
|
66
|
-
cell.style.border = "none";
|
|
67
|
-
cell.style.padding = "0";
|
|
68
|
-
cell.style.background = "transparent";
|
|
69
|
-
if (widthTwips > 0) {
|
|
70
|
-
cell.style.width = `${widthTwips / 20}pt`;
|
|
71
|
-
}
|
|
72
|
-
return cell;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function nodesAreOnlyRowPadding(nodes: ArrayLike<Node> & { item?(index: number): Node | null }): boolean {
|
|
76
|
-
for (let index = 0; index < nodes.length; index += 1) {
|
|
77
|
-
const node = nodes.item ? nodes.item(index) : nodes[index];
|
|
78
|
-
if (!node) {
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
if (!(node instanceof HTMLElement) || !node.hasAttribute("data-row-padding")) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function resolveRenderedColspan(node: PMNode): number {
|
|
89
|
-
const colspan = node.attrs.colspan as number | undefined;
|
|
90
|
-
if (typeof colspan === "number" && colspan > 1) {
|
|
91
|
-
return colspan;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const gridSpan = node.attrs.gridSpan as number | undefined;
|
|
95
|
-
if (typeof gridSpan === "number" && gridSpan > 1) {
|
|
96
|
-
return gridSpan;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return 1;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function resolveRenderedRowspan(node: PMNode): number {
|
|
103
|
-
const rowspan = node.attrs.rowspan as number | undefined;
|
|
104
|
-
return typeof rowspan === "number" && rowspan > 1 ? rowspan : 1;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function readVerticalMerge(node: PMNode): "restart" | "continue" | null {
|
|
108
|
-
const value = node.attrs.verticalMerge;
|
|
109
|
-
return value === "restart" || value === "continue" ? value : null;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function isColumnCoveredBySpan(spans: readonly OpenExplicitRowSpan[], column: number): boolean {
|
|
113
|
-
return spans.some(
|
|
114
|
-
(span) => column >= span.col && column < span.col + span.colSpan,
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function findVerticalMergeOwner(
|
|
119
|
-
openVerticalMerges: readonly OpenVerticalMerge[],
|
|
120
|
-
column: number,
|
|
121
|
-
colSpan: number,
|
|
122
|
-
): OpenVerticalMerge | null {
|
|
123
|
-
const matchingByWidth = openVerticalMerges.find(
|
|
124
|
-
(merge) => merge.col >= column && merge.colSpan === colSpan,
|
|
125
|
-
);
|
|
126
|
-
if (matchingByWidth) {
|
|
127
|
-
return matchingByWidth;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return openVerticalMerges.find((merge) => merge.col >= column) ?? null;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function computeTableLayout(tableNode: PMNode): TableCellLayout[][] {
|
|
134
|
-
const rowLayouts: TableCellLayout[][] = [];
|
|
135
|
-
const openVerticalMerges: OpenVerticalMerge[] = [];
|
|
136
|
-
const openExplicitRowSpans: OpenExplicitRowSpan[] = [];
|
|
137
|
-
|
|
138
|
-
for (let rowIndex = 0; rowIndex < tableNode.childCount; rowIndex += 1) {
|
|
139
|
-
for (const merge of openVerticalMerges) {
|
|
140
|
-
merge.continuedThisRow = false;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const rowNode = tableNode.child(rowIndex);
|
|
144
|
-
const layoutRow: TableCellLayout[] = [];
|
|
145
|
-
let column = 0;
|
|
146
|
-
|
|
147
|
-
for (let cellIndex = 0; cellIndex < rowNode.childCount; cellIndex += 1) {
|
|
148
|
-
const cellNode = rowNode.child(cellIndex);
|
|
149
|
-
const colSpan = resolveRenderedColspan(cellNode);
|
|
150
|
-
const explicitRowSpan = resolveRenderedRowspan(cellNode);
|
|
151
|
-
const verticalMerge = readVerticalMerge(cellNode);
|
|
152
|
-
|
|
153
|
-
if (verticalMerge === "continue") {
|
|
154
|
-
const owner = findVerticalMergeOwner(openVerticalMerges, column, colSpan);
|
|
155
|
-
if (owner) {
|
|
156
|
-
owner.layout.rowSpan += 1;
|
|
157
|
-
owner.continuedThisRow = true;
|
|
158
|
-
layoutRow.push({
|
|
159
|
-
cellIndex,
|
|
160
|
-
colSpan,
|
|
161
|
-
hidden: true,
|
|
162
|
-
rowSpan: 1,
|
|
163
|
-
});
|
|
164
|
-
column = owner.col + owner.colSpan;
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
while (isColumnCoveredBySpan(openExplicitRowSpans, column)) {
|
|
170
|
-
column += 1;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const layout: TableCellLayout = {
|
|
174
|
-
cellIndex,
|
|
175
|
-
colSpan,
|
|
176
|
-
hidden: false,
|
|
177
|
-
rowSpan: explicitRowSpan,
|
|
178
|
-
};
|
|
179
|
-
layoutRow.push(layout);
|
|
180
|
-
|
|
181
|
-
if (verticalMerge === "restart") {
|
|
182
|
-
openVerticalMerges.push({
|
|
183
|
-
col: column,
|
|
184
|
-
colSpan,
|
|
185
|
-
continuedThisRow: true,
|
|
186
|
-
layout,
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (explicitRowSpan > 1) {
|
|
191
|
-
openExplicitRowSpans.push({
|
|
192
|
-
col: column,
|
|
193
|
-
colSpan,
|
|
194
|
-
remainingRows: explicitRowSpan - 1,
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
column += colSpan;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
for (let index = openVerticalMerges.length - 1; index >= 0; index -= 1) {
|
|
202
|
-
if (!openVerticalMerges[index]?.continuedThisRow) {
|
|
203
|
-
openVerticalMerges.splice(index, 1);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
for (let index = openExplicitRowSpans.length - 1; index >= 0; index -= 1) {
|
|
208
|
-
const span = openExplicitRowSpans[index];
|
|
209
|
-
if (!span) {
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
span.remainingRows -= 1;
|
|
213
|
-
if (span.remainingRows <= 0) {
|
|
214
|
-
openExplicitRowSpans.splice(index, 1);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
rowLayouts.push(layoutRow);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
return rowLayouts;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function syncRenderedTableLayout(tableBody: HTMLTableSectionElement, tableNode: PMNode): void {
|
|
225
|
-
const rowLayouts = computeTableLayout(tableNode);
|
|
226
|
-
const rowElements = Array.from(tableBody.rows);
|
|
227
|
-
const gridColumns = Array.isArray(tableNode.attrs.gridColumns) ? tableNode.attrs.gridColumns as number[] : [];
|
|
228
|
-
|
|
229
|
-
for (let rowIndex = 0; rowIndex < rowLayouts.length; rowIndex += 1) {
|
|
230
|
-
const rowLayout = rowLayouts[rowIndex];
|
|
231
|
-
const rowElement = rowElements[rowIndex];
|
|
232
|
-
if (!rowLayout || !rowElement) {
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
removePaddingCells(rowElement);
|
|
237
|
-
const cellElements = Array.from(rowElement.cells);
|
|
238
|
-
for (const cellLayout of rowLayout) {
|
|
239
|
-
const element = cellElements[cellLayout.cellIndex];
|
|
240
|
-
if (!element) {
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
element.colSpan = cellLayout.colSpan > 1 ? cellLayout.colSpan : 1;
|
|
245
|
-
element.rowSpan = cellLayout.hidden ? 1 : cellLayout.rowSpan > 1 ? cellLayout.rowSpan : 1;
|
|
246
|
-
element.style.display = cellLayout.hidden ? "none" : "";
|
|
247
|
-
|
|
248
|
-
if (cellLayout.hidden) {
|
|
249
|
-
element.setAttribute("aria-hidden", "true");
|
|
250
|
-
element.setAttribute("data-vertical-merge-hidden", "true");
|
|
251
|
-
} else {
|
|
252
|
-
element.removeAttribute("aria-hidden");
|
|
253
|
-
element.removeAttribute("data-vertical-merge-hidden");
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
const rowNode = tableNode.child(rowIndex);
|
|
258
|
-
const gridBefore = readRowPadding(rowNode, "gridBefore");
|
|
259
|
-
const gridAfter = readRowPadding(rowNode, "gridAfter");
|
|
260
|
-
if (gridBefore > 0) {
|
|
261
|
-
rowElement.insertBefore(
|
|
262
|
-
createPaddingCell(gridBefore, sumGridColumns(gridColumns, 0, gridBefore)),
|
|
263
|
-
rowElement.firstChild,
|
|
264
|
-
);
|
|
265
|
-
}
|
|
266
|
-
if (gridAfter > 0) {
|
|
267
|
-
const start = Math.max(0, gridColumns.length - gridAfter);
|
|
268
|
-
rowElement.appendChild(
|
|
269
|
-
createPaddingCell(gridAfter, sumGridColumns(gridColumns, start, gridAfter)),
|
|
270
|
-
);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
function requestTableLayoutSync(start: HTMLElement): void {
|
|
276
|
-
const table = start.closest("[data-pm-table-root='true']");
|
|
277
|
-
table?.dispatchEvent(new Event(TABLE_LAYOUT_SYNC_EVENT));
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* NodeView for the table node.
|
|
282
|
-
* Renders as <table><tbody>...</tbody></table>.
|
|
283
|
-
* ProseMirror places row content into the tbody via contentDOM.
|
|
284
|
-
*/
|
|
285
|
-
export class TableNodeView {
|
|
286
|
-
dom: HTMLElement;
|
|
287
|
-
contentDOM: HTMLTableSectionElement;
|
|
288
|
-
private node: PMNode;
|
|
289
|
-
private syncQueued = false;
|
|
290
|
-
private readonly onSyncRequest: EventListener;
|
|
291
|
-
|
|
292
|
-
constructor(node: PMNode) {
|
|
293
|
-
this.node = node;
|
|
294
|
-
|
|
295
|
-
const table = document.createElement("table");
|
|
296
|
-
table.className = "border-collapse w-full my-2 text-sm";
|
|
297
|
-
table.setAttribute("data-pm-table-root", "true");
|
|
298
|
-
|
|
299
|
-
const tbody = document.createElement("tbody");
|
|
300
|
-
table.appendChild(tbody);
|
|
301
|
-
|
|
302
|
-
this.dom = table;
|
|
303
|
-
this.contentDOM = tbody;
|
|
304
|
-
this.onSyncRequest = () => {
|
|
305
|
-
this.scheduleLayoutSync();
|
|
306
|
-
};
|
|
307
|
-
this.dom.addEventListener(TABLE_LAYOUT_SYNC_EVENT, this.onSyncRequest);
|
|
308
|
-
this.scheduleLayoutSync();
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
update(node: PMNode): boolean {
|
|
312
|
-
if (node.type !== this.node.type) {
|
|
313
|
-
return false;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
this.node = node;
|
|
317
|
-
this.scheduleLayoutSync();
|
|
318
|
-
return true;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
destroy(): void {
|
|
322
|
-
this.dom.removeEventListener(TABLE_LAYOUT_SYNC_EVENT, this.onSyncRequest);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
ignoreMutation(record: ViewMutationRecord): boolean {
|
|
326
|
-
if (record.type === "attributes") {
|
|
327
|
-
return record.target === this.dom
|
|
328
|
-
|| (record.target instanceof HTMLElement && record.target.hasAttribute("data-row-padding"));
|
|
329
|
-
}
|
|
330
|
-
if (record.type === "childList" && this.dom.contains(record.target)) {
|
|
331
|
-
const addedNodes = record.addedNodes as ArrayLike<Node> & { item?(index: number): Node | null };
|
|
332
|
-
const removedNodes = record.removedNodes as ArrayLike<Node> & { item?(index: number): Node | null };
|
|
333
|
-
const addedOkay = (addedNodes?.length ?? 0) === 0 || nodesAreOnlyRowPadding(addedNodes);
|
|
334
|
-
const removedOkay = (removedNodes?.length ?? 0) === 0 || nodesAreOnlyRowPadding(removedNodes);
|
|
335
|
-
return addedOkay && removedOkay;
|
|
336
|
-
}
|
|
337
|
-
return false;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
private scheduleLayoutSync(): void {
|
|
341
|
-
if (this.syncQueued) {
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
this.syncQueued = true;
|
|
345
|
-
queueMicrotask(() => {
|
|
346
|
-
this.syncQueued = false;
|
|
347
|
-
syncRenderedTableLayout(this.contentDOM, this.node);
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* NodeView for table_row nodes.
|
|
354
|
-
* Renders as <tr>...</tr>.
|
|
355
|
-
*/
|
|
356
|
-
export class TableRowNodeView {
|
|
357
|
-
dom: HTMLElement;
|
|
358
|
-
contentDOM: HTMLElement;
|
|
359
|
-
|
|
360
|
-
constructor(_node: PMNode) {
|
|
361
|
-
const tr = document.createElement("tr");
|
|
362
|
-
this.dom = tr;
|
|
363
|
-
this.contentDOM = tr;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/**
|
|
368
|
-
* NodeView for table_cell and table_header_cell nodes.
|
|
369
|
-
*
|
|
370
|
-
* Applies colspan immediately and defers final rowspan/vertical-merge
|
|
371
|
-
* layout to the owning table node view.
|
|
372
|
-
*/
|
|
373
|
-
export class TableCellNodeView {
|
|
374
|
-
dom: HTMLElement;
|
|
375
|
-
contentDOM: HTMLElement;
|
|
376
|
-
|
|
377
|
-
constructor(node: PMNode) {
|
|
378
|
-
const isHeader = (node.type.spec as { tableRole?: string }).tableRole === "header_cell";
|
|
379
|
-
const cell = document.createElement(isHeader ? "th" : "td");
|
|
380
|
-
|
|
381
|
-
cell.className = isHeader
|
|
382
|
-
? "border border-primary/20 p-2 align-top font-semibold bg-surface-raised"
|
|
383
|
-
: "border border-primary/20 p-2 align-top";
|
|
384
|
-
|
|
385
|
-
const colspan = resolveRenderedColspan(node);
|
|
386
|
-
const rowspan = resolveRenderedRowspan(node);
|
|
387
|
-
if (colspan > 1) {
|
|
388
|
-
(cell as HTMLTableCellElement).colSpan = colspan;
|
|
389
|
-
}
|
|
390
|
-
if (rowspan > 1) {
|
|
391
|
-
(cell as HTMLTableCellElement).rowSpan = rowspan;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
this.dom = cell;
|
|
395
|
-
this.contentDOM = cell;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Update the DOM when the node's attrs change (e.g., after a merge/split operation).
|
|
400
|
-
* Return false to let ProseMirror rebuild the node view from scratch.
|
|
401
|
-
*/
|
|
402
|
-
update(node: PMNode): boolean {
|
|
403
|
-
const isHeader = (node.type.spec as { tableRole?: string }).tableRole === "header_cell";
|
|
404
|
-
const expectedTag = isHeader ? "TH" : "TD";
|
|
405
|
-
if (this.dom.tagName !== expectedTag) {
|
|
406
|
-
return false;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
const colspan = resolveRenderedColspan(node);
|
|
410
|
-
const rowspan = resolveRenderedRowspan(node);
|
|
411
|
-
const cell = this.dom as HTMLTableCellElement;
|
|
412
|
-
cell.colSpan = colspan > 1 ? colspan : 1;
|
|
413
|
-
cell.rowSpan = rowspan > 1 ? rowspan : 1;
|
|
414
|
-
cell.style.display = "";
|
|
415
|
-
cell.removeAttribute("aria-hidden");
|
|
416
|
-
cell.removeAttribute("data-vertical-merge-hidden");
|
|
417
|
-
requestTableLayoutSync(this.dom);
|
|
418
|
-
return true;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
ignoreMutation(record: ViewMutationRecord): boolean {
|
|
422
|
-
return record.type === "attributes" && record.target === this.dom;
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
/**
|
|
427
|
-
* NodeView factory map for use with EditorView.nodeViews.
|
|
428
|
-
*
|
|
429
|
-
* Pass this object directly to the EditorView constructor options:
|
|
430
|
-
* new EditorView(mount, { nodeViews: tableNodeViews, ... })
|
|
431
|
-
*/
|
|
432
|
-
export const tableNodeViews: { [node: string]: NodeViewConstructor } = {
|
|
433
|
-
table: (node: PMNode) => new TableNodeView(node),
|
|
434
|
-
table_cell: (node: PMNode) => new TableCellNodeView(node),
|
|
435
|
-
table_header_cell: (node: PMNode) => new TableCellNodeView(node),
|
|
436
|
-
};
|
package/src/ui-tailwind/index.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
// Workspace shell
|
|
2
|
-
export { TwReviewWorkspace, type TwReviewWorkspaceProps } from "./tw-review-workspace";
|
|
3
|
-
|
|
4
|
-
// Editor surface
|
|
5
|
-
export { TwEditorSurface, type TwEditorSurfaceProps } from "./editor-surface/tw-editor-surface";
|
|
6
|
-
export { TwParagraphBlock } from "./editor-surface/tw-paragraph-block";
|
|
7
|
-
export { TwOpaqueBlock } from "./editor-surface/tw-opaque-block";
|
|
8
|
-
export { TwSegmentView } from "./editor-surface/tw-segment-view";
|
|
9
|
-
export { TwInlineToken } from "./editor-surface/tw-inline-token";
|
|
10
|
-
export { renderTwCaret } from "./editor-surface/tw-caret";
|
|
11
|
-
|
|
12
|
-
// Review rail
|
|
13
|
-
export { TwReviewRail, type TwReviewRailProps, type ReviewRailTab } from "./review/tw-review-rail";
|
|
14
|
-
export { TwCommentSidebar } from "./review/tw-comment-sidebar";
|
|
15
|
-
export { TwRevisionSidebar } from "./review/tw-revision-sidebar";
|
|
16
|
-
export { TwHealthPanel } from "./review/tw-health-panel";
|
|
17
|
-
|
|
18
|
-
// Toolbar
|
|
19
|
-
export { TwToolbar, type TwToolbarProps } from "./toolbar/tw-toolbar";
|
|
20
|
-
export { TwToolbarIconButton } from "./toolbar/tw-toolbar-icon-button";
|
|
21
|
-
export type { WorkspaceMode, ZoomLevel } from "../api/public-types";
|
|
22
|
-
|
|
23
|
-
// Status
|
|
24
|
-
export { TwStatusBar } from "./status/tw-status-bar";
|
|
25
|
-
|
|
26
|
-
// Chrome
|
|
27
|
-
export { TwAlertBanner } from "./chrome/tw-alert-banner";
|
|
28
|
-
export { TwSelectionToolbar } from "./chrome/tw-selection-toolbar";
|
|
29
|
-
|
|
30
|
-
// Session capabilities
|
|
31
|
-
export {
|
|
32
|
-
deriveCapabilities,
|
|
33
|
-
type SessionCapabilities,
|
|
34
|
-
} from "../runtime/session-capabilities";
|
|
35
|
-
|
|
36
|
-
// Headless (re-export for convenience)
|
|
37
|
-
export {
|
|
38
|
-
createCommentDecorationModel,
|
|
39
|
-
getCommentHighlightClass,
|
|
40
|
-
getCommentRangeState,
|
|
41
|
-
type CommentDecorationModel,
|
|
42
|
-
type MarkupDisplay,
|
|
43
|
-
} from "../ui/headless/comment-decoration-model";
|
|
44
|
-
|
|
45
|
-
export {
|
|
46
|
-
createRevisionDecorationModel,
|
|
47
|
-
getRevisionHighlightClass,
|
|
48
|
-
getRevisionRangeState,
|
|
49
|
-
shouldHideInCleanMode,
|
|
50
|
-
type RevisionDecorationModel,
|
|
51
|
-
} from "../ui/headless/revision-decoration-model";
|
|
52
|
-
|
|
53
|
-
export {
|
|
54
|
-
createEditorKeyboardHandler,
|
|
55
|
-
type EditorKeyboardCallbacks,
|
|
56
|
-
type EditorKeyboardContext,
|
|
57
|
-
} from "../ui/headless/use-editor-keyboard";
|
|
58
|
-
|
|
59
|
-
export {
|
|
60
|
-
createSelectionSnapshot,
|
|
61
|
-
selectionTouchesRange,
|
|
62
|
-
} from "../ui/headless/selection-helpers";
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
DocumentNavigationSnapshot,
|
|
3
|
-
PageLayoutSnapshot,
|
|
4
|
-
SurfaceBlockSnapshot,
|
|
5
|
-
} from "../api/public-types.ts";
|
|
6
|
-
|
|
7
|
-
export interface LineMarker {
|
|
8
|
-
id: string;
|
|
9
|
-
label: string;
|
|
10
|
-
topPx: number;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function computeLineMarkersIfEnabled(input: {
|
|
14
|
-
pageLayout: PageLayoutSnapshot | undefined;
|
|
15
|
-
surfaceBlocks: readonly SurfaceBlockSnapshot[];
|
|
16
|
-
pages: ReadonlyArray<DocumentNavigationSnapshot["pages"][number]>;
|
|
17
|
-
buildLineNumberMarkers: (
|
|
18
|
-
blocks: readonly SurfaceBlockSnapshot[],
|
|
19
|
-
pages: ReadonlyArray<DocumentNavigationSnapshot["pages"][number]>,
|
|
20
|
-
) => LineMarker[];
|
|
21
|
-
}): LineMarker[] {
|
|
22
|
-
if (!input.pageLayout?.lineNumbering) {
|
|
23
|
-
return [];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return input.buildLineNumberMarkers(input.surfaceBlocks, input.pages);
|
|
27
|
-
}
|