summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2024-02-18 08:10:09 -0500
committerGitHub <noreply@github.com>2024-02-18 13:10:09 +0000
commit6cf38229b54efbbc3ae7bc174c3999f9dfa7b1d2 (patch)
tree1d47e64bf80ef2f7fd082dde956d0b214946f189 /ext
parentc48cd6ff6d8dcced7baf1b27ce3ac2449944f5d7 (diff)
Html templates update (#707)
* Simplify display template loading * Add helper * Rename file * Rename for simplicity * Create templates file * Load * Remove templates * Move permissions templates * Remove "templates" from comments * Fix prepare
Diffstat (limited to 'ext')
-rw-r--r--ext/js/background/backend.js6
-rw-r--r--ext/js/comm/api.js7
-rw-r--r--ext/js/display/display-generator.js9
-rw-r--r--ext/js/display/display.js2
-rw-r--r--ext/js/dom/html-template-collection.js24
-rw-r--r--ext/js/pages/settings/settings-controller.js2
-rw-r--r--ext/permissions.html10
-rw-r--r--ext/settings.html458
-rw-r--r--ext/templates-display.html (renamed from ext/display-templates.html)12
-rw-r--r--ext/templates-settings.html441
-rw-r--r--ext/welcome.html34
11 files changed, 468 insertions, 537 deletions
diff --git a/ext/js/background/backend.js b/ext/js/background/backend.js
index f301b4c6..c0410ab8 100644
--- a/ext/js/background/backend.js
+++ b/ext/js/background/backend.js
@@ -167,7 +167,6 @@ export class Backend {
['getStylesheetContent', this._onApiGetStylesheetContent.bind(this)],
['getEnvironmentInfo', this._onApiGetEnvironmentInfo.bind(this)],
['clipboardGet', this._onApiClipboardGet.bind(this)],
- ['getDisplayTemplatesHtml', this._onApiGetDisplayTemplatesHtml.bind(this)],
['getZoom', this._onApiGetZoom.bind(this)],
['getDefaultAnkiFieldTemplates', this._onApiGetDefaultAnkiFieldTemplates.bind(this)],
['getDictionaryInfo', this._onApiGetDictionaryInfo.bind(this)],
@@ -686,11 +685,6 @@ export class Backend {
return this._clipboardReader.getText(false);
}
- /** @type {import('api').ApiHandler<'getDisplayTemplatesHtml'>} */
- async _onApiGetDisplayTemplatesHtml() {
- return await fetchText('/display-templates.html');
- }
-
/** @type {import('api').ApiHandler<'getZoom'>} */
_onApiGetZoom(_params, sender) {
return new Promise((resolve, reject) => {
diff --git a/ext/js/comm/api.js b/ext/js/comm/api.js
index f07702da..30fcfc29 100644
--- a/ext/js/comm/api.js
+++ b/ext/js/comm/api.js
@@ -210,13 +210,6 @@ export class API {
}
/**
- * @returns {Promise<import('api').ApiReturn<'getDisplayTemplatesHtml'>>}
- */
- getDisplayTemplatesHtml() {
- return this._invoke('getDisplayTemplatesHtml', void 0);
- }
-
- /**
* @returns {Promise<import('api').ApiReturn<'getZoom'>>}
*/
getZoom() {
diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js
index 621ea833..65736759 100644
--- a/ext/js/display/display-generator.js
+++ b/ext/js/display/display-generator.js
@@ -39,12 +39,9 @@ export class DisplayGenerator {
this._structuredContentGenerator = new StructuredContentGenerator(this._contentManager, document);
}
- /**
- * @param {import('../comm/api.js').API} api
- */
- async prepare(api) {
- const html = await api.getDisplayTemplatesHtml();
- this._templates.load(html);
+ /** */
+ async prepare() {
+ await this._templates.loadFromFiles(['/templates-display.html']);
this.updateHotkeys();
}
diff --git a/ext/js/display/display.js b/ext/js/display/display.js
index 4cd2d611..588508b5 100644
--- a/ext/js/display/display.js
+++ b/ext/js/display/display.js
@@ -318,7 +318,7 @@ export class Display extends EventDispatcher {
// Prepare
await this._hotkeyHelpController.prepare(this._application.api);
- await this._displayGenerator.prepare(this._application.api);
+ await this._displayGenerator.prepare();
this._queryParser.prepare();
this._history.prepare();
this._optionToggleHotkeyHandler.prepare();
diff --git a/ext/js/dom/html-template-collection.js b/ext/js/dom/html-template-collection.js
index 981d5528..a71d954f 100644
--- a/ext/js/dom/html-template-collection.js
+++ b/ext/js/dom/html-template-collection.js
@@ -16,6 +16,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+import {fetchText} from '../core/fetch-utilities.js';
+
export class HtmlTemplateCollection {
constructor() {
/** @type {Map<string, HTMLTemplateElement>} */
@@ -23,17 +25,23 @@ export class HtmlTemplateCollection {
}
/**
- * @param {string|Document} source
+ * @param {string[]} urls
*/
- load(source) {
- const sourceNode = (
- typeof source === 'string' ?
- new DOMParser().parseFromString(source, 'text/html') :
- source
- );
+ async loadFromFiles(urls) {
+ const htmlRawArray = await Promise.all(urls.map((url) => fetchText(url)));
+ const domParser = new DOMParser();
+ for (const htmlRaw of htmlRawArray) {
+ const templatesDocument = domParser.parseFromString(htmlRaw, 'text/html');
+ this.load(templatesDocument);
+ }
+ }
+ /**
+ * @param {Document} source
+ */
+ load(source) {
const pattern = /^([\w\W]+)-template$/;
- for (const template of sourceNode.querySelectorAll('template')) {
+ for (const template of source.querySelectorAll('template')) {
const match = pattern.exec(template.id);
if (match === null) { continue; }
this._prepareTemplate(template);
diff --git a/ext/js/pages/settings/settings-controller.js b/ext/js/pages/settings/settings-controller.js
index c835f8e6..d0cfd838 100644
--- a/ext/js/pages/settings/settings-controller.js
+++ b/ext/js/pages/settings/settings-controller.js
@@ -44,7 +44,6 @@ export class SettingsController extends EventDispatcher {
this._pageExitPreventionEventListeners = new EventListenerCollection();
/** @type {HtmlTemplateCollection} */
this._templates = new HtmlTemplateCollection();
- this._templates.load(document);
}
/** @type {import('../../application.js').Application} */
@@ -69,6 +68,7 @@ export class SettingsController extends EventDispatcher {
/** */
async prepare() {
+ await this._templates.loadFromFiles(['/templates-settings.html']);
this._application.on('optionsUpdated', this._onOptionsUpdated.bind(this));
if (this._canObservePermissionsChanges()) {
chrome.permissions.onAdded.addListener(this._onPermissionsChanged.bind(this));
diff --git a/ext/permissions.html b/ext/permissions.html
index 61b0d363..884687ab 100644
--- a/ext/permissions.html
+++ b/ext/permissions.html
@@ -227,16 +227,6 @@
</div>
</div></div>
-<template id="permissions-origin-template">
- <div class="permissions-origin-index generic-list-index-prefix"></div>
- <input type="text" class="permissions-origin-input horizontal-flex-fill" autocomplete="off" spellcheck="false" readonly>
- <button type="button" class="icon-button permissions-origin-menu-button permissions-origin-button" data-menu="permissions-origin-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
-</template>
-
-<template id="permissions-origin-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="remove">Remove</button>
-</div></div></div></template>
-
<!-- Scripts -->
<script src="/js/pages/permissions-main.js" type="module"></script>
diff --git a/ext/settings.html b/ext/settings.html
index 8dc70cf3..fc447c29 100644
--- a/ext/settings.html
+++ b/ext/settings.html
@@ -2321,57 +2321,6 @@
</div></div>
-<!-- Profile templates -->
-<template id="profile-entry-template"><div class="profile-entry generic-list-entry">
- <div class="profile-entry-cell generic-list-index-prefix"></div>
- <div class="profile-entry-cell"><label class="radio"><input type="radio" class="profile-entry-is-default-radio" name="profile-entry-default-radio"><span class="radio-body"><span class="radio-border"></span><span class="radio-dot"></span></span></label></div>
- <div class="profile-entry-cell"><input class="profile-entry-name-input" type="text" autocomplete="off" placeholder="Profile name"></div>
- <div class="profile-entry-cell"><a tabindex="0" class="profile-entry-condition-count-link"><span class="profile-entry-condition-count">0</span></a></div>
- <div class="profile-entry-cell input-height-icon-button-container"><button type="button" class="icon-button profile-entry-menu-button" data-menu="profile-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button></div>
-</div></template>
-
-<template id="profile-condition-group-template"><div class="profile-condition-group">
- <div class="profile-condition-list"></div>
- <div class="profile-condition-list-info">
- <div class="profile-condition-group-separator-label">or</div>
- <div class="profile-condition-list-info-space"></div>
- <button type="button" class="profile-condition-add-button low-emphasis">Add</button>
- </div>
-</div></template>
-
-<template id="profile-condition-template"><div class="profile-condition">
- <div class="profile-condition-prefix"></div>
- <div class="profile-condition-inner">
- <select class="profile-condition-type"><optgroup label="Type"></optgroup></select>
- <select class="profile-condition-operator"><optgroup label="Operator"></optgroup></select>
- <div class="profile-condition-input-container">
- <input type="text" class="profile-condition-input" autocomplete="off" spellcheck="false">
- <div class="input-height-icon-button-container mouse-button-container" hidden>
- <button type="button" class="icon-button profile-condition-mouse-button mouse-button"><span class="icon-button-inner"><span class="icon" data-icon="mouse"></span></span></button>
- </div>
- </div>
- </div>
- <div class="profile-condition-menu-button-container input-height-icon-button-container">
- <button type="button" class="icon-button profile-condition-menu-button" data-menu="profile-condition-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
- </div>
-</div></template>
-
-<template id="profile-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="moveUp">Move up</button>
- <button type="button" class="popup-menu-item" data-menu-action="moveDown">Move down</button>
- <button type="button" class="popup-menu-item" data-menu-action="copyFrom">Copy from&hellip;</button>
- <button type="button" class="popup-menu-item" data-menu-action="editConditions">Edit conditions&hellip;</button>
- <button type="button" class="popup-menu-item" data-menu-action="duplicate">Duplicate</button>
- <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
-</div></div></div></template>
-
-<template id="profile-condition-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="resetValue">Reset value</button>
- <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
- <button type="button" class="popup-menu-item" data-menu-action="deleteGroup">Delete group</button>
-</div></div></div></template>
-
-
<!-- Dictionary modals -->
<div id="dictionaries-modal" class="modal" tabindex="-1" role="dialog" hidden><div class="modal-content">
<div class="modal-header">
@@ -2692,74 +2641,6 @@
</div></div>
-<!-- Dictionary templates -->
-<template id="dictionary-template">
- <div class="dictionary-list-index generic-list-index-prefix"></div>
- <label class="toggle dictionary-item-enabled-toggle-container"><input type="checkbox" class="dictionary-enabled"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label>
- <div class="dictionary-item-title-container">
- <span>
- <strong class="dictionary-title"></strong> <span class="light dictionary-version"></span>
- </span>
- <button type="button" class="dictionary-outdated-button" hidden>
- <div class="badge warning-badge"><span class="icon" data-icon="exclamation-point-short"></span></div>
- </button>
- <button type="button" class="dictionary-integrity-button" hidden>
- <div class="badge info-badge badge-small-icon"><span class="icon" data-icon="checkmark"></span></div>
- </button>
- </div>
- <input type="number" step="1" class="short-height dictionary-priority">
- <button type="button" class="icon-button dictionary-menu-button" data-menu="dictionary-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
-</template>
-
-<template id="dictionary-details-entry-template"><div class="dictionary-details-entry">
- <span class="dictionary-details-entry-label"></span>
- <span class="dictionary-details-entry-info"></span>
-</div></template>
-
-<template id="dictionary-extra-template">
- <div class="dictionary-item-bottom"></div>
- <div class="dictionary-item-bottom"></div>
- <div class="dictionary-item-bottom dictionary-item-title-container">
- <span>
- <strong class="dictionary-title">Unassociated Data</strong> <span class="light dictionary-total-count"></span>
- </span>
- <button type="button" class="dictionary-integrity-button">
- <div class="badge warning-badge"><span class="icon" data-icon="exclamation-point-short"></span></div>
- </button>
- </div>
- <div class="dictionary-item-bottom"></div>
- <div class="dictionary-item-bottom dictionary-item-button-height"></div>
-</template>
-
-<template id="dictionary-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="showDetails">Details&hellip;</button>
- <button type="button" class="popup-menu-item" data-menu-action="moveUp">Move up</button>
- <button type="button" class="popup-menu-item" data-menu-action="moveDown">Move down</button>
- <button type="button" class="popup-menu-item" data-menu-action="moveTo">Move to&hellip;</button>
- <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
-</div></div></div></template>
-
-<template id="secondary-search-dictionary-template"><div class="secondary-search-dictionary-item horizontal-flex">
- <label class="toggle"><input type="checkbox" class="dictionary-allow-secondary-searches"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label>
- <span class="horizontal-flex-fill"><strong class="dictionary-title"></strong> <span class="light dictionary-version"></span></span>
-</div></template>
-
-<template id="collapsible-dictionary-item-template"><div class="collapsible-dictionary-item">
- <div class="collapsible-dictionary-cell">
- <span class="dictionary-info-label"><strong class="dictionary-title"></strong> <span class="light dictionary-version"></span></span>
- </div>
- <div class="collapsible-dictionary-cell">
- <select class="definitions-collapsible medium-width">
- <option value="not-collapsible">Not collapsible</option>
- <option value="collapsed">Collapsed</option>
- <option value="expanded">Expanded</option>
- <option value="force-collapsed">Force collapsed</option>
- <option value="force-expanded">Force expanded</option>
- </select>
- </div>
-</div></template>
-
-
<!-- Custom CSS modal -->
<div id="custom-css-modal" class="modal modal-left" tabindex="-1" role="dialog" hidden><div class="modal-content-container1">
<div class="modal-content-container2 modal-content-dimmer"><div class="modal-content">
@@ -2880,37 +2761,6 @@
</div></div>
-<!-- Audio templates -->
-<template id="audio-source-template"><div class="audio-source">
- <div class="audio-source-index generic-list-index-prefix"></div>
- <div class="audio-source-inner">
- <select class="audio-source-type-select">
- <option value="jpod101">JapanesePod101</option>
- <option value="jpod101-alternate">JapanesePod101 (Alternate)</option>
- <option value="jisho">Jisho.org</option>
- <option value="text-to-speech">Text-to-speech</option>
- <option value="text-to-speech-reading">Text-to-speech (Kana reading)</option>
- <option value="custom">Custom URL</option>
- <option value="custom-json">Custom URL (JSON)</option>
- </select>
- <div class="audio-source-parameter-container" data-field="url" hidden>
- <span class="audio-source-parameter-label">URL:</span>
- <input type="text" class="audio-source-parameter">
- </div>
- <div class="audio-source-parameter-container" data-field="voice" hidden>
- <span class="audio-source-parameter-label">Voice:</span>
- <select class="audio-source-parameter"></select>
- </div>
- </div>
- <button type="button" class="icon-button audio-source-menu-button" data-menu="audio-source-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
-</div></template>
-
-<template id="audio-source-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="help">Help</button>
- <button type="button" class="popup-menu-item" data-menu-action="remove">Remove</button>
-</div></div></div></template>
-
-
<!-- Scanning inputs modal -->
<div id="scanning-inputs-modal" class="modal" tabindex="-1" role="dialog" hidden><div class="modal-content">
<div class="modal-header">
@@ -2969,114 +2819,6 @@
</div></div>
-<!-- Scanning inputs templates -->
-<template id="scan-input-template"><div class="scan-input" data-show-advanced="false">
- <div class="scan-input-grid">
- <div class="scan-input-index-cell generic-list-index-prefix"></div>
- <div class="scan-input-menu-button-cell">
- <div class="input-height-icon-button-container">
- <button type="button" class="icon-button scanning-input-menu-button" data-menu="scanning-inputs-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
- </div>
- </div>
-
- <div class="scan-input-prefix-cell" data-property="include"><span>Required inputs:</span></div>
- <div class="scan-input-content-cell input-group" data-property="include">
- <input type="text" class="scan-input-field" autocomplete="off" spellcheck="false" placeholder="No inputs" data-property="include">
- <button type="button" class="input-suffix input-suffix-icon-button light-icon mouse-button" data-property="include"><span class="icon" data-icon="mouse"></span></button>
- </div>
-
- <div class="scan-input-prefix-cell" data-property="exclude"><span>Excluded inputs:</span></div>
- <div class="scan-input-content-cell input-group" data-property="exclude">
- <input type="text" class="scan-input-field" autocomplete="off" spellcheck="false" placeholder="No inputs" data-property="exclude">
- <button type="button" class="input-suffix input-suffix-icon-button light-icon mouse-button" data-property="exclude"><span class="icon" data-icon="mouse"></span></button>
- </div>
-
- <div class="scan-input-prefix-cell scan-input-options-cell" data-property="types"><span>Input types:</span></div>
- <div class="scan-input-content-cell scan-input-options-cell" data-property="types">
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.mouse"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Mouse</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.touch"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Touch</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.pen"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Pen</span>
- </label>
- </div>
-
- <div class="scan-input-prefix-cell scan-input-options-cell scan-input-advanced-only" data-property="search-options"><span>Search types:</span></div>
- <div class="scan-input-content-cell scan-input-options-cell scan-input-advanced-only" data-property="search-options">
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.searchTerms"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Search for terms</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.searchKanji"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Search for kanji</span>
- </label>
- </div>
-
- <div class="scan-input-prefix-cell scan-input-options-cell scan-input-advanced-only" data-property="touch-options"><span>Touch options:</span></div>
- <div class="scan-input-content-cell scan-input-options-cell scan-input-advanced-only" data-property="touch-options">
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnTouchPress"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Scan on touch press</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnTouchRelease"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Scan on touch release</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnTouchMove"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Scan on touch move</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.preventTouchScrolling"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Prevent touch scrolling</span>
- </label>
- </div>
-
- <div class="scan-input-prefix-cell scan-input-options-cell scan-input-advanced-only" data-property="pen-options"><span>Pen options:</span></div>
- <div class="scan-input-content-cell scan-input-options-cell scan-input-advanced-only" data-property="pen-options">
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenPress"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Scan on pen press</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenRelease"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Scan on pen release</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenMove"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Scan on pen move (while touched)</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenHover"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Scan on pen hover (before touched)</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenReleaseHover"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Scan on pen hover (after touched)</span>
- </label>
- <label class="scan-input-checkbox-item">
- <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.preventPenScrolling"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Prevent pen scrolling</span>
- </label>
- </div>
- </div>
-</div></template>
-
-<template id="scanning-inputs-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="showAdvanced">Show advanced options</button>
- <button type="button" class="popup-menu-item" data-menu-action="hideAdvanced">Hide advanced options</button>
- <button type="button" class="popup-menu-item" data-menu-action="clearInputs">Clear inputs</button>
- <button type="button" class="popup-menu-item" data-menu-action="remove">Remove</button>
-</div></div></div></template>
-
-
<!-- Input action prevention modal -->
<div id="input-action-prevention-modal" class="modal" tabindex="-1" role="dialog" hidden><div class="modal-content modal-content-small">
<div class="modal-header"><div class="modal-title">Input Action Prevention</div></div>
@@ -3407,20 +3149,6 @@
</div></div>
-<!-- Anki card templates -->
-<template id="anki-card-field-template"><div class="anki-card-field-name-container"><span class="anki-card-field-name"></span></div>
-<div class="anki-card-field-value-container input-group">
- <input type="text" class="anki-card-field-value" autocomplete="off">
- <button type="button" class="anki-card-field-value-menu-button input-suffix input-suffix-icon-button light-icon" data-menu-position="v-center left"><span class="icon" data-icon="material-down-arrow"></span></button>
-</div></template>
-
-<template id="anki-card-terms-field-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body"></div></div></div></template>
-
-<template id="anki-card-kanji-field-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body"></div></div></div></template>
-
-<template id="anki-card-all-field-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body"></div></div></div></template>
-
-
<!-- Anki field template modals -->
<div id="anki-card-templates-modal" class="modal" tabindex="-1" role="dialog" hidden><div class="modal-content modal-content-full">
<div class="modal-header"><div class="modal-title">Anki Card Templates</div></div>
@@ -3580,38 +3308,6 @@
</div></div>
-<!-- Translation templates -->
-<template id="translation-text-replacement-entry-template"><div class="translation-text-replacement-entry">
- <div class="translation-text-replacement-index generic-list-index-prefix"></div>
- <div class="translation-text-replacement-pattern-label">Pattern:</div>
- <div class="translation-text-replacement-replacement-label">Replacement:</div>
- <div class="translation-text-replacement-pattern-container">
- <input type="text" class="translation-text-replacement-pattern code">
- <label class="translation-text-replacement-checkbox-container">
- <label class="checkbox"><input type="checkbox" class="translation-text-replacement-checkbox translation-text-replacement-pattern-ignore-case"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span class="translation-text-replacement-checkbox-label">Ignore case</span>
- </label>
- </div>
- <div class="translation-text-replacement-replacement-container">
- <input type="text" class="translation-text-replacement-replacement code">
- </div>
- <button type="button" class="icon-button translation-text-replacement-button" data-menu="translation-text-replacement-entry-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
-
- <div class="translation-text-replacement-test-label translation-text-replacement-test-node">Test Input:</div>
- <div class="translation-text-replacement-test-container translation-text-replacement-test-node">
- <input type="text" class="translation-text-replacement-test-input" lang="ja">
- <div class="translation-text-replacement-test-label-inner">Output:</div>
- <input type="text" class="translation-text-replacement-test-output" lang="ja" readonly>
- </div>
-</div></template>
-
-<template id="translation-text-replacement-entry-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="showTest">Test</button>
- <button type="button" class="popup-menu-item" data-menu-action="hideTest">Hide test</button>
- <button type="button" class="popup-menu-item" data-menu-action="remove">Remove</button>
-</div></div></div></template>
-
-
<!-- Sentence parsing modal -->
<div id="sentence-termination-characters-modal" class="modal" tabindex="-1" role="dialog" hidden><div class="modal-content">
<div class="modal-header">
@@ -3651,47 +3347,6 @@
</div></div>
-<!-- Sentence parsing templates -->
-<template id="sentence-termination-character-entry-template"><tr class="sentence-termination-character-entry">
- <td class="generic-list-index-prefix"></td>
- <td>
- <label class="toggle"><input type="checkbox" class="sentence-termination-character-enabled"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label>
- </td>
- <td>
- <select class="sentence-termination-character-type">
- <option value="terminator">Terminator</option>
- <option value="quote">Quote</option>
- </select>
- </td>
- <td>
- <input type="text" class="sentence-termination-character-input1" maxlength="1" lang="ja">
- </td>
- <td>
- <input type="text" class="sentence-termination-character-input2" maxlength="1" lang="ja">
- <div class="sentence-termination-character-input2-alt">&mdash;</div>
- </td>
- <td>
- <div class="sentence-termination-character-include-list">
- <label class="sentence-termination-character-include">
- <label class="checkbox"><input type="checkbox" class="sentence-termination-character-include-at-start"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>At start</span>
- </label>
- <label class="sentence-termination-character-include">
- <label class="checkbox"><input type="checkbox" class="sentence-termination-character-include-at-end"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>At end</span>
- </label>
- </div>
- </td>
- <td>
- <button type="button" class="icon-button sentence-termination-character-entry-button" data-menu="sentence-termination-character-entry-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
- </td>
-</tr></template>
-
-<template id="sentence-termination-character-entry-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
-</div></div></div></template>
-
-
<!-- Keyboard shortcuts modal -->
<div id="keyboard-shortcuts-modal" class="modal" tabindex="-1" role="dialog" hidden><div class="modal-content modal-content-full">
<div class="modal-header">
@@ -3776,119 +3431,6 @@
</div>
</div></div>
-<!-- Keyboard shortcuts templates -->
-<template id="hotkey-list-item-template"><div class="hotkey-list-item"><div class="hotkey-list-item-grid">
- <div class="hotkey-list-item-index-cell generic-list-index-prefix"></div>
- <div class="hotkey-list-item-button-cell">
- <div class="input-height-icon-button-container">
- <button type="button" class="icon-button hotkey-list-item-button" data-menu="hotkey-list-item-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
- </div>
- </div>
-
- <div class="hotkey-list-item-input-label-cell">Input:</div>
- <div class="hotkey-list-item-input-cell">
- <input type="text" class="hotkey-list-item-input" autocomplete="off" spellcheck="false" placeholder="No input" data-property="include">
- <div class="hotkey-list-item-enabled-button-container input-group">
- <button type="button" class="hotkey-list-item-enabled-button input-button">
- <label class="hotkey-list-item-enabled-button-label button-inner-label">
- <span class="checkbox"><input type="checkbox" class="hotkey-list-item-enabled"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></span>
- <span>Enabled</span>
- </label>
- </button>
- <button type="button" class="hotkey-list-item-scopes-button input-suffix input-suffix-icon-button light-icon" data-menu="hotkey-list-item-scopes-menu" data-menu-position="below left"><span class="icon" data-icon="material-down-arrow"></span></button>
- </div>
- </div>
-
- <div class="hotkey-list-item-action-label-cell">Action:</div>
- <div class="hotkey-list-item-action-cell">
- <select class="hotkey-list-item-action">
- <option value="">None</option>
- <option value="close">Close</option>
- <option value="focusSearchBox">Focus search box</option>
- <option value="nextEntry">Go to next entry</option>
- <option value="previousEntry">Go to previous entry</option>
- <option value="lastEntry">Go to last entry</option>
- <option value="firstEntry">Go to first entry</option>
- <option value="nextEntryDifferentDictionary">Go to next dictionary</option>
- <option value="previousEntryDifferentDictionary">Go to previous dictionary</option>
- <option value="historyBackward">Navigate backward in history</option>
- <option value="historyForward">Navigate forward in history</option>
- <option value="addNoteKanji">Add kanji note</option>
- <option value="addNoteTermKanji">Add term note</option>
- <option value="addNoteTermKana">Add term note (reading)</option>
- <option value="viewNotes">View notes</option>
- <option value="playAudio">Play audio</option>
- <option value="playAudioFromSource">Play audio from source</option>
- <option value="copyHostSelection">Copy host window selection</option>
- <option value="scanSelectedText">Scan selected text</option>
- <option value="scanTextAtCaret">Scan text at caret</option>
- <option value="toggleOption">Toggle option</option>
- </select>
- <div class="hotkey-list-item-action-argument-container"></div>
- </div>
-</div></div></template>
-
-<template id="extension-hotkey-list-item-template"><div class="settings-item"><div class="settings-item-inner settings-item-inner-wrappable">
- <div class="settings-item-left">
- <div class="settings-item-label"></div>
- </div>
- <div class="settings-item-right">
- <div class="flex-row-nowrap">
- <input type="text">
- <button type="button" class="icon-button extension-hotkey-list-item-button" data-menu="extension-hotkey-list-item-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
- </div>
- </div>
-</div></div></template>
-
-<template id="hotkey-list-item-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="clearInputs">Clear input</button>
- <button type="button" class="popup-menu-item" data-menu-action="resetInput">Reset input</button>
- <button type="button" class="popup-menu-item" data-menu-action="resetArgument">Reset argument</button>
- <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
-</div></div></div></template>
-
-<template id="hotkey-list-item-scopes-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item hotkey-scope-popup-menu-item" data-menu-action="toggleScope" data-scope="web"><label class="hotkey-scope-popup-menu-item-label button-inner-label">
- <label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="web"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Web</span>
- </label></button>
- <button type="button" class="popup-menu-item hotkey-scope-popup-menu-item" data-menu-action="toggleScope" data-scope="popup"><label class="hotkey-scope-popup-menu-item-label button-inner-label">
- <label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="popup"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Popup</span>
- </label></button>
- <button type="button" class="popup-menu-item hotkey-scope-popup-menu-item" data-menu-action="toggleScope" data-scope="search"><label class="hotkey-scope-popup-menu-item-label button-inner-label">
- <label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="search"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
- <span>Search</span>
- </label></button>
-</div></div></div></template>
-
-<template id="extension-hotkey-list-item-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="clearInput">Clear input</button>
- <button type="button" class="popup-menu-item" data-menu-action="resetInput">Reset input</button>
-</div></div></div></template>
-
-<template id="hotkey-argument-move-offset-template"><div class="flex-row-nowrap">
- <span class="hotkey-argument-label">Count:</span>
- <input type="number" step="1" min="1" class="hotkey-argument-input">
-</div></template>
-
-<template id="hotkey-argument-setting-path-template"><div class="flex-row-nowrap">
- <span class="hotkey-argument-label">Path:</span>
- <input type="text" class="hotkey-argument-input horizontal-flex-fill" spellcheck="false" autocomplete="off">
-</div></template>
-
-<template id="hotkey-argument-audio-source-template"><div class="flex-row-nowrap">
- <span class="hotkey-argument-label">Source:</span>
- <select class="audio-source-select hotkey-argument-input horizontal-flex-fill">
- <option value="jpod101">JapanesePod101</option>
- <option value="jpod101-alternate">JapanesePod101 (Alternate)</option>
- <option value="jisho">Jisho.org</option>
- <option value="text-to-speech">Text-to-speech</option>
- <option value="text-to-speech-reading">Text-to-speech (Kana reading)</option>
- <option value="custom">Custom</option>
- </select>
-</div></template>
-
<!-- Scripts -->
<script src="/js/pages/settings/settings-main.js" type="module"></script>
diff --git a/ext/display-templates.html b/ext/templates-display.html
index caf5920c..944a10ab 100644
--- a/ext/display-templates.html
+++ b/ext/templates-display.html
@@ -1,6 +1,6 @@
-<!DOCTYPE html><html><head><title>Display Templates</title></head><body>
+<!DOCTYPE html><html><head><title>Templates</title></head><body>
-<!-- Term entry templates -->
+<!-- Term entry -->
<template id="term-entry-template" data-remove-whitespace-text="true"><div class="entry" data-type="term">
<div class="entry-current-indicator" title="Current entry"><span class="entry-current-indicator-inner"></span></div>
<div class="entry-header">
@@ -80,7 +80,7 @@
<template id="inflection-rule-chain-template"><li class="inflection-rule-chain"></li></template>
<template id="inflection-template"><span class="inflection"></span><span class="inflection-separator"> </span></template>
-<!-- Frequency templates -->
+<!-- Frequency -->
<template id="frequency-group-item-template"><span class="frequency-group-item"><span class="tag tag-has-body frequency-group-tag" data-category="frequency"><span class="tag-label"><span class="tag-label-content"></span></span><span class="tag-body"><span class="tag-body-content frequency-list"></span></span></span></span></template>
<template id="term-frequency-item-template" data-remove-whitespace-text="true"><span class="frequency-item"><span class="tag tag-has-body frequency-tag" data-category="frequency" data-frequency-type="term">
<span class="tag-label"><span class="tag-label-content"></span></span>
@@ -101,12 +101,12 @@
</span></span>
</span></span></template>
-<!-- Pitch accent templates -->
+<!-- Pitch accent -->
<template id="pronunciation-group-template"><li class="pronunciation-group"><span class="pronunciation-group-tag-list tag-list"></span><ul class="pronunciation-list"></ul></li></template>
<template id="pronunciation-disambiguation-template"><span class="pronunciation-disambiguation"></span></template>
<template id="pronunciation-template"><li class="pronunciation"><span class="pronunciation-tag-list tag-list"></span><span class="pronunciation-disambiguation-list"></span><span class="pronunciation-representation-list"><span class="pronunciation-text-container"></span><span class="pronunciation-downstep-notation-container"></span><span class="pronunciation-graph-container"></span></span></li></template>
-<!-- Kanji entry templates -->
+<!-- Kanji entry -->
<template id="kanji-entry-template" data-remove-whitespace-text="true"><div class="entry" data-type="kanji">
<div class="entry-current-indicator" title="Current entry"><span class="entry-current-indicator-inner"></span></div>
<div class="entry-header">
@@ -162,7 +162,7 @@
<template id="kanji-reading-template"><dd class="kanji-reading"></dd></template>
<!-- [html-validate-enable element-required-ancestor] -->
-<!-- Tag templates -->
+<!-- Tag -->
<template id="tag-template"><span class="tag"><span class="tag-label"><span class="tag-label-content"></span></span></span></template>
<template id="tag-with-body-template"><span class="tag tag-has-body"><span class="tag-label"><span class="tag-label-content"></span></span><span class="tag-body"><span class="tag-body-content"></span></span></span></template>
diff --git a/ext/templates-settings.html b/ext/templates-settings.html
new file mode 100644
index 00000000..a3a3febe
--- /dev/null
+++ b/ext/templates-settings.html
@@ -0,0 +1,441 @@
+<!DOCTYPE html><html><head><title>Templates</title></head><body>
+
+<!-- Profile -->
+<template id="profile-entry-template"><div class="profile-entry generic-list-entry">
+ <div class="profile-entry-cell generic-list-index-prefix"></div>
+ <div class="profile-entry-cell"><label class="radio"><input type="radio" class="profile-entry-is-default-radio" name="profile-entry-default-radio"><span class="radio-body"><span class="radio-border"></span><span class="radio-dot"></span></span></label></div>
+ <div class="profile-entry-cell"><input class="profile-entry-name-input" type="text" autocomplete="off" placeholder="Profile name"></div>
+ <div class="profile-entry-cell"><a tabindex="0" class="profile-entry-condition-count-link"><span class="profile-entry-condition-count">0</span></a></div>
+ <div class="profile-entry-cell input-height-icon-button-container"><button type="button" class="icon-button profile-entry-menu-button" data-menu="profile-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button></div>
+</div></template>
+<template id="profile-condition-group-template"><div class="profile-condition-group">
+ <div class="profile-condition-list"></div>
+ <div class="profile-condition-list-info">
+ <div class="profile-condition-group-separator-label">or</div>
+ <div class="profile-condition-list-info-space"></div>
+ <button type="button" class="profile-condition-add-button low-emphasis">Add</button>
+ </div>
+</div></template>
+<template id="profile-condition-template"><div class="profile-condition">
+ <div class="profile-condition-prefix"></div>
+ <div class="profile-condition-inner">
+ <select class="profile-condition-type"><optgroup label="Type"></optgroup></select>
+ <select class="profile-condition-operator"><optgroup label="Operator"></optgroup></select>
+ <div class="profile-condition-input-container">
+ <input type="text" class="profile-condition-input" autocomplete="off" spellcheck="false">
+ <div class="input-height-icon-button-container mouse-button-container" hidden>
+ <button type="button" class="icon-button profile-condition-mouse-button mouse-button"><span class="icon-button-inner"><span class="icon" data-icon="mouse"></span></span></button>
+ </div>
+ </div>
+ </div>
+ <div class="profile-condition-menu-button-container input-height-icon-button-container">
+ <button type="button" class="icon-button profile-condition-menu-button" data-menu="profile-condition-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+ </div>
+</div></template>
+<template id="profile-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="moveUp">Move up</button>
+ <button type="button" class="popup-menu-item" data-menu-action="moveDown">Move down</button>
+ <button type="button" class="popup-menu-item" data-menu-action="copyFrom">Copy from&hellip;</button>
+ <button type="button" class="popup-menu-item" data-menu-action="editConditions">Edit conditions&hellip;</button>
+ <button type="button" class="popup-menu-item" data-menu-action="duplicate">Duplicate</button>
+ <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
+</div></div></div></template>
+<template id="profile-condition-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="resetValue">Reset value</button>
+ <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
+ <button type="button" class="popup-menu-item" data-menu-action="deleteGroup">Delete group</button>
+</div></div></div></template>
+
+<!-- Dictionary -->
+<template id="dictionary-template">
+ <div class="dictionary-list-index generic-list-index-prefix"></div>
+ <label class="toggle dictionary-item-enabled-toggle-container"><input type="checkbox" class="dictionary-enabled"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label>
+ <div class="dictionary-item-title-container">
+ <span>
+ <strong class="dictionary-title"></strong> <span class="light dictionary-version"></span>
+ </span>
+ <button type="button" class="dictionary-outdated-button" hidden>
+ <div class="badge warning-badge"><span class="icon" data-icon="exclamation-point-short"></span></div>
+ </button>
+ <button type="button" class="dictionary-integrity-button" hidden>
+ <div class="badge info-badge badge-small-icon"><span class="icon" data-icon="checkmark"></span></div>
+ </button>
+ </div>
+ <input type="number" step="1" class="short-height dictionary-priority">
+ <button type="button" class="icon-button dictionary-menu-button" data-menu="dictionary-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+</template>
+<template id="dictionary-details-entry-template"><div class="dictionary-details-entry">
+ <span class="dictionary-details-entry-label"></span>
+ <span class="dictionary-details-entry-info"></span>
+</div></template>
+<template id="dictionary-extra-template">
+ <div class="dictionary-item-bottom"></div>
+ <div class="dictionary-item-bottom"></div>
+ <div class="dictionary-item-bottom dictionary-item-title-container">
+ <span>
+ <strong class="dictionary-title">Unassociated Data</strong> <span class="light dictionary-total-count"></span>
+ </span>
+ <button type="button" class="dictionary-integrity-button">
+ <div class="badge warning-badge"><span class="icon" data-icon="exclamation-point-short"></span></div>
+ </button>
+ </div>
+ <div class="dictionary-item-bottom"></div>
+ <div class="dictionary-item-bottom dictionary-item-button-height"></div>
+</template>
+<template id="dictionary-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="showDetails">Details&hellip;</button>
+ <button type="button" class="popup-menu-item" data-menu-action="moveUp">Move up</button>
+ <button type="button" class="popup-menu-item" data-menu-action="moveDown">Move down</button>
+ <button type="button" class="popup-menu-item" data-menu-action="moveTo">Move to&hellip;</button>
+ <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
+</div></div></div></template>
+<template id="secondary-search-dictionary-template"><div class="secondary-search-dictionary-item horizontal-flex">
+ <label class="toggle"><input type="checkbox" class="dictionary-allow-secondary-searches"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label>
+ <span class="horizontal-flex-fill"><strong class="dictionary-title"></strong> <span class="light dictionary-version"></span></span>
+</div></template>
+<template id="collapsible-dictionary-item-template"><div class="collapsible-dictionary-item">
+ <div class="collapsible-dictionary-cell">
+ <span class="dictionary-info-label"><strong class="dictionary-title"></strong> <span class="light dictionary-version"></span></span>
+ </div>
+ <div class="collapsible-dictionary-cell">
+ <select class="definitions-collapsible medium-width">
+ <option value="not-collapsible">Not collapsible</option>
+ <option value="collapsed">Collapsed</option>
+ <option value="expanded">Expanded</option>
+ <option value="force-collapsed">Force collapsed</option>
+ <option value="force-expanded">Force expanded</option>
+ </select>
+ </div>
+</div></template>
+
+<!-- Audio -->
+<template id="audio-source-template"><div class="audio-source">
+ <div class="audio-source-index generic-list-index-prefix"></div>
+ <div class="audio-source-inner">
+ <select class="audio-source-type-select">
+ <option value="jpod101">JapanesePod101</option>
+ <option value="jpod101-alternate">JapanesePod101 (Alternate)</option>
+ <option value="jisho">Jisho.org</option>
+ <option value="text-to-speech">Text-to-speech</option>
+ <option value="text-to-speech-reading">Text-to-speech (Kana reading)</option>
+ <option value="custom">Custom URL</option>
+ <option value="custom-json">Custom URL (JSON)</option>
+ </select>
+ <div class="audio-source-parameter-container" data-field="url" hidden>
+ <span class="audio-source-parameter-label">URL:</span>
+ <input type="text" class="audio-source-parameter">
+ </div>
+ <div class="audio-source-parameter-container" data-field="voice" hidden>
+ <span class="audio-source-parameter-label">Voice:</span>
+ <select class="audio-source-parameter"></select>
+ </div>
+ </div>
+ <button type="button" class="icon-button audio-source-menu-button" data-menu="audio-source-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+</div></template>
+<template id="audio-source-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="help">Help</button>
+ <button type="button" class="popup-menu-item" data-menu-action="remove">Remove</button>
+</div></div></div></template>
+
+<!-- Scanning inputs -->
+<template id="scan-input-template"><div class="scan-input" data-show-advanced="false">
+ <div class="scan-input-grid">
+ <div class="scan-input-index-cell generic-list-index-prefix"></div>
+ <div class="scan-input-menu-button-cell">
+ <div class="input-height-icon-button-container">
+ <button type="button" class="icon-button scanning-input-menu-button" data-menu="scanning-inputs-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+ </div>
+ </div>
+
+ <div class="scan-input-prefix-cell" data-property="include"><span>Required inputs:</span></div>
+ <div class="scan-input-content-cell input-group" data-property="include">
+ <input type="text" class="scan-input-field" autocomplete="off" spellcheck="false" placeholder="No inputs" data-property="include">
+ <button type="button" class="input-suffix input-suffix-icon-button light-icon mouse-button" data-property="include"><span class="icon" data-icon="mouse"></span></button>
+ </div>
+
+ <div class="scan-input-prefix-cell" data-property="exclude"><span>Excluded inputs:</span></div>
+ <div class="scan-input-content-cell input-group" data-property="exclude">
+ <input type="text" class="scan-input-field" autocomplete="off" spellcheck="false" placeholder="No inputs" data-property="exclude">
+ <button type="button" class="input-suffix input-suffix-icon-button light-icon mouse-button" data-property="exclude"><span class="icon" data-icon="mouse"></span></button>
+ </div>
+
+ <div class="scan-input-prefix-cell scan-input-options-cell" data-property="types"><span>Input types:</span></div>
+ <div class="scan-input-content-cell scan-input-options-cell" data-property="types">
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.mouse"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Mouse</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.touch"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Touch</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.pen"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Pen</span>
+ </label>
+ </div>
+
+ <div class="scan-input-prefix-cell scan-input-options-cell scan-input-advanced-only" data-property="search-options"><span>Search types:</span></div>
+ <div class="scan-input-content-cell scan-input-options-cell scan-input-advanced-only" data-property="search-options">
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.searchTerms"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Search for terms</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.searchKanji"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Search for kanji</span>
+ </label>
+ </div>
+
+ <div class="scan-input-prefix-cell scan-input-options-cell scan-input-advanced-only" data-property="touch-options"><span>Touch options:</span></div>
+ <div class="scan-input-content-cell scan-input-options-cell scan-input-advanced-only" data-property="touch-options">
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnTouchPress"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Scan on touch press</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnTouchRelease"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Scan on touch release</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnTouchMove"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Scan on touch move</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.preventTouchScrolling"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Prevent touch scrolling</span>
+ </label>
+ </div>
+
+ <div class="scan-input-prefix-cell scan-input-options-cell scan-input-advanced-only" data-property="pen-options"><span>Pen options:</span></div>
+ <div class="scan-input-content-cell scan-input-options-cell scan-input-advanced-only" data-property="pen-options">
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenPress"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Scan on pen press</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenRelease"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Scan on pen release</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenMove"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Scan on pen move (while touched)</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenHover"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Scan on pen hover (before touched)</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenReleaseHover"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Scan on pen hover (after touched)</span>
+ </label>
+ <label class="scan-input-checkbox-item">
+ <label class="checkbox"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.preventPenScrolling"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Prevent pen scrolling</span>
+ </label>
+ </div>
+ </div>
+</div></template>
+<template id="scanning-inputs-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="showAdvanced">Show advanced options</button>
+ <button type="button" class="popup-menu-item" data-menu-action="hideAdvanced">Hide advanced options</button>
+ <button type="button" class="popup-menu-item" data-menu-action="clearInputs">Clear inputs</button>
+ <button type="button" class="popup-menu-item" data-menu-action="remove">Remove</button>
+</div></div></div></template>
+
+<!-- Anki card -->
+<template id="anki-card-field-template"><div class="anki-card-field-name-container"><span class="anki-card-field-name"></span></div>
+<div class="anki-card-field-value-container input-group">
+ <input type="text" class="anki-card-field-value" autocomplete="off">
+ <button type="button" class="anki-card-field-value-menu-button input-suffix input-suffix-icon-button light-icon" data-menu-position="v-center left"><span class="icon" data-icon="material-down-arrow"></span></button>
+</div></template>
+<template id="anki-card-terms-field-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body"></div></div></div></template>
+<template id="anki-card-kanji-field-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body"></div></div></div></template>
+<template id="anki-card-all-field-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body"></div></div></div></template>
+
+<!-- Translation -->
+<template id="translation-text-replacement-entry-template"><div class="translation-text-replacement-entry">
+ <div class="translation-text-replacement-index generic-list-index-prefix"></div>
+ <div class="translation-text-replacement-pattern-label">Pattern:</div>
+ <div class="translation-text-replacement-replacement-label">Replacement:</div>
+ <div class="translation-text-replacement-pattern-container">
+ <input type="text" class="translation-text-replacement-pattern code">
+ <label class="translation-text-replacement-checkbox-container">
+ <label class="checkbox"><input type="checkbox" class="translation-text-replacement-checkbox translation-text-replacement-pattern-ignore-case"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span class="translation-text-replacement-checkbox-label">Ignore case</span>
+ </label>
+ </div>
+ <div class="translation-text-replacement-replacement-container">
+ <input type="text" class="translation-text-replacement-replacement code">
+ </div>
+ <button type="button" class="icon-button translation-text-replacement-button" data-menu="translation-text-replacement-entry-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+
+ <div class="translation-text-replacement-test-label translation-text-replacement-test-node">Test Input:</div>
+ <div class="translation-text-replacement-test-container translation-text-replacement-test-node">
+ <input type="text" class="translation-text-replacement-test-input" lang="ja">
+ <div class="translation-text-replacement-test-label-inner">Output:</div>
+ <input type="text" class="translation-text-replacement-test-output" lang="ja" readonly>
+ </div>
+</div></template>
+<template id="translation-text-replacement-entry-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="showTest">Test</button>
+ <button type="button" class="popup-menu-item" data-menu-action="hideTest">Hide test</button>
+ <button type="button" class="popup-menu-item" data-menu-action="remove">Remove</button>
+</div></div></div></template>
+
+<!-- Sentence parsing -->
+<template id="sentence-termination-character-entry-template"><tr class="sentence-termination-character-entry">
+ <td class="generic-list-index-prefix"></td>
+ <td>
+ <label class="toggle"><input type="checkbox" class="sentence-termination-character-enabled"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label>
+ </td>
+ <td>
+ <select class="sentence-termination-character-type">
+ <option value="terminator">Terminator</option>
+ <option value="quote">Quote</option>
+ </select>
+ </td>
+ <td>
+ <input type="text" class="sentence-termination-character-input1" maxlength="1" lang="ja">
+ </td>
+ <td>
+ <input type="text" class="sentence-termination-character-input2" maxlength="1" lang="ja">
+ <div class="sentence-termination-character-input2-alt">&mdash;</div>
+ </td>
+ <td>
+ <div class="sentence-termination-character-include-list">
+ <label class="sentence-termination-character-include">
+ <label class="checkbox"><input type="checkbox" class="sentence-termination-character-include-at-start"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>At start</span>
+ </label>
+ <label class="sentence-termination-character-include">
+ <label class="checkbox"><input type="checkbox" class="sentence-termination-character-include-at-end"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>At end</span>
+ </label>
+ </div>
+ </td>
+ <td>
+ <button type="button" class="icon-button sentence-termination-character-entry-button" data-menu="sentence-termination-character-entry-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+ </td>
+</tr></template>
+<template id="sentence-termination-character-entry-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
+</div></div></div></template>
+
+<!-- Keyboard shortcuts -->
+<template id="hotkey-list-item-template"><div class="hotkey-list-item"><div class="hotkey-list-item-grid">
+ <div class="hotkey-list-item-index-cell generic-list-index-prefix"></div>
+ <div class="hotkey-list-item-button-cell">
+ <div class="input-height-icon-button-container">
+ <button type="button" class="icon-button hotkey-list-item-button" data-menu="hotkey-list-item-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+ </div>
+ </div>
+
+ <div class="hotkey-list-item-input-label-cell">Input:</div>
+ <div class="hotkey-list-item-input-cell">
+ <input type="text" class="hotkey-list-item-input" autocomplete="off" spellcheck="false" placeholder="No input" data-property="include">
+ <div class="hotkey-list-item-enabled-button-container input-group">
+ <button type="button" class="hotkey-list-item-enabled-button input-button">
+ <label class="hotkey-list-item-enabled-button-label button-inner-label">
+ <span class="checkbox"><input type="checkbox" class="hotkey-list-item-enabled"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></span>
+ <span>Enabled</span>
+ </label>
+ </button>
+ <button type="button" class="hotkey-list-item-scopes-button input-suffix input-suffix-icon-button light-icon" data-menu="hotkey-list-item-scopes-menu" data-menu-position="below left"><span class="icon" data-icon="material-down-arrow"></span></button>
+ </div>
+ </div>
+
+ <div class="hotkey-list-item-action-label-cell">Action:</div>
+ <div class="hotkey-list-item-action-cell">
+ <select class="hotkey-list-item-action">
+ <option value="">None</option>
+ <option value="close">Close</option>
+ <option value="focusSearchBox">Focus search box</option>
+ <option value="nextEntry">Go to next entry</option>
+ <option value="previousEntry">Go to previous entry</option>
+ <option value="lastEntry">Go to last entry</option>
+ <option value="firstEntry">Go to first entry</option>
+ <option value="nextEntryDifferentDictionary">Go to next dictionary</option>
+ <option value="previousEntryDifferentDictionary">Go to previous dictionary</option>
+ <option value="historyBackward">Navigate backward in history</option>
+ <option value="historyForward">Navigate forward in history</option>
+ <option value="addNoteKanji">Add kanji note</option>
+ <option value="addNoteTermKanji">Add term note</option>
+ <option value="addNoteTermKana">Add term note (reading)</option>
+ <option value="viewNotes">View notes</option>
+ <option value="playAudio">Play audio</option>
+ <option value="playAudioFromSource">Play audio from source</option>
+ <option value="copyHostSelection">Copy host window selection</option>
+ <option value="scanSelectedText">Scan selected text</option>
+ <option value="scanTextAtCaret">Scan text at caret</option>
+ <option value="toggleOption">Toggle option</option>
+ </select>
+ <div class="hotkey-list-item-action-argument-container"></div>
+ </div>
+</div></div></template>
+<template id="extension-hotkey-list-item-template"><div class="settings-item"><div class="settings-item-inner settings-item-inner-wrappable">
+ <div class="settings-item-left">
+ <div class="settings-item-label"></div>
+ </div>
+ <div class="settings-item-right">
+ <div class="flex-row-nowrap">
+ <input type="text">
+ <button type="button" class="icon-button extension-hotkey-list-item-button" data-menu="extension-hotkey-list-item-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+ </div>
+ </div>
+</div></div></template>
+<template id="hotkey-list-item-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="clearInputs">Clear input</button>
+ <button type="button" class="popup-menu-item" data-menu-action="resetInput">Reset input</button>
+ <button type="button" class="popup-menu-item" data-menu-action="resetArgument">Reset argument</button>
+ <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
+</div></div></div></template>
+<template id="hotkey-list-item-scopes-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item hotkey-scope-popup-menu-item" data-menu-action="toggleScope" data-scope="web"><label class="hotkey-scope-popup-menu-item-label button-inner-label">
+ <label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="web"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Web</span>
+ </label></button>
+ <button type="button" class="popup-menu-item hotkey-scope-popup-menu-item" data-menu-action="toggleScope" data-scope="popup"><label class="hotkey-scope-popup-menu-item-label button-inner-label">
+ <label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="popup"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Popup</span>
+ </label></button>
+ <button type="button" class="popup-menu-item hotkey-scope-popup-menu-item" data-menu-action="toggleScope" data-scope="search"><label class="hotkey-scope-popup-menu-item-label button-inner-label">
+ <label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="search"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
+ <span>Search</span>
+ </label></button>
+</div></div></div></template>
+<template id="extension-hotkey-list-item-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="clearInput">Clear input</button>
+ <button type="button" class="popup-menu-item" data-menu-action="resetInput">Reset input</button>
+</div></div></div></template>
+<template id="hotkey-argument-move-offset-template"><div class="flex-row-nowrap">
+ <span class="hotkey-argument-label">Count:</span>
+ <input type="number" step="1" min="1" class="hotkey-argument-input">
+</div></template>
+<template id="hotkey-argument-setting-path-template"><div class="flex-row-nowrap">
+ <span class="hotkey-argument-label">Path:</span>
+ <input type="text" class="hotkey-argument-input horizontal-flex-fill" spellcheck="false" autocomplete="off">
+</div></template>
+<template id="hotkey-argument-audio-source-template"><div class="flex-row-nowrap">
+ <span class="hotkey-argument-label">Source:</span>
+ <select class="audio-source-select hotkey-argument-input horizontal-flex-fill">
+ <option value="jpod101">JapanesePod101</option>
+ <option value="jpod101-alternate">JapanesePod101 (Alternate)</option>
+ <option value="jisho">Jisho.org</option>
+ <option value="text-to-speech">Text-to-speech</option>
+ <option value="text-to-speech-reading">Text-to-speech (Kana reading)</option>
+ <option value="custom">Custom</option>
+ </select>
+</div></template>
+
+<!-- Permissions -->
+<template id="permissions-origin-template">
+ <div class="permissions-origin-index generic-list-index-prefix"></div>
+ <input type="text" class="permissions-origin-input horizontal-flex-fill" autocomplete="off" spellcheck="false" readonly>
+ <button type="button" class="icon-button permissions-origin-menu-button permissions-origin-button" data-menu="permissions-origin-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
+</template>
+<template id="permissions-origin-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
+ <button type="button" class="popup-menu-item" data-menu-action="remove">Remove</button>
+</div></div></div></template>
+
+</body></html>
diff --git a/ext/welcome.html b/ext/welcome.html
index b9bb3205..e6104079 100644
--- a/ext/welcome.html
+++ b/ext/welcome.html
@@ -425,40 +425,6 @@
</div>
</div></div>
-
-<!-- Dictionary templates -->
-<template id="dictionary-template">
- <div class="dictionary-list-index generic-list-index-prefix"></div>
- <label class="toggle dictionary-item-enabled-toggle-container"><input type="checkbox" class="dictionary-enabled"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label>
- <div class="dictionary-item-title-container">
- <span>
- <strong class="dictionary-title"></strong> <span class="light dictionary-version"></span>
- </span>
- <button type="button" class="dictionary-outdated-button" hidden>
- <div class="badge warning-badge"><span class="icon" data-icon="exclamation-point-short"></span></div>
- </button>
- <button type="button" class="dictionary-integrity-button" hidden>
- <div class="badge info-badge badge-small-icon"><span class="icon" data-icon="checkmark"></span></div>
- </button>
- </div>
- <input type="number" step="1" class="short-height dictionary-priority">
- <button type="button" class="icon-button dictionary-menu-button" data-menu="dictionary-menu" data-menu-position="below left"><span class="icon-button-inner"><span class="icon" data-icon="kebab-menu"></span></span></button>
-</template>
-
-<template id="dictionary-details-entry-template"><div class="dictionary-details-entry">
- <span class="dictionary-details-entry-label"></span>
- <span class="dictionary-details-entry-info"></span>
-</div></template>
-
-<template id="dictionary-menu-template"><div class="popup-menu-container" tabindex="-1" role="dialog"><div class="popup-menu"><div class="popup-menu-body">
- <button type="button" class="popup-menu-item" data-menu-action="showDetails">Details&hellip;</button>
- <button type="button" class="popup-menu-item" data-menu-action="moveUp">Move up</button>
- <button type="button" class="popup-menu-item" data-menu-action="moveDown">Move down</button>
- <button type="button" class="popup-menu-item" data-menu-action="moveTo">Move to&hellip;</button>
- <button type="button" class="popup-menu-item" data-menu-action="delete">Delete</button>
-</div></div></div></template>
-
-
<!-- Scripts -->
<script src="/js/pages/welcome-main.js" type="module"></script>