jekyll-dice-tray 0.5.1 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9bd0677666a51acbbbb3ca6bf5b67d1f5bb1ef638fa4ba2fc86a3ea5a0f4cc9
4
- data.tar.gz: 8832cb5174a2d58f10f7aa8534a91b8865b296323d81a097e6d476422b2b1e31
3
+ metadata.gz: 2a26bfe4476cf5803127bbeedc4d880e33c99542f5d4b1c81b0e51a06d0ef181
4
+ data.tar.gz: 30a10792b7e94cf0323d54f60a14eb269cd35eed615e0796ab6c67b54debfb6b
5
5
  SHA512:
6
- metadata.gz: 558222307d26787647131df280b6e35055d644a9dfe2c97b9f2ce752e5ff179a56b21b96467dcea47633b4fb6a3128536931b2a0600a2b935dabdb5946867ba7
7
- data.tar.gz: 5e69d92fe00836cef6d4aa013a3f4e320cbed50e4a082a7826f8085ef4ec68b6f9a4b4d96829e4348ff95aa7ce5706e03c336fd8dd81924366343b21dd73dd1b
6
+ metadata.gz: 21124bf090c27e159ebdf5d1bdf547060edf559a46837cc573b4f2a11e5eb3d6905d720d4091d68a730e01f2b6da2b6f99db31ec0625967630d8aee8c6863e36
7
+ data.tar.gz: 0a3f664eb69e877948cbdd2a302509491b73bc81894233f9945bde69d710361f8de8cb96ece2133716e7f4398217272c1a7ab22666a9d0df3c3002107bb96a48
@@ -34,13 +34,16 @@
34
34
  border-radius: 12px;
35
35
  box-shadow: 0 18px 48px rgba(0, 0, 0, 0.22);
36
36
  overflow: hidden;
37
- display: flex;
37
+ /* Stay collapsed until data-expanded="true". A default of flex overrides the
38
+ hidden attribute and paints the open tray before hydration. */
39
+ display: none;
38
40
  flex-direction: column;
39
41
  max-height: 360px;
40
42
  }
41
43
 
42
- #jekyll-dice-tray[data-expanded="false"] .jdt-body {
43
- display: none;
44
+ /* Only the pre-paint script or dice_tray.js sets this; absent means minimized. */
45
+ #jekyll-dice-tray[data-expanded="true"] .jdt-body {
46
+ display: flex;
44
47
  }
45
48
 
46
49
  #jekyll-dice-tray .jdt-clue {
@@ -2,6 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var STORAGE_PREFIX = "jekyll_dice_tray:";
5
+ // Also read before first paint by the inline script in HtmlRewriter.inject_tray.
5
6
  var STORAGE_EXPANDED = STORAGE_PREFIX + "expanded";
6
7
  var STORAGE_HISTORY = STORAGE_PREFIX + "history_v1";
7
8
  var STORAGE_INPUT_HISTORY = STORAGE_PREFIX + "input_history_v1";
@@ -521,15 +522,41 @@
521
522
  root.setAttribute("data-expanded", expanded ? "true" : "false");
522
523
  // Some themes override [hidden], so enforce display too.
523
524
  body.hidden = !expanded;
525
+ // Clear the pre-paint inline lock so the expanded stylesheet rule can show the body.
524
526
  body.style.display = expanded ? "" : "none";
525
527
  saveBool(STORAGE_EXPANDED, expanded);
526
528
  if (expanded) {
527
529
  setTimeout(function () {
528
530
  input && input.focus();
529
531
  }, 0);
532
+ } else if (input && document.activeElement === input) {
533
+ input.blur();
530
534
  }
531
535
  }
532
536
 
