@a3s-lab/office 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +121 -6
  2. package/dist/0~1403.js +20 -12
  3. package/dist/0~2805.js +241 -241
  4. package/dist/0~4980.js +1 -1
  5. package/dist/0~5050.js +1 -20
  6. package/dist/0~5093.js +547 -547
  7. package/dist/0~7048.js +31 -29
  8. package/dist/0~document-editor.js +694 -90
  9. package/dist/0~pdf-viewer.js +41 -10
  10. package/dist/0~presentation-editor.js +8 -6
  11. package/dist/0~spreadsheet-editor.js +4272 -2753
  12. package/dist/0~work-document-import-worker-client.js +237 -0
  13. package/dist/0~work-docx-export.js +1 -1
  14. package/dist/0~work-docx-import.js +3 -3
  15. package/dist/0~work-docx-large-document-import.js +559 -0
  16. package/dist/0~work-office-diagnostics.js +51 -35
  17. package/dist/0~work-pptx-import.js +2 -2
  18. package/dist/4104.js +4127 -3037
  19. package/dist/432.js +51 -7
  20. package/dist/4476.js +280 -69
  21. package/dist/5184.js +24 -2
  22. package/dist/{8928.js → 6282.js} +2338 -93
  23. package/dist/8715.js +1201 -1156
  24. package/dist/9356.js +128 -8
  25. package/dist/core.d.ts +1 -0
  26. package/dist/core.js +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/internal/features/work/editors/document-editor-support.d.ts +1 -9
  29. package/dist/internal/features/work/editors/document-external-content.d.ts +1 -1
  30. package/dist/internal/features/work/editors/presentation-slide-canvas.d.ts +3 -1
  31. package/dist/internal/features/work/editors/presentation-slide-thumbnail.d.ts +3 -2
  32. package/dist/internal/features/work/editors/presentation-thumbnail-rail.d.ts +2 -1
  33. package/dist/internal/features/work/editors/presentation-workspace.d.ts +2 -1
  34. package/dist/internal/features/work/editors/spreadsheet-border-ribbon.d.ts +5 -0
  35. package/dist/internal/features/work/editors/spreadsheet-calculation-projection.d.ts +10 -0
  36. package/dist/internal/features/work/editors/spreadsheet-cell-border-command.d.ts +3 -0
  37. package/dist/internal/features/work/editors/spreadsheet-cell-border.d.ts +14 -0
  38. package/dist/internal/features/work/editors/spreadsheet-cell-fill-command.d.ts +3 -0
  39. package/dist/internal/features/work/editors/spreadsheet-cell-fill.d.ts +12 -0
  40. package/dist/internal/features/work/editors/spreadsheet-cell-range.d.ts +14 -0
  41. package/dist/internal/features/work/editors/spreadsheet-command-catalog.d.ts +159 -0
  42. package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +8 -4
  43. package/dist/internal/features/work/editors/spreadsheet-editor-support.d.ts +8 -1
  44. package/dist/internal/features/work/editors/spreadsheet-home-format-ribbon.d.ts +10 -0
  45. package/dist/internal/features/work/editors/spreadsheet-in-place-workbook-sync.d.ts +10 -0
  46. package/dist/internal/features/work/editors/spreadsheet-operation-projection.d.ts +14 -0
  47. package/dist/internal/features/work/editors/spreadsheet-structure-selection.d.ts +7 -0
  48. package/dist/internal/features/work/editors/use-document-pagination.d.ts +5 -0
  49. package/dist/internal/features/work/editors/use-presentation-design-commands.d.ts +2 -1
  50. package/dist/internal/features/work/editors/use-spreadsheet-collaboration.d.ts +2 -1
  51. package/dist/internal/features/work/editors/use-spreadsheet-workbook-sync.d.ts +2 -1
  52. package/dist/internal/features/work/spreadsheet-history-value.d.ts +1 -0
  53. package/dist/internal/features/work/spreadsheet-sparse.d.ts +10 -0
  54. package/dist/internal/features/work/work-document-chunk-geometry.d.ts +28 -0
  55. package/dist/internal/features/work/work-document-chunk-node.d.ts +23 -0
  56. package/dist/internal/features/work/work-document-extensions.d.ts +1 -0
  57. package/dist/internal/features/work/work-document-file-io.d.ts +2 -1
  58. package/dist/internal/features/work/work-document-html-fingerprint.d.ts +15 -0
  59. package/dist/internal/features/work/work-document-import-worker-client.d.ts +13 -0
  60. package/dist/internal/features/work/work-document-import-worker-protocol.d.ts +36 -0
  61. package/dist/internal/features/work/work-document-import.worker.d.ts +1 -0
  62. package/dist/internal/features/work/work-document-incremental-layout.d.ts +1 -1
  63. package/dist/internal/features/work/work-document-integrity-index.d.ts +14 -0
  64. package/dist/internal/features/work/work-document-lazy-block.d.ts +3 -0
  65. package/dist/internal/features/work/work-document-lazy-html.d.ts +21 -0
  66. package/dist/internal/features/work/work-document-lazy-model.d.ts +29 -0
  67. package/dist/internal/features/work/work-document-lazy-pagination-measurement.d.ts +3 -0
  68. package/dist/internal/features/work/work-document-lazy-preview.d.ts +21 -0
  69. package/dist/internal/features/work/work-document-lazy-update.d.ts +14 -0
  70. package/dist/internal/features/work/work-document-model.d.ts +18 -2
  71. package/dist/internal/features/work/work-document-page-surface-registry.d.ts +16 -0
  72. package/dist/internal/features/work/work-document-pagination-dom.d.ts +1 -0
  73. package/dist/internal/features/work/work-document-pagination-types.d.ts +1 -0
  74. package/dist/internal/features/work/work-document-pagination.d.ts +1 -1
  75. package/dist/internal/features/work/work-document-text-statistics.d.ts +25 -0
  76. package/dist/internal/features/work/work-document-windowing.d.ts +23 -0
  77. package/dist/internal/features/work/work-docx-import.d.ts +2 -1
  78. package/dist/internal/features/work/work-docx-large-document-import.d.ts +35 -0
  79. package/dist/internal/features/work/work-docx-large-document-parser.d.ts +29 -0
  80. package/dist/internal/features/work/work-file-data.d.ts +7 -1
  81. package/dist/internal/features/work/work-file-import.d.ts +33 -0
  82. package/dist/internal/features/work/work-file-io.d.ts +5 -4
  83. package/dist/internal/features/work/work-file-kind.d.ts +5 -0
  84. package/dist/internal/features/work/work-markdown-file-io.d.ts +2 -1
  85. package/dist/internal/features/work/work-office-diagnostics.d.ts +12 -2
  86. package/dist/internal/features/work/work-ooxml-package.d.ts +8 -0
  87. package/dist/internal/features/work/work-pptx-import.d.ts +1 -1
  88. package/dist/internal/features/work/work-presentation-file-io.d.ts +2 -1
  89. package/dist/internal/features/work/work-presentation-layouts.d.ts +7 -1
  90. package/dist/internal/features/work/work-repository.d.ts +1 -0
  91. package/dist/internal/features/work/work-spreadsheet-compatibility-summary.d.ts +10 -0
  92. package/dist/internal/features/work/work-spreadsheet-file-export.d.ts +2 -0
  93. package/dist/internal/features/work/work-spreadsheet-file-import.d.ts +3 -0
  94. package/dist/internal/features/work/work-spreadsheet-import-diagnostics.d.ts +2 -0
  95. package/dist/internal/features/work/work-spreadsheet-import-worker-client.d.ts +6 -0
  96. package/dist/internal/features/work/work-spreadsheet-import-worker-protocol.d.ts +32 -0
  97. package/dist/internal/features/work/work-spreadsheet-import.worker.d.ts +1 -0
  98. package/dist/internal/features/work/work-spreadsheet-matrix-profile.d.ts +64 -0
  99. package/dist/internal/features/work/work-spreadsheet-package-scan-worker-client.d.ts +6 -0
  100. package/dist/internal/features/work/work-spreadsheet-package-scan-worker-protocol.d.ts +49 -0
  101. package/dist/internal/features/work/work-spreadsheet-package-scan.worker.d.ts +1 -0
  102. package/dist/internal/features/work/work-spreadsheet-protection.d.ts +2 -0
  103. package/dist/internal/features/work/work-types.d.ts +22 -0
  104. package/dist/internal/features/work/work-xlsx-formula-diagnostics.d.ts +3 -1
  105. package/dist/internal/features/work/work-xlsx-formulas.d.ts +2 -1
  106. package/dist/internal/features/work/work-xlsx-interop.d.ts +8 -17
  107. package/dist/internal/features/work/work-xlsx-pivot-diagnostics.d.ts +2 -1
  108. package/dist/internal/features/work/work-xlsx-plain-fast-path.d.ts +54 -0
  109. package/dist/internal/features/work/work-xlsx-style-gate.d.ts +1 -0
  110. package/dist/internal/features/work/work-xlsx-worksheet-scan.d.ts +12 -0
  111. package/dist/internal/features/work/work-xlsx-worksheet.d.ts +12 -0
  112. package/dist/office-kernel.wasm +0 -0
  113. package/dist/office-kernel.worker.js +31 -29
  114. package/dist/react.d.ts +7 -1
  115. package/dist/styles.css +440 -3
  116. package/dist/work-document-import.worker.js +558 -0
  117. package/dist/work-spreadsheet-import.worker.js +24745 -0
  118. package/dist/work-spreadsheet-import.worker.js.LICENSE.txt +3 -0
  119. package/dist/work-spreadsheet-package-scan.worker.js +4157 -0
  120. package/dist/work-spreadsheet-package-scan.worker.js.LICENSE.txt +11 -0
  121. package/docs/latest/en/browser-editor-architecture.md +351 -15
  122. package/package.json +26 -4
