diff --git a/components/Line.js b/components/Line.js
new file mode 100644
index 00000000..9e7a34a5
--- /dev/null
+++ b/components/Line.js
@@ -0,0 +1,20 @@
+import { displayRange, textFilter } from '../src'
+
+const petuchaClass = (isPetucha) => isPetucha ? 'mod-petucha' : ''
+const setumaClass = (column) => column.length > 1 ? 'mod-setuma' : ''
+
+const Line = ({ text, verses, aliyot, isPetucha }, annotated) => `
+
+ ${text.map((column) => (`
+
+ ${column.map((fragment) => (`
+ ${textFilter({ text: fragment, annotated })}
+ `)).join('')}
+
+ `)).join('')}
+
${displayRange.asVersesRange(verses)}
+
${displayRange.asAliyotRange(aliyot)}
+
+`
+
+export default Line
diff --git a/components/Page.js b/components/Page.js
new file mode 100644
index 00000000..21686d34
--- /dev/null
+++ b/components/Page.js
@@ -0,0 +1,13 @@
+import Line from './Line'
+
+const Page = (lines, annotated) => `
+
+ ${lines.map((line) => (`
+
+ ${Line(line, annotated)} |
+
+ `)).join('')}
+
+`
+
+export default Page
diff --git a/components/ParshaPicker.js b/components/ParshaPicker.js
new file mode 100644
index 00000000..aad0d8b5
--- /dev/null
+++ b/components/ParshaPicker.js
@@ -0,0 +1,11 @@
+import parshiyot from '../build/parshiyot.json'
+
+const ParshaPicker = () => `
+
+
+ ${parshiyot.map(({ he, page }) => (`- ${he}
`)).join('')}
+
+
+`
+
+export default ParshaPicker
diff --git a/css/master.css b/css/master.css
index a1ec6660..9efc1a4a 100644
--- a/css/master.css
+++ b/css/master.css
@@ -2,6 +2,7 @@
@import "/dist/normalize.css";
@import "./app-layout.css";
+@import "./tooltip.css";
@import "./page.css";
@import "./parsha-picker.css";
@import "./toggle.css";
diff --git a/css/toolbar.css b/css/toolbar.css
index 189dc49b..685c722c 100644
--- a/css/toolbar.css
+++ b/css/toolbar.css
@@ -17,7 +17,8 @@
}
.annotations-toggle {
- font-family: ShlomosemiStam
+ font-family: ShlomosemiStam;
+ position: relative;
}
.parsha-title {
diff --git a/css/tooltip.css b/css/tooltip.css
new file mode 100644
index 00000000..c88f2a3f
--- /dev/null
+++ b/css/tooltip.css
@@ -0,0 +1,23 @@
+[data-tooltip]::after {
+ content: attr(data-tooltip);
+ background-color: hsl(0, 0%, 20%);
+ color: white;
+ display: inline-block;
+ position: absolute;
+ top: 200%;
+ padding: 1em 1.5em;
+ border-radius: 4px;
+ font-size: 0.8em;
+ white-space: nowrap;
+ left: 50%;
+ transform: translate(-50%, 0) scale(0);
+ transform-origin: top center;
+ box-shadow: 0 0 8px -4px black;
+ font-family: sans-serif;
+}
+
+[data-tooltip]:hover::after {
+ transform: translate(-50%, 0) scale(1.0);
+ transition: transform 0.15s;
+ transition-delay: 1s;
+}
diff --git a/cypress/integration/app.cypress.test.js b/cypress/integration/app.cypress.test.js
index 3fb0dc92..f82d1afb 100644
--- a/cypress/integration/app.cypress.test.js
+++ b/cypress/integration/app.cypress.test.js
@@ -124,4 +124,6 @@ describe('app', () => {
cy.contains('בראשית ברא אלהים את השמים ואת הארץ')
})
+
+ it('shows a tooltip to press the "Shift" key to toggle quickly') // can't test this because cypress does not have `cy.get('...').hover` – see https://docs.cypress.io/api/commands/hover.html#
})
diff --git a/dist/bundle.js b/dist/bundle.js
index 7457cebb..6adbdf41 100644
--- a/dist/bundle.js
+++ b/dist/bundle.js
@@ -108,6 +108,42 @@ eval("module.exports = [{\"he\":\"בראשית\",\"page\":1},{\"he\":\"נח\",\"
/***/ }),
+/***/ "./components/Line.js":
+/*!****************************!*\
+ !*** ./components/Line.js ***!
+ \****************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _src__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src */ \"./src/index.js\");\n\n\nconst petuchaClass = (isPetucha) => isPetucha ? 'mod-petucha' : ''\nconst setumaClass = (column) => column.length > 1 ? 'mod-setuma' : ''\n\nconst Line = ({ text, verses, aliyot, isPetucha }, annotated) => `\n \n ${text.map((column) => (`\n
\n ${column.map((fragment) => (`\n ${Object(_src__WEBPACK_IMPORTED_MODULE_0__[\"textFilter\"])({ text: fragment, annotated })}\n `)).join('')}\n
\n `)).join('')}\n
${_src__WEBPACK_IMPORTED_MODULE_0__[\"displayRange\"].asVersesRange(verses)}\n
${_src__WEBPACK_IMPORTED_MODULE_0__[\"displayRange\"].asAliyotRange(aliyot)}\n
\n`\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Line);\n\n\n//# sourceURL=webpack:///./components/Line.js?");
+
+/***/ }),
+
+/***/ "./components/Page.js":
+/*!****************************!*\
+ !*** ./components/Page.js ***!
+ \****************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Line__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Line */ \"./components/Line.js\");\n\n\nconst Page = (lines, annotated) => `\n \n ${lines.map((line) => (`\n \n ${Object(_Line__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(line, annotated)} | \n
\n `)).join('')}\n
\n`\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Page);\n\n\n//# sourceURL=webpack:///./components/Page.js?");
+
+/***/ }),
+
+/***/ "./components/ParshaPicker.js":
+/*!************************************!*\
+ !*** ./components/ParshaPicker.js ***!
+ \************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _build_parshiyot_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../build/parshiyot.json */ \"./build/parshiyot.json\");\nvar _build_parshiyot_json__WEBPACK_IMPORTED_MODULE_0___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../build/parshiyot.json */ \"./build/parshiyot.json\", 1);\n\n\nconst ParshaPicker = () => `\n \n
\n ${_build_parshiyot_json__WEBPACK_IMPORTED_MODULE_0__.map(({ he, page }) => (`- ${he}
`)).join('')}\n
\n
\n`\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ParshaPicker);\n\n\n//# sourceURL=webpack:///./components/ParshaPicker.js?");
+
+/***/ }),
+
/***/ "./index.js":
/*!******************!*\
!*** ./index.js ***!
@@ -116,7 +152,7 @@ eval("module.exports = [{\"he\":\"בראשית\",\"page\":1},{\"he\":\"נח\",\"
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _src__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src */ \"./src/index.js\");\n/* harmony import */ var _build_parshiyot_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./build/parshiyot.json */ \"./build/parshiyot.json\");\nvar _build_parshiyot_json__WEBPACK_IMPORTED_MODULE_1___namespace = /*#__PURE__*/__webpack_require__.t(/*! ./build/parshiyot.json */ \"./build/parshiyot.json\", 1);\n/* harmony import */ var _build_page_titles_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./build/page-titles.json */ \"./build/page-titles.json\");\nvar _build_page_titles_json__WEBPACK_IMPORTED_MODULE_2___namespace = /*#__PURE__*/__webpack_require__.t(/*! ./build/page-titles.json */ \"./build/page-titles.json\", 1);\n\n\n\n\nconst petuchaClass = (isPetucha) => isPetucha ? 'mod-petucha' : ''\n\nconst setumaClass = (column) => column.length > 1 ? 'mod-setuma' : ''\n\nconst Line = ({ text, verses, aliyot, isPetucha }, annotated) => `\n \n ${text.map((column) => (`\n
\n ${column.map((fragment) => (`\n ${Object(_src__WEBPACK_IMPORTED_MODULE_0__[\"textFilter\"])({ text: fragment, annotated })}\n `)).join('')}\n
\n `)).join('')}\n
${_src__WEBPACK_IMPORTED_MODULE_0__[\"displayRange\"].asVersesRange(verses)}\n
${_src__WEBPACK_IMPORTED_MODULE_0__[\"displayRange\"].asAliyotRange(aliyot)}\n
\n`\n\nconst Page = (lines, annotated) => `\n \n ${lines.map((line) => (`\n \n ${Line(line, annotated)} | \n
\n `)).join('')}\n
\n`\n\nconst ParshaPicker = () => `\n \n
\n ${_build_parshiyot_json__WEBPACK_IMPORTED_MODULE_1__.map(({ he, page }) => (`- ${he}
`)).join('')}\n
\n
\n`\n\nconst insertBefore = (parent, child) => {\n parent.insertAdjacentElement('afterbegin', child)\n}\n\nconst insertAfter = (parent, child) => {\n parent.insertAdjacentElement('beforeend', child)\n}\n\nconst fetchPage = (n) => {\n if (n <= 0) return Promise.resolve({})\n\n return window.fetch(`/build/pages/${n}.json`)\n .then((res) => res.json())\n .then((page) => ({ key: n, content: page }))\n .catch((err) => {\n console.error(err)\n return {}\n })\n}\n\nconst iterator = _src__WEBPACK_IMPORTED_MODULE_0__[\"IntegerIterator\"].new({ startingAt: 1 })\n\nconst cache = {}\n\nconst unpackCache = (cache) => Object.keys(cache).map(key => cache[key])\n\nlet isShowingParshaPicker = false\n\nconst htmlToElement = (html) => {\n const template = document.createElement('template')\n html = html.trim() // Never return a text node of whitespace as the result\n template.innerHTML = html\n return template.content.firstChild\n}\n\nconst state = {\n iterator\n}\n\nconst render = ({ cache, showAnnotations, title }) => {\n unpackCache(cache)\n .forEach(({ node, content }) => {\n const el = htmlToElement(Page(content, showAnnotations))\n\n const firstChild = node.firstChild\n if (firstChild) {\n node.replaceChild(el, firstChild)\n } else {\n node.appendChild(el)\n }\n })\n\n document.querySelector('[data-target-id=\"parsha-title\"]').innerHTML = title\n}\n\nconst setState = (updates) => {\n const newState = Object.assign(state, updates)\n\n render(newState)\n}\n\nconst emptyObject = (obj) => {\n for (const key in obj) {\n delete obj[key]\n }\n}\n\nconst emptyNode = (node) => {\n while (node.firstChild) node.removeChild(node.firstChild)\n}\n\nconst showParshaPicker = () => {\n document.querySelector('#js-app').appendChild(htmlToElement(ParshaPicker()))\n ;[...document.querySelectorAll('[data-target-id=\"parsha\"]')]\n .forEach((parsha) => {\n parsha.addEventListener('click', (e) => {\n const page = Number(e.target.getAttribute('data-jump-to-page'))\n const title = Object(_src__WEBPACK_IMPORTED_MODULE_0__[\"title\"])(_build_page_titles_json__WEBPACK_IMPORTED_MODULE_2__[page - 1])\n\n emptyObject(cache)\n state.iterator = _src__WEBPACK_IMPORTED_MODULE_0__[\"IntegerIterator\"].new({ startingAt: page })\n\n emptyNode(document.querySelector('[data-target-id=\"tikkun-book\"]'))\n\n fetchPage(state.iterator.next())\n .then(({ key, content }) => {\n const node = document.createElement('div')\n node.classList.add('tikkun-page')\n node.setAttribute('data-page-number', key)\n\n cache[key] = { node, content }\n insertAfter(document.querySelector('[data-target-id=\"tikkun-book\"]'), node)\n\n setState({\n cache,\n showAnnotations: document.querySelector('[data-target-id=\"annotations-toggle\"]').checked,\n title\n })\n })\n\n toggleParshaPicker()\n })\n })\n}\n\nconst toggleParshaPicker = () => {\n isShowingParshaPicker = !isShowingParshaPicker\n\n ;[\n '[data-test-id=\"annotations-toggle\"]',\n '[data-target-id=\"repo-link\"]',\n '[data-target-id=\"tikkun-book\"]'\n ]\n .map(selector => document.querySelector(selector))\n .map(el => el.classList)\n .forEach(classList => {\n classList.toggle('u-hidden')\n classList.toggle('mod-animated')\n })\n\n if (isShowingParshaPicker) {\n showParshaPicker()\n } else {\n document.querySelector('#js-app').removeChild(document.querySelector('.parsha-picker'))\n }\n}\n\nconst toggleAnnotations = (e) => {\n if (e.key !== 'Shift') return\n\n const toggle = document.querySelector('[data-target-id=\"annotations-toggle\"]')\n\n toggle.checked = !toggle.checked\n\n setState({ showAnnotations: toggle.checked })\n}\n\nconst isInView = (view, scrollView) => {\n return (\n view.offsetTop < scrollView.scrollTop + scrollView.clientHeight\n ) && (\n view.offsetTop + view.clientHeight > scrollView.scrollTop\n )\n}\n\nconst updatePageTitle = (scrollView) => {\n const pages = [...document.querySelectorAll('.tikkun-page')]\n\n const inViewPages = pages.filter((page) => isInView(page, scrollView))\n\n const firstPageInView = inViewPages[0]\n\n const n = Number(firstPageInView.getAttribute('data-page-number'))\n setState({ title: Object(_src__WEBPACK_IMPORTED_MODULE_0__[\"title\"])(_build_page_titles_json__WEBPACK_IMPORTED_MODULE_2__[n - 1]) })\n}\n\nlet timeout\nconst debounce = (f) => {\n clearTimeout(timeout)\n timeout = setTimeout(f, 100)\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n _src__WEBPACK_IMPORTED_MODULE_0__[\"InfiniteScroller\"]\n .new({\n container: document.querySelector('[data-target-id=\"tikkun-book\"]'),\n fetchPreviousContent: {\n fetch: () => fetchPage(state.iterator.previous()),\n render: (container, { key, content }) => {\n const node = document.createElement('div')\n node.classList.add('tikkun-page')\n node.setAttribute('data-page-number', key)\n\n insertBefore(container, node)\n cache[key] = { node, content }\n\n setState({ cache })\n }\n },\n fetchNextContent: {\n fetch: () => fetchPage(state.iterator.next()),\n render: (container, { key, content }) => {\n const node = document.createElement('div')\n node.classList.add('tikkun-page')\n node.setAttribute('data-page-number', key)\n\n insertAfter(container, node)\n cache[key] = { node, content }\n\n setState({ cache })\n }\n }\n })\n .attach()\n\n document.querySelector('[data-target-id=\"tikkun-book\"]').addEventListener('scroll', (e) => {\n debounce(() => updatePageTitle(e.target))\n })\n\n document.querySelector('[data-target-id=\"annotations-toggle\"]').addEventListener('change', (e) => {\n const showAnnotations = e.target.checked\n\n setState({ showAnnotations })\n })\n\n document.addEventListener('keydown', toggleAnnotations)\n document.addEventListener('keyup', toggleAnnotations)\n\n document.querySelector('[data-target-id=\"parsha-title\"]').addEventListener('click', toggleParshaPicker)\n\n fetchPage(state.iterator.next())\n .then(({ key, content }) => {\n const node = document.createElement('div')\n node.classList.add('tikkun-page')\n node.setAttribute('data-page-number', key)\n\n cache[key] = { node, content }\n insertAfter(document.querySelector('[data-target-id=\"tikkun-book\"]'), node)\n\n setState({\n cache,\n showAnnotations: document.querySelector('[data-target-id=\"annotations-toggle\"]').checked,\n title: Object(_src__WEBPACK_IMPORTED_MODULE_0__[\"title\"])(_build_page_titles_json__WEBPACK_IMPORTED_MODULE_2__[key - 1])\n })\n })\n})\n\n\n//# sourceURL=webpack:///./index.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _src__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src */ \"./src/index.js\");\n/* harmony import */ var _components_Page__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/Page */ \"./components/Page.js\");\n/* harmony import */ var _components_ParshaPicker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/ParshaPicker */ \"./components/ParshaPicker.js\");\n/* harmony import */ var _build_page_titles_json__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./build/page-titles.json */ \"./build/page-titles.json\");\nvar _build_page_titles_json__WEBPACK_IMPORTED_MODULE_3___namespace = /*#__PURE__*/__webpack_require__.t(/*! ./build/page-titles.json */ \"./build/page-titles.json\", 1);\n\n\n\n\n\nconst insertBefore = (parent, child) => {\n parent.insertAdjacentElement('afterbegin', child)\n}\n\nconst insertAfter = (parent, child) => {\n parent.insertAdjacentElement('beforeend', child)\n}\n\nconst fetchPage = (n) => {\n if (n <= 0) return Promise.resolve({})\n\n return window.fetch(`/build/pages/${n}.json`)\n .then((res) => res.json())\n .then((page) => ({ key: n, content: page }))\n .catch((err) => {\n console.error(err)\n return {}\n })\n}\n\nconst iterator = _src__WEBPACK_IMPORTED_MODULE_0__[\"IntegerIterator\"].new({ startingAt: 1 })\n\nconst cache = {}\n\nconst unpackCache = (cache) => Object.keys(cache).map(key => cache[key])\n\nlet isShowingParshaPicker = false\n\nconst htmlToElement = (html) => {\n const template = document.createElement('template')\n html = html.trim() // Never return a text node of whitespace as the result\n template.innerHTML = html\n return template.content.firstChild\n}\n\nconst state = {\n iterator\n}\n\nconst render = ({ cache, showAnnotations, title }) => {\n unpackCache(cache)\n .forEach(({ node, content }) => {\n const el = htmlToElement(Object(_components_Page__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(content, showAnnotations))\n\n const firstChild = node.firstChild\n if (firstChild) {\n node.replaceChild(el, firstChild)\n } else {\n node.appendChild(el)\n }\n })\n\n document.querySelector('[data-target-id=\"parsha-title\"]').innerHTML = title\n}\n\nconst setState = (updates) => {\n const newState = Object.assign(state, updates)\n\n render(newState)\n}\n\nconst emptyObject = (obj) => {\n for (const key in obj) {\n delete obj[key]\n }\n}\n\nconst emptyNode = (node) => {\n while (node.firstChild) node.removeChild(node.firstChild)\n}\n\nconst makePageNode = (n) => {\n const node = document.createElement('div')\n node.classList.add('tikkun-page')\n node.setAttribute('data-page-number', n)\n\n return node\n}\n\nconst showParshaPicker = () => {\n document.querySelector('#js-app').appendChild(htmlToElement(Object(_components_ParshaPicker__WEBPACK_IMPORTED_MODULE_2__[\"default\"])()))\n ;[...document.querySelectorAll('[data-target-id=\"parsha\"]')]\n .forEach((parsha) => {\n parsha.addEventListener('click', (e) => {\n const page = Number(e.target.getAttribute('data-jump-to-page'))\n\n emptyObject(cache)\n state.iterator = _src__WEBPACK_IMPORTED_MODULE_0__[\"IntegerIterator\"].new({ startingAt: page })\n\n emptyNode(document.querySelector('[data-target-id=\"tikkun-book\"]'))\n\n fetchPage(state.iterator.next())\n .then(renderNext)\n\n toggleParshaPicker()\n })\n })\n}\n\nconst toggleParshaPicker = () => {\n isShowingParshaPicker = !isShowingParshaPicker\n\n ;[\n '[data-test-id=\"annotations-toggle\"]',\n '[data-target-id=\"repo-link\"]',\n '[data-target-id=\"tikkun-book\"]'\n ]\n .map(selector => document.querySelector(selector))\n .map(el => el.classList)\n .forEach(classList => {\n classList.toggle('u-hidden')\n classList.toggle('mod-animated')\n })\n\n if (isShowingParshaPicker) {\n showParshaPicker()\n } else {\n document.querySelector('#js-app').removeChild(document.querySelector('.parsha-picker'))\n }\n}\n\nconst toggleAnnotations = (e) => {\n if (e.key !== 'Shift') return\n\n const toggle = document.querySelector('[data-target-id=\"annotations-toggle\"]')\n\n toggle.checked = !toggle.checked\n\n setState({ showAnnotations: toggle.checked })\n}\n\nconst isInView = (view, scrollView) => {\n return (\n view.offsetTop < scrollView.scrollTop + scrollView.clientHeight\n ) && (\n view.offsetTop + view.clientHeight > scrollView.scrollTop\n )\n}\n\nconst updatePageTitle = (scrollView) => {\n const pages = [...document.querySelectorAll('.tikkun-page')]\n\n const inViewPages = pages.filter((page) => isInView(page, scrollView))\n\n const firstPageInView = inViewPages[0]\n\n const n = Number(firstPageInView.getAttribute('data-page-number'))\n setState({ title: Object(_src__WEBPACK_IMPORTED_MODULE_0__[\"title\"])(_build_page_titles_json__WEBPACK_IMPORTED_MODULE_3__[n - 1]) })\n}\n\nlet timeout\nconst debounce = (f) => {\n clearTimeout(timeout)\n timeout = setTimeout(f, 100)\n}\n\nconst renderPage = ({ doInsert }) => ({ key, content }) => {\n const node = makePageNode(key)\n\n cache[key] = { node, content }\n doInsert(document.querySelector('[data-target-id=\"tikkun-book\"]'), node)\n\n setState({\n cache,\n showAnnotations: document.querySelector('[data-target-id=\"annotations-toggle\"]').checked,\n title: Object(_src__WEBPACK_IMPORTED_MODULE_0__[\"title\"])(_build_page_titles_json__WEBPACK_IMPORTED_MODULE_3__[key - 1])\n })\n}\n\nconst renderPrevious = renderPage({ doInsert: insertBefore })\nconst renderNext = renderPage({ doInsert: insertAfter })\n\ndocument.addEventListener('DOMContentLoaded', () => {\n _src__WEBPACK_IMPORTED_MODULE_0__[\"InfiniteScroller\"]\n .new({\n container: document.querySelector('[data-target-id=\"tikkun-book\"]'),\n fetchPreviousContent: {\n fetch: () => fetchPage(state.iterator.previous()),\n render: (container, { key, content }) => renderPrevious({ key, content })\n },\n fetchNextContent: {\n fetch: () => fetchPage(state.iterator.next()),\n render: (container, { key, content }) => renderNext({ key, content })\n }\n })\n .attach()\n\n document.querySelector('[data-target-id=\"tikkun-book\"]').addEventListener('scroll', (e) => {\n debounce(() => updatePageTitle(e.target))\n })\n\n document.querySelector('[data-target-id=\"annotations-toggle\"]').addEventListener('change', (e) => {\n const showAnnotations = e.target.checked\n\n setState({ showAnnotations })\n })\n\n document.addEventListener('keydown', toggleAnnotations)\n document.addEventListener('keyup', toggleAnnotations)\n\n document.querySelector('[data-target-id=\"parsha-title\"]').addEventListener('click', toggleParshaPicker)\n\n fetchPage(state.iterator.next())\n .then(renderNext)\n})\n\n\n//# sourceURL=webpack:///./index.js?");
/***/ }),
diff --git a/index.html b/index.html
index a243c61b..08cb1dbe 100644
--- a/index.html
+++ b/index.html
@@ -3,6 +3,7 @@
+
@@ -18,7 +19,7 @@