537
+ function isOtherTextEntry(node) {
538
+ if (!node || node === input) return false;
539
+ var el = node.nodeType === 1 ? node : node.parentElement;
540
+ if (!el) return false;
541
+ if (el.closest && el.closest("#jekyll-dice-tray")) return false;
542
+ var tag = el.tagName;
543
+ if (tag === "TEXTAREA") return true;
544
+ if (tag === "INPUT") {
545
+ var type = (el.getAttribute("type") || "text").toLowerCase();
546
+ return (
547
+ type !== "button" &&
548
+ type !== "submit" &&
549
+ type !== "reset" &&
550
+ type !== "checkbox" &&
551
+ type !== "radio" &&
552
+ type !== "file" &&
553
+ type !== "color" &&
554
+ type !== "range"
555
+ );
556
+ }
557
+ return !!el.isContentEditable;
558
+ }
559
+
533
560
  function renderHistory() {
534
561
  log.innerHTML = "";
535
562
  history.forEach(function (item) {
@@ -787,6 +814,15 @@
787
814
  setExpanded(!expanded);
788
815
  });
789
816
 
817
+ document.addEventListener("keydown", function (e) {
818
+ if (e.defaultPrevented || e.repeat || e.isComposing) return;
819
+ if (e.key !== "~" && e.key !== "`") return;
820
+ if (e.ctrlKey || e.metaKey || e.altKey) return;
821
+ if (isOtherTextEntry(e.target)) return;
822
+ e.preventDefault();
823
+ setExpanded(toggle.getAttribute("aria-expanded") !== "true");
824
+ });
825
+
790
826
  input.addEventListener("keydown", function (e) {
791
827
  if (e.key !== "Enter") return;
792
828
  var v = input.value;
@@ -199,18 +199,42 @@ module Jekyll
199
199
  def self.inject_tray(html, assets_path:)
200
200
  return html if html.include?('data-dice-tray-root="true"')
201
201
 
202
+ # Start collapsed. Inline display:none holds the body shut until the script
203
+ # below runs: the hidden attribute loses to author CSS (including ours), and
204
+ # the deferred dice_tray.js can run after first paint, which flashes the
205
+ # open tray on navigation. This script reads the same localStorage key as
206
+ # STORAGE_EXPANDED in dice_tray.js and applies it before first paint.
202
207
  tray = <<~HTML
203
- <div id="jekyll-dice-tray" data-dice-tray-root="true" data-version="#{VERSION}" aria-live="polite">
208
+ <div id="jekyll-dice-tray" data-dice-tray-root="true" data-version="#{VERSION}" data-expanded="false" aria-live="polite">
204
209
  <div class="jdt-header">
205
- <button type="button" class="jdt-toggle" aria-expanded="false" title="Toggle dice tray">Dice</button>
210
+ <button type="button" class="jdt-toggle" aria-expanded="false" title="Toggle dice tray (~)">Dice</button>
206
211
  </div>
207
- <div class="jdt-body" hidden>
212
+ <div class="jdt-body" hidden style="display:none">
208
213
  <div class="jdt-clue">Type <code>1d20+5</code> or <code>/help</code>, then press Enter.</div>
209
214
  <div class="jdt-log" role="log" aria-label="Dice roll log"></div>
210
215
  <input class="jdt-input" type="text" inputmode="text" autocomplete="off" spellcheck="false"
211
216
  placeholder="Roll: 1d6, d4, 2d8+1, /help" />
212
217
  </div>
213
218
  </div>
219
+ <script>
220
+ // Synchronous on purpose: must finish before the browser paints the tray.
221
+ (function () {
222
+ try {
223
+ // Keep in sync with STORAGE_EXPANDED in dice_tray.js.
224
+ var expanded = localStorage.getItem("jekyll_dice_tray:expanded") === "true";
225
+ var root = document.getElementById("jekyll-dice-tray");
226
+ if (!root) return;
227
+ root.setAttribute("data-expanded", expanded ? "true" : "false");
228
+ var toggle = root.querySelector(".jdt-toggle");
229
+ if (toggle) toggle.setAttribute("aria-expanded", expanded ? "true" : "false");
230
+ var body = root.querySelector(".jdt-body");
231
+ if (!body) return;
232
+ body.hidden = !expanded;
233
+ // Inline display wins over theme rules that override [hidden].
234
+ body.style.display = expanded ? "flex" : "none";
235
+ } catch (e) {}
236
+ })();
237
+ </script>
214
238
  HTML
215
239
 
216
240
  tags = <<~HTML
@@ -1,6 +1,6 @@
1
1
  module Jekyll
2
2
  module DiceTray
3
- VERSION = "0.5.1"
3
+ VERSION = "0.6.0"
4
4
  end
5
5
  end
6
6
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-dice-tray
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - directsun