docxodus 9.5.0 → 9.7.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.
@@ -6694,6 +6694,19 @@ var DocxEditor = class _DocxEditor {
6694
6694
  get sessionHandle() {
6695
6695
  return this.handle;
6696
6696
  }
6697
+ /**
6698
+ * Repaint from the live session after it was mutated OUTSIDE the editor's own
6699
+ * commands — a host driving {@link sessionHandle} directly (an agent pipeline,
6700
+ * `raw.replaceXml`, a batch import). Continuous mode patches incrementally from
6701
+ * the render plan (a Unid-preserving single-block mutation repaints just that
6702
+ * block); paginated mode — or anything the reconciler cannot prove — remounts.
6703
+ * The editor cannot observe external mutations, so the host owns calling this
6704
+ * once per mutation batch.
6705
+ */
6706
+ refresh() {
6707
+ this.assertOpen();
6708
+ this.reconcile();
6709
+ }
6697
6710
  /** Move one top-level body block relative to another and repaint from the live session. */
6698
6711
  moveBlock(sourceAnchorId, targetAnchorId, position) {
6699
6712
  this.assertOpen();
@@ -8865,23 +8878,38 @@ var DocxEditor = class _DocxEditor {
8865
8878
  };
8866
8879
 
8867
8880
  // src/ribbon-chrome.ts
8868
- var RIBBON_STYLE_VERSION = "5";
8881
+ var RIBBON_STYLE_VERSION = "8";
8869
8882
  var RIBBON_STYLE_ATTR = "data-docxodus-ribbon-styles";
8870
8883
  var RIBBON_CSS = `
8871
8884
  .dxr {
8872
- --dxr-ink: #101418;
8885
+ /* OS-Legal design tokens (github.com/Open-Source-Legal/OS-Legal-Style):
8886
+ deep-teal accent, slate foreground scale, warm neutral surfaces, and
8887
+ "light touch" shadows at 0.03-0.06 opacity \u2014 structure over decoration. */
8888
+ --dxr-ink: #1e293b;
8873
8889
  --dxr-sheet: #ffffff;
8874
- --dxr-chrome: #eef1f6;
8875
- --dxr-chrome-sunk: #e3e8f0;
8876
- --dxr-rule: #d3dae4;
8877
- --dxr-accent: #1f5fd0;
8878
- --dxr-wash: #dde8fb;
8879
- --dxr-muted: #5d6975;
8880
- --dxr-data: #0b6f6a;
8881
- --dxr-danger: #a3341f;
8882
- --dxr-desk: #dfe3ea;
8883
- --dxr-ui: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
8890
+ --dxr-chrome: #ffffff;
8891
+ --dxr-chrome-sunk: #f8fafc;
8892
+ --dxr-rule: #e2e8f0;
8893
+ --dxr-rule-strong: #cbd5e1;
8894
+ --dxr-accent: #0f766e;
8895
+ --dxr-accent-hover: #0d9488;
8896
+ --dxr-accent-active: #115e59;
8897
+ --dxr-wash: #f0fdfa;
8898
+ --dxr-wash-on: #ccfbf1;
8899
+ --dxr-muted: #475569;
8900
+ --dxr-faint: #94a3b8;
8901
+ --dxr-data: #0f766e;
8902
+ --dxr-danger: #dc2626;
8903
+ --dxr-danger-wash: #fef2f2;
8904
+ --dxr-desk: #f1f5f9;
8905
+ --dxr-ui: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
8906
+ --dxr-serif: Georgia, "Times New Roman", serif;
8884
8907
  --dxr-mono: ui-monospace, SFMono-Regular, "Cascadia Mono", Consolas, monospace;
8908
+ --dxr-shadow-sm: 0 1px 2px rgba(15, 23, 42, .04);
8909
+ --dxr-shadow-md: 0 1px 3px rgba(15, 23, 42, .06), 0 4px 6px rgba(15, 23, 42, .03);
8910
+ --dxr-shadow-lg: 0 4px 6px rgba(15, 23, 42, .05), 0 10px 15px rgba(15, 23, 42, .04);
8911
+ --dxr-shadow-xl: 0 8px 16px rgba(15, 23, 42, .06), 0 20px 25px rgba(15, 23, 42, .05);
8912
+ --dxr-ease: cubic-bezier(.4, 0, .2, 1);
8885
8913
  --dxr-tap: 30px;
8886
8914
 
8887
8915
  position: relative;
@@ -8897,6 +8925,18 @@ var RIBBON_CSS = `
8897
8925
  }
8898
8926
  .dxr *, .dxr *::before, .dxr *::after { box-sizing: border-box; }
8899
8927
 
8928
+ /* \u2500\u2500 Card frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
8929
+ A drop-in embed carries its OWN boundary instead of hoping the host clips it:
8930
+ rounded corners, a hairline, and the house elevation. overflow: clip keeps
8931
+ the sticky chrome, scrollbars, and the loading overlay inside the curve.
8932
+ Full-bleed hosts mount with data-frame="flush" and stay edge-to-edge. */
8933
+ .dxr[data-frame="card"] {
8934
+ border: 1px solid var(--dxr-rule);
8935
+ border-radius: 14px;
8936
+ box-shadow: var(--dxr-shadow-xl);
8937
+ overflow: clip;
8938
+ }
8939
+
8900
8940
  /* Touch devices get bigger hit targets everywhere the token is used. */
8901
8941
  @media (pointer: coarse) { .dxr { --dxr-tap: 40px; } }
8902
8942
 
@@ -8925,12 +8965,13 @@ var RIBBON_CSS = `
8925
8965
  font-weight: 600;
8926
8966
  letter-spacing: -.01em;
8927
8967
  }
8968
+ /* A filled circle, echoing the OS-Legal "Node" motif rather than a diamond. */
8928
8969
  .dxr-brand .dxr-mark {
8929
8970
  flex: 0 0 auto;
8930
8971
  width: 9px;
8931
8972
  height: 9px;
8973
+ border-radius: 50%;
8932
8974
  background: var(--dxr-accent);
8933
- clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
8934
8975
  }
8935
8976
  .dxr-brand .dxr-docname {
8936
8977
  overflow: hidden;
@@ -8962,25 +9003,25 @@ var RIBBON_CSS = `
8962
9003
  scrollbar-width: none;
8963
9004
  }