@@ -13051,8 +13051,8 @@
13051
13051
  };
13052
13052
  })();
13053
13053
  (()=>{
13054
- const MAX_LAYOUT_BLOCKS = 10000;
13055
- const MAX_LAYOUT_PAGE_STYLES = MAX_LAYOUT_BLOCKS;
13054
+ const MAX_LAYOUT_BLOCKS = 200000;
13055
+ const MAX_LAYOUT_PAGE_STYLES = 10000;
13056
13056
  const MAX_LAYOUT_EXTENT = 1000000;
13057
13057
  const MAX_LAYOUT_PAGE_INDEX = 1000000;
13058
13058
  function layoutOfficeDocumentInJavaScript(request) {
@@ -13072,10 +13072,10 @@
13072
13072
  ensurePageMetrics(pages, page);
13073
13073
  if (void 0 !== block.flowCount) {
13074
13074
  const end = index + block.flowCount;
13075
- layoutFlow(request.blocks.slice(index, end), request.blocks.slice(end), pages, page, request.page, pageStyles, end < request.blocks.length);
13075
+ layoutFlow(request.blocks, index, end, pages, page, request.page, pageStyles, end < request.blocks.length);
13076
13076
  index = end;
13077
13077
  } else {
13078
- layoutSingleBlock(block, request.blocks.slice(index + 1), pages, page, request.page, pageStyles, index + 1 < request.blocks.length);
13078
+ layoutSingleBlock(block, request.blocks, index + 1, pages, page, request.page, pageStyles, index + 1 < request.blocks.length);
13079
13079
  index += 1;
13080
13080
  }
13081
13081
  }
@@ -13119,7 +13119,7 @@
13119
13119
  }
13120
13120
  validateFlowSequences(request.blocks);
13121
13121
  }
