fable-editor 1.2.6 → 1.2.8

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.
@@ -61,10 +61,10 @@ function We() {
61
61
  A.unshift("Warning: " + f), Function.prototype.apply.call(console[a], console, A);
62
62
  }
63
63
  }
64
- var H = !1, $ = !1, O = !1, F = !1, et = !1, Mt;
64
+ var H = !1, $ = !1, Z = !1, F = !1, et = !1, Mt;
65
65
  Mt = Symbol.for("react.module.reference");
66
66
  function ue(a) {
67
- return !!(typeof a == "string" || typeof a == "function" || a === i || a === n || et || a === s || a === c || a === d || F || a === b || H || $ || O || typeof a == "object" && a !== null && (a.$$typeof === m || a.$$typeof === u || a.$$typeof === l || a.$$typeof === r || a.$$typeof === o || // This needs to include all possible module reference object
67
+ return !!(typeof a == "string" || typeof a == "function" || a === i || a === n || et || a === s || a === c || a === d || F || a === b || H || $ || Z || typeof a == "object" && a !== null && (a.$$typeof === m || a.$$typeof === u || a.$$typeof === l || a.$$typeof === r || a.$$typeof === o || // This needs to include all possible module reference object
68
68
  // types supported by any Flight configuration anywhere since
69
69
  // we don't know which Flight build this will end up being used
70
70
  // with.
@@ -313,13 +313,13 @@ function We() {
313
313
  }
314
314
  return "";
315
315
  }
316
- var K = Object.prototype.hasOwnProperty, Dt = {}, Zt = w.ReactDebugCurrentFrame;
316
+ var K = Object.prototype.hasOwnProperty, Dt = {}, Ot = w.ReactDebugCurrentFrame;
317
317
  function lt(a) {
318
318
  if (a) {
319
319
  var f = a._owner, v = nt(a.type, a._source, f ? f.type : null);
320
- Zt.setExtraStackFrame(v);
320
+ Ot.setExtraStackFrame(v);
321
321
  } else
322
- Zt.setExtraStackFrame(null);
322
+ Ot.setExtraStackFrame(null);
323
323
  }
324
324
  function ye(a, f, v, T, L) {
325
325
  {
@@ -352,17 +352,17 @@ function We() {
352
352
  }
353
353
  function we(a) {
354
354
  try {
355
- return Ot(a), !1;
355
+ return Zt(a), !1;
356
356
  } catch {
357
357
  return !0;
358
358
  }
359
359
  }
360
- function Ot(a) {
360
+ function Zt(a) {
361
361
  return "" + a;
362
362
  }
363
363
  function Ft(a) {
364
364
  if (we(a))
365
- return E("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", Ce(a)), Ot(a);
365
+ return E("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", Ce(a)), Zt(a);
366
366
  }
367
367
  var _t = w.ReactCurrentOwner, Te = {
368
368
  key: !0,
@@ -601,13 +601,13 @@ Check the top-level render call using <` + v + ">.");
601
601
  return Fe !== "key";
602
602
  }), xt = D.length > 0 ? "{key: someKey, " + D.join(": ..., ") + ": ...}" : "{key: someKey}";
603
603
  if (!Yt[U + xt]) {
604
- var Oe = D.length > 0 ? "{" + D.join(": ..., ") + ": ...}" : "{}";
604
+ var Ze = D.length > 0 ? "{" + D.join(": ..., ") + ": ...}" : "{}";
605
605
  E(`A props object containing a "key" prop is being spread into JSX:
606
606
  let props = %s;
607
607
  <%s {...props} />
608
608
  React keys must be passed directly to JSX without using spread:
609
609
  let props = %s;
610
- <%s key={someKey} {...props} />`, xt, U, Oe, U), Yt[U + xt] = !0;
610
+ <%s key={someKey} {...props} />`, xt, U, Ze, U), Yt[U + xt] = !0;
611
611
  }
612
612
  }
613
613
  return a === i ? Pe(P) : Re(P), P;
@@ -619,8 +619,8 @@ React keys must be passed directly to JSX without using spread:
619
619
  function Ne(a, f, v) {
620
620
  return Qt(a, f, v, !1);
621
621
  }
622
- var De = Ne, Ze = Be;
623
- tt.Fragment = i, tt.jsx = De, tt.jsxs = Ze;
622
+ var De = Ne, Oe = Be;
623
+ tt.Fragment = i, tt.jsx = De, tt.jsxs = Oe;
624
624
  }()), tt;
625
625
  }
626
626
  process.env.NODE_ENV === "production" ? Et.exports = je() : Et.exports = We();
@@ -2921,23 +2921,23 @@ const xi = ["nw", "ne", "sw", "se"], wt = ["img-left", "img-right", "img-top", "
2921
2921
  "img-top": h.tpltop,
2922
2922
  "img-center": h.tplcenter
2923
2923
  }, wi = ".tox,.pop,.tblctx,.imgctx,.selctx,.dlg";
2924
- let Z = null, X = null, St = 0, ae = !1;
2924
+ let O = null, X = null, St = 0, ae = !1;
2925
2925
  function ct() {
2926
- clearTimeout(St), X = null, Z && Z.classList.remove("show");
2926
+ clearTimeout(St), X = null, O && O.classList.remove("show");
2927
2927
  }
2928
2928
  function Ti(p) {
2929
2929
  const t = p.dataset.tip;
2930
2930
  if (!t) return;
2931
2931
  X = p, clearTimeout(St);
2932
- const e = Z && Z.classList.contains("show") ? 60 : 350;
2932
+ const e = O && O.classList.contains("show") ? 60 : 350;
2933
2933
  St = window.setTimeout(() => {
2934
2934
  if (X !== p || !document.contains(p)) return;
2935
- Z || (Z = document.createElement("div"), Z.className = "etip", document.body.appendChild(Z)), Z.textContent = t, Z.classList.add("show");
2936
- const i = p.getBoundingClientRect(), s = Z.offsetWidth, n = Z.offsetHeight;
2935
+ O || (O = document.createElement("div"), O.className = "etip", document.body.appendChild(O)), O.textContent = t, O.classList.add("show");
2936
+ const i = p.getBoundingClientRect(), s = O.offsetWidth, n = O.offsetHeight;
2937
2937
  let l = i.left + i.width / 2 - s / 2;
2938
2938
  l = Math.max(6, Math.min(l, innerWidth - s - 6));
2939
2939
  let r = i.bottom + 7;
2940
- r + n > innerHeight - 6 && (r = i.top - n - 7), Z.style.left = l + "px", Z.style.top = r + "px";
2940
+ r + n > innerHeight - 6 && (r = i.top - n - 7), O.style.left = l + "px", O.style.top = r + "px";
2941
2941
  }, e);
2942
2942
  }
2943
2943
  function Ei() {
@@ -2976,7 +2976,7 @@ function de(p) {
2976
2976
  var j;
2977
2977
  let Hi = (j = class {
2978
2978
  constructor(t) {
2979
- this.lang = "en", this.contentClass = "fable-content-" + j.instanceCounter++, this.contentStyleEl = null, this.savedRange = null, this.foreColor = "#000000", this.backColor = "#FACC15", this.openPop = null, this.openSubEl = null, this.popAnchor = null, this.dlgOvl = null, this.tblActive = null, this.tblCorner = null, this.tblColBars = [], this.tblCtx = null, this.tblCellMark = null, this.tblOpMark = null, this.tblOpMarkKind = null, this.imgActive = null, this.imgHandles = [], this.imgCtx = null, this.imgHideTimer = null, this.phActive = null, this.phCtx = null, this.phUploadTarget = null, this.vidActive = null, this.vidCtx = null, this.vidHideTimer = null, this.vphActive = null, this.vphCtx = null, this.vphUploadTarget = null, this.selCtx = null, this.tbrMore = null, this.tbrExpanded = !1, this.codeActive = null, this.codeCtx = null, this.tplActive = null, this.tplCtx = null, this.revisions = [], this.revTimer = null, this.draftTimer = null, this.draftStorageKey = "", this.listeners = [], this.isDestroyed = !1, this.options = {
2979
+ this.lang = "en", this.contentClass = "fable-content-" + j.instanceCounter++, this.contentStyleEl = null, this.savedRange = null, this.foreColor = "#000000", this.backColor = "#FACC15", this.openPop = null, this.subStack = [], this.popAnchor = null, this.dlgOvl = null, this.tblActive = null, this.tblCorner = null, this.tblColBars = [], this.tblCtx = null, this.tblCellMark = null, this.tblOpMark = null, this.tblOpMarkKind = null, this.imgActive = null, this.imgHandles = [], this.imgCtx = null, this.imgHideTimer = null, this.phActive = null, this.phCtx = null, this.phUploadTarget = null, this.vidActive = null, this.vidCtx = null, this.vidHideTimer = null, this.vphActive = null, this.vphCtx = null, this.vphUploadTarget = null, this.selCtx = null, this.tbrMore = null, this.tbrExpanded = !1, this.codeActive = null, this.codeCtx = null, this.tplActive = null, this.tplCtx = null, this.revisions = [], this.revTimer = null, this.draftTimer = null, this.draftStorageKey = "", this.listeners = [], this.isDestroyed = !1, this.options = {
2980
2980
  target: t.target,
2981
2981
  language: t.language || "en",
2982
2982
  height: t.height ?? 302,
@@ -3048,7 +3048,7 @@ let Hi = (j = class {
3048
3048
  /* ---------------------------------------------------------- event binding */
3049
3049
  bindEvents() {
3050
3050
  if (this.onDoc("mousedown", (t) => {
3051
- this.openPop && !this.openPop.contains(t.target) && !this.popAnchor.contains(t.target) && !(this.openSubEl && this.openSubEl.contains(t.target)) && this.closePop();
3051
+ this.openPop && !this.openPop.contains(t.target) && !this.popAnchor.contains(t.target) && !this.subContains(t.target) && this.closePop();
3052
3052
  }), this.onDoc("keydown", (t) => {
3053
3053
  t.key === "Escape" && (this.closePop(), this.closeDlg());
3054
3054
  }), this.onDoc("selectionchange", () => {
@@ -3103,8 +3103,10 @@ let Hi = (j = class {
3103
3103
  this.positionTableHandles(), this.positionImageHandles(), this.positionImgPhCtx(), this.positionTplCtx(), this.positionVphCtx(), this.positionVidCtx(), this.positionCodeCtx();
3104
3104
  }), this.onWin(
3105
3105
  "scroll",
3106
- () => {
3107
- this.positionTableHandles(), this.positionImageHandles(), this.positionImgPhCtx(), this.positionTplCtx(), this.positionVphCtx(), this.positionVidCtx(), this.positionCodeCtx(), this.repositionSelToolbar();
3106
+ (t) => {
3107
+ var s;
3108
+ const e = t.target;
3109
+ e instanceof Node && ((((s = this.openPop) == null ? void 0 : s.contains(e)) ?? !1) || this.subContains(e)) || this.closePop(), this.positionTableHandles(), this.positionImageHandles(), this.positionImgPhCtx(), this.positionTplCtx(), this.positionVphCtx(), this.positionVidCtx(), this.positionCodeCtx(), this.repositionSelToolbar();
3108
3110
  },
3109
3111
  !0
3110
3112
  ), this.onWin("resize", () => {
@@ -3152,7 +3154,7 @@ let Hi = (j = class {
3152
3154
  const t = (e = this.docInput.files) == null ? void 0 : e[0];
3153
3155
  t && this.importWordFile(t).catch(() => alert(this.t("importfail")));
3154
3156
  }), this.onDoc("mousedown", (t) => {
3155
- this.ed.contains(t.target) || t.target === this.tblCorner || this.tblColBars.includes(t.target) || this.tblCtx && this.tblCtx.contains(t.target) || this.imgHandles.includes(t.target) || this.imgCtx && this.imgCtx.contains(t.target) || this.phCtx && this.phCtx.contains(t.target) || this.tplCtx && this.tplCtx.contains(t.target) || this.selCtx && this.selCtx.contains(t.target) || this.vphCtx && this.vphCtx.contains(t.target) || this.vidCtx && this.vidCtx.contains(t.target) || this.codeCtx && this.codeCtx.contains(t.target) || this.openPop && this.openPop.contains(t.target) || this.openSubEl && this.openSubEl.contains(t.target) || (this.clearTableHandles(), this.clearImageHandles(), this.clearImgPlaceholderSel(), this.clearTplSel(), this.clearVphPlaceholderSel(), this.clearVidHandles(), this.clearCodeSel(), this.clearSelToolbar());
3157
+ this.ed.contains(t.target) || t.target === this.tblCorner || this.tblColBars.includes(t.target) || this.tblCtx && this.tblCtx.contains(t.target) || this.imgHandles.includes(t.target) || this.imgCtx && this.imgCtx.contains(t.target) || this.phCtx && this.phCtx.contains(t.target) || this.tplCtx && this.tplCtx.contains(t.target) || this.selCtx && this.selCtx.contains(t.target) || this.vphCtx && this.vphCtx.contains(t.target) || this.vidCtx && this.vidCtx.contains(t.target) || this.codeCtx && this.codeCtx.contains(t.target) || this.openPop && this.openPop.contains(t.target) || this.subContains(t.target) || (this.clearTableHandles(), this.clearImageHandles(), this.clearImgPlaceholderSel(), this.clearTplSel(), this.clearVphPlaceholderSel(), this.clearVidHandles(), this.clearCodeSel(), this.clearSelToolbar());
3156
3158
  });
3157
3159
  }
3158
3160
  on(t, e, i) {
@@ -3358,24 +3360,42 @@ let Hi = (j = class {
3358
3360
  }
3359
3361
  /* ---------------------------------------------------------- popups / menus */
3360
3362
  closeSub() {
3361
- var t;
3362
- (t = this.openSubEl) == null || t.remove(), this.openSubEl = null;
3363
+ this.closeSubFrom(0);
3364
+ }
3365
+ /** Removes stacked flyouts from `level` (0 = shallowest) onward, keeping
3366
+ * anything shallower - e.g. hovering a sibling item inside the "Cell"
3367
+ * flyout should drop a deeper "Cell background" flyout but keep "Cell"
3368
+ * itself and the top-level popup it bridges to. */
3369
+ closeSubFrom(t) {
3370
+ for (; this.subStack.length > t; ) this.subStack.pop().remove();
3371
+ }
3372
+ /** True if `node` is inside any currently-open flyout submenu (any depth). */
3373
+ subContains(t) {
3374
+ return this.subStack.some((e) => e.contains(t));
3375
+ }
3376
+ /** 0 for the top-level popup itself; otherwise this container's depth in
3377
+ * the flyout stack + 1. Used to know how many deeper flyouts to close
3378
+ * when opening or hovering within `container`. */
3379
+ subLevelOf(t) {
3380
+ if (t === this.openPop) return 0;
3381
+ const e = this.subStack.indexOf(t);
3382
+ return e === -1 ? this.subStack.length : e + 1;
3363
3383
  }
3364
3384
  closePop() {
3365
3385
  var t;
3366
3386
  this.closeSub(), this.openPop && (this.openPop.remove(), this.openPop = null, (t = this.popAnchor) == null || t.classList.remove("open"), this.popAnchor = null, this.setOpTarget(null));
3367
3387
  }
3368
3388
  openSubFor(t, e) {
3369
- this.closeSub();
3370
- const i = document.createElement("div");
3371
- i.className = "pop sub", i.dir = this.dir(), t.subBuild ? t.subBuild(i) : t.sub && this.menuItems(i, t.sub), i.addEventListener("mousedown", (o) => {
3372
- o.target.tagName !== "INPUT" && o.preventDefault();
3373
- }), document.body.appendChild(i);
3374
- const s = e.getBoundingClientRect();
3375
- let l = this.dir() === "rtl" ? s.left - i.offsetWidth + 2 : s.right - 2;
3376
- l = Math.max(8, Math.min(l + scrollX, scrollX + innerWidth - i.offsetWidth - 8));
3377
- let r = s.top + scrollY - 6;
3378
- r = Math.max(8 + scrollY, Math.min(r, scrollY + innerHeight - i.offsetHeight - 8)), i.style.left = l + "px", i.style.top = r + "px", this.openSubEl = i;
3389
+ const i = e.getBoundingClientRect(), s = e.closest(".pop");
3390
+ this.closeSubFrom(s ? this.subLevelOf(s) : 0);
3391
+ const n = document.createElement("div");
3392
+ n.className = "pop sub", n.dir = this.dir(), t.subBuild ? t.subBuild(n) : t.sub && this.menuItems(n, t.sub), n.addEventListener("mousedown", (c) => {
3393
+ c.target.tagName !== "INPUT" && c.preventDefault();
3394
+ }), document.body.appendChild(n);
3395
+ let r = this.dir() === "rtl" ? i.left - n.offsetWidth + 2 : i.right - 2;
3396
+ r = Math.max(8, Math.min(r + scrollX, scrollX + innerWidth - n.offsetWidth - 8));
3397
+ let o = i.top + scrollY - 6;
3398
+ o = Math.max(8 + scrollY, Math.min(o, scrollY + innerHeight - n.offsetHeight - 8)), n.style.left = r + "px", n.style.top = o + "px", this.subStack.push(n);
3379
3399
  }
3380
3400
  popup(t, e, i) {
3381
3401
  if (this.openPop && this.popAnchor === t) {
@@ -3386,10 +3406,12 @@ let Hi = (j = class {
3386
3406
  const s = document.createElement("div");
3387
3407
  s.className = "pop" + (i ? " " + i : ""), s.dir = this.dir(), e(s), document.body.appendChild(s);
3388
3408
  const n = t.getBoundingClientRect();
3389
- s.style.minWidth = Math.max(160, Math.round(n.width)) + "px", s.style.top = n.bottom + scrollY + 2 + "px";
3390
- let r = this.dir() === "rtl" ? n.right - s.offsetWidth : n.left;
3391
- r = Math.max(8, Math.min(r + scrollX, scrollX + innerWidth - s.offsetWidth - 8)), s.style.left = r + "px", s.addEventListener("mousedown", (o) => {
3392
- o.target.tagName !== "INPUT" && o.preventDefault();
3409
+ s.style.minWidth = Math.max(160, Math.round(n.width)) + "px";
3410
+ let l = n.bottom + scrollY + 2;
3411
+ l = Math.max(8 + scrollY, Math.min(l, scrollY + innerHeight - s.offsetHeight - 8)), s.style.top = l + "px";
3412
+ let o = this.dir() === "rtl" ? n.right - s.offsetWidth : n.left;
3413
+ o = Math.max(8, Math.min(o + scrollX, scrollX + innerWidth - s.offsetWidth - 8)), s.style.left = o + "px", s.addEventListener("mousedown", (c) => {
3414
+ c.target.tagName !== "INPUT" && c.preventDefault();
3393
3415
  }), this.openPop = s, this.popAnchor = t, t.classList.add("open");
3394
3416
  }
3395
3417
  menuItems(t, e) {
@@ -3403,7 +3425,7 @@ let Hi = (j = class {
3403
3425
  i.action && (this.closePop(), i.action());
3404
3426
  }), n.addEventListener("mouseenter", () => {
3405
3427
  var l;
3406
- s ? this.openSubFor(i, n) : this.openSubEl && t !== this.openSubEl && this.closeSub(), (l = i.hover) == null || l.call(i, !0);
3428
+ s ? this.openSubFor(i, n) : this.closeSubFrom(this.subLevelOf(t)), (l = i.hover) == null || l.call(i, !0);
3407
3429
  }), n.addEventListener("mouseleave", () => {
3408
3430
  var l;
3409
3431
  return (l = i.hover) == null ? void 0 : l.call(i, !1);
@@ -3782,8 +3804,8 @@ let Hi = (j = class {
3782
3804
  * (the quick color chips); everything else yields one. */
3783
3805
  buildToolbarRegistry() {
3784
3806
  const t = this.tbtn(h.tableic, this.t("quicktable"), () => this.tableGrid(t)), e = {
3785
- undo: () => this.tbtn(h.undo, this.t("undo"), () => this.exec("undo")),
3786
- redo: () => this.tbtn(h.redo, this.t("redo"), () => this.exec("redo")),
3807
+ undo: () => this.tbtn(h.undo, this.t("undo"), () => this.exec("undo"), "undo"),
3808
+ redo: () => this.tbtn(h.redo, this.t("redo"), () => this.exec("redo"), "redo"),
3787
3809
  preview: () => this.tbtn(h.prevw, this.t("preview"), () => this.previewDlg()),
3788
3810
  print: () => this.tbtn(h.printic, this.t("print"), () => this.printDoc()),
3789
3811
  importword: () => this.tbtn(h.wordic, this.t("importword"), () => this.pickWordDoc()),
@@ -4126,10 +4148,10 @@ let Hi = (j = class {
4126
4148
  this.t("tablepropsttl"),
4127
4149
  (E) => {
4128
4150
  const I = (H, $) => {
4129
- const O = document.createElement("div");
4130
- O.style.cssText = r;
4151
+ const Z = document.createElement("div");
4152
+ Z.style.cssText = r;
4131
4153
  const F = document.createElement("span");
4132
- F.style.cssText = o, F.textContent = this.t(H), O.append(F, $), E.appendChild(O);
4154
+ F.style.cssText = o, F.textContent = this.t(H), Z.append(F, $), E.appendChild(Z);
4133
4155
  };
4134
4156
  e = document.createElement("input"), e.type = "text", e.style.cssText = c, e.placeholder = "e.g. 600px or 100%", e.value = u, I("tblwidth", e), i = document.createElement("input"), i.type = "number", i.min = "0", i.style.cssText = c, i.value = String(m), I("tblcellpadding", i), s = document.createElement("input"), s.type = "number", s.min = "0", s.style.cssText = c, s.value = String(b), I("tblcellspacing", s), n = document.createElement("input"), n.type = "number", n.min = "0", n.style.cssText = c, n.value = String(y), I("tblborder", n), l = document.createElement("select"), l.style.cssText = c, [
4135
4157
  ["", "alignnone"],
@@ -4137,8 +4159,8 @@ let Hi = (j = class {
4137
4159
  ["center", "aligncenter"],
4138
4160
  ["right", "alignright"]
4139
4161
  ].forEach(([H, $]) => {
4140
- const O = document.createElement("option");
4141
- O.value = H, O.textContent = this.t($), H === w && (O.selected = !0), l.appendChild(O);
4162
+ const Z = document.createElement("option");
4163
+ Z.value = H, Z.textContent = this.t($), H === w && (Z.selected = !0), l.appendChild(Z);
4142
4164
  }), I("tblalign", l);
4143
4165
  },
4144
4166
  [
@@ -4726,8 +4748,8 @@ let Hi = (j = class {
4726
4748
  E.type = "file", E.accept = this.options.videoFileTypes.join(","), E.style.display = "none", w.addEventListener("click", () => {
4727
4749
  E.value = "", E.click();
4728
4750
  }), E.addEventListener("change", () => {
4729
- var O;
4730
- const H = (O = E.files) == null ? void 0 : O[0];
4751
+ var Z;
4752
+ const H = (Z = E.files) == null ? void 0 : Z[0];
4731
4753
  if (!H) return;
4732
4754
  w.disabled = !0, w.textContent = this.t("uploading");
4733
4755
  const $ = (F) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fable-editor",
3
- "version": "1.2.6",
3
+ "version": "1.2.8",
4
4
  "description": "FableEditor — a rich text editor with React and Angular wrappers",
5
5
  "author": "Sajin Satheesan <an.sajinsatheesan@gmail.com>",
6
6
  "repository": {
package/style.css CHANGED
@@ -194,6 +194,14 @@
194
194
  stroke-linejoin: round;
195
195
  }
196
196
 
197
+ /* undo/redo swap sides under dir=rtl (normal flex reordering of the
198
+ toolbar), but their glyphs stay fixed - without this, both arrows end
199
+ up pointing at each other instead of outward from their new position */
200
+ [dir=rtl] .tbtn[data-id=undo] svg,
201
+ [dir=rtl] .tbtn[data-id=redo] svg {
202
+ transform: scaleX(-1);
203
+ }
204
+
197
205
  .tbtn svg .f {
198
206
  fill: #2f3744;
199
207
  stroke: none;
@@ -1053,7 +1061,7 @@
1053
1061
  transform: rotate(-90deg);
1054
1062
  }
1055
1063
 
1056
- [dir=rtl] .pop .mi .subarrow svg {
1064
+ .pop[dir=rtl] .mi .subarrow svg {
1057
1065
  transform: rotate(90deg);
1058
1066
  }
1059
1067
 
@@ -1711,8 +1719,13 @@
1711
1719
  color: #556;
1712
1720
  }
1713
1721
 
1714
- kbd {
1722
+ /* scoped (not a bare kbd selector) and with its own explicit color -
1723
+ a host page's own kbd styling can otherwise out-specificity a bare
1724
+ tag selector and override just one of background/color, leaving
1725
+ light-on-light text */
1726
+ .dlg kbd {
1715
1727
  background: #f3f4f6;
1728
+ color: #444c58;
1716
1729
  border-radius: 4px;
1717
1730
  padding: 2px 7px;
1718
1731
  font: 12px Consolas, monospace;