8964
9005
  .dxr-tabs::-webkit-scrollbar { display: none; }
9006
+ /* Line-variant tabs (the house Tabs default): no boxes, no fills \u2014 the selected
9007
+ tab is a 2px accent underline sitting on the panel's own hairline. */
8965
9008
  .dxr-tab {
8966
9009
  flex: 0 0 auto;
8967
- padding: 6px 15px 7px;
8968
- border: 1px solid transparent;
8969
- border-bottom: none;
8970
- border-radius: 5px 5px 0 0;
9010
+ padding: 7px 14px 8px;
9011
+ border: none;
8971
9012
  background: none;
8972
9013
  color: var(--dxr-muted);
8973
9014
  font: inherit;
8974
9015
  font-size: 12.5px;
9016
+ font-weight: 500;
8975
9017
  cursor: pointer;
9018
+ transition: color .15s var(--dxr-ease), box-shadow .15s var(--dxr-ease);
8976
9019
  }
8977
- .dxr-tab:hover { color: var(--dxr-ink); background: #e6ebf3; }
9020
+ .dxr-tab:hover { color: var(--dxr-ink); }
8978
9021
  .dxr-tab[aria-selected="true"] {
8979
9022
  color: var(--dxr-ink);
8980
9023
  font-weight: 600;
8981
- background: var(--dxr-chrome-sunk);
8982
- border-color: var(--dxr-rule);
8983
- box-shadow: inset 0 2px 0 var(--dxr-accent);
9024
+ box-shadow: inset 0 -2px 0 var(--dxr-accent);
8984
9025
  }
8985
9026
  /* Contextual tab \u2014 present only while the caret is inside a table. */
8986
9027
  .dxr-tab[data-contextual] { color: var(--dxr-accent); }
@@ -9010,7 +9051,7 @@ var RIBBON_CSS = `
9010
9051
  .dxr-group:last-child { border-right: none; }
9011
9052
  .dxr-group:first-child { padding-left: 0; }
9012
9053
  .dxr-glabel {
9013
- color: var(--dxr-muted);
9054
+ color: var(--dxr-faint);
9014
9055
  font-size: 9.5px;
9015
9056
  font-weight: 600;
9016
9057
  letter-spacing: .11em;
@@ -9019,48 +9060,69 @@ var RIBBON_CSS = `
9019
9060
  .dxr-row { display: flex; gap: 3px; align-items: center; }
9020
9061
 
9021
9062
  /* \u2500\u2500 Controls \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
9063
+ /* One button family, house-style: every control is a ghost \u2014 no borders, no
9064
+ fills, no per-button boxes. Hover paints a quiet slate wash; the active
9065
+ (toggled) state paints a teal one. Save alone is the flat primary, so the
9066
+ surface has exactly one accent-colored action. */
9022
9067
  .dxr button, .dxr label.dxr-btn {
9023
9068
  min-height: var(--dxr-tap);
9024
9069
  padding: 5px 9px;
9025
- border: 1px solid transparent;
9026
- border-radius: 4px;
9070
+ border: none;
9071
+ border-radius: 6px;
9027
9072
  background: none;
9028
9073
  color: var(--dxr-ink);
9029
9074
  font: inherit;
9030
9075
  font-size: 13px;
9076
+ font-weight: 500;
9031
9077
  line-height: 1.15;
9032
9078
  cursor: pointer;
9079
+ transition: background-color .15s var(--dxr-ease), color .15s var(--dxr-ease),
9080
+ box-shadow .15s var(--dxr-ease), transform .15s var(--dxr-ease);
9033
9081
  }
9034
9082
  .dxr label.dxr-btn { display: inline-flex; align-items: center; }
9035
- .dxr button:hover, .dxr label.dxr-btn:hover { background: #d6deea; }
9036
- .dxr button:active { background: #c8d3e3; }
9083
+ .dxr button:hover, .dxr label.dxr-btn:hover { background: #f1f5f9; }
9084
+ .dxr button:active { background: #e2e8f0; }
9037
9085
  .dxr button:disabled { opacity: .38; cursor: default; background: none; }
9038
- .dxr button.dxr-on { color: var(--dxr-accent); background: var(--dxr-wash); border-color: #b3ccf2; }
9039
- .dxr-quick button, .dxr-quick label.dxr-btn {
9040
- padding: 4px 10px;
9041
- border-color: var(--dxr-rule);
9042
- background: #f7f9fc;
9043
- font-size: 12.5px;
9044
- }
9045
- .dxr-quick button:hover, .dxr-quick label.dxr-btn:hover { background: #fff; border-color: #b9c4d4; }
9046
- .dxr-quick button:disabled:hover { background: #f7f9fc; border-color: var(--dxr-rule); }
9047
- .dxr button.dxr-icon { min-width: var(--dxr-tap); text-align: center; }
9086
+ .dxr button.dxr-on { color: var(--dxr-accent); background: var(--dxr-wash-on); }
9087
+ .dxr-quick button, .dxr-quick label.dxr-btn { padding: 4px 10px; font-size: 12.5px; }
9088
+ /* Save \u2014 the house primary: flat accent, sm shadow, the 1px lift on hover. */
9089
+ .dxr-quick button[data-dxr="save"]:not(:disabled) {
9090
+ background: var(--dxr-accent);
9091
+ color: #fff;
9092
+ font-weight: 600;
9093
+ box-shadow: var(--dxr-shadow-sm);
9094
+ }
9095
+ .dxr-quick button[data-dxr="save"]:not(:disabled):hover {
9096
+ background: var(--dxr-accent-hover);
9097
+ box-shadow: var(--dxr-shadow-md);
9098
+ transform: translateY(-1px);
9099
+ }
9100
+ .dxr-quick button[data-dxr="save"]:not(:disabled):active {
9101
+ background: var(--dxr-accent-active);
9102
+ box-shadow: var(--dxr-shadow-sm);
9103
+ transform: translateY(0);
9104
+ }
9105
+ /* Icon controls sit quieter than text ones until touched (house IconButton). */
9106
+ .dxr button.dxr-icon { min-width: var(--dxr-tap); text-align: center; color: var(--dxr-muted); }
9107
+ .dxr button.dxr-icon:hover:not(:disabled) { color: var(--dxr-ink); }
9108
+ .dxr button.dxr-icon.dxr-on { color: var(--dxr-accent); }
9048
9109
  /* Icons are inline SVG drawn from the same shapes the control acts on (text lines,
9049
9110
  rules), so alignment and indent read at a glance instead of relying on arrow
9050
9111
  glyphs that collide with undo/redo. currentColor keeps them in step with state. */
9051
9112
  .dxr button svg { display: block; margin: 0 auto; fill: currentColor; }
9052
9113
  .dxr button.dxr-wide { display: inline-flex; align-items: center; justify-content: center; gap: 6px; }
9053
- .dxr button.dxr-danger:hover { color: var(--dxr-danger); background: #f6dcd6; }
9114
+ .dxr button.dxr-danger:hover { color: var(--dxr-danger); background: var(--dxr-danger-wash); }
9054
9115
  .dxr select, .dxr input[type="number"], .dxr input[type="text"] {
9055
9116
  min-height: var(--dxr-tap);
9056
9117
  padding: 4px 6px;
9057
9118
  border: 1px solid var(--dxr-rule);
9058
- border-radius: 4px;
9059
- background: #f7f9fc;
9119
+ border-radius: 6px;
9120
+ background: var(--dxr-sheet);
9060
9121
  color: var(--dxr-ink);
9061
9122
  font: inherit;
9062
9123
  font-size: 12.5px;
9063
9124
  }
9125
+ .dxr select:hover, .dxr input:hover { border-color: var(--dxr-rule-strong); }
9064
9126
  .dxr select:focus-visible, .dxr input:focus-visible, .dxr button:focus-visible,
9065
9127
  .dxr .dxr-tab:focus-visible, .dxr label.dxr-btn:focus-within {
9066
9128
  outline: 2px solid var(--dxr-accent);
@@ -9091,7 +9153,7 @@ var RIBBON_CSS = `
9091
9153
  height: 25px;
9092
9154
  padding: 0 10px;
9093
9155
  overflow-x: auto;
9094
- background: #f7f9fc;
9156
+ background: #fafafa;
9095
9157
  border-top: 1px solid var(--dxr-rule);
9096
9158
  color: var(--dxr-muted);
9097
9159
  font-family: var(--dxr-mono);
@@ -9110,7 +9172,7 @@ var RIBBON_CSS = `
9110
9172
  .dxr-rail .dxr-cell:first-child { padding-left: 0; }
9111
9173
  .dxr-rail .dxr-cell:last-child { border-right: none; }
9112
9174
  .dxr-rail .dxr-k {
9113
- color: #8b96a3;
9175
+ color: var(--dxr-faint);
9114
9176
  font-family: var(--dxr-ui);
9115
9177
  font-size: 9.5px;
9116
9178
  letter-spacing: .1em;
@@ -9118,7 +9180,7 @@ var RIBBON_CSS = `
9118
9180
  }
9119
9181
  .dxr-rail .dxr-v { color: var(--dxr-data); }
9120
9182
  .dxr-rail .dxr-v.dxr-flash { animation: dxr-railflash .45s ease-out; }
9121
- @keyframes dxr-railflash { from { background: #b9ecdf; } to { background: transparent; } }
9183
+ @keyframes dxr-railflash { from { background: #ccfbf1; } to { background: transparent; } }
9122
9184
 
9123
9185
  /* \u2500\u2500 Hint \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
9124
9186
  .dxr-hint {
@@ -9133,8 +9195,8 @@ var RIBBON_CSS = `
9133
9195
  .dxr-hint kbd {
9134
9196
  padding: 0 4px;
9135
9197
  border: 1px solid var(--dxr-rule);
9136
- border-radius: 3px;
9137
- background: #e8ecf3;
9198
+ border-radius: 4px;
9199
+ background: #f1f5f9;
9138
9200
  font-family: var(--dxr-mono);
9139
9201
  font-size: 11px;
9140
9202
  }
@@ -9149,13 +9211,34 @@ var RIBBON_CSS = `
9149
9211
  SHOULD win.
9150
9212
  (No backticks in this file's comments: the stylesheet is a template literal.) */
9151
9213
  .dxr-scroll { flex: 1 1 auto; min-height: 0; overflow: auto; -webkit-overflow-scrolling: touch; }
9214
+ /* Soft scroll boundaries: content dissolves at the chrome and at the bottom edge
9215
+ instead of hard-clipping. Sticky gradient veils cost one paint layer each and
9216
+ never intercept input. */
9217
+ .dxr-scroll::before, .dxr-scroll::after {
9218
+ content: "";
9219
+ position: sticky;
9220
+ z-index: 3;
9221
+ display: block;
9222
+ height: 26px;
9223
+ pointer-events: none;
9224
+ }
9225
+ .dxr-scroll::before {
9226
+ top: 0;
9227
+ margin-bottom: -26px;
9228
+ background: linear-gradient(to bottom, var(--dxr-desk), transparent);
9229
+ }
9230
+ .dxr-scroll::after {
9231
+ bottom: 0;
9232
+ margin-top: -26px;
9233
+ background: linear-gradient(to top, var(--dxr-desk), transparent);
9234
+ }
9152
9235
  .dxr[data-chrome] .dxr-surface { margin: 26px auto; padding: 0 16px 96px; }
9153
9236
  .dxr-surface [contenteditable="true"]:focus {
9154
9237
  outline: 2px solid var(--dxr-accent);
9155
9238
  outline-offset: 2px;
9156
9239
  border-radius: 2px;
9157
9240
  }
9158
- @media (hover: hover) { .dxr-surface [contenteditable="true"]:hover { background: #f2f7ff; } }
9241
+ @media (hover: hover) { .dxr-surface [contenteditable="true"]:hover { background: var(--dxr-wash); } }
9159
9242
 
9160
9243
  /* Header/footer bands: stories live in their own OOXML parts outside the body,
9161
9244
  so they dock as their own regions. Styled from the same tokens as the ribbon
@@ -9167,9 +9250,10 @@ var RIBBON_CSS = `
9167
9250
  margin: 0 auto 14px;
9168
9251
  padding: 9px 72px 13px;
9169
9252
  border: 1px solid var(--dxr-rule);
9170
- border-left: 2px solid #c2ccd9;
9171
- border-radius: 3px;
9253
+ border-left: 2px solid #5eead4;
9254
+ border-radius: 6px;
9172
9255
  background: var(--dxr-sheet);
9256
+ box-shadow: var(--dxr-shadow-sm);
9173
9257
  }
9174
9258
  .dxr-surface .docx-hf-band + .docx-body-flow { margin-top: 0; }
9175
9259
  .dxr-surface .docx-hf-band[data-hf-band="footer"] { margin: 14px auto 0; }
@@ -9188,8 +9272,8 @@ var RIBBON_CSS = `
9188
9272
  .dxr-surface .docx-hf-chrome select, .dxr-surface .docx-hf-chrome input {
9189
9273
  padding: 3px 5px;
9190
9274
  border: 1px solid var(--dxr-rule);
9191
- border-radius: 4px;
9192
- background: #f7f9fc;
9275
+ border-radius: 6px;
9276
+ background: var(--dxr-sheet);
9193
9277
  color: var(--dxr-ink);
9194
9278
  font: inherit;
9195
9279
  font-family: var(--dxr-ui);
@@ -9203,22 +9287,22 @@ var RIBBON_CSS = `
9203
9287
  .dxr-surface .docx-hf-warning {
9204
9288
  margin: 0 0 8px -60px;
9205
9289
  padding: 7px 9px;
9206
- border: 1px solid #e8d9a8;
9207
- border-left: 2px solid #c9a227;
9208
- border-radius: 3px;
9209
- background: #fdf6e3;
9210
- color: #6b5310;
9290
+ border: 1px solid #fde68a;
9291
+ border-left: 2px solid #d97706;
9292
+ border-radius: 6px;
9293
+ background: #fffbeb;
9294
+ color: #92400e;
9211
9295
  font-size: 12px;
9212
9296
  line-height: 1.45;
9213
9297
  }
9214
9298
  .dxr-surface .docx-hf-warning button {
9215
9299
  margin-left: 6px;
9216
9300
  padding: 2px 8px;
9217
- border-color: #e8d9a8;
9301
+ border-color: #fde68a;
9218
9302
  background: #fff;
9219
9303
  font-size: 12px;
9220
9304
  }
9221
- .dxr-surface .docx-hf-placeholder { color: #9aa4b1; font-style: italic; }
9305
+ .dxr-surface .docx-hf-placeholder { color: var(--dxr-faint); font-style: italic; }
9222
9306
  .dxr-surface .docx-hf-inherited {
9223
9307
  color: var(--dxr-muted);
9224
9308
  font-style: italic;
@@ -9238,7 +9322,7 @@ var RIBBON_CSS = `
9238
9322
  padding: 56px 0;
9239
9323
  border-radius: 3px;
9240
9324
  background: var(--dxr-sheet);
9241
- box-shadow: 0 1px 3px rgba(16, 20, 24, .14), 0 8px 24px rgba(16, 20, 24, .05);
9325
+ box-shadow: 0 1px 3px rgba(15, 23, 42, .08), 0 12px 24px rgba(15, 23, 42, .06);
9242
9326
  }
9243
9327
 
9244
9328
  /* \u2500\u2500 Table size picker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -9248,9 +9332,9 @@ var RIBBON_CSS = `
9248
9332
  z-index: 30;
9249
9333
  padding: 9px;
9250
9334
  border: 1px solid var(--dxr-rule);
9251
- border-radius: 6px;
9335
+ border-radius: 12px;
9252
9336
  background: #fff;
9253
- box-shadow: 0 4px 16px rgba(16, 20, 24, .18);
9337
+ box-shadow: var(--dxr-shadow-xl);
9254
9338
  }
9255
9339
  .dxr-pop[data-open] { display: block; }
9256
9340
  .dxr-gridcells { display: grid; grid-template-columns: repeat(10, 16px); gap: 2px; }
@@ -9258,11 +9342,11 @@ var RIBBON_CSS = `
9258
9342
  width: 16px;
9259
9343
  height: 16px;
9260
9344
  border: 1px solid var(--dxr-rule);
9261
- border-radius: 2px;
9262
- background: #f2f5f9;
9345
+ border-radius: 3px;
9346
+ background: var(--dxr-chrome-sunk);
9263
9347
  cursor: pointer;
9264
9348
  }
9265
- .dxr-gridcells div[data-on] { background: var(--dxr-wash); border-color: var(--dxr-accent); }
9349
+ .dxr-gridcells div[data-on] { background: #ccfbf1; border-color: var(--dxr-accent); }
9266
9350
  .dxr-popfoot {
9267
9351
  display: flex;
9268
9352
  justify-content: space-between;
@@ -9345,11 +9429,11 @@ var RIBBON_CSS = `
9345
9429
  display: grid;
9346
9430
  place-items: center;
9347
9431
  padding: 24px;
9348
- color: #f4f9ff;
9432
+ color: #f8fafc;
9349
9433
  background:
9350
- radial-gradient(circle at 20% 20%, rgba(63, 128, 255, .24), transparent 22rem),
9351
- radial-gradient(circle at 82% 80%, rgba(176, 91, 255, .22), transparent 24rem),
9352
- linear-gradient(145deg, #071221 0%, #0b1930 52%, #101426 100%);
9434
+ radial-gradient(circle at 20% 20%, rgba(13, 148, 136, .2), transparent 22rem),
9435
+ radial-gradient(circle at 82% 80%, rgba(45, 212, 191, .1), transparent 24rem),
9436
+ linear-gradient(150deg, #0b1220 0%, #0f172a 55%, #0f2723 100%);
9353
9437
  transition: opacity .55s ease, visibility .55s ease;
9354
9438
  }
9355
9439
  .dxr-loader[hidden] { display: none; }
@@ -9368,14 +9452,14 @@ var RIBBON_CSS = `
9368
9452
  .dxr-orbit {
9369
9453
  position: absolute;
9370
9454
  inset: 7%;
9371
- border: 1px solid rgba(115, 204, 255, .22);
9455
+ border: 1px solid rgba(45, 212, 191, .24);
9372
9456
  border-radius: 50%;
9373
9457
  animation: dxr-spin 9s linear infinite;
9374
9458
  }
9375
9459
  .dxr-orbit.dxr-two {
9376
9460
  inset: 20%;
9377
9461
  border-style: dashed;
9378
- border-color: rgba(196, 128, 255, .32);
9462
+ border-color: rgba(94, 234, 212, .3);
9379
9463
  animation-duration: 6s;
9380
9464
  animation-direction: reverse;
9381
9465
  }
@@ -9385,19 +9469,19 @@ var RIBBON_CSS = `
9385
9469
  height: 10px;
9386
9470
  border-radius: 50%;
9387
9471
  content: "";
9388
- background: #52e5ff;
9389
- box-shadow: 0 0 18px #52e5ff;
9472
+ background: #2dd4bf;
9473
+ box-shadow: 0 0 18px rgba(45, 212, 191, .8);
9390
9474
  }
9391
9475
  .dxr-orbit::before { top: -5px; left: 50%; }
9392
- .dxr-orbit::after { right: 7%; bottom: 12%; background: #b26cff; box-shadow: 0 0 18px #b26cff; }
9476
+ .dxr-orbit::after { right: 7%; bottom: 12%; background: #5eead4; box-shadow: 0 0 18px rgba(94, 234, 212, .7); }
9393
9477
  .dxr-card {
9394
9478
  position: absolute;
9395
9479
  inset: 24% 28%;
9396
9480
  padding: 20px 15px;
9397
- border: 1px solid rgba(255, 255, 255, .33);
9481
+ border: 1px solid rgba(255, 255, 255, .3);
9398
9482
  border-radius: 14px;
9399
- background: linear-gradient(150deg, rgba(255, 255, 255, .18), rgba(255, 255, 255, .06));
9400
- box-shadow: 0 22px 50px rgba(0, 0, 0, .35), 0 0 45px rgba(71, 150, 255, .13);
9483
+ background: linear-gradient(150deg, rgba(255, 255, 255, .16), rgba(255, 255, 255, .05));
9484
+ box-shadow: 0 22px 50px rgba(0, 0, 0, .35), 0 0 45px rgba(13, 148, 136, .15);
9401
9485
  backdrop-filter: blur(10px);
9402
9486
  animation: dxr-float 3.6s ease-in-out infinite;
9403
9487
  }
@@ -9407,8 +9491,8 @@ var RIBBON_CSS = `
9407
9491
  right: -9px;
9408
9492
  padding: 4px 7px;
9409
9493
  border-radius: 6px;
9410
- background: #52e5ff;
9411
- color: #06111d;
9494
+ background: #2dd4bf;
9495
+ color: #042f2e;
9412
9496
  content: "DOCX";
9413
9497
  font-size: 8px;
9414
9498
  font-weight: 900;
@@ -9425,46 +9509,49 @@ var RIBBON_CSS = `
9425
9509
  }
9426
9510
  .dxr-card i:nth-child(2) { width: 76%; animation-delay: -.45s; }
9427
9511
  .dxr-card i:nth-child(3) { width: 88%; animation-delay: -.85s; }
9428
- .dxr-card i:nth-child(4) { width: 58%; background: rgba(255, 111, 139, .75); animation-delay: -1.2s; }
9512
+ .dxr-card i:nth-child(4) { width: 58%; background: rgba(248, 113, 113, .75); animation-delay: -1.2s; }
9429
9513
  .dxr-chip {
9430
9514
  position: absolute;
9431
9515
  display: grid;
9432
9516
  width: 34px;
9433
9517
  height: 34px;
9434
9518
  place-items: center;
9435
- border: 1px solid rgba(255, 255, 255, .17);
9519
+ border: 1px solid rgba(255, 255, 255, .16);
9436
9520
  border-radius: 11px;
9437
- background: rgba(12, 28, 49, .88);
9521
+ background: rgba(15, 30, 46, .88);
9438
9522
  box-shadow: 0 12px 30px rgba(0, 0, 0, .28);
9439
9523
  font-size: 11px;
9440
9524
  font-weight: 850;
9441
9525
  }
9442
- .dxr-chip.dxr-b { left: 2%; top: 30%; color: #52e5ff; animation: dxr-chip 3s ease-in-out infinite; }
9443
- .dxr-chip.dxr-r { right: -2%; bottom: 24%; color: #ff8da0; animation: dxr-chip 3s -1.4s ease-in-out infinite; }
9444
- .dxr-chip.dxr-s { left: 20%; bottom: 0; color: #52e0a2; animation: dxr-chip 3s -.7s ease-in-out infinite; }
9445
- .dxr-eyebrow { color: #52e5ff; font-size: 10px; font-weight: 850; letter-spacing: .16em; text-transform: uppercase; }
9526
+ .dxr-chip.dxr-b { left: 2%; top: 30%; color: #5eead4; animation: dxr-chip 3s ease-in-out infinite; }
9527
+ .dxr-chip.dxr-r { right: -2%; bottom: 24%; color: #fca5a5; animation: dxr-chip 3s -1.4s ease-in-out infinite; }
9528
+ .dxr-chip.dxr-s { left: 20%; bottom: 0; color: #6ee7b7; animation: dxr-chip 3s -.7s ease-in-out infinite; }
9529
+ .dxr-eyebrow { color: #5eead4; font-size: 10px; font-weight: 850; letter-spacing: .16em; text-transform: uppercase; }
9530
+ /* Georgia headline \u2014 the house pairing of a serif headline over Inter UI copy. */
9446
9531
  .dxr-loader h2 {
9447
9532
  margin: 10px auto 10px;
9448
9533
  max-width: 520px;
9449
- font-size: clamp(23px, 5vw, 40px);
9450
- line-height: 1.05;
9451
- letter-spacing: -.045em;
9534
+ font-family: var(--dxr-serif);
9535
+ font-size: clamp(23px, 5vw, 38px);
9536
+ font-weight: 500;
9537
+ line-height: 1.08;
9538
+ letter-spacing: -.02em;
9452
9539
  }
9453
- .dxr-loader-copy > p { margin: 0 auto; max-width: 46ch; color: #9eb2c9; font-size: 13.5px; line-height: 1.6; }
9540
+ .dxr-loader-copy > p { margin: 0 auto; max-width: 46ch; color: #94a3b8; font-size: 13.5px; line-height: 1.6; }
9454
9541
  .dxr-ad {
9455
9542
  display: flex;
9456
9543
  gap: 12px;
9457
9544
  margin: 20px auto 0;
9458
9545
  max-width: 420px;
9459
9546
  padding: 13px;
9460
- border: 1px solid rgba(126, 160, 200, .16);
9461
- border-radius: 13px;
9547
+ border: 1px solid rgba(148, 163, 184, .16);
9548
+ border-radius: 12px;
9462
9549
  background: rgba(255, 255, 255, .04);
9463
9550
  text-align: left;
9464
9551
  }
9465
- .dxr-ad .dxr-num { color: #b26cff; font: 800 10px/1.4 var(--dxr-mono); }
9552
+ .dxr-ad .dxr-num { color: #2dd4bf; font: 800 10px/1.4 var(--dxr-mono); }
9466
9553
  .dxr-ad strong { display: block; font-size: 12.5px; }
9467
- .dxr-ad .dxr-adcopy { display: block; margin-top: 4px; color: #849bb5; font-size: 11.5px; line-height: 1.45; }
9554
+ .dxr-ad .dxr-adcopy { display: block; margin-top: 4px; color: #8ba0b9; font-size: 11.5px; line-height: 1.45; }
9468
9555
  .dxr-ad[data-swap] { animation: dxr-swap .4s ease; }
9469
9556
  .dxr-track {
9470
9557
  height: 3px;
@@ -9478,8 +9565,8 @@ var RIBBON_CSS = `
9478
9565
  width: 12%;
9479
9566
  height: 100%;
9480
9567
  border-radius: inherit;
9481
- background: linear-gradient(90deg, #52e5ff, #5c7cff, #b26cff);
9482
- box-shadow: 0 0 16px rgba(82, 229, 255, .55);
9568
+ background: linear-gradient(90deg, #14b8a6, #2dd4bf, #5eead4);
9569
+ box-shadow: 0 0 16px rgba(45, 212, 191, .5);
9483
9570
  transition: width .65s cubic-bezier(.22, .8, .28, 1);
9484
9571
  }
9485
9572
  .dxr-meta {
@@ -9488,7 +9575,7 @@ var RIBBON_CSS = `
9488
9575
  gap: 14px;
9489
9576
  margin: 9px auto 0;
9490
9577
  max-width: 420px;
9491
- color: #647e9c;
9578
+ color: #64748b;
9492
9579
  font: 700 9px/1 var(--dxr-mono);
9493
9580
  letter-spacing: .09em;
9494
9581
  text-transform: uppercase;
@@ -9497,9 +9584,9 @@ var RIBBON_CSS = `
9497
9584
  display: none;
9498
9585
  margin-top: 18px;
9499
9586
  padding: 9px 14px;
9500
- border: 1px solid rgba(255, 127, 145, .4);
9587
+ border: 1px solid rgba(248, 113, 113, .4);
9501
9588
  border-radius: 9px;
9502
- background: rgba(255, 127, 145, .12);
9589
+ background: rgba(248, 113, 113, .12);
9503
9590
  color: #fff;
9504
9591
  cursor: pointer;
9505
9592
  }
@@ -9614,8 +9701,8 @@ var RIBBON_HTML = `
9614
9701
  )}</button>
9615
9702
  </div>
9616
9703
  <div class="dxr-row">
9617
- <button type="button" data-list="bullet" title="Bullet list">&#8226; List</button>
9618
- <button type="button" data-list="decimal" title="Numbered list">1. List</button>
9704
+ <button type="button" data-list="bullet" title="Bullet list">Bullets</button>
9705
+ <button type="button" data-list="decimal" title="Numbered list">Numbered</button>
9619
9706
  <button type="button" data-pagebreak title="Start this block on a new page">Page break</button>
9620
9707
  </div>
9621
9708
  </div>
@@ -9938,6 +10025,7 @@ var RibbonSurface = class {
9938
10025
  const root = doc.createElement("div");
9939
10026
  root.className = "dxr";
9940
10027
  root.dataset.state = "idle";
10028
+ root.dataset.frame = this.options.frame ?? "flush";
9941
10029
  root.innerHTML = RIBBON_HTML;
9942
10030
  for (const el of Array.from(root.querySelectorAll("[data-dxr]"))) {
9943
10031
  el.id = this.idPrefix + el.dataset.dxr;
@@ -12005,6 +12093,9 @@ async function createRibbonEditor(container, source, options = {}) {
12005
12093
  mount2.root.style.minHeight = "0";
12006
12094
  const ribbon = mountRibbon(mount2.root, {
12007
12095
  documentName: ribbonOptions.documentName ?? nameFromSource(source),
12096
+ // A drop-in embed sits in the middle of someone's page, so it carries its own
12097
+ // boundary (rounded card + shadow). Full-bleed hosts pass frame: "flush".
12098
+ frame: "card",
12008
12099
  ...ribbonOptions,
12009
12100
  // Exports arrive after the runtime boots; the loader covers that gap.
12010
12101
  exports: void 0
@@ -1 +1 @@
1
- {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExE;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,GAAG,MAAM,CAAC;AAwPtE,6CAA6C;AAC7C,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBjF;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,2BAA2B;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC,CAsCrB;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,EAC9B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAED,MAAM,WAAW,yBAA0B,SAAQ,aAAa;IAC9D,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,EAC9B,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,YAAY,CAAC,CA0CvB"}
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExE;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,GAAG,MAAM,CAAC;AAwPtE,6CAA6C;AAC7C,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBjF;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,2BAA2B;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC,CAsCrB;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,EAC9B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAED,MAAM,WAAW,yBAA0B,SAAQ,aAAa;IAC9D,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,EAC9B,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,YAAY,CAAC,CA6CvB"}