13122
- function layoutSingleBlock(block, next, pages, page, defaultPage, pageStyles, hasMoreBlocks) {
13122
+ function layoutSingleBlock(block, blocks, nextIndex, pages, page, defaultPage, pageStyles, hasMoreBlocks) {
13123
13123
  const availableHeight = pageBodyHeight(page);
13124
13124
  let current = pages.at(-1);
13125
13125
  let currentHasContent = current.placements.length > 0;
@@ -13129,7 +13129,7 @@
13129
13129
  currentHasContent = false;
13130
13130
  }
13131
13131
  const remaining = Math.max(0, availableHeight - current.usedHeight);
13132
- const nextHeight = nextBlockPreviewHeight(next, page, defaultPage, pageStyles);
13132
+ const nextHeight = nextBlockPreviewHeight(blocks, nextIndex, page, defaultPage, pageStyles);
13133
13133
  const groupedHeight = block.height + (block.keepWithNext ? nextHeight : 0);
13134
13134
  const shouldAdvance = currentHasContent && (block.height > remaining || (block.keepTogether || block.keepWithNext) && groupedHeight <= availableHeight && groupedHeight > remaining);
13135
13135
  if (shouldAdvance) {
@@ -13139,13 +13139,13 @@
13139
13139
  placeFragment(block, current, availableHeight);
13140
13140
  if (block.breakAfter && hasMoreBlocks) pages.push(emptyPage(nextPageIndex(pages), page));
13141
13141
  }
13142
- function layoutFlow(blocks, next, pages, page, defaultPage, pageStyles, hasMoreBlocks) {
13142
+ function layoutFlow(blocks, start, end, pages, page, defaultPage, pageStyles, hasMoreBlocks) {
13143
13143
  const availableHeight = pageBodyHeight(page);
13144
- const first = blocks[0];
13145
- const last = blocks.at(-1);
13144
+ const first = blocks[start];
13145
+ const last = blocks[end - 1];
13146
13146
  if (first.breakBefore && pages.at(-1)?.placements.length) pages.push(emptyPage(nextPageIndex(pages), page));
13147
- const totalHeight = fragmentHeight(blocks, 0, blocks.length);
13148
- const nextHeight = last.keepWithNext ? nextBlockPreviewHeight(next, page, defaultPage, pageStyles) : 0;
13147
+ const totalHeight = fragmentHeight(blocks, start, end);
13148
+ const nextHeight = last.keepWithNext ? nextBlockPreviewHeight(blocks, end, page, defaultPage, pageStyles) : 0;
13149
13149
  let current = pages.at(-1);
13150
13150
  const repeatHeaderCount = first.repeatHeaderCount ?? 0;
13151
13151
  const repeatHeaderHeight = first.repeatHeaderHeight ?? 0;
@@ -13154,8 +13154,8 @@
13154
13154
  current = emptyPage(nextPageIndex(pages), page);
13155
13155
  pages.push(current);
13156
13156
  }
13157
- if (repeatHeaderCount > 0 && repeatHeaderCount < blocks.length) {
13158
- const leadingHeight = fragmentHeight(blocks, 0, repeatHeaderCount + 1);
13157
+ if (repeatHeaderCount > 0 && repeatHeaderCount < end - start) {
13158
+ const leadingHeight = fragmentHeight(blocks, start, start + repeatHeaderCount + 1);
13159
13159
  const remainingHeight = Math.max(0, availableHeight - current.usedHeight);
13160
13160
  if (current.placements.length > 0 && leadingHeight <= availableHeight && leadingHeight > remainingHeight) {
13161
13161
  current = emptyPage(nextPageIndex(pages), page);
@@ -13163,22 +13163,23 @@
13163
13163
  }
13164
13164
  }
13165
13165
  const minimum = Math.max(1, first.minimumFragmentsPerPage ?? 1);
13166
- let cursor = 0;
13167
- while(cursor < blocks.length){
13166
+ let cursor = start;
13167
+ let remainingFlowHeight = totalHeight;
13168
+ while(cursor < end){
13168
13169
  current = pages.at(-1);
13169
- if (cursor >= repeatHeaderCount && cursor > 0 && repeatHeaderHeight > 0 && 0 === current.placements.length && 0 === current.usedHeight) current.usedHeight = repeatHeaderHeight;
13170
+ if (cursor - start >= repeatHeaderCount && cursor > start && repeatHeaderHeight > 0 && 0 === current.placements.length && 0 === current.usedHeight) current.usedHeight = repeatHeaderHeight;
13170
13171
  const currentHasContent = current.placements.length > 0;
13171
13172
  const remainingHeight = Math.max(0, availableHeight - current.usedHeight);
13172
- const remainingFragments = blocks.length - cursor;
13173
- const remainingFlowHeight = fragmentHeight(blocks, cursor, blocks.length);
13173
+ const remainingFragments = end - cursor;
13174
13174
  if (nextHeight > 0 && currentHasContent && remainingFlowHeight <= remainingHeight && remainingFlowHeight + nextHeight > remainingHeight && remainingFlowHeight + nextHeight <= availableHeight) {
13175
13175
  pages.push(emptyPage(nextPageIndex(pages), page));
13176
13176
  continue;
13177
13177
  }
13178
- let fitting = fragmentsFitting(blocks, cursor, blocks.length, remainingHeight);
13178
+ let fitting = fragmentsFitting(blocks, cursor, end, remainingHeight);
13179
13179
  if (fitting === remainingFragments) {
13180
- placeFragments(blocks, cursor, blocks.length, current, availableHeight);
13181
- cursor = blocks.length;
13180
+ placeFragments(blocks, cursor, end, current, availableHeight);
13181
+ cursor = end;
13182
+ remainingFlowHeight = 0;
13182
13183
  continue;
13183
13184
  }
13184
13185
  if (0 === fitting) {
@@ -13195,18 +13196,19 @@
13195
13196
  continue;
13196
13197
  }
13197
13198
  fitting = Math.max(1, fitting);
13199
+ remainingFlowHeight -= fragmentHeight(blocks, cursor, cursor + fitting);
13198
13200
  placeFragments(blocks, cursor, cursor + fitting, current, availableHeight);
13199
13201
  cursor += fitting;
13200
- if (cursor < blocks.length) pages.push(emptyPage(nextPageIndex(pages), page));
13202
+ if (cursor < end) pages.push(emptyPage(nextPageIndex(pages), page));
13201
13203
  }
13202
13204
  if (last.breakAfter && hasMoreBlocks) pages.push(emptyPage(nextPageIndex(pages), page));
13203
13205
  }
13204
- function nextBlockPreviewHeight(blocks, currentPage, defaultPage, pageStyles) {
13205
- const first = blocks[0];
13206
+ function nextBlockPreviewHeight(blocks, start, currentPage, defaultPage, pageStyles) {
13207
+ const first = blocks[start];
13206
13208
  if (!first || first.breakBefore) return 0;
13207
13209
  if (!pageMetricsEqual(currentPage, pageMetricsForBlock(first, defaultPage, pageStyles))) return 0;
13208
13210
  const count = Math.min(2, first.flowCount ?? 1);
13209
- return fragmentHeight(blocks, 0, count);
13211
+ return fragmentHeight(blocks, start, Math.min(blocks.length, start + count));
13210
13212
  }
13211
13213
  function fragmentsFitting(blocks, start, end, availableHeight) {
13212
13214
  let used = 0;
@@ -13274,13 +13276,13 @@
13274
13276
  const count = block.flowCount;
13275
13277
  const repeatHeaderCount = block.repeatHeaderCount;
13276
13278
  const repeatHeaderHeight = block.repeatHeaderHeight;
13277
- const flow = blocks.slice(index, index + count);
13278
- if (flow.length !== count) throw kernelError('office.kernel.flow_sequence_invalid', 'A layout flow must contain its declared number of fragments.');
13279
- flow.forEach((fragment, flowIndex)=>{
13279
+ if (index + count > blocks.length) throw kernelError('office.kernel.flow_sequence_invalid', 'A layout flow must contain its declared number of fragments.');
13280
+ for(let flowIndex = 0; flowIndex < count; flowIndex += 1){
13281
+ const fragment = blocks[index + flowIndex];
13280
13282
  if (fragment.flowId !== block.flowId || fragment.flowIndex !== flowIndex || fragment.flowCount !== count || fragment.minimumFragmentsPerPage !== block.minimumFragmentsPerPage || fragment.repeatHeaderCount !== repeatHeaderCount || fragment.repeatHeaderHeight !== repeatHeaderHeight || fragment.pageStyleId !== block.pageStyleId) throw kernelError('office.kernel.flow_sequence_invalid', 'Layout flow fragments must be consecutive and consistently indexed.');
13281
13283
  if (flowIndex > 0 && fragment.breakBefore) throw kernelError('office.kernel.flow_break_invalid', 'Only the first flow fragment may request breakBefore.');
13282
13284
  if (flowIndex + 1 < count && fragment.breakAfter) throw kernelError('office.kernel.flow_break_invalid', 'Only the last flow fragment may request breakAfter.');
13283
- });
13285
+ }
13284
13286
  index += count;
13285
13287
  }
13286
13288
  }
package/dist/react.d.ts CHANGED
@@ -8,13 +8,19 @@ import type { SpreadsheetEditorProps as InternalSpreadsheetEditorProps } from '.
8
8
  import type { WorkOfficeFileAction } from './internal/features/work/editors/work-office-chrome';
9
9
  import { type OfficeSurfaceProps, type OfficeTheme } from './office-surface';
10
10
  export type OfficeEditorKind = 'document' | 'markdown' | 'spreadsheet' | 'presentation' | 'pdf';
11
+ export interface OfficeEditorPreloadOptions {
12
+ /** Overrides the packaged PDFium asset when preloading the PDF runtime. */
13
+ pdfWasmUrl?: string;
14
+ /** Also fetches PDFium WebAssembly. Disabled unless explicitly enabled. */
15
+ preloadRuntimeAssets?: boolean;
16
+ }
11
17
  /**
12
18
  * Starts loading one editor without mounting it.
13
19
  *
14
20
  * Call this from an intent signal such as hover or keyboard focus to keep the
15
21
  * initial application bundle small without adding latency to editor opening.
16
22
  */
17
- export declare function preloadOfficeEditor(kind: OfficeEditorKind): Promise<void>;
23
+ export declare function preloadOfficeEditor(kind: OfficeEditorKind, options?: OfficeEditorPreloadOptions): Promise<void>;
18
24
  export declare const defaultPdfiumWasmUrl: string;
19
25
  export declare const defaultOfficeKernelWasmUrl: string;
20
26
  export declare const defaultDocumentLayoutFontUrl: string;
package/dist/styles.css CHANGED
@@ -6912,15 +6912,181 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
6912
6912
 
6913
6913
  .work-editor-loading.ds-state-view {
6914
6914
  background: var(--a3s-bg);
6915
- flex: 1;
6915
+ flex: 1 1 0;
6916
+ justify-content: center;
6917
+ align-self: stretch;
6918
+ align-items: center;
6916
6919
  width: 100%;
6917
6920
  min-width: 0;
6918
- min-height: 0;
6921
+ max-width: none;
6922
+ height: 100%;
6923
+ min-height: 100%;
6919
6924
  margin: 0;
6925
+ padding: clamp(24px, 5vw, 56px);
6926
+ position: relative;
6927
+ overflow: hidden;
6928
+ }
6929
+
6930
+ .work-editor-loading.ds-state-view .ds-state-view-icon {
6931
+ background: none;
6932
+ border-radius: 22px;
6933
+ width: 72px;
6934
+ height: 72px;
6935
+ margin-bottom: 16px;
6936
+ }
6937
+
6938
+ .work-editor-loading-visual {
6939
+ isolation: isolate;
6940
+ place-items: center;
6941
+ width: 64px;
6942
+ height: 64px;
6943
+ display: grid;
6944
+ position: relative;
6945
+ }
6946
+
6947
+ .work-editor-loading-focus {
6948
+ z-index: -1;
6949
+ background: color-mix(in srgb, var(--a3s-blue) 10%, var(--a3s-panel));
6950
+ opacity: .44;
6951
+ border-radius: 18px;
6952
+ animation: 1.8s ease-in-out infinite work-editor-loading-focus;
6953
+ position: absolute;
6954
+ inset: 5px;
6955
+ }
6956
+
6957
+ .work-editor-loading-page {
6958
+ border: 1px solid color-mix(in srgb, var(--a3s-blue) 24%, var(--a3s-line));
6959
+ background: var(--a3s-panel);
6960
+ width: 32px;
6961
+ height: 42px;
6962
+ box-shadow: 0 10px 24px -16px color-mix(in srgb, var(--a3s-blue) 70%, black);
6963
+ border-radius: 7px;
6964
+ flex-direction: column;
6965
+ gap: 5px;
6966
+ padding: 11px 7px 8px;
6967
+ animation: 1.8s cubic-bezier(.16, 1, .3, 1) infinite work-editor-loading-page;
6968
+ display: flex;
6969
+ position: relative;
6970
+ }
6971
+
6972
+ .work-editor-loading-page:after {
6973
+ border-top: 1px solid color-mix(in srgb, var(--a3s-blue) 48%, transparent);
6974
+ border-right: 1px solid color-mix(in srgb, var(--a3s-blue) 48%, transparent);
6975
+ content: "";
6976
+ border-radius: 0 2px 0 0;
6977
+ width: 5px;
6978
+ height: 5px;
6979
+ position: absolute;
6980
+ top: 5px;
6981
+ right: 5px;
6982
+ }
6983
+
6984
+ .work-editor-loading-line {
6985
+ background: color-mix(in srgb, var(--a3s-ink) 36%, transparent);
6986
+ transform-origin: 0;
6987
+ border-radius: 2px;
6988
+ flex: 0 0 2px;
6989
+ width: 100%;
6990
+ height: 2px;
6991
+ animation: 1.8s cubic-bezier(.16, 1, .3, 1) infinite work-editor-loading-line;
6992
+ display: block;
6993
+ }
6994
+
6995
+ .work-editor-loading-line--accent {
6996
+ background: var(--a3s-blue);
6997
+ width: 68%;
6998
+ animation-delay: -120ms;
6999
+ }
7000
+
7001
+ .work-editor-loading-line--short {
7002
+ width: 76%;
7003
+ animation-delay: .12s;
6920
7004
  }
6921
7005
 
6922
7006
  .work-editor-loading.ds-state-view h2 {
7007
+ letter-spacing: -.01em;
7008
+ text-wrap: balance;
7009
+ max-width: min(360px, 100%);
6923
7010
  font-size: 13px;
7011
+ font-weight: 650;
7012
+ }
7013
+
7014
+ @keyframes work-editor-loading-focus {
7015
+ 0%, 100% {
7016
+ opacity: .34;
7017
+ transform: scale(.88);
7018
+ }
7019
+
7020
+ 48% {
7021
+ opacity: .72;
7022
+ transform: scale(1);
7023
+ }
7024
+ }
7025
+
7026
+ @keyframes work-editor-loading-page {
7027
+ 0%, 100% {
7028
+ box-shadow: 0 8px 20px -16px color-mix(in srgb, var(--a3s-blue) 56%, black);
7029
+ transform: translateY(1px);
7030
+ }
7031
+
7032
+ 48% {
7033
+ box-shadow: 0 14px 28px -14px color-mix(in srgb, var(--a3s-blue) 72%, black);
7034
+ transform: translateY(-1px);
7035
+ }
7036
+ }
7037
+
7038
+ @keyframes work-editor-loading-line {
7039
+ 0%, 12% {
7040
+ opacity: .38;
7041
+ transform: scaleX(.28);
7042
+ }
7043
+
7044
+ 44%, 72% {
7045
+ opacity: 1;
7046
+ transform: scaleX(1);
7047
+ }
7048
+
7049
+ 100% {
7050
+ opacity: .62;
7051
+ transform: scaleX(.78);
7052
+ }
7053
+ }
7054
+
7055
+ @media (prefers-reduced-motion: reduce) {
7056
+ .work-editor-loading-focus, .work-editor-loading-page, .work-editor-loading-line {
7057
+ animation: none;
7058
+ }
7059
+
7060
+ .work-editor-loading-focus {
7061
+ opacity: .56;
7062
+ transform: none;
7063
+ }
7064
+
7065
+ .work-editor-loading-line {
7066
+ opacity: 1;
7067
+ transform: none;
7068
+ }
7069
+ }
7070
+
7071
+ @media (forced-colors: active) {
7072
+ .work-editor-loading-focus {
7073
+ background: canvas;
7074
+ outline: 1px solid highlight;
7075
+ }
7076
+
7077
+ .work-editor-loading-page {
7078
+ box-shadow: none;
7079
+ background: canvas;
7080
+ border-color: canvastext;
7081
+ }
7082
+
7083
+ .work-editor-loading-line {
7084
+ background: canvastext;
7085
+ }
7086
+
7087
+ .work-editor-loading-line--accent {
7088
+ background: highlight;
7089
+ }
6924
7090
  }
6925
7091
 
6926
7092
  .work-version-history {
@@ -10727,6 +10893,10 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
10727
10893
  table-layout: auto;
10728
10894
  }
10729
10895
 
10896
+ .work-document-page .tiptap table[data-office-table-layout="autofit"][data-office-table-width-type="auto"] col, .work-document-page .tiptap table[data-office-table-layout="contents"] col {
10897
+ width: auto !important;
10898
+ }
10899
+
10730
10900
  .work-document-page .tiptap table[data-office-table-layout="fixed"] {
10731
10901
  table-layout: fixed;
10732
10902
  }
@@ -11129,13 +11299,29 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
11129
11299
  }
11130
11300
 
11131
11301
  .work-document-page .tiptap > .work-document-section {
11132
- column-count: var(--work-document-column-count, 1);
11133
11302
  column-gap: var(--work-document-column-gap, 12mm);
11134
11303
  column-rule: var(--work-document-column-rule, none);
11135
11304
  min-height: 120px;
11136
11305
  position: relative;
11137
11306
  }
11138
11307
 
11308
+ .work-document-page .tiptap > .work-document-section:not([data-section-column-count="1"]) {
11309
+ column-count: var(--work-document-column-count);
11310
+ }
11311
+
11312
+ .work-document-page .tiptap .work-document-chunk {
11313
+ width: 100%;
11314
+ display: flow-root;
11315
+ }
11316
+
11317
+ .work-document-page .tiptap .work-document-chunk.placeholder {
11318
+ box-sizing: border-box;
11319
+ pointer-events: none;
11320
+ -webkit-user-select: none;
11321
+ user-select: none;
11322
+ overflow: hidden;
11323
+ }
11324
+
11139
11325
  .work-document-page .tiptap > .work-document-section:first-child {
11140
11326
  min-height: 760px;
11141
11327
  }
@@ -11249,6 +11435,10 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
11249
11435
  table-layout: auto;
11250
11436
  }
11251
11437
 
11438
+ .work-document-preview-page table[data-office-table-layout="autofit"][data-office-table-width-type="auto"] col, .work-document-print-body table[data-office-table-layout="autofit"][data-office-table-width-type="auto"] col, .work-document-preview-page table[data-office-table-layout="contents"] col, .work-document-print-body table[data-office-table-layout="contents"] col {
11439
+ width: auto !important;
11440
+ }
11441
+
11252
11442
  .work-document-preview-page table[data-office-table-layout="fixed"], .work-document-print-body table[data-office-table-layout="fixed"] {
11253
11443
  table-layout: fixed;
11254
11444
  width: auto;
@@ -14820,6 +15010,253 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
14820
15010
  color: currentColor;
14821
15011
  }
14822
15012
 
15013
+ .work-spreadsheet-border-split-root {
15014
+ border-radius: 6px;
15015
+ flex: none;
15016
+ align-items: stretch;
15017
+ height: 29px;
15018
+ display: inline-flex;
15019
+ }
15020
+
15021
+ .work-office-ribbon .work-office-toolbar .work-spreadsheet-border-primary, .work-office-ribbon .work-office-toolbar .work-spreadsheet-border-disclosure {
15022
+ border-radius: 0;
15023
+ height: 29px;
15024
+ padding: 0;
15025
+ }
15026
+
15027
+ .work-office-ribbon .work-office-toolbar .work-spreadsheet-border-primary {
15028
+ border-radius: 6px 0 0 6px;
15029
+ width: 29px;
15030
+ min-width: 29px;
15031
+ }
15032
+
15033
+ .work-office-ribbon .work-office-toolbar .work-spreadsheet-border-disclosure {
15034
+ border-left: 1px solid color-mix(in srgb, var(--a3s-line) 72%, transparent);
15035
+ border-radius: 0 6px 6px 0;
15036
+ width: 16px;
15037
+ min-width: 16px;
15038
+ }
15039
+
15040
+ .work-spreadsheet-border-disclosure svg {
15041
+ transition: transform .12s;
15042
+ }
15043
+
15044
+ .work-spreadsheet-border-disclosure[aria-expanded="true"] svg {
15045
+ transform: rotate(180deg);
15046
+ }
15047
+
15048
+ .work-spreadsheet-border-primary:focus-visible, .work-spreadsheet-border-disclosure:focus-visible {
15049
+ box-shadow: inset 0 0 0 1px var(--work-spreadsheet-accent);
15050
+ outline: 0;
15051
+ }
15052
+
15053
+ .work-spreadsheet-border-panel {
15054
+ --work-office-menu-accent: var(--work-office-control-accent, #159469);
15055
+ width: min(292px, 100vw - 32px);
15056
+ padding: 8px;
15057
+ }
15058
+
15059
+ .work-spreadsheet-border-section-label {
15060
+ color: var(--a3s-faint);
15061
+ padding: 2px 6px 7px;
15062
+ font-size: 10px;
15063
+ font-weight: 650;
15064
+ }
15065
+
15066
+ .work-spreadsheet-border-targets {
15067
+ grid-template-columns: repeat(2, minmax(0, 1fr));
15068
+ gap: 2px;
15069
+ display: grid;
15070
+ }
15071
+
15072
+ .work-spreadsheet-border-targets > button {
15073
+ min-width: 0;
15074
+ min-height: 32px;
15075
+ color: var(--a3s-muted);
15076
+ font: inherit;
15077
+ text-align: left;
15078
+ cursor: pointer;
15079
+ background: none;
15080
+ border: 0;
15081
+ border-radius: 6px;
15082
+ grid-template-columns: 22px minmax(0, 1fr);
15083
+ align-items: center;
15084
+ gap: 7px;
15085
+ padding: 4px 7px;
15086
+ display: grid;
15087
+ }
15088
+
15089
+ .work-spreadsheet-border-targets > button:hover:not(:disabled), .work-spreadsheet-border-targets > button:focus-visible, .work-spreadsheet-border-targets > button[aria-checked="true"] {
15090
+ background: color-mix(in srgb,
15091
+ var(--work-office-menu-accent) 10%,
15092
+ var(--a3s-panel));
15093
+ color: var(--a3s-ink);
15094
+ outline: 0;
15095
+ }
15096
+
15097
+ .work-spreadsheet-border-targets > button:focus-visible {
15098
+ box-shadow: inset 0 0 0 1px var(--work-office-menu-accent);
15099
+ }
15100
+
15101
+ .work-spreadsheet-border-targets > button:disabled {
15102
+ cursor: not-allowed;
15103
+ opacity: .4;
15104
+ }
15105
+
15106
+ .work-spreadsheet-border-targets > button > span:last-child {
15107
+ text-overflow: ellipsis;
15108
+ white-space: nowrap;
15109
+ font-size: 11px;
15110
+ overflow: hidden;
15111
+ }
15112
+
15113
+ .work-spreadsheet-border-glyph {
15114
+ border: 1px solid color-mix(in srgb, currentcolor 34%, transparent);
15115
+ width: 17px;
15116
+ height: 17px;
15117
+ color: var(--work-office-menu-accent, var(--work-spreadsheet-accent));
15118
+ flex: 0 0 17px;
15119
+ display: block;
15120
+ position: relative;
15121
+ }
15122
+
15123
+ .work-spreadsheet-border-glyph:before, .work-spreadsheet-border-glyph:after {
15124
+ content: "";
15125
+ position: absolute;
15126
+ }
15127
+
15128
+ .work-spreadsheet-border-glyph[data-border-target="top"] {
15129
+ border-top: 2px solid;
15130
+ }
15131
+
15132
+ .work-spreadsheet-border-glyph[data-border-target="bottom"] {
15133
+ border-bottom: 2px solid;
15134
+ }
15135
+
15136
+ .work-spreadsheet-border-glyph[data-border-target="left"] {
15137
+ border-left: 2px solid;
15138
+ }
15139
+
15140
+ .work-spreadsheet-border-glyph[data-border-target="right"] {
15141
+ border-right: 2px solid;
15142
+ }
15143
+
15144
+ .work-spreadsheet-border-glyph[data-border-target="outside"], .work-spreadsheet-border-glyph[data-border-target="all"] {
15145
+ border: 2px solid;
15146
+ }
15147
+
15148
+ .work-spreadsheet-border-glyph[data-border-target="inside"]:before, .work-spreadsheet-border-glyph[data-border-target="all"]:before, .work-spreadsheet-border-glyph[data-border-target="vertical"]:before {
15149
+ border-left: 1px solid;
15150
+ top: 1px;
15151
+ bottom: 1px;
15152
+ left: 7px;
15153
+ }
15154
+
15155
+ .work-spreadsheet-border-glyph[data-border-target="inside"]:after, .work-spreadsheet-border-glyph[data-border-target="all"]:after, .work-spreadsheet-border-glyph[data-border-target="horizontal"]:after {
15156
+ border-top: 1px solid;
15157
+ top: 7px;
15158
+ left: 1px;
15159
+ right: 1px;
15160
+ }
15161
+
15162
+ .work-spreadsheet-border-glyph[data-border-target="none"] {
15163
+ border-style: dashed;
15164
+ }
15165
+
15166
+ .work-spreadsheet-border-glyph[data-border-target="none"]:before, .work-spreadsheet-border-glyph[data-border-target="diagonal"]:before {
15167
+ border-top: 1px solid;
15168
+ top: 7px;
15169
+ left: -1px;
15170
+ right: -1px;
15171
+ transform: rotate(-45deg);
15172
+ }
15173
+
15174
+ .work-spreadsheet-border-glyph[data-border-target="none"]:after {
15175
+ border-top: 1px solid;
15176
+ top: 7px;
15177
+ left: -1px;
15178
+ right: -1px;
15179
+ transform: rotate(45deg);
15180
+ }
15181
+
15182
+ .work-spreadsheet-border-settings {
15183
+ border-top: 1px solid var(--a3s-line);
15184
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
15185
+ gap: 8px;
15186
+ margin-top: 8px;
15187
+ padding: 9px 6px 2px;
15188
+ display: grid;
15189
+ }
15190
+
15191
+ .work-spreadsheet-border-settings > label {
15192
+ min-width: 0;
15193
+ color: var(--a3s-faint);
15194
+ gap: 5px;
15195
+ font-size: 10px;
15196
+ display: grid;
15197
+ }
15198
+
15199
+ .work-spreadsheet-border-settings select, .work-spreadsheet-border-color-control {
15200
+ border: 1px solid var(--a3s-line);
15201
+ background: var(--a3s-panel);
15202
+ width: 100%;
15203
+ min-width: 0;
15204
+ height: 30px;
15205
+ color: var(--a3s-ink);
15206
+ font: inherit;
15207
+ border-radius: 6px;
15208
+ }
15209
+
15210
+ .work-spreadsheet-border-settings select {
15211
+ padding-inline: 7px;
15212
+ }
15213
+
15214
+ .work-spreadsheet-border-color-control {
15215
+ grid-template-columns: 18px minmax(0, 1fr);
15216
+ align-items: center;
15217
+ gap: 5px;
15218
+ padding: 0 6px;
15219
+ display: grid;
15220
+ position: relative;
15221
+ }
15222
+
15223
+ .work-spreadsheet-border-color-control input {
15224
+ cursor: pointer;
15225
+ opacity: 0;
15226
+ width: 100%;
15227
+ height: 100%;
15228
+ position: absolute;
15229
+ inset: 0;
15230
+ }
15231
+
15232
+ .work-spreadsheet-border-color-swatch {
15233
+ border: 1px solid var(--a3s-line-strong);
15234
+ border-radius: 4px;
15235
+ width: 16px;
15236
+ height: 16px;
15237
+ }
15238
+
15239
+ .work-spreadsheet-border-color-control output {
15240
+ color: var(--a3s-muted);
15241
+ text-overflow: ellipsis;
15242
+ font-size: 9px;
15243
+ overflow: hidden;
15244
+ }
15245
+
15246
+ @media (width <= 480px) {
15247
+ .work-spreadsheet-border-panel {
15248
+ width: min(276px, 100vw - 24px);
15249
+ }
15250
+
15251
+ .work-spreadsheet-border-targets > button {
15252
+ min-height: 44px;
15253
+ }
15254
+
15255
+ .work-spreadsheet-border-settings {
15256
+ grid-template-columns: 1fr;
15257
+ }
15258
+ }
15259
+
14823
15260
  .work-spreadsheet-sheet-list {
14824
15261
  min-width: 220px;
14825
15262
  }