Full Code of crimx/ext-saladict for AI

dev ffb478cd2e32 cached
707 files
2.1 MB
588.4k tokens
1035 symbols
1 requests
Download .txt
Showing preview only (2,338K chars total). Download the full file or copy to clipboard to get everything.
Repository: crimx/ext-saladict
Branch: dev
Commit: ffb478cd2e32
Files: 707
Total size: 2.1 MB

Directory structure:
gitextract_w8wgf1mm/

├── .browserslistrc
├── .editorconfig
├── .eslintrc.js
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── _bug_report_chs.md
│   │   ├── _feature_request_chs.md
│   │   ├── _new_dict_chs.md
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   └── feature_request.md
│   ├── config.yml
│   └── no-response.yml
├── .gitignore
├── .neutrinorc.js
├── .prettierrc
├── .storybook/
│   ├── addons.ts
│   ├── config.ts
│   ├── configs/
│   │   └── contexts.tsx
│   ├── manager-head.html
│   ├── preview-head.html
│   ├── style.css
│   └── webpack.config.js
├── .travis.yml
├── .vscode/
│   ├── locales.schema.json
│   └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING-zh.md
├── CONTRIBUTING.md
├── LICENSE
├── README-zh.md
├── README.md
├── assets/
│   ├── content.css
│   ├── fanyi.youdao.2.0/
│   │   ├── all-packed.css
│   │   ├── conn.html
│   │   ├── conn.js
│   │   └── main.js
│   ├── google-page-trans.js
│   ├── inject-dict-panel.js
│   └── vimium-c-injector.js
├── commitlint.config.js
├── config/
│   └── jest/
│       ├── cssTransform.js
│       ├── fileTransform.js
│       └── setupTests.js
├── jest.config.js
├── jsconfig.json
├── mac-app/
│   └── Saladict - Pop-up Dictionary and Page Translator/
│       ├── Saladict - Pop-up Dictionary and Page Translator/
│       │   ├── AppDelegate.swift
│       │   ├── Assets.xcassets/
│       │   │   ├── AccentColor.colorset/
│       │   │   │   └── Contents.json
│       │   │   ├── AppIcon.appiconset/
│       │   │   │   └── Contents.json
│       │   │   └── Contents.json
│       │   ├── Base.lproj/
│       │   │   └── Main.storyboard
│       │   ├── Info.plist
│       │   ├── Saladict___Pop_up_Dictionary_and_Page_Translator.entitlements
│       │   └── ViewController.swift
│       ├── Saladict - Pop-up Dictionary and Page Translator Extension/
│       │   ├── Info.plist
│       │   ├── SafariWebExtensionHandler.swift
│       │   └── Saladict___Pop_up_Dictionary_and_Page_Translator_Extension.entitlements
│       └── Saladict - Pop-up Dictionary and Page Translator.xcodeproj/
│           ├── project.pbxproj
│           ├── project.xcworkspace/
│           │   ├── contents.xcworkspacedata
│           │   ├── xcshareddata/
│           │   │   └── IDEWorkspaceChecks.plist
│           │   └── xcuserdata/
│           │       └── crimx.xcuserdatad/
│           │           └── UserInterfaceState.xcuserstate
│           └── xcuserdata/
│               └── crimx.xcuserdatad/
│                   └── xcschemes/
│                       └── xcschememanagement.plist
├── package.json
├── postcss.config.js
├── scripts/
│   ├── after-build.js
│   ├── build.js
│   ├── firefox-fix.js
│   ├── fixtures.js
│   ├── pdf.js
│   ├── setup-env.js
│   ├── start.js
│   ├── style-extractor.js
│   └── test.js
├── src/
│   ├── _helpers/
│   │   ├── __mocks__/
│   │   │   ├── browser-api.ts
│   │   │   ├── config-manager.ts
│   │   │   └── selection.ts
│   │   ├── analytics/
│   │   │   ├── events.ts
│   │   │   └── index.ts
│   │   ├── browser-api.ts
│   │   ├── check-update.ts
│   │   ├── chs-to-chz.ts
│   │   ├── config-manager.ts
│   │   ├── dom.ts
│   │   ├── fetch-dom.ts
│   │   ├── getSuggests.ts
│   │   ├── hooks.ts
│   │   ├── i18n.ts
│   │   ├── injectSaladictInternal.ts
│   │   ├── integrity.ts
│   │   ├── lang-check.ts
│   │   ├── matchPatternToRegExpStr.ts
│   │   ├── observables.ts
│   │   ├── permission-manager.ts
│   │   ├── profile-manager.ts
│   │   ├── promise-more.ts
│   │   ├── record-manager.ts
│   │   ├── saladict.ts
│   │   ├── scrollbar-width.ts
│   │   ├── storybook.tsx
│   │   ├── titlebar-offset.ts
│   │   ├── translateCtx.ts
│   │   ├── uniqueKey.ts
│   │   └── wordoftheday.ts
│   ├── _locales/
│   │   ├── en/
│   │   │   ├── background.ts
│   │   │   ├── common.ts
│   │   │   ├── content.ts
│   │   │   ├── langcode.ts
│   │   │   ├── menus.ts
│   │   │   ├── options.ts
│   │   │   ├── popup.ts
│   │   │   └── wordpage.ts
│   │   ├── es/
│   │   │   ├── background.ts
│   │   │   ├── common.ts
│   │   │   ├── content.ts
│   │   │   ├── langcode.ts
│   │   │   ├── menus.ts
│   │   │   ├── options.ts
│   │   │   ├── popup.ts
│   │   │   └── wordpage.ts
│   │   ├── manifest/
│   │   │   ├── en/
│   │   │   │   └── messages.json
│   │   │   ├── np/
│   │   │   │   └── messages.json
│   │   │   ├── zh_CN/
│   │   │   │   └── messages.json
│   │   │   └── zh_TW/
│   │   │       └── messages.json
│   │   ├── ne/
│   │   │   ├── background.ts
│   │   │   ├── common.ts
│   │   │   ├── content.ts
│   │   │   ├── langcode.ts
│   │   │   ├── menus.ts
│   │   │   ├── options.ts
│   │   │   ├── popup.ts
│   │   │   └── wordpage.ts
│   │   ├── zh-CN/
│   │   │   ├── background.ts
│   │   │   ├── common.ts
│   │   │   ├── content.ts
│   │   │   ├── langcode.ts
│   │   │   ├── menus.ts
│   │   │   ├── options.ts
│   │   │   ├── popup.ts
│   │   │   └── wordpage.ts
│   │   └── zh-TW/
│   │       ├── background.ts
│   │       ├── common.ts
│   │       ├── content.ts
│   │       ├── langcode.ts
│   │       ├── menus.ts
│   │       ├── options.ts
│   │       ├── popup.ts
│   │       └── wordpage.ts
│   ├── _sass_shared/
│   │   ├── _fancy-scrollbar.scss
│   │   ├── _global/
│   │   │   ├── _interfaces.scss
│   │   │   ├── _mixins.scss
│   │   │   ├── _variables.scss
│   │   │   └── _z-indices.scss
│   │   ├── _namespace.scss
│   │   ├── _reset.scss
│   │   └── _theme.scss
│   ├── app-config/
│   │   ├── auth.ts
│   │   ├── context-menus.ts
│   │   ├── dicts.ts
│   │   ├── index.ts
│   │   ├── merge-config.ts
│   │   ├── merge-profile.ts
│   │   └── profiles.ts
│   ├── audio-control/
│   │   ├── audio-control.scss
│   │   └── index.tsx
│   ├── background/
│   │   ├── __fake__/
│   │   │   └── env.ts
│   │   ├── __mocks__/
│   │   │   └── database.ts
│   │   ├── audio-manager.ts
│   │   ├── badge.ts
│   │   ├── clipboard-manager.ts
│   │   ├── context-menus.ts
│   │   ├── database/
│   │   │   ├── core.ts
│   │   │   ├── index.ts
│   │   │   ├── read.ts
│   │   │   ├── sync-meta.ts
│   │   │   └── write.ts
│   │   ├── env.ts
│   │   ├── i18n-manager.ts
│   │   ├── index.ts
│   │   ├── initialization.ts
│   │   ├── page-translate/
│   │   │   └── caiyun.ts
│   │   ├── pdf-sniffer.ts
│   │   ├── server.ts
│   │   ├── sync-manager/
│   │   │   ├── __mocks__/
│   │   │   │   └── helpers.ts
│   │   │   ├── helpers.ts
│   │   │   ├── index.ts
│   │   │   ├── interface.ts
│   │   │   └── services/
│   │   │       ├── ankiconnect/
│   │   │       │   ├── _locales/
│   │   │       │   │   ├── en.ts
│   │   │       │   │   ├── zh-CN.ts
│   │   │       │   │   └── zh-TW.ts
│   │   │       │   └── index.ts
│   │   │       ├── eudic/
│   │   │       │   ├── _locales/
│   │   │       │   │   ├── en.ts
│   │   │       │   │   ├── zh-CN.ts
│   │   │       │   │   └── zh-TW.ts
│   │   │       │   └── index.ts
│   │   │       ├── shanbay/
│   │   │       │   ├── _locales/
│   │   │       │   │   ├── en.ts
│   │   │       │   │   ├── zh-CN.ts
│   │   │       │   │   └── zh-TW.ts
│   │   │       │   └── index.ts
│   │   │       └── webdav/
│   │   │           ├── _locales/
│   │   │           │   ├── en.ts
│   │   │           │   ├── zh-CN.ts
│   │   │           │   └── zh-TW.ts
│   │   │           └── index.ts
│   │   ├── types.ts
│   │   └── windows-manager.ts
│   ├── components/
│   │   ├── AntdRoot/
│   │   │   ├── AntdRootContainer.tsx
│   │   │   ├── _style.scss
│   │   │   └── index.tsx
│   │   ├── EntryBox/
│   │   │   ├── EntryBox.scss
│   │   │   ├── EntryBox.stories.tsx
│   │   │   └── index.tsx
│   │   ├── ErrorBoundary.tsx
│   │   ├── FloatBox/
│   │   │   ├── FloatBox.scss
│   │   │   ├── FloatBox.stories.tsx
│   │   │   └── index.tsx
│   │   ├── HoverBox/
│   │   │   ├── HoverBox.scss
│   │   │   └── index.tsx
│   │   ├── MachineTrans/
│   │   │   ├── MachineTrans.scss
│   │   │   ├── MachineTrans.stories.tsx
│   │   │   ├── MachineTrans.tsx
│   │   │   └── engine.ts
│   │   ├── ShadowPortal/
│   │   │   ├── ShadowPortal.scss
│   │   │   └── index.tsx
│   │   ├── Speaker/
│   │   │   ├── Speaker.scss
│   │   │   ├── Speaker.stories.tsx
│   │   │   └── index.tsx
│   │   ├── StarRates/
│   │   │   └── index.tsx
│   │   ├── StrElm/
│   │   │   └── index.tsx
│   │   ├── Waveform/
│   │   │   ├── Waveform.scss
│   │   │   ├── Waveform.stories.tsx
│   │   │   └── Waveform.tsx
│   │   ├── WordPage/
│   │   │   ├── ExportModal/
│   │   │   │   ├── Linebreak.tsx
│   │   │   │   ├── PlaceholderTable.tsx
│   │   │   │   └── index.tsx
│   │   │   ├── Header.tsx
│   │   │   ├── WordTable.tsx
│   │   │   ├── _style.scss
│   │   │   └── index.tsx
│   │   └── dictionaries/
│   │       ├── ahdict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── baidu/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── bing/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── caiyun/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── cambridge/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── cnki/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── cobuild/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── dictionaries.stories.tsx
│   │       ├── etymonline/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── eudic/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── google/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── googledict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── guoyu/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── helpers.ts
│   │       ├── hjdict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── jikipedia/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── jukuu/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── lexico/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── liangan/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── locales.ts
│   │       ├── longman/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── macmillan/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── merriamwebster/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── mojidict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── naver/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── oaldict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── renren/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── shanbay/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── sogou/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── tencent/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── urban/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── vocabulary/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── weblio/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── weblioejje/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── websterlearner/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── wikipedia/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── youdao/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── youdaotrans/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       └── zdic/
│   │           ├── View.tsx
│   │           ├── _locales.json
│   │           ├── _style.shadow.scss
│   │           ├── config.ts
│   │           └── engine.ts
│   ├── content/
│   │   ├── __fake__/
│   │   │   ├── env-instant-capture.ts
│   │   │   ├── env-select-text.ts
│   │   │   └── env.ts
│   │   ├── _style.scss
│   │   ├── components/
│   │   │   ├── DictItem/
│   │   │   │   ├── DictItem.scss
│   │   │   │   ├── DictItem.stories.tsx
│   │   │   │   ├── DictItem.tsx
│   │   │   │   ├── DictItemBody.tsx
│   │   │   │   ├── DictItemContent.shadow.scss
│   │   │   │   ├── DictItemHead.scss
│   │   │   │   └── DictItemHead.tsx
│   │   │   ├── DictList/
│   │   │   │   ├── DictList.container.tsx
│   │   │   │   ├── DictList.scss
│   │   │   │   ├── DictList.stories.tsx
│   │   │   │   └── DictList.tsx
│   │   │   ├── DictPanel/
│   │   │   │   ├── DictPanel.container.tsx
│   │   │   │   ├── DictPanel.portal.tsx
│   │   │   │   ├── DictPanel.scss
│   │   │   │   ├── DictPanel.shadow.scss
│   │   │   │   ├── DictPanel.stories.tsx
│   │   │   │   ├── DictPanel.tsx
│   │   │   │   ├── DictPanelStandalone.container.tsx
│   │   │   │   ├── DictPanelStandalone.scss
│   │   │   │   └── DictPanelStandalone.tsx
│   │   │   ├── MenuBar/
│   │   │   │   ├── MenuBar.container.tsx
│   │   │   │   ├── MenuBar.scss
│   │   │   │   ├── MenuBar.stories.tsx
│   │   │   │   ├── MenuBar.tsx
│   │   │   │   ├── MenubarBtns.scss
│   │   │   │   ├── MenubarBtns.stories.tsx
│   │   │   │   ├── MenubarBtns.tsx
│   │   │   │   ├── Profiles.scss
│   │   │   │   ├── Profiles.stories.tsx
│   │   │   │   ├── Profiles.tsx
│   │   │   │   ├── SearchBox.scss
│   │   │   │   ├── SearchBox.stories.tsx
│   │   │   │   ├── SearchBox.tsx
│   │   │   │   ├── Suggest.scss
│   │   │   │   ├── Suggest.stories.tsx
│   │   │   │   └── Suggest.tsx
│   │   │   ├── MtaBox/
│   │   │   │   ├── MtaBox.container.tsx
│   │   │   │   ├── MtaBox.scss
│   │   │   │   ├── MtaBox.stories.tsx
│   │   │   │   └── MtaBox.tsx
│   │   │   ├── SaladBowl/
│   │   │   │   ├── SaladBowl.container.tsx
│   │   │   │   ├── SaladBowl.portal.tsx
│   │   │   │   ├── SaladBowl.shadow.scss
│   │   │   │   ├── SaladBowl.stories.tsx
│   │   │   │   └── SaladBowl.tsx
│   │   │   ├── WaveformBox/
│   │   │   │   ├── WaveformBox.container.tsx
│   │   │   │   ├── WaveformBox.scss
│   │   │   │   ├── WaveformBox.stories.tsx
│   │   │   │   └── WaveformBox.tsx
│   │   │   └── WordEditor/
│   │   │       ├── CtxTransList.scss
│   │   │       ├── CtxTransList.stories.tsx
│   │   │       ├── CtxTransList.tsx
│   │   │       ├── Notes.scss
│   │   │       ├── Notes.tsx
│   │   │       ├── WordCards.scss
│   │   │       ├── WordCards.tsx
│   │   │       ├── WordEditor.container.tsx
│   │   │       ├── WordEditor.portal.tsx
│   │   │       ├── WordEditor.scss
│   │   │       ├── WordEditor.shadow.scss
│   │   │       ├── WordEditor.stories.tsx
│   │   │       ├── WordEditor.tsx
│   │   │       ├── WordEditorPanel.scss
│   │   │       ├── WordEditorPanel.stories.tsx
│   │   │       ├── WordEditorPanel.tsx
│   │   │       └── WordEditorStandalone.container.tsx
│   │   ├── index.tsx
│   │   └── redux/
│   │       ├── epics/
│   │       │   ├── index.ts
│   │       │   ├── newSelection.epic.ts
│   │       │   ├── searchStart.epic.ts
│   │       │   └── utils.ts
│   │       ├── index.ts
│   │       ├── init.ts
│   │       └── modules/
│   │           ├── action-catalog.ts
│   │           ├── action-handlers/
│   │           │   ├── index.ts
│   │           │   ├── new-selection.ts
│   │           │   ├── open-qs-panel.ts
│   │           │   └── search-start.ts
│   │           ├── index.ts
│   │           └── state.ts
│   ├── history/
│   │   ├── env.ts
│   │   └── index.tsx
│   ├── manifest/
│   │   ├── chrome.manifest.json
│   │   ├── common.manifest.js
│   │   ├── edge.manifest.json
│   │   ├── firefox.manifest.json
│   │   └── safari.manifest.json
│   ├── notebook/
│   │   ├── env.ts
│   │   └── index.tsx
│   ├── options/
│   │   ├── __fake__/
│   │   │   └── env.ts
│   │   ├── _style.scss
│   │   ├── acknowledgement.ts
│   │   ├── components/
│   │   │   ├── BtnPreview/
│   │   │   │   ├── PreviewIcon.tsx
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── Entries/
│   │   │   │   ├── BlackWhiteList.tsx
│   │   │   │   ├── ContextMenus/
│   │   │   │   │   ├── AddModal.tsx
│   │   │   │   │   ├── EditeModal.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── DictAuths.tsx
│   │   │   │   ├── DictPanel.tsx
│   │   │   │   ├── Dictionaries/
│   │   │   │   │   ├── AllDicts.tsx
│   │   │   │   │   ├── DictTitle/
│   │   │   │   │   │   ├── _style.scss
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── EditModal.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── General.tsx
│   │   │   │   ├── ImportExport.tsx
│   │   │   │   ├── Notebook/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── sync-services/
│   │   │   │   │       ├── ankiconnect.tsx
│   │   │   │   │       ├── eudic.tsx
│   │   │   │   │       ├── shanbay.tsx
│   │   │   │   │       └── webdav.tsx
│   │   │   │   ├── PDF.tsx
│   │   │   │   ├── Permissions.tsx
│   │   │   │   ├── Popup.tsx
│   │   │   │   ├── Privacy.tsx
│   │   │   │   ├── Profiles/
│   │   │   │   │   ├── EditNameModal.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Pronunciation.tsx
│   │   │   │   ├── QuickSearch/
│   │   │   │   │   ├── StandaloneModal.tsx
│   │   │   │   │   ├── TitlebarOffsetModal.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   └── SearchModes/
│   │   │   │       ├── index.tsx
│   │   │   │       └── searchMode.tsx
│   │   │   ├── EntryError.tsx
│   │   │   ├── EntrySideBar/
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── Header/
│   │   │   │   ├── HeadInfo/
│   │   │   │   │   ├── AckList.tsx
│   │   │   │   │   ├── _style.scss
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── InputNumberGroup/
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── MainEntry.tsx
│   │   │   ├── MatchPatternModal/
│   │   │   │   ├──  PatternItem.tsx
│   │   │   │   └── index.tsx
│   │   │   ├── SaladictForm/
│   │   │   │   ├── SaveBtn.tsx
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── SaladictModalForm.tsx
│   │   │   └── SortableList/
│   │   │       ├── _style.scss
│   │   │       ├── index.tsx
│   │   │       └── reorder.ts
│   │   ├── env.ts
│   │   ├── helpers/
│   │   │   ├── change-entry.ts
│   │   │   ├── layout.ts
│   │   │   ├── panel-store.ts
│   │   │   ├── path-joiner.ts
│   │   │   ├── upload.ts
│   │   │   ├── use-check-dict-auth.ts
│   │   │   └── use-form-dirty.ts
│   │   └── index.tsx
│   ├── popup/
│   │   ├── Notebook.tsx
│   │   ├── Popup.tsx
│   │   ├── __fake__/
│   │   │   ├── _style.scss
│   │   │   └── env.ts
│   │   ├── _style.scss
│   │   ├── env.ts
│   │   └── index.tsx
│   ├── quick-search/
│   │   ├── env.ts
│   │   ├── index.tsx
│   │   └── quick-search.scss
│   ├── selection/
│   │   ├── helper.ts
│   │   ├── index.ts
│   │   ├── instant-capture.ts
│   │   ├── message.ts
│   │   ├── quick-search.ts
│   │   └── select-text.ts
│   ├── typings/
│   │   ├── css.d.ts
│   │   ├── global.d.ts
│   │   ├── helpers.ts
│   │   └── message.ts
│   └── word-editor/
│       ├── env.ts
│       ├── index.tsx
│       └── word-editor.scss
├── test/
│   ├── helper.ts
│   └── specs/
│       ├── _helpers/
│       │   ├── browser-api.spec.ts
│       │   ├── check-update.spec.ts
│       │   ├── chs-to-chz.spec.ts
│       │   ├── lang-check.spec.ts
│       │   ├── profile-manager.spec.ts
│       │   └── promise-more.spec.ts
│       ├── background/
│       │   ├── audio-manager.spec.ts
│       │   ├── context-menus.spec.ts
│       │   ├── initialization.spec.ts
│       │   ├── pdf-sniffer.spec.ts
│       │   └── sync-manager/
│       │       └── services/
│       │           ├── ankiconnect.spec.ts
│       │           └── webdav.spec.ts
│       └── components/
│           └── dictionaries/
│               ├── ahdict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── bing/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── cambridge/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── cnki/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── cobuild/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── etymonline/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── eudic/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── googledict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── guoyu/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── helpers.ts
│               ├── hjdict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── jikipedia/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── jukuu/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── lexico/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── liangan/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── longman/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── macmillan/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── merriamwebster/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   ├── requests.mock.ts
│               │   └── testCases.ts
│               ├── mojidict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── naver/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── oaldict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── renren/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── shanbay/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── urban/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── vocabulary/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── weblio/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── weblioejje/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── websterlearner/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── wikipedia/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── youdao/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               └── zdic/
│                   ├── engine.spec.ts
│                   ├── fixtures.js
│                   └── requests.mock.ts
├── tsconfig.json
└── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .browserslistrc
================================================
Firefox > 67
Chrome >= 63


================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true


================================================
FILE: .eslintrc.js
================================================
module.exports = {
  env: {
    browser: true,
    node: true,
    'jest/globals': true
  },
  extends: [
    'standard',
    'plugin:prettier/recommended',
    'plugin:react/recommended'
  ],
  plugins: ['@typescript-eslint', 'jest'],
  parser: '@typescript-eslint/parser',
  rules: {
    '@typescript-eslint/adjacent-overload-signatures': 'error',
    '@typescript-eslint/no-unused-vars': [
      'error',
      { args: 'none', ignoreRestSiblings: true }
    ],
    'dot-notation': 'off',
    'import/first': 'off',
    'import/no-webpack-loader-syntax': 'off',
    'no-dupe-class-members': 'off',
    'no-unused-vars': 'off',
    'no-useless-return': 'off',
    'prefer-promise-reject-errors': 'off',
    'prettier/prettier': ['error', { singleQuote: true, semi: false }],
    'react/display-name': 'off',
    'react/prop-types': 'off',
    'standard/computed-property-even-spacing': 'off',
    'standard/no-callback-literal': 'off',
    camelcase: 'off',
    yoda: 'off'
  },
  globals: {
    browser: true
  },
  settings: {
    react: {
      version: 'detect'
    }
  }
}


================================================
FILE: .gitattributes
================================================
*.min.js binary
/public/** binary

# For Github language details
/test/**/response/*.html linguist-vendored
/public/** linguist-vendored


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: saladict
open_collective: # Replace with a single Open Collective username
ko_fi: saladict
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://saladict.crimx.com/support.html']


================================================
FILE: .github/ISSUE_TEMPLATE/_bug_report_chs.md
================================================
---
name: 反馈 Bug
about: 沙拉查词运行出现不正确行为。
title: ''
labels: ''
assignees: ''

---

<!--
反馈前请阅读

- 使用说明: https://saladict.crimx.com/manual.html
- 常见问题以及答复: https://saladict.crimx.com/q&a.html
- 请先在 issues 页面搜索你的问题,很可能已被解决。
-->

<!-- 这是隐藏的信息 -->
<!-- 👆这样括起来的信息将被隐藏,填写时注意不要写在里面。 -->

<!-- 点击编辑器上方的 preview 可预览效果 -->

<!--
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。

(重要事情已经说了十遍😅)
-->

## 设备信息
- 操作系统: [] <!-- 如 [Win10] -->
- 浏览器版本: [] <!-- 如 [Chrome77] -->
- 沙拉查词版本: [] <!-- 如 [v7.0.0] (在沙拉查词设置页面左上角查看) -->

<!-- 请在下方 ## 开头行之间的空白处填写,点击编辑器上方的 preview 预览效果 -->

## 描述问题
<!-- 客观描述出现了什么问题 -->



## 复现步骤
<!--
如何重复触发这个不正确的行为,如:

1. 打开某某某......
2. 点击某某某......
3. 滚动到某某某......
4. 问题出现

请提供具体页面和具体操作,而不是「任意页面」「选任一单词」,即便问题确实在多处出现。
-->



## 期待的正常行为
<!-- 请描述正常情况下应该出现什么结果 -->



## 截图
<!-- 可选,需要情况下,可借助截图描述问题 -->



## 额外信息
<!-- 可选,更多有助于理解问题的描述和资料 -->




================================================
FILE: .github/ISSUE_TEMPLATE/_feature_request_chs.md
================================================
---
name: 功能建议
about: 请求实现新功能或改进已有功能。
title: ''
labels: ''
assignees: ''

---

<!--
反馈前请阅读

- 使用说明: https://saladict.crimx.com/manual.html
- 常见问题以及答复: https://saladict.crimx.com/q&a.html
- 请先在 issues 页面搜索你的问题,很可能已被解决。
-->

<!-- 这是隐藏的信息 -->
<!-- 👆这样括起来的信息将被隐藏,填写时注意不要写在里面。 -->

<!-- 点击编辑器上方的 preview 可预览效果 -->

<!--
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。
⚠️请_完整_填写以下模板描述问题,否则反馈将会被系统关闭。

(重要事情已经说了十遍😅)
-->

## 设备信息
- 操作系统: [] <!-- 如 [Window10] -->
- 浏览器版本: [] <!-- 如 [Chrome77] -->
- 沙拉查词版本: [] <!-- 如 [v7.0.0] -->

<!-- 请在下方 ## 开头行之间的空白处填写,点击编辑器上方的 preview 预览效果 -->

## 请描述目前使用沙拉查词遇到什么不便
<!-- 清晰描述使用过程中遇到的问题 -->



## 理想情况下,沙拉查词应该怎么做
<!-- 清晰描述期待发生的行为 -->



## 替代方案
<!-- (可选)如果你已经有了能用的替代方案,或者对沙拉查词具体如何实现有建议 -->



## 额外信息
<!-- (可选)更多有助于理解问题的描述和资料 -->




================================================
FILE: .github/ISSUE_TEMPLATE/_new_dict_chs.md
================================================
---
name: 词典推荐
about: 请求沙拉查词添加新词典。
title: ''
labels: ''
assignees: ''

---

<!--
- 使用说明: https://saladict.crimx.com/manual.html
- 常见问题以及答复: https://saladict.crimx.com/q&a.html
- 在 issues 页面搜索你的问题,很可能已被解决。

目前沙拉查词已经支持了大量主流词典,推荐前请请在沙拉查词设置中查看是否已经支持。

每维护多一个词典都需要不少工作量,故功能雷同的词典不会轻易考虑添加,请完整填写下方模板并提供充分的推荐理由!
-->

<!-- 这是隐藏的信息 -->
<!-- 👆这样括起来的信息将被隐藏,填写时注意不要写在里面。 -->

<!-- 请在下方 ## 开头行之间的空白处填写,点击编辑器上方的 preview 预览效果 -->

## 词典名称以及链接



## 沙拉查词的已有的词典为什么不能满足?
<!-- 推荐词典有什么特殊功能是当前词典无法满足的 -->



## 单词举例
<!--
列出几个当前词典无法找到释义的单词,或者能体现推荐词典特性的单词

- 单词1,在已有词典下无法找到 xxxx 的用法。
- 单词2,推荐词典可以显示 xxxx 功能。
-->



## 截图
<!-- 需要情况下,可借助截图描述问题 -->



## 额外信息
<!-- 更多有助于理解问题的描述和资料 -->




================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Bug related issue.
title: ''
labels: ''
assignees: ''

---

## Device info
 - OS: [e.g. Window10]
 - Browser Version [e.g. Chrome77]
 - Saladict Version [e.g. v7.0.0]

## Describe the bug
<!-- A clear and concise description of what the bug is. -->

## To Reproduce
<!-- Steps to reproduce the behavior: -->
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

## Expected behavior
<!-- A clear and concise description of what you expected to happen. -->

## Screenshots
<!-- If applicable, add screenshots to help explain your problem. -->

## Additional context
<!-- Add any other context about the problem here. -->


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for Saladict
title: ''
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->

**Describe the solution you'd like**
<!-- A clear and concise description of what you want to happen. -->

**Describe alternatives you've considered**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->

**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->


================================================
FILE: .github/config.yml
================================================
# Configuration for request-info - https://github.com/behaviorbot/request-info

# *OPTIONAL* Comment to reply with
# Can be either a string :
requestInfoReplyComment: |
  请填写模板描述问题,以便别人理解、定位和解决问题。

  We would appreciate it if you could provide more info about this issue.

# Or an array:
# requestInfoReplyComment:
#  - Ah no! young blade! That was a trifle short!
#  - Tell me more !
#  - I am sure you can be more effusive

# *OPTIONAL* default titles to check against for lack of descriptiveness
# MUST BE ALL LOWERCASE
# requestInfoDefaultTitles:
#   - update readme.md
#   - updates

# *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given
requestInfoLabelToAdd: needs-more-info

# *OPTIONAL* Require Issues to contain more information than what is provided in the issue templates
# Will fail if the issue's body is equal to a provided template
checkIssueTemplate: true

# *OPTIONAL* Require Pull Requests to contain more information than what is provided in the PR template
# Will fail if the pull request's body is equal to the provided template
checkPullRequestTemplate: false

# *OPTIONAL* Only warn about insufficient information on these events type
# Keys must be lowercase. Valid values are 'issue' and 'pullRequest'
requestInfoOn:
  pullRequest: false
  issue: true
# *OPTIONAL* Add a list of people whose Issues/PRs will not be commented on
# keys must be GitHub usernames
# requestInfoUserstoExclude:
#   - hiimbex
#   - bexo


================================================
FILE: .github/no-response.yml
================================================
# Configuration for probot-no-response - https://github.com/probot/no-response

# Number of days of inactivity before an Issue is closed for lack of response
daysUntilClose: 14
# Label requiring a response
responseRequiredLabel: needs-more-info
# Comment to post when closing an Issue for lack of response. Set to `false` to disable
closeComment: >
  This issue has been automatically closed because there has been no response
  to our request for more information from the original author. With only the
  information that is currently in the issue, we don't have enough information
  to take action. Please reach out if you have or find the answers we need so
  that we can investigate further.


================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test

# parcel-bundler cache (https://parceljs.org/)
.cache

# next.js build output
.next

# nuxt.js build output
.nuxt

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# Neutrino build directory
build

assets/pdf/
deps/

test/**/response
.idea

.webext_tmp/*


**/.DS_Store


================================================
FILE: .neutrinorc.js
================================================
const path = require('path')
const fs = require('fs')
const webpack = require('webpack')
const react = require('@neutrinojs/react')
const copy = require('@neutrinojs/copy')
const jest = require('@neutrinojs/jest')
const wext = require('neutrino-webextension')
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
const MomentLocalesPlugin = require('moment-locales-webpack-plugin')
const dotenv = require('dotenv')
const argv = require('yargs').argv
const AfterBuildPlugin = require('./scripts/after-build')
const svgToMiniDataURI = require('mini-svg-data-uri')
const isAnalyze = argv.analyze || argv.analyse

module.exports = {
  options: {
    mains: {
      content: {
        entry: 'content',
        webext: {
          type: 'content_scripts',
          manifest: {
            css: ['assets/content.css'],
            matches: ['<all_urls>']
          },
          setup: 'content/__fake__/env.ts'
        }
      },

      selection: {
        entry: 'selection',
        webext: {
          type: 'content_scripts',
          manifest: {
            match_about_blank: true,
            all_frames: true,
            matches: ['<all_urls>']
          }
        }
      },

      popup: {
        entry: 'popup',
        webext: {
          type: 'browser_action',
          manifest: {
            default_icon: {
              '16': 'assets/icon-16.png',
              '19': 'assets/icon-19.png',
              '24': 'assets/icon-24.png',
              '38': 'assets/icon-38.png',
              '48': 'assets/icon-48.png',
              '128': 'assets/icon-128.png'
            }
          },
          setup: 'popup/__fake__/env.ts'
        }
      },

      options: {
        entry: 'options',
        webext: {
          type: 'options_ui',
          manifest: {
            open_in_tab: true
          },
          setup: 'options/__fake__/env.ts'
        }
      },

      background: {
        entry: 'background',
        webext: {
          type: 'background',
          setup: 'background/__fake__/env.ts'
        }
      },

      notebook: {
        entry: 'notebook'
      },

      history: {
        entry: 'history'
      },

      'quick-search': {
        entry: 'quick-search'
      },

      'word-editor': {
        entry: 'word-editor'
      },

      'audio-control': {
        entry: 'audio-control'
      }
    }
  },
  use: [
    react({
      html: {
        title: 'Saladict'
      },
      image: false,
      style: {
        test: /\.(css|scss)$/,
        modulesTest: /\.module\.(css|scss)$/,
        loaders: [
          // Define loaders as objects. Note: loaders must be specified in reverse order.
          // ie: for the loaders below the actual execution order would be:
          // input file -> sass-loader -> postcss-loader -> css-loader -> style-loader/mini-css-extract-plugin
          {
            loader: 'postcss-loader',
            options: {
              plugins: [require('autoprefixer')]
            },
            useId: 'postcss'
          },
          {
            loader: 'sass-loader',
            useId: 'scss'
          },
          {
            loader: 'sass-resources-loader',
            useId: 'sass-resources',
            options: {
              sourceMap: process.env.NODE_ENV !== 'production',
              resources: [
                path.join(__dirname, 'src/_sass_shared/_namespace.scss'),
                ...fs
                .readdirSync(path.join(__dirname, 'src/_sass_shared/_global/'))
                .map(filename =>
                  path.join(__dirname, 'src/_sass_shared/_global/', filename)
                )
              ]
            }
          }
        ]
      },
      babel: {
        presets: [
          [
            '@babel/preset-env',
            {
              /* remove targets set by neutrino web preset preferring browserslistrc */
            }
          ],
          [
            '@babel/preset-typescript',
            {
              isTSX: true,
              allExtensions: true
            }
          ]
        ],
        plugins: [
          [
            'import',
            {
              libraryName: 'antd'
            },
            'antd'
          ],
          [
            'import',
            {
              libraryName: '@ant-design/icons',
              libraryDirectory: '',
              camel2DashComponentName: false,
              style: false
            },
            '@ant-design/icons'
          ]
        ]
      }
    }),
    copy({
      patterns: [
        { context: 'assets', from: '**/*', to: 'assets/', toType: 'dir' },
        {
          context: 'src/_locales/manifest',
          from: '**/*',
          to: '_locales/',
          toType: 'dir'
        },
        {
          context: 'node_modules/antd/dist/',
          from: '+(antd|antd.dark).min.css',
          to: 'assets/',
          toType: 'dir'
        },
        // caiyunapp
        {
          context: 'node_modules/trsjs/build/sala',
          from: 'trs.js',
          to: 'assets/',
          toType: 'dir'
        }
      ]
    }),
    neutrino => {
      /* eslint-disable indent */

      // images
      neutrino.config.module.rules
        .delete('image')
        .end()
        .rule('svg')
        .test(/\.(svg)(\?v=\d+\.\d+\.\d+)?$/)
        .use('svg-url')
        .loader(require.resolve('url-loader'))
        .options({
          limit: 8192,
          // remove `default` when `require` image
          // due to legacy code
          esModule: false,
          generator: content => svgToMiniDataURI(content.toString())
        })
        .end()
        .end()
        .rule('pixel')
        .test(/\.(ico|png|jpg|jpeg|gif|webp)(\?v=\d+\.\d+\.\d+)?$/)
        .use('img-url')
        .loader(require.resolve('file-loader'))
        .options({
          // dev-server image name collision
          name: resourcePath => {
            if (process.env.NODE_ENV === 'development') {
              return '[path]/[name].[ext]'
            }

            const dictMatch = /\/dictionaries\/([^/]+)\/favicon.png/.exec(
              resourcePath
            )
            if (dictMatch) {
              return `assets/favicon-${dictMatch[1]}.[contenthash:8].[ext]`
            }

            return 'assets/[name].[contenthash:8].[ext]'
          },
          limit: 0,
          esModule: false
        })

      // avoid collision
      neutrino.config.output.jsonpFunction('saladictEntry')

      // transform *.shadow.(css|scss) to string
      // this will be injected into shadow-dom style tag
      // prettier-ignore
      const shadowStyleRules = neutrino.config.module
        .rule('style')
          .oneOf('shadow')
            .before('normal')
            .test(/\.shadow\.(css|scss)$/)
              .use('tostring')
                .loader('to-string-loader')
                .end()
              .use('minify')
              .after('css')
                .loader('clean-css-loader')
                .options({
                  level: 1,
                })
                .end()
      // copy loaders from normal to shadow
      // prettier-ignore
      neutrino.config.module
        .rule('style')
          .oneOf('normal')
            .uses.values()
              .filter(rule => !/^(extract|style)$/.test(rule.name))
              .forEach(rule => {
                shadowStyleRules
                  .use(rule.name)
                    .loader(rule.get('loader'))
                    .options(rule.get('options'))
              })

      // prettier-ignore
      neutrino.config
        .module
          .rule('compile') // add ts extensions for babel ect
            .test(/\.(mjs|jsx|js|ts|tsx)$/)
            .end()
          .end()
        .resolve
          .extensions // typescript extensions
            .add('.ts')
            .add('.tsx')
            .end()
          .alias // '@' src alias
            .set('@', path.join(__dirname, 'src'))
            .end()
          .end()

      // remove locales
      neutrino.config
        .plugin('momentjs')
          .use(MomentLocalesPlugin, [{ localesToKeep: ['zh-cn', 'zh-tw'] }])
          .end()

      // prettier-ignore
      neutrino.config
        .plugin('process.env')
          .use(webpack.DefinePlugin, [{
            'process.env': JSON.stringify(Object.assign(
                { DEBUG: !!argv.debug },
                dotenv.config().parsed
              ))
          }])
      /* eslint-enable indent */

      if (argv.mode === 'production') {
        // prettier-ignore
        neutrino.config
          .performance
            .hints(false)
            .end()
          .optimization
            .merge({
              splitChunks: {
                cacheGroups: {
                  react: {
                    test: /[\\/]node_modules[\\/](react|react-dom|i18next)[\\/]/,
                    name: 'view-vendor',
                    chunks: 'all',
                    priority: 100
                  },
                  franc: {
                    test: /[\\/]node_modules[\\/]franc/,
                    name: 'franc',
                    chunks: 'all',
                    priority: 100
                  },
                  dexie: {
                    test: /[\\/]node_modules[\\/]dexie/,
                    name: 'dexie',
                    chunks: 'all',
                    priority: 100
                  },
                  wordpage: {
                    test: (module, chunks) => module.resource &&
                      module.resource.includes(`${path.sep}src${path.sep}`) &&
                      !module.resource.includes(`${path.sep}node_modules${path.sep}`),
                    name: 'wordpage',
                    chunks: ({ name }) => /^(notebook|history)$/.test(name),
                  },
                  antd: {
                    test: /[\\/]node_modules[\\/]/,
                    name: 'antd',
                    chunks: ({ name }) => /^(options|notebook|history)$/.test(name),
                  }
                }
              },
            })
      }

      if (argv.debug) {
        // prettier-ignore
        neutrino.config
          .devtool('inline-source-map')
          .optimization
            .minimize(false)
      }

      if (isAnalyze) {
        // prettier-ignore
        neutrino.config
          .plugin('bundle-analyze')
          .use(BundleAnalyzerPlugin);
      }
    },
    jest({
      testRegex: ['test/specs/.*\\.spec\\.(ts|tsx|js|jsx)'],
      setupFilesAfterEnv: ['<rootDir>/config/jest/setupTests.js'],
      moduleNameMapper: {
        '^@/(.*)$': '<rootDir>/src/$1'
      },
      transform: {
        '\\.(mjs|jsx|js|ts|tsx)$': require.resolve(
          '@neutrinojs/jest/src/transformer'
        )
      },
      testTimeout: 20000
    }),
    wext({
      polyfill: true
    }),
    neutrino => {
      // prettier-ignore
      neutrino.config
        .plugin('after-build')
        .use(AfterBuildPlugin);
    }
  ]
}


================================================
FILE: .prettierrc
================================================
tabWidth: 2
semi: false
singleQuote: true


================================================
FILE: .storybook/addons.ts
================================================
import '@storybook/addon-knobs/register'
import '@storybook/addon-contexts/register'
import '@storybook/addon-actions/register'
import '@storybook/addon-backgrounds/register'
import 'storybook-addon-jsx/register'
import 'storybook-addon-react-docgen/register'

import addons from '@storybook/addons'
import { STORY_RENDERED } from '@storybook/core-events'

addons.register('TitleAddon', api => {
  api.on(STORY_RENDERED, () => {
    const storyData = api.getCurrentStoryData()
    document.title = `${storyData.name} - Saladict Storybook`
  })
})


================================================
FILE: .storybook/config.ts
================================================
import {
  configure,
  addDecorator,
  StoryDecorator,
  addParameters
} from '@storybook/react'
import { withContexts } from '@storybook/addon-contexts/react'
import { i18nContexts } from './configs/contexts'
import { StyleWrap } from '../src/_helpers/storybook'

import './style.css'

addParameters({
  options: {
    // bug https://github.com/storybookjs/storybook/issues/6569
    enableShortcuts: false
  },
  props: {
    propTablesExclude: [StyleWrap],
    styles: styles => ({
      ...styles,
      infoBody: {
        ...styles.infoBody,
        marginTop: 0,
        padding: '0 40px'
      },
      propTableHead: {
        ...styles.propTableHead,
        margin: 0
      },
      h1: {
        display: 'none'
      }
    })
  },
  jsx: {
    functionValue: (fn: Function) => `${fn.name}()`
  }
})

// place after the info addon so that wrappers get removed
addDecorator(withContexts(i18nContexts) as StoryDecorator)

function loadStories() {
  const req = require.context('../src', true, /\.stories\.tsx$/)
  let files = req.keys()
  if (process.env.STORYBOOK_PATH_PATTERN) {
    const tester = new RegExp(process.env.STORYBOOK_PATH_PATTERN)
    files = files.filter(filename => tester.test(filename))
  }
  files.forEach(filename => req(filename))
}

configure(loadStories, module)


================================================
FILE: .storybook/configs/contexts.tsx
================================================
import React, { FC, useContext, useEffect } from 'react'
import {
  I18nContextProvider,
  I18nContext,
  i18nLoader
} from '../../src/_helpers/i18n'
import i18next from 'i18next'

interface I18nWrapProps {
  lang: string
}

const I18nWrapInner: FC<I18nWrapProps> = props => {
  const lang = useContext(I18nContext)
  useEffect(() => {
    if (lang) {
      if (lang && props.lang !== lang) {
        i18next.changeLanguage(props.lang)
      }
    } else {
      i18nLoader()
    }
  }, [lang, props.lang])
  return <>{props.children}</>
}

const I18nWrap: FC<I18nWrapProps> = props => (
  <I18nContextProvider>
    <I18nWrapInner {...props}>{props.children}</I18nWrapInner>
  </I18nContextProvider>
)

export const i18nContexts = [
  {
    // https://storybooks-official.netlify.com/?path=/story/basics-icon--labels
    icon: 'globe',
    title: 'i18n',
    components: [I18nWrap],
    params: [
      {
        name: 'English',
        props: { lang: 'en' },
        default: 'en' === navigator.language
      },
      {
        name: '简体中文',
        props: { lang: 'zh-CN' },
        default: 'zh-CN' === navigator.language
      },
      {
        name: '繁体中文',
        props: { lang: 'zh-TW' },
        default: 'zh-TW' === navigator.language
      }
    ]
  }
]


================================================
FILE: .storybook/manager-head.html
================================================
<style>
  /* disable upgrade floaty */
  [href='/?path=/settings/about'] {
    display: none !important;
  }
</style>


================================================
FILE: .storybook/preview-head.html
================================================
<style>
  #story-root {
    min-height: 100px;
  }
</style>


================================================
FILE: .storybook/style.css
================================================
body {
  width: unset;
  height: unset;
  overflow-y: scroll;
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}


================================================
FILE: .storybook/webpack.config.js
================================================
const path = require('path')
const fs = require('fs')
const Neutrino = require('neutrino/Neutrino')
const neutrinorc = require('../.neutrinorc.js')
const neutrino = new Neutrino(neutrinorc.options)
neutrinorc.use.forEach(middleware => neutrino.use(middleware))

const babelOptions = neutrino.config.module
  .rule('compile')
  .use('babel')
  .get('options')

// babelOptions.plugins.push([
//   'babel-plugin-react-docgen-typescript',
//   {
//     docgenCollectionName: 'STORYBOOK_REACT_CLASSES',
//     include: 'components.*\\.tsx$',
//     exclude: '__mocks__|(\\.stories\\.tsx$)'
//   }
// ])

const sassGlobals = [
  path.join(__dirname, '../src/_sass_shared/_namespace.scss'),
  ...fs
    .readdirSync(path.join(__dirname, '../src/_sass_shared/_global/'))
    .map(filename => path.join(__dirname, '../src/_sass_shared/_global/', filename))
]

module.exports = ({ config }) => {
  config.module.rules.push({
    test: /\.mjs$/,
    type: 'javascript/auto'
  })
  config.module.rules.push({
    test: /\.(ts|tsx)$/,
    use: [
      {
        loader: require.resolve('babel-loader'),
        options: babelOptions
      },
      {
        loader: require.resolve('react-docgen-typescript-loader'),
        options: {
          tsconfigPath: path.join(__dirname, '../tsconfig.json')
        }
      }
    ]
  })
  config.module.rules.push({
    oneOf: [
      {
        test: /\.module\.(css|scss)$/,
        use: [
          'to-string-loader',
          {
            loader: 'css-loader',
            options: {
              importLoaders: 2,
              modules: true
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              plugins: [require('autoprefixer')]
            }
          },
          'sass-loader'
        ],
        include: path.resolve(__dirname, '../src')
      },
      {
        test: /\.shadow\.(css|scss)$/,
        use: [
          'to-string-loader',
          {
            loader: 'css-loader',
            options: {
              importLoaders: 2
            }
          },
          {
            loader: 'clean-css-loader',
            options: {
              level: 1
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              plugins: [require('autoprefixer')]
            }
          },
          'sass-loader',
          {
            loader: 'sass-resources-loader',
            options: {
              sourceMap: true,
              resources: sassGlobals
            }
          }
        ],
        include: path.resolve(__dirname, '../src')
      },
      {
        test: /\.(css|scss)$/,
        use: [
          'to-string-loader',
          {
            loader: 'css-loader',
            options: {
              importLoaders: 2
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              plugins: [require('autoprefixer')]
            }
          },
          'sass-loader',
          {
            loader: 'sass-resources-loader',
            options: {
              sourceMap: true,
              resources: sassGlobals
            }
          }
        ],
        include: path.resolve(__dirname, '../src')
      }
    ]
  })

  if (Array.isArray(config.entry)) {
    config.entry.unshift('webextensions-emulator/dist/core')
  } else {
    Object.keys(config.entry).forEach(id => {
      if (!Array.isArray(config.entry[id])) {
        config.entry[id] = [config.entry[id]]
      }
      config.entry[id].unshift('webextensions-emulator/dist/core')
    })
  }

  config.resolve.extensions.push('.ts', '.tsx')
  config.resolve.alias['@'] = path.join(__dirname, '../src')
  config.resolve.alias['@sb'] = path.join(__dirname)

  return config
}


================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
  - 'stable'
script:
  - yarn lint
  - yarn build
  # remove agnostic tests
  - yarn test --testPathIgnorePatterns 'components/dictionaries'


================================================
FILE: .vscode/locales.schema.json
================================================
{
  "type": "object",
  "properties": {
    "name": {
      "$ref": "#/definitions/locale"
    },
    "options": {
      "$ref": "#/definitions/locales"
    },
    "helps": {
      "$ref": "#/definitions/locales"
    }
  },
  "required": ["name"],
  "additionalProperties": false,

  "definitions": {
    "locale": {
      "type": "object",
      "properties": {
        "en": { "type": "string" },
        "zh-CN": { "type": "string" },
        "zh-TW": { "type": "string" }
      },
      "required": ["en", "zh-CN", "zh-TW"],
      "additionalProperties": false
    },
    "locales": {
      "type": "object",
      "patternProperties": {
        ".+": {
          "$ref": "#/definitions/locale"
        }
      }
    }
  }
}


================================================
FILE: .vscode/settings.json
================================================
{
  "json.schemas": [
    {
      "fileMatch": ["src/components/dictionaries/**/_locales.json"],
      "url": ".vscode/locales.schema.json"
    }
  ],
  "files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/*/**": true,
    "**/build/*/**": true,
    "**/assets/*/**": true
  },
  "conventionalCommits.scopes": [
    "audio-control",
    "background",
    "components",
    "config",
    "dicts",
    "history",
    "locales",
    "notebook",
    "options",
    "panel",
    "popup",
    "selecion",
    "sync-services",
    "word-editor"
  ]
}


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.

## [7.20.0](https://github.com/crimx/ext-saladict/compare/v7.19.1...v7.20.0) (2021-10-17)


### Features

* **pdf:** inject vimium-c ([#1462](https://github.com/crimx/ext-saladict/issues/1462)) ([#1463](https://github.com/crimx/ext-saladict/issues/1463)) ([029c07a](https://github.com/crimx/ext-saladict/commit/029c07a0801177bf9d8137163fc43f70fe1e7a30))
* **sync-services:** add eudic ([#1467](https://github.com/crimx/ext-saladict/issues/1467)) ([452bf53](https://github.com/crimx/ext-saladict/commit/452bf537a4aee7d1e3d79b7960cd5183cdff88af))
* **wordpage:** add context cloze ([b910769](https://github.com/crimx/ext-saladict/commit/b91076941940dc82961830f43dcb9ee081596aa4))
* add Oxford Learner's Dict ([#1458](https://github.com/crimx/ext-saladict/issues/1458)) ([aaffe00](https://github.com/crimx/ext-saladict/commit/aaffe00d760adb44676042142a5ce2af34ce5001)), closes [#1253](https://github.com/crimx/ext-saladict/issues/1253)


### Bug Fixes

* **dictpanel:** remove waveform box if option is off ([e979c1c](https://github.com/crimx/ext-saladict/commit/e979c1c62fb022f23e4e3edc600e5d0abee830c1))
* **dicts:** fix srcset protocol ([21a0032](https://github.com/crimx/ext-saladict/commit/21a0032a3acb6b25cc5444409218b689176a9cb1)), closes [#1366](https://github.com/crimx/ext-saladict/issues/1366)
* **hot-words:** remove daily hot words of urban dict ([#1428](https://github.com/crimx/ext-saladict/issues/1428)) ([5dc29cd](https://github.com/crimx/ext-saladict/commit/5dc29cd61fc181929804dcf4d1cd4337289a062b))
* **notebook:** make export panel textarea background transparent ([09bddc0](https://github.com/crimx/ext-saladict/commit/09bddc0579f7844b4688aca4e6e60e409407d292))
* **panel:** pin panel by default ([e4ee931](https://github.com/crimx/ext-saladict/commit/e4ee931efe04f13946a1883425ced8fca7f52931)), closes [#1505](https://github.com/crimx/ext-saladict/issues/1505)
* **selecion:** check range count before getting range ([dfc46a0](https://github.com/crimx/ext-saladict/commit/dfc46a0378b3c71bbc9f0febf5d2b0058fdb3826)), closes [#1144](https://github.com/crimx/ext-saladict/issues/1144)

### [7.19.1](https://github.com/crimx/ext-saladict/compare/v7.19.0...v7.19.1) (2021-07-25)


### Bug Fixes

* **no-typefield:** add support for content editable ([#1334](https://github.com/crimx/ext-saladict/issues/1334)) ([7984991](https://github.com/crimx/ext-saladict/commit/7984991e0e7adfb0b5fa16d604ffa3da6be65a40))
* **pdf:** update pdf dir ([a8df19f](https://github.com/crimx/ext-saladict/commit/a8df19f12bcc5000eedaf40f6c0d3e0438386371))

## [7.19.0](https://github.com/crimx/ext-saladict/compare/v7.18.2...v7.19.0) (2021-05-23)


### Features

* **dict-panel:** add a option to pin panel by default ([#1296](https://github.com/crimx/ext-saladict/issues/1296)) ([bbaeb76](https://github.com/crimx/ext-saladict/commit/bbaeb76c77d62e18e3d6a0af52d7bad983dbcd69))


### Bug Fixes

* **fixtures:** cnki url ([0fd0125](https://github.com/crimx/ext-saladict/commit/0fd012596c4e82e5acf7fa91469bdb78209fbbbc))

### [7.18.2](https://github.com/crimx/ext-saladict/compare/v7.18.1...v7.18.2) (2021-05-23)


### Bug Fixes

* **dict-panel:** move root el to document element ([aaeae1c](https://github.com/crimx/ext-saladict/commit/aaeae1cc6f4ea9ad43e2042b8b670f8480aaefb1)), closes [#1293](https://github.com/crimx/ext-saladict/issues/1293) [#1190](https://github.com/crimx/ext-saladict/issues/1190) [#474](https://github.com/crimx/ext-saladict/issues/474) [#421](https://github.com/crimx/ext-saladict/issues/421) [#398](https://github.com/crimx/ext-saladict/issues/398) [#278](https://github.com/crimx/ext-saladict/issues/278)
* **dict-panel:** prevent input method conflict on first input ([e4dda57](https://github.com/crimx/ext-saladict/commit/e4dda573263f77ad9bfbf10c577971b9a9631fb8)), closes [#1149](https://github.com/crimx/ext-saladict/issues/1149)
* **dicts:** fix zdic icon ([9aea435](https://github.com/crimx/ext-saladict/commit/9aea435fc8f8141d448d2f8309fef3d9872ea75a)), closes [#1244](https://github.com/crimx/ext-saladict/issues/1244)

### [7.18.1](https://github.com/crimx/ext-saladict/compare/v7.18.0...v7.18.1) (2021-01-18)


### Bug Fixes

* **fixtures:** read url of undefined ([52e209d](https://github.com/crimx/ext-saladict/commit/52e209d2ca55715bdc5f574ae9f10420ce87306b))

## [7.18.0](https://github.com/crimx/ext-saladict/compare/v7.17.0...v7.18.0) (2020-11-02)


### Features

* **panel:** add shortcut for switch search history ([0a61c49](https://github.com/crimx/ext-saladict/commit/0a61c4982a0232daaecf9c9c5573858a2a2cd1a1)), closes [#1063](https://github.com/crimx/ext-saladict/issues/1063)
* add options for browser action panel width and height ([fab67dd](https://github.com/crimx/ext-saladict/commit/fab67dd5d82a1fc13d15886d92b5e03f518c434f)), closes [#983](https://github.com/crimx/ext-saladict/issues/983)


### Bug Fixes

* **background:** query error on http url ([1922c09](https://github.com/crimx/ext-saladict/commit/1922c0914f46c306ce905d87b298b5ccd7e15e5a))
* **dicts:** sogou access token is required Closes [#1011](https://github.com/crimx/ext-saladict/issues/1011) ([a449119](https://github.com/crimx/ext-saladict/commit/a449119ae1643b2cb19b23e68aa1a998382c6cb9))
* **options:** hide unsupported features on Firefox ([516e030](https://github.com/crimx/ext-saladict/commit/516e03048525f426ac9145db96866fe4673ee25c)), closes [#1062](https://github.com/crimx/ext-saladict/issues/1062)

## [7.17.0](https://github.com/crimx/ext-saladict/compare/v7.15.1...v7.17.0) (2020-09-08)


### Features

* add lingocloud browser shortcut ([badd839](https://github.com/crimx/ext-saladict/commit/badd839a0c40602a79337b646a0b6baa6f66f834))
* add Lingocloud trs ([fe75c7a](https://github.com/crimx/ext-saladict/commit/fe75c7a6c9431aeeaa63138b4fd1c1eff153124f))


### Bug Fixes

* **dicts:** add google tts ([bbbe0a1](https://github.com/crimx/ext-saladict/commit/bbbe0a10a6def4608ff850e849005997abb37ad6))
* **options:** fix dict title overflows on small screens ([54d4fe3](https://github.com/crimx/ext-saladict/commit/54d4fe30ddd0a62f0c41bc7423bf0eb3c3a9309e))
* **options:** replace react-sortable-hoc with react-beautiful-dnd ([7e3d0c7](https://github.com/crimx/ext-saladict/commit/7e3d0c744f1d1bc18c8778460f811f2a55d029a3)), closes [#966](https://github.com/crimx/ext-saladict/issues/966)
* **panel:** remove text loading delay on standalone panel ([42827bb](https://github.com/crimx/ext-saladict/commit/42827bb30499c7b5788be9cb10f6c9f4cf191508)), closes [#974](https://github.com/crimx/ext-saladict/issues/974)
* **panel:** simplify summoned panel initialization ([ae322be](https://github.com/crimx/ext-saladict/commit/ae322beb688414264ce6a2a4b958e69392ab4c2c))
* **popup:** close popup panel after menus being triggered ([931afc2](https://github.com/crimx/ext-saladict/commit/931afc279ce6f9ff1e4ad211eccf2fd86f95f330))

### [7.16.1](https://github.com/crimx/ext-saladict/compare/v7.15.1...v7.16.1) (2020-09-05)


### Features

* add lingocloud browser shortcut ([badd839](https://github.com/crimx/ext-saladict/commit/badd839a0c40602a79337b646a0b6baa6f66f834))
* add Lingocloud trs ([fe75c7a](https://github.com/crimx/ext-saladict/commit/fe75c7a6c9431aeeaa63138b4fd1c1eff153124f))


### Bug Fixes

* **dicts:** add google tts ([bbbe0a1](https://github.com/crimx/ext-saladict/commit/bbbe0a10a6def4608ff850e849005997abb37ad6))
* **options:** fix dict title overflows on small screens ([54d4fe3](https://github.com/crimx/ext-saladict/commit/54d4fe30ddd0a62f0c41bc7423bf0eb3c3a9309e))
* **options:** replace react-sortable-hoc with react-beautiful-dnd ([7e3d0c7](https://github.com/crimx/ext-saladict/commit/7e3d0c744f1d1bc18c8778460f811f2a55d029a3)), closes [#966](https://github.com/crimx/ext-saladict/issues/966)
* **panel:** remove text loading delay on standalone panel ([42827bb](https://github.com/crimx/ext-saladict/commit/42827bb30499c7b5788be9cb10f6c9f4cf191508)), closes [#974](https://github.com/crimx/ext-saladict/issues/974)
* **popup:** close popup panel after menus being triggered ([931afc2](https://github.com/crimx/ext-saladict/commit/931afc279ce6f9ff1e4ad211eccf2fd86f95f330))

## [7.16.0](https://github.com/crimx/ext-saladict/compare/v7.15.1...v7.16.0) (2020-09-04)


### Features

* add lingocloud browser shortcut ([badd839](https://github.com/crimx/ext-saladict/commit/badd839a0c40602a79337b646a0b6baa6f66f834))
* add Lingocloud trs ([fe75c7a](https://github.com/crimx/ext-saladict/commit/fe75c7a6c9431aeeaa63138b4fd1c1eff153124f))


### Bug Fixes

* **dicts:** add google tts ([bbbe0a1](https://github.com/crimx/ext-saladict/commit/bbbe0a10a6def4608ff850e849005997abb37ad6))
* **options:** fix dict title overflows on small screens ([54d4fe3](https://github.com/crimx/ext-saladict/commit/54d4fe30ddd0a62f0c41bc7423bf0eb3c3a9309e))
* **options:** replace react-sortable-hoc with react-beautiful-dnd ([7e3d0c7](https://github.com/crimx/ext-saladict/commit/7e3d0c744f1d1bc18c8778460f811f2a55d029a3)), closes [#966](https://github.com/crimx/ext-saladict/issues/966)
* **panel:** remove text loading delay on standalone panel ([42827bb](https://github.com/crimx/ext-saladict/commit/42827bb30499c7b5788be9cb10f6c9f4cf191508)), closes [#974](https://github.com/crimx/ext-saladict/issues/974)
* **popup:** close popup panel after menus being triggered ([931afc2](https://github.com/crimx/ext-saladict/commit/931afc279ce6f9ff1e4ad211eccf2fd86f95f330))

### [7.15.1](https://github.com/crimx/ext-saladict/compare/v7.15.0...v7.15.1) (2020-08-07)

## [7.15.0](https://github.com/crimx/ext-saladict/compare/v7.14.5...v7.15.0) (2020-08-07)


### Features

* **sync-services:** add sync server to ankiconnect ([b6a7487](https://github.com/crimx/ext-saladict/commit/b6a74873b71282805892e8172961dec1a77e13bb))


### Bug Fixes

* **background:** remove background permission on Opera ([151b0a1](https://github.com/crimx/ext-saladict/commit/151b0a16320ff7ab875ad970525b358459f733a3)), closes [#916](https://github.com/crimx/ext-saladict/issues/916)
* **dicts:** cambridge amp-img replacement ([1aed3f4](https://github.com/crimx/ext-saladict/commit/1aed3f41f24e0b91e5bf9b20ab11a3f38967d8a7)), closes [#939](https://github.com/crimx/ext-saladict/issues/939)
* **dicts:** cambridge idiom-only entry ([0135b3e](https://github.com/crimx/ext-saladict/commit/0135b3e84ec85af382e2e94470b5c1705e1e830e)), closes [#940](https://github.com/crimx/ext-saladict/issues/940)
* **dicts:** replace cambridge amp-audio ([aac184c](https://github.com/crimx/ext-saladict/commit/aac184cd9d9ddb035f8331457baf8b0a160a3224)), closes [#943](https://github.com/crimx/ext-saladict/issues/943)
* **dicts:** same url for src page ([a0696e1](https://github.com/crimx/ext-saladict/commit/a0696e1709dd700d20d182c0f277025090a14608)), closes [#935](https://github.com/crimx/ext-saladict/issues/935)
* **locales:** typo ([8dcb8e1](https://github.com/crimx/ext-saladict/commit/8dcb8e11cf5f9e40dd424fa332525329d3385ca4))
* **panel:** reset opacity on root container ([40abbbc](https://github.com/crimx/ext-saladict/commit/40abbbc884f6ac3fba44e9423e9d4887048e91e0)), closes [#904](https://github.com/crimx/ext-saladict/issues/904)
* **panel:** search box on in-page panel loses focus ([c1d5984](https://github.com/crimx/ext-saladict/commit/c1d598473d02dc247c218d48e183bfa58251def2)), closes [#927](https://github.com/crimx/ext-saladict/issues/927)
* **panel:** select background color ([2a9c144](https://github.com/crimx/ext-saladict/commit/2a9c14484d56a2815bb9fb09d98f361e41616f52))
* **panel:** support Super Dark Mode ([6e6164e](https://github.com/crimx/ext-saladict/commit/6e6164eeb9ec1f5eeff80bad3f3b9715a3627447)), closes [#947](https://github.com/crimx/ext-saladict/issues/947)
* **sync-services:** shanbay batch upload interrupting ([5881389](https://github.com/crimx/ext-saladict/commit/5881389b05823258383ba7448eb836e6cb59bc30)), closes [#932](https://github.com/crimx/ext-saladict/issues/932)
* **word-editor:** correct container dimension ([0b51e6b](https://github.com/crimx/ext-saladict/commit/0b51e6bb0026d363f728cde758e299219580c791))


### Build System

* **deps-dev:** bump standard-version from 6.0.1 to 8.0.1 ([#903](https://github.com/crimx/ext-saladict/issues/903)) ([d1ac2b5](https://github.com/crimx/ext-saladict/commit/d1ac2b57d576f4eaaa94f3a8a6595b44a28b76f1))

### [7.14.5](https://github.com/crimx/ext-saladict/compare/v7.14.4...v7.14.5) (2020-07-12)


### Bug Fixes

* **panel:** set missing initial config ([791cb57](https://github.com/crimx/ext-saladict/commit/791cb57cbd40264b255da03576693af3a15daf24))

### [7.14.4](https://github.com/crimx/ext-saladict/compare/v7.14.3...v7.14.4) (2020-07-12)


### Bug Fixes

* **dicts:** correct machine translator rtl source text collapse fading ([42003e5](https://github.com/crimx/ext-saladict/commit/42003e51c0c3778c3ecbc0d6771142baae720ab9))


### Build System

* always strip momentjs locales ([7dbb309](https://github.com/crimx/ext-saladict/commit/7dbb309bbe3caafc70348999ca5e4526fd649618))

### [7.14.3](https://github.com/crimx/ext-saladict/compare/v7.14.2...v7.14.3) (2020-07-12)


### Bug Fixes

* **panel:** fix machine source text fade color ([b36deb6](https://github.com/crimx/ext-saladict/commit/b36deb68df02254da2577cad4b9eb65722e5155a))

### [7.14.2](https://github.com/crimx/ext-saladict/compare/v7.14.1...v7.14.2) (2020-07-12)


### Bug Fixes

* **panel:** move saladict-theme down under darkMode ([52d8fb2](https://github.com/crimx/ext-saladict/commit/52d8fb20dd9d53a83b0c1f807102220977aa9e0d))

### [7.14.1](https://github.com/crimx/ext-saladict/compare/v7.14.0...v7.14.1) (2020-07-12)


### Bug Fixes

* **options:** update antd typings ([2879c4f](https://github.com/crimx/ext-saladict/commit/2879c4fe9e1ef6a5397ac807ce94a2d188d61d30))
* fixed incorrect options merging ([8e062dc](https://github.com/crimx/ext-saladict/commit/8e062dc7dc87642da282bcceeabbaf86d58770f4))
* switch default slInitial back to collapse ([524223c](https://github.com/crimx/ext-saladict/commit/524223c4a2cfafd5a0a8d0a2eb6fa494926e5099))


### Build System

* add sass globals to storybook ([f44ce5a](https://github.com/crimx/ext-saladict/commit/f44ce5a6bd54b2f3346d63934151db6aa76789d0))

## [7.14.0](https://github.com/crimx/ext-saladict/compare/v7.13.4...v7.14.0) (2020-07-10)


### Features

* **background:** add background permission ([9d41e09](https://github.com/crimx/ext-saladict/commit/9d41e0980e17dffbcce2804a66b850f9e33c147e)), closes [#892](https://github.com/crimx/ext-saladict/issues/892)
* **menus:** add saladict standlone panel ([0d4a732](https://github.com/crimx/ext-saladict/commit/0d4a73278a523405b1ab1d28ade9d514826ecd4a)), closes [#864](https://github.com/crimx/ext-saladict/issues/864)
* **panel:** add dict item catalog ([f07ea25](https://github.com/crimx/ext-saladict/commit/f07ea25751fcb746363e09b3804da03520b35249))


### Bug Fixes

* **components:** fix select padding in firefox ([dd366d3](https://github.com/crimx/ext-saladict/commit/dd366d396e8ca63298aeb70a575dfaad858f75b7))
* **components:** typo ([0229cc2](https://github.com/crimx/ext-saladict/commit/0229cc28124567cbe6a79c71d474c935da094756))
* **dicts:** update tts for tencent and caiyun ([afdac41](https://github.com/crimx/ext-saladict/commit/afdac41d4099aef1efa6021c60b741e3ad6fda22))
* **options:** update sortable list on store changes ([075aef7](https://github.com/crimx/ext-saladict/commit/075aef764d8327f78288e0d6d183ae51f9f82f48))
* **panel:** correct panel history ([1b2781f](https://github.com/crimx/ext-saladict/commit/1b2781f48e875f07536be14a733e93a901db5958)), closes [#881](https://github.com/crimx/ext-saladict/issues/881)
* **panel:** fix catalog scrolling ([ded090d](https://github.com/crimx/ext-saladict/commit/ded090d81b7d2bd66b0c12806a1c3fa457257328))


### Tests

* **panel:** update dict item stories ([507c638](https://github.com/crimx/ext-saladict/commit/507c638ba34a9b903cbee06b36056ede15c66a2d))
* update stories ([49b2ad2](https://github.com/crimx/ext-saladict/commit/49b2ad2eb68e0b39117b224ad1c05264b8ed678f))
* **dicts:** log runtime messages ([5c23327](https://github.com/crimx/ext-saladict/commit/5c23327db3f6b44f25487b3cc0866ab38741adc9))

### [7.13.4](https://github.com/crimx/ext-saladict/compare/v7.13.3...v7.13.4) (2020-06-23)


### Bug Fixes

* **options:** entry incorrect initial form state ([f009670](https://github.com/crimx/ext-saladict/commit/f0096707ba14425e3c4a60a9548ddad3adf8f3e0)), closes [#865](https://github.com/crimx/ext-saladict/issues/865)

### [7.13.3](https://github.com/crimx/ext-saladict/compare/v7.13.2...v7.13.3) (2020-06-20)


### Bug Fixes

* **dicts:** add macmillan american ([0c63217](https://github.com/crimx/ext-saladict/commit/0c632178733dd32cbd0a5aaab2aad31207a237b1)), closes [#837](https://github.com/crimx/ext-saladict/issues/837)
* **dicts:** update cnki params ([952702c](https://github.com/crimx/ext-saladict/commit/952702c57946c7058291a062163511594b7c5d57)), closes [#852](https://github.com/crimx/ext-saladict/issues/852)


### Build System

* upgrade deps ([549983a](https://github.com/crimx/ext-saladict/commit/549983ac77d58de9471c8cf01a29ff95b4616e8f))

### [7.13.2](https://github.com/crimx/ext-saladict/compare/v7.13.1...v7.13.2) (2020-06-04)


### Bug Fixes

* **sync-services:** fix anki returning random order of field names ([227089c](https://github.com/crimx/ext-saladict/commit/227089c8f713b32bafd512a74c5423ea0a7b5673))

### [7.13.1](https://github.com/crimx/ext-saladict/compare/v7.13.0...v7.13.1) (2020-06-02)


### Bug Fixes

* **ankiconnect:** compatible with anki localization ([f1ce54c](https://github.com/crimx/ext-saladict/commit/f1ce54c732c4a3ed04b8b881c1df3d4810c65f62))
* remove unused ([f0d203c](https://github.com/crimx/ext-saladict/commit/f0d203c84f107762d7b753593851d4ffb417c310))

## [7.13.0](https://github.com/crimx/ext-saladict/compare/v7.12.1...v7.13.0) (2020-06-01)


### Features

* **panel:** add option for panel size and position memo ([bce3bfb](https://github.com/crimx/ext-saladict/commit/bce3bfbaeee386529232d261025844b187ca43e8)), closes [#812](https://github.com/crimx/ext-saladict/issues/812)
* **sync-services:** add ankiconnect ([cd12702](https://github.com/crimx/ext-saladict/commit/cd127027a66909903f91c1f17ed7173428a0ecfd))


### Bug Fixes

* **dicts:** remove horizontal scroll ([7ebf09d](https://github.com/crimx/ext-saladict/commit/7ebf09d224e06df08750cdbde6f6cd31034875c3)), closes [#818](https://github.com/crimx/ext-saladict/issues/818)
* **dicts:** remove lexico associated translation ([81d2cc7](https://github.com/crimx/ext-saladict/commit/81d2cc7a811a249b4ef7350fe9f31e95d1a7ce78)), closes [#818](https://github.com/crimx/ext-saladict/issues/818)
* **i18n:** make loader singleton ([6539fc7](https://github.com/crimx/ext-saladict/commit/6539fc78debda645c4d3524ac42c146ee20e4d00))
* **options:** add key to react component ([09a7d32](https://github.com/crimx/ext-saladict/commit/09a7d3277943aafae090e172e5046bca72181ee0))
* **panel:** open standalone panel anyway ([88259b0](https://github.com/crimx/ext-saladict/commit/88259b0893967a0e993d1c8102043378cd27c9c7)), closes [#832](https://github.com/crimx/ext-saladict/issues/832)
* **panel:** update fav icon after saving words ([c803998](https://github.com/crimx/ext-saladict/commit/c803998132dbc71f78d4a29730784e9446035f58))
* **sync-services:** add version on request ([f84f359](https://github.com/crimx/ext-saladict/commit/f84f3590c577b43e67ced19382565692b6cdc67c))
* **word-editor:** translate context when word editor shows up ([95bf129](https://github.com/crimx/ext-saladict/commit/95bf129dbfc97a9992c62e84cf7be27ce294eecc))
* stop playing audio on panel close ([97cabf4](https://github.com/crimx/ext-saladict/commit/97cabf49e7aca7754edde247003fbcb4ea42dd59)), closes [#824](https://github.com/crimx/ext-saladict/issues/824)
* **wordpage:** dark mode ([5921673](https://github.com/crimx/ext-saladict/commit/59216735ab2f88e9bdc9f6b8adae6e4cb4e7d93c))


### Tests

* **sync-services:** add Anki Connect ([1fb55e8](https://github.com/crimx/ext-saladict/commit/1fb55e83b58354e8449ed0b6353e591f4c47e779))
* **sync-services:** update webdav to new architecture ([d98c16c](https://github.com/crimx/ext-saladict/commit/d98c16cdfca16a5f2c0df4a7ed78e75b4441c8cd))

### [7.12.1](https://github.com/crimx/ext-saladict/compare/v7.12.0...v7.12.1) (2020-05-17)


### Bug Fixes

* **dicts:** update googledict style ([52e66df](https://github.com/crimx/ext-saladict/commit/52e66dfe282b74bc21a7bec4e91bf8a66a34f0cf))
* **macmillan:** add styles on labels ([768ba78](https://github.com/crimx/ext-saladict/commit/768ba7851d7e22517a3d4a23dad135c103f229ab)), closes [#803](https://github.com/crimx/ext-saladict/issues/803)

## [7.12.0](https://github.com/crimx/ext-saladict/compare/v7.11.2...v7.12.0) (2020-05-15)


### Features

* **command:** add shortcut for adding notebook ([524dd6c](https://github.com/crimx/ext-saladict/commit/524dd6c7a250c415a865f1587c79b09bef7cbc7c)), closes [#785](https://github.com/crimx/ext-saladict/issues/785)
* **pdf:** open pdf viewer in standalone panel ([07f8c71](https://github.com/crimx/ext-saladict/commit/07f8c71195d1c0cf41f0592115921d226bebef07))
* **selection:** add altKey for search modes ([fdc2ba5](https://github.com/crimx/ext-saladict/commit/fdc2ba56ad63d278668633c507a1e0c3a11070eb)), closes [#729](https://github.com/crimx/ext-saladict/issues/729)


### Bug Fixes

* respect qsFocus option ([2a9cf06](https://github.com/crimx/ext-saladict/commit/2a9cf062a29aea60aa15f473ba3b5a543f9dea49)), closes [#784](https://github.com/crimx/ext-saladict/issues/784)
* upgrade neutrino-webextension ([5c1c48d](https://github.com/crimx/ext-saladict/commit/5c1c48d0b58a22ad172196e3106e00383b133eaa)), closes [#790](https://github.com/crimx/ext-saladict/issues/790)


### Tests

* **dicts:** update macmillan ([70150fd](https://github.com/crimx/ext-saladict/commit/70150fd41a34de85c24418932ba33d4cb8ce84d8))
* **pdf:** update pdf tests ([6890c6d](https://github.com/crimx/ext-saladict/commit/6890c6d030415fa53adb741e7cfc0650fe43e044))

### [7.11.2](https://github.com/crimx/ext-saladict/compare/v7.11.1...v7.11.2) (2020-05-06)


### Bug Fixes

* **wordeditor:** incorrect z-index ([3701084](https://github.com/crimx/ext-saladict/commit/3701084299cc3902a2e55e9e14d472fba9bcdf27)), closes [#780](https://github.com/crimx/ext-saladict/issues/780)
* **wordpage:** refresh table on word changes ([5520feb](https://github.com/crimx/ext-saladict/commit/5520feb1b28eb73e689f5881cc07d9855c11fac9)), closes [#780](https://github.com/crimx/ext-saladict/issues/780)

### [7.11.1](https://github.com/crimx/ext-saladict/compare/v7.11.0...v7.11.1) (2020-05-05)


### Bug Fixes

* **firefox:** add franc to dynamic chunks ([61580b1](https://github.com/crimx/ext-saladict/commit/61580b1217bd293885b854ad061d55b082b5be2b)), closes [#778](https://github.com/crimx/ext-saladict/issues/778)
* **wordeditor:** fix z-index on internal page ([5c80ebb](https://github.com/crimx/ext-saladict/commit/5c80ebb186c782c0c4747fca3de97e035a334cb6))


### Tests

* update check-update ([6582938](https://github.com/crimx/ext-saladict/commit/6582938c814a92b5ab36a8ae20b4ebdf6a77cc98))

## [7.11.0](https://github.com/crimx/ext-saladict/compare/v7.10.4...v7.11.0) (2020-05-01)


### Features

* **dicts:** add jikipedia ([046b850](https://github.com/crimx/ext-saladict/commit/046b850c83516c43022773bdd2ab6cacbb7696fa))
* fix buggy axios ([9eb8172](https://github.com/crimx/ext-saladict/commit/9eb817242365961cd940bd5e54547b601678c7ce))
* **panel:** add sticky folding ([7b2c352](https://github.com/crimx/ext-saladict/commit/7b2c3524b452925d126d6bd15770649a353e2068)), closes [#765](https://github.com/crimx/ext-saladict/issues/765)
* **panel:** remember last standalone window position ([3d25428](https://github.com/crimx/ext-saladict/commit/3d254280e6c2a16a7bd5de99eace55090c04cc88)), closes [#766](https://github.com/crimx/ext-saladict/issues/766)
* **profiles:** add shortcuts for top profiles ([de9ca07](https://github.com/crimx/ext-saladict/commit/de9ca077c23147859ebc648b3202faa5b25bca15))
* added option qsFocus ([51e59f9](https://github.com/crimx/ext-saladict/commit/51e59f91fb27ed3c942d2f9c4aa88e31f78eef84)), closes [#764](https://github.com/crimx/ext-saladict/issues/764)


### Bug Fixes

* **badge:** remove badge text ([873b1c7](https://github.com/crimx/ext-saladict/commit/873b1c77d3655e4b10dcb389108aabf9c9e31b4c)), closes [#770](https://github.com/crimx/ext-saladict/issues/770)
* **options:** prevent panel being opened accidentally ([a673c9f](https://github.com/crimx/ext-saladict/commit/a673c9f94f46d19121058b0f534a5aaa750d8453)), closes [#769](https://github.com/crimx/ext-saladict/issues/769)
* **panel:** do not update search box text on selection ([b104405](https://github.com/crimx/ext-saladict/commit/b1044050d92ee4fb5a2f4bd594d2bd9ca44eca12))
* **pdf:** remove 'unsafe-eval' CSP ([eaea459](https://github.com/crimx/ext-saladict/commit/eaea459ae500cf84cea3f65e59c573d6816d222d))


### Build System

* fix script arguments ([df78f19](https://github.com/crimx/ext-saladict/commit/df78f199b71fd4b018903fd57e00c39928986c1c))


### Tests

* **background:** remove update check ([1f1b5ff](https://github.com/crimx/ext-saladict/commit/1f1b5ffa7ed8fb99773f645eb20555a00b12bacd))
* **storybook:** add path pattern ([61a883a](https://github.com/crimx/ext-saladict/commit/61a883a928aaa7c640194592ceb42a650e6d2647))

### [7.10.4](https://github.com/crimx/ext-saladict/compare/v7.10.3...v7.10.4) (2020-04-27)

### [7.10.3](https://github.com/crimx/ext-saladict/compare/v7.10.2...v7.10.3) (2020-04-26)

### [7.10.2](https://github.com/crimx/ext-saladict/compare/v7.10.1...v7.10.2) (2020-04-26)


### Bug Fixes

* **dicts:** cnki should respect options ([c78d2d7](https://github.com/crimx/ext-saladict/commit/c78d2d7ae41dc08d1c7a8a3900613392825c3527)), closes [#752](https://github.com/crimx/ext-saladict/issues/752)
* **options:** smooth dark/bright transition ([5433cac](https://github.com/crimx/ext-saladict/commit/5433cac8f074e00a597e91c6804cf3fc8acf3bef))
* **options:** typo ([c66ed05](https://github.com/crimx/ext-saladict/commit/c66ed0586a1662d2a9c4611f8ef8e2c4c7099b60))
* **selection:** cancel instant capture on keyup ([c6dbaa7](https://github.com/crimx/ext-saladict/commit/c6dbaa7ef92c29827b6a35db7bc6824c8696843f)), closes [#756](https://github.com/crimx/ext-saladict/issues/756)

### [7.10.1](https://github.com/crimx/ext-saladict/compare/v7.10.0...v7.10.1) (2020-04-24)


### Bug Fixes

* **wordpage:** firefox layout ([7165fda](https://github.com/crimx/ext-saladict/commit/7165fda9101b24a229e15a64396ef39ef1c7fb85))

## [7.10.0](https://github.com/crimx/ext-saladict/compare/v7.9.3...v7.10.0) (2020-04-24)


### Features

* add token settings ([df2924f](https://github.com/crimx/ext-saladict/commit/df2924f7f1a88ce50c21e6019ddf63c73f3a2ae1))


### Bug Fixes

* **context-menus:** encode selection text ([0da9e84](https://github.com/crimx/ext-saladict/commit/0da9e84fd2c5805d66af637f8977340408b2d21a))
* **context-menus:** load locale ([e1981b1](https://github.com/crimx/ext-saladict/commit/e1981b145680a7b2fbce86be5a93e50e0266beac))
* **googledict:** audio link ([407fa9b](https://github.com/crimx/ext-saladict/commit/407fa9b669800bde3ccc29b217e8515d810f022d))
* **i18n:** make ready changes every time ([2a03730](https://github.com/crimx/ext-saladict/commit/2a0373045d343c77782ca327bce3d6bdf40b7c0c))
* **i18n:** proper init language without reloading ([bca03cb](https://github.com/crimx/ext-saladict/commit/bca03cb2f3c0d3fb7258b594e69661512606877d))
* **options:** avoid stale values ([d98b53a](https://github.com/crimx/ext-saladict/commit/d98b53a7973edca8da7274f7fc774da532e30e5e))
* **options:** layout adjustment ([84496e6](https://github.com/crimx/ext-saladict/commit/84496e698cba7656ea0a46b8dd959fee00f1faaf))
* **options:** make data immutable ([fc967db](https://github.com/crimx/ext-saladict/commit/fc967db6cb3eed729c9bb3dfd1b3ba9545d0c917))
* **options:** only get values from item name ([fea31ab](https://github.com/crimx/ext-saladict/commit/fea31abd5ade22c9ff44a0a8115519a5586ff1c3))
* **options:** reduce re-rendering of the whole form ([02f61a9](https://github.com/crimx/ext-saladict/commit/02f61a9105b0adbf87a17b4170e6522bcc5de370))
* **options:** rerender error boundary on entry change ([7450057](https://github.com/crimx/ext-saladict/commit/7450057896ce10bd52f5c0602353e2532563d999))
* **options:** search words on options page ([4bfc211](https://github.com/crimx/ext-saladict/commit/4bfc211d26286d71b178ffcecf9145d7ec222b15))
* **panel:** correct standalone position on multi-screen ([f2f152f](https://github.com/crimx/ext-saladict/commit/f2f152ff604260e6e65a05b7dfea7d84f8d07e96))
* **panel:** disable external style reset on standalone panel ([c2f26be](https://github.com/crimx/ext-saladict/commit/c2f26bec4ae533b3f22610fe5ce7ad722e15d446))
* **panel:** hide external divs ([d584e31](https://github.com/crimx/ext-saladict/commit/d584e313e4cbf6370a8d8c397ce32f4fb9659976)), closes [#703](https://github.com/crimx/ext-saladict/issues/703)
* **panel:** more robust dargging ([e5a876b](https://github.com/crimx/ext-saladict/commit/e5a876b5475e29538874834ed985cde21a7a5ae2)), closes [#747](https://github.com/crimx/ext-saladict/issues/747)
* **panel:** mta font size ([0b261fd](https://github.com/crimx/ext-saladict/commit/0b261fd23d9ea9512ffc59d3adafdd14967b69c7)), closes [#721](https://github.com/crimx/ext-saladict/issues/721)
* **panel:** profiles float box ([7b59fb3](https://github.com/crimx/ext-saladict/commit/7b59fb3246bca4c99acd8129ddb981c913affd56))
* **pdf:** update pdf script ([f419402](https://github.com/crimx/ext-saladict/commit/f419402bfe96e9759076f865c0ea813a8dc011d1))
* **selection:** instant selection ([85d43a0](https://github.com/crimx/ext-saladict/commit/85d43a0a03519985828362c99556719c86761f84)), closes [#742](https://github.com/crimx/ext-saladict/issues/742)
* **sync-services:** ignore word addition from sync services ([685cd02](https://github.com/crimx/ext-saladict/commit/685cd02e09adb11bf508ef9ae3033d4d4591763c)), closes [#717](https://github.com/crimx/ext-saladict/issues/717)
* content style origin ([230275d](https://github.com/crimx/ext-saladict/commit/230275d5db56e65de9570d27d62ceed1f0618a32))


### Build System

* better chunk naming for dict favicons ([d1f65fd](https://github.com/crimx/ext-saladict/commit/d1f65fde14b23992ce7a1969a0a3b778a4caef70))
* control split chunks ([858ea64](https://github.com/crimx/ext-saladict/commit/858ea644d19016218b2b4481fbd63e80e8345f65))
* fix dotenv ([07c7fc6](https://github.com/crimx/ext-saladict/commit/07c7fc6b78c1acc84607a0946775d2332f875ffb))


### Tests

* **panel:** update storybook ([657da12](https://github.com/crimx/ext-saladict/commit/657da12dd418a99a5d13f83158ed9f1d51fe3c33))

### [7.9.3](https://github.com/crimx/ext-saladict/compare/v7.9.2...v7.9.3) (2020-03-19)


### Bug Fixes

* **panel:** prevent ff flash ([#691](https://github.com/crimx/ext-saladict/issues/691)) ([d18df80](https://github.com/crimx/ext-saladict/commit/d18df80956e8423d808e9a8ac64458ddc73b3b22))
* **word-editor:** inner panel not showing up ([b8c6064](https://github.com/crimx/ext-saladict/commit/b8c606486d69fc00c1babe5d6569bcb61f26a801)), closes [#694](https://github.com/crimx/ext-saladict/issues/694)

### [7.9.2](https://github.com/crimx/ext-saladict/compare/v7.9.1...v7.9.2) (2020-03-14)


### Bug Fixes

* **dicts:** wrong dict config ([551a0b3](https://github.com/crimx/ext-saladict/commit/551a0b30db29c14dd093d33f01c440d669846fc4))

### [7.9.1](https://github.com/crimx/ext-saladict/compare/v7.9.0...v7.9.1) (2020-03-10)


### Bug Fixes

* **dicts:** add fallback language for machine translate ([60b10da](https://github.com/crimx/ext-saladict/commit/60b10da2dbb890270965de7b24a6672ced4ce579)), closes [#674](https://github.com/crimx/ext-saladict/issues/674)
* **dicts:** enhance cjk detection ([8311d9e](https://github.com/crimx/ext-saladict/commit/8311d9e30d01740930725cd9a83adfa5a92bf26e))
* **dicts:** remove caching async function ([03d7866](https://github.com/crimx/ext-saladict/commit/03d78669dacece312ba7bf2a5d8763d9b760730b))

## [7.9.0](https://github.com/crimx/ext-saladict/compare/v7.8.0...v7.9.0) (2020-03-09)


### Features

* **dicts:** add lexico ([a86fc7d](https://github.com/crimx/ext-saladict/commit/a86fc7db85f8646f6326b6e1dbbd235ce930c7d6))
* **dicts:** add renren ([b4dc38d](https://github.com/crimx/ext-saladict/commit/b4dc38da25e838f1c9869d66d6cb2b9ecfbf3fb5))


### Bug Fixes

* **dicts:** correct tts language ([76eb34d](https://github.com/crimx/ext-saladict/commit/76eb34d70fe802b3117a5c31a2e8f1d732f2f34e)), closes [#659](https://github.com/crimx/ext-saladict/issues/659)
* **renren:** prevent detail click event being captured by panel ([921d102](https://github.com/crimx/ext-saladict/commit/921d102deac23ec19196a41512883d645c73ae13))
* **wordpage:** keyword matching ([b9a1a3e](https://github.com/crimx/ext-saladict/commit/b9a1a3e211a405595724a9e466ffc8d9a2c7ec1d))


### Tests

* fix bing fixtures ([a7731a2](https://github.com/crimx/ext-saladict/commit/a7731a22131dc358c3036b14d59b9a3d33344a53))

## [7.8.0](https://github.com/crimx/ext-saladict/compare/v7.7.6...v7.8.0) (2020-02-13)


### Bug Fixes

* remove extra clipboard search on command ([0b7166e](https://github.com/crimx/ext-saladict/commit/0b7166e)), closes [#647](https://github.com/crimx/ext-saladict/issues/647)
* space escape ([2c31562](https://github.com/crimx/ext-saladict/commit/2c31562)), closes [#635](https://github.com/crimx/ext-saladict/issues/635)


### Features

* add standalone word editor ([24d487a](https://github.com/crimx/ext-saladict/commit/24d487a)), closes [#608](https://github.com/crimx/ext-saladict/issues/608)



### [7.7.6](https://github.com/crimx/ext-saladict/compare/v7.7.5...v7.7.6) (2020-02-03)



### [7.7.5](https://github.com/crimx/ext-saladict/compare/v7.7.4...v7.7.5) (2020-02-03)



### [7.7.4](https://github.com/crimx/ext-saladict/compare/v7.7.3...v7.7.4) (2020-02-03)



### [7.7.3](https://github.com/crimx/ext-saladict/compare/v7.7.2...v7.7.3) (2020-02-02)



### [7.7.2](https://github.com/crimx/ext-saladict/compare/v7.7.1...v7.7.2) (2020-01-27)



### [7.7.1](https://github.com/crimx/ext-saladict/compare/v7.7.0...v7.7.1) (2020-01-24)


### Bug Fixes

* pdf.js requires unsafe-eval csp ([533a66d](https://github.com/crimx/ext-saladict/commit/533a66d)), closes [#630](https://github.com/crimx/ext-saladict/issues/630)



## [7.7.0](https://github.com/crimx/ext-saladict/compare/v7.6.2...v7.7.0) (2020-01-24)


### Bug Fixes

* **pdf:** match double quotes ([46060bd](https://github.com/crimx/ext-saladict/commit/46060bd))


### Features

* **options:** add privacy settings ([9408002](https://github.com/crimx/ext-saladict/commit/9408002))



### [7.6.2](https://github.com/crimx/ext-saladict/compare/v7.6.1...v7.6.2) (2020-01-16)


### Tests

* remove fixtures ([eca13a3](https://github.com/crimx/ext-saladict/commit/eca13a3))



### [7.6.1](https://github.com/crimx/ext-saladict/compare/v7.6.0...v7.6.1) (2020-01-06)


### Bug Fixes

* **background:** remove duplicated qs panel onclose response ([b9d209b](https://github.com/crimx/ext-saladict/commit/b9d209b)), closes [#618](https://github.com/crimx/ext-saladict/issues/618)
* **selection:** respect qs panel selection settings ([4990479](https://github.com/crimx/ext-saladict/commit/4990479))



## [7.6.0](https://github.com/crimx/ext-saladict/compare/v7.5.4...v7.6.0) (2019-12-29)


### Bug Fixes

* **panel:** ignore snapshot if the panel was hidden ([ae9a538](https://github.com/crimx/ext-saladict/commit/ae9a538))
* **panel:** open word editor on wordpage ([dbb9b58](https://github.com/crimx/ext-saladict/commit/dbb9b58)), closes [#590](https://github.com/crimx/ext-saladict/issues/590)
* **selection:** detect mouseup in panel ([989a9f6](https://github.com/crimx/ext-saladict/commit/989a9f6))
* remove invalid window state ([c258de2](https://github.com/crimx/ext-saladict/commit/c258de2))
* round window positions ([fa3d264](https://github.com/crimx/ext-saladict/commit/fa3d264)), closes [#607](https://github.com/crimx/ext-saladict/issues/607)


### Features

* **content:** add picker for ctx translated results ([6c0c4b8](https://github.com/crimx/ext-saladict/commit/6c0c4b8))
* **menus:** add copu pdf url to clipboard ([cfe6d9d](https://github.com/crimx/ext-saladict/commit/cfe6d9d)), closes [#571](https://github.com/crimx/ext-saladict/issues/571)



### [7.5.4](https://github.com/crimx/ext-saladict/compare/v7.5.3...v7.5.4) (2019-12-11)


### Bug Fixes

* dual screen windows management ([8196a6d](https://github.com/crimx/ext-saladict/commit/8196a6d)), closes [#587](https://github.com/crimx/ext-saladict/issues/587)



### [7.5.3](https://github.com/crimx/ext-saladict/compare/v7.5.2...v7.5.3) (2019-12-10)


### Bug Fixes

* **dicts:** update moji ([fb528b1](https://github.com/crimx/ext-saladict/commit/fb528b1))
* self messaging server init order ([8473faa](https://github.com/crimx/ext-saladict/commit/8473faa))
* 自定义 css 对独立面板不生效 ([#579](https://github.com/crimx/ext-saladict/issues/579)) ([1db0c5a](https://github.com/crimx/ext-saladict/commit/1db0c5a))


### Tests

* remove opentranslate ([d655258](https://github.com/crimx/ext-saladict/commit/d655258))
* update api ([34535ea](https://github.com/crimx/ext-saladict/commit/34535ea))
* update webdav testing ([782f288](https://github.com/crimx/ext-saladict/commit/782f288))



### [7.5.2](https://github.com/crimx/ext-saladict/compare/v7.5.1...v7.5.2) (2019-11-11)


### Bug Fixes

* **sync:** webdav url ending ([5dc51a8](https://github.com/crimx/ext-saladict/commit/5dc51a8)), closes [#562](https://github.com/crimx/ext-saladict/issues/562)



### [7.5.1](https://github.com/crimx/ext-saladict/compare/v7.5.0...v7.5.1) (2019-11-04)


### Bug Fixes

* translate context before editing ([5c92445](https://github.com/crimx/ext-saladict/commit/5c92445)), closes [#550](https://github.com/crimx/ext-saladict/issues/550)



## [7.5.0](https://github.com/crimx/ext-saladict/compare/v7.4.0...v7.5.0) (2019-11-03)


### Bug Fixes

* update homepage url ([102ff19](https://github.com/crimx/ext-saladict/commit/102ff19))
* **config:** merge machine pronounce config ([1c37346](https://github.com/crimx/ext-saladict/commit/1c37346)), closes [#540](https://github.com/crimx/ext-saladict/issues/540)
* **content:** prevent triggering page key events ([a74b255](https://github.com/crimx/ext-saladict/commit/a74b255))
* **panel:** reset text align ([3b38d19](https://github.com/crimx/ext-saladict/commit/3b38d19)), closes [#537](https://github.com/crimx/ext-saladict/issues/537)
* missing pdf locale properties ([10e9636](https://github.com/crimx/ext-saladict/commit/10e9636)), closes [#548](https://github.com/crimx/ext-saladict/issues/548)


### Features

* **content:** add bowl offset config ([3a1327f](https://github.com/crimx/ext-saladict/commit/3a1327f)), closes [#535](https://github.com/crimx/ext-saladict/issues/535)



## [7.4.0](https://github.com/crimx/ext-saladict/compare/v7.3.2...v7.4.0) (2019-10-24)


### Bug Fixes

* **dicts:** fix custom tl ([1156c5e](https://github.com/crimx/ext-saladict/commit/1156c5e))
* **menus:** update all menus before selected Closes [#533](https://github.com/crimx/ext-saladict/issues/533) ([076e072](https://github.com/crimx/ext-saladict/commit/076e072))
* **selection:** get page info on selection ([972a9aa](https://github.com/crimx/ext-saladict/commit/972a9aa)), closes [#531](https://github.com/crimx/ext-saladict/issues/531)
* **selection:** prevent mouseup being cancelled ([0485244](https://github.com/crimx/ext-saladict/commit/0485244))


### Features

* **dicts:** add mojidict ([2ec91ef](https://github.com/crimx/ext-saladict/commit/2ec91ef))



### [7.3.2](https://github.com/crimx/ext-saladict/compare/v7.3.1...v7.3.2) (2019-10-19)


### Bug Fixes

* ignore numbers ([352a84c](https://github.com/crimx/ext-saladict/commit/352a84c))



### [7.3.1](https://github.com/crimx/ext-saladict/compare/v7.3.0...v7.3.1) (2019-10-18)


### Bug Fixes

* **badges:** prevent stale values ([5f4c5d5](https://github.com/crimx/ext-saladict/commit/5f4c5d5))



## [7.3.0](https://github.com/crimx/ext-saladict/compare/v7.2.2...v7.3.0) (2019-10-18)


### Features

* **wordpage:** support replacing linebreaks ([c112de5](https://github.com/crimx/ext-saladict/commit/c112de5))



### [7.2.2](https://github.com/crimx/ext-saladict/compare/v7.2.1...v7.2.2) (2019-10-15)



### [7.2.1](https://github.com/crimx/ext-saladict/compare/v7.2.0...v7.2.1) (2019-10-13)


### Bug Fixes

* **selection:** in-panel selection ([507581a](https://github.com/crimx/ext-saladict/commit/507581a)), closes [#513](https://github.com/crimx/ext-saladict/issues/513)



## [7.2.0](https://github.com/crimx/ext-saladict/compare/v7.1.1...v7.2.0) (2019-10-12)


### Bug Fixes

* **selection:** ignore anchor and button click on panel ([904445c](https://github.com/crimx/ext-saladict/commit/904445c)), closes [#512](https://github.com/crimx/ext-saladict/issues/512)


### Features

* match all characters ([59c8183](https://github.com/crimx/ext-saladict/commit/59c8183)), closes [#434](https://github.com/crimx/ext-saladict/issues/434)



### [7.1.1](https://github.com/crimx/ext-saladict/compare/v7.1.0...v7.1.1) (2019-10-08)


### Bug Fixes

* **panel:** save word without confirm ([#500](https://github.com/crimx/ext-saladict/issues/500)) ([3d77d97](https://github.com/crimx/ext-saladict/commit/3d77d97))
* **selection:** only detect left click ([fc3797d](https://github.com/crimx/ext-saladict/commit/fc3797d)), closes [#502](https://github.com/crimx/ext-saladict/issues/502)
* **selection:** prevent unexpected in-panel selection ([3c057ce](https://github.com/crimx/ext-saladict/commit/3c057ce)), closes [#498](https://github.com/crimx/ext-saladict/issues/498)



## [7.1.0](https://github.com/crimx/ext-saladict/compare/v7.0.4...v7.1.0) (2019-10-03)


### Bug Fixes

* **panel:** always focus mta box on expand ([57840eb](https://github.com/crimx/ext-saladict/commit/57840eb))
* **panel:** prevent page shortkeys when typing ([ba9a37a](https://github.com/crimx/ext-saladict/commit/ba9a37a)), closes [#490](https://github.com/crimx/ext-saladict/issues/490)


### Features

* **panel:** add new shortcut for searching clipboard ([e5f279d](https://github.com/crimx/ext-saladict/commit/e5f279d)), closes [#485](https://github.com/crimx/ext-saladict/issues/485)
* **panel:** add touch mode close [#492](https://github.com/crimx/ext-saladict/issues/492) ([c86e6e8](https://github.com/crimx/ext-saladict/commit/c86e6e8))



### [7.0.4](https://github.com/crimx/ext-saladict/compare/v7.0.3...v7.0.4) (2019-10-01)


### Bug Fixes

* **dicts:** hjdict switch buttons. close [#489](https://github.com/crimx/ext-saladict/issues/489) ([a2718d4](https://github.com/crimx/ext-saladict/commit/a2718d4))
* youdao translate ([02381da](https://github.com/crimx/ext-saladict/commit/02381da))



### [7.0.3](https://github.com/crimx/ext-saladict/compare/v7.0.2...v7.0.3) (2019-09-30)


### Bug Fixes

* **panel:** fix mta box init focus with clipboard content [#487](https://github.com/crimx/ext-saladict/issues/487) ([789270d](https://github.com/crimx/ext-saladict/commit/789270d))
* **qs:** selection on quick search panel ([3ede289](https://github.com/crimx/ext-saladict/commit/3ede289)), closes [#487](https://github.com/crimx/ext-saladict/issues/487)



### [7.0.2](https://github.com/crimx/ext-saladict/compare/v7.0.0...v7.0.2) (2019-09-30)


### Bug Fixes

* **config:** number merging ([cb53388](https://github.com/crimx/ext-saladict/commit/cb53388))
* **config:** update quick search location ([70bd9be](https://github.com/crimx/ext-saladict/commit/70bd9be)), closes [#479](https://github.com/crimx/ext-saladict/issues/479)
* **dicts:** include cambridge dphrase block ([29f7b3c](https://github.com/crimx/ext-saladict/commit/29f7b3c)), closes [#480](https://github.com/crimx/ext-saladict/issues/480)
* **pdf:** inject panel on firefox close [#477](https://github.com/crimx/ext-saladict/issues/477) ([a7ac72b](https://github.com/crimx/ext-saladict/commit/a7ac72b))
* **popup:** correct popup width ([170fe72](https://github.com/crimx/ext-saladict/commit/170fe72)), closes [#481](https://github.com/crimx/ext-saladict/issues/481)
* **sync:** update mkcol authorzation close [#475](https://github.com/crimx/ext-saladict/issues/475) ([2e433e5](https://github.com/crimx/ext-saladict/commit/2e433e5))

### [7.0.1](https://github.com/crimx/ext-saladict/compare/v7.0.0...v7.0.1) (2019-09-30)


### Bug Fixes

* **config:** number merging ([569f69c](https://github.com/crimx/ext-saladict/commit/569f69c))
* **config:** update quick search location ([34a6a07](https://github.com/crimx/ext-saladict/commit/34a6a07)), closes [#479](https://github.com/crimx/ext-saladict/issues/479)
* **dicts:** include cambridge dphrase block ([807923f](https://github.com/crimx/ext-saladict/commit/807923f)), closes [#480](https://github.com/crimx/ext-saladict/issues/480)
* **pdf:** inject panel on firefox close [#477](https://github.com/crimx/ext-saladict/issues/477) ([745bb75](https://github.com/crimx/ext-saladict/commit/745bb75))
* **popup:** correct popup width ([6f14ba2](https://github.com/crimx/ext-saladict/commit/6f14ba2)), closes [#481](https://github.com/crimx/ext-saladict/issues/481)
* **sync:** update mkcol authorzation close [#475](https://github.com/crimx/ext-saladict/issues/475) ([ddd6b77](https://github.com/crimx/ext-saladict/commit/ddd6b77))

## [7.0.0](https://github.com/crimx/ext-saladict/compare/v6.33.2...v7.0.0) (2019-09-29)


### Bug Fixes

* **background:** show unsupported badge on internal tabs ([fe06a06](https://github.com/crimx/ext-saladict/commit/fe06a06))
* **content:** correct history index ([bb94e87](https://github.com/crimx/ext-saladict/commit/bb94e87))
* **dicts:** convert chs to chz on guoyu and liangan ([5e5a058](https://github.com/crimx/ext-saladict/commit/5e5a058))
* **dicts:** correct text color on dark mode ([7484469](https://github.com/crimx/ext-saladict/commit/7484469))
* **dicts:** fix tencent referer ([9c7b0de](https://github.com/crimx/ext-saladict/commit/9c7b0de))
* **dicts:** params encoding ([c689e69](https://github.com/crimx/ext-saladict/commit/c689e69))
* **dicts:** update sogou ([c0dffa1](https://github.com/crimx/ext-saladict/commit/c0dffa1))
* **dicts:** update sogou api ([04a1e74](https://github.com/crimx/ext-saladict/commit/04a1e74))
* **dicts:** update sogou api ([055f24e](https://github.com/crimx/ext-saladict/commit/055f24e))
* **dicts:** update tencent api ([f13039f](https://github.com/crimx/ext-saladict/commit/f13039f))
* **dicts:** url params encode ([3db28ff](https://github.com/crimx/ext-saladict/commit/3db28ff))
* **options:** disable selection outside panel on options page ([491a791](https://github.com/crimx/ext-saladict/commit/491a791))
* **options:** increase ant modal mask z-index ([337e92a](https://github.com/crimx/ext-saladict/commit/337e92a))
* **options:** z-index on tooltips ([c94e340](https://github.com/crimx/ext-saladict/commit/c94e340))
* **panel:** add to notebook on standalone panel ([c7b00e5](https://github.com/crimx/ext-saladict/commit/c7b00e5))
* **panel:** calc hight changes on expand ([f6f335e](https://github.com/crimx/ext-saladict/commit/f6f335e))
* **panel:** correct standalone css variables ([f0e087c](https://github.com/crimx/ext-saladict/commit/f0e087c))
* **panel:** fancy scrollbar on standalone panel ([4734ab8](https://github.com/crimx/ext-saladict/commit/4734ab8))
* **panel:** keep panel showing on options page ([d43ac1f](https://github.com/crimx/ext-saladict/commit/d43ac1f))
* **panel:** normal scrollbar width on firefox ([a0385a8](https://github.com/crimx/ext-saladict/commit/a0385a8))
* **panel:** remove Firefox button inner border ([00a069f](https://github.com/crimx/ext-saladict/commit/00a069f))
* **selection:** add page info in selection ([b64e85e](https://github.com/crimx/ext-saladict/commit/b64e85e))
* **selection:** check mouse target when anchor node is null ([1a2487f](https://github.com/crimx/ext-saladict/commit/1a2487f))
* **selection:** keep panel coords when pinned ([7648247](https://github.com/crimx/ext-saladict/commit/7648247))
* **selection:** skip extra selection change on Firefox ([754db43](https://github.com/crimx/ext-saladict/commit/754db43))
* firefox ext api ([b8efad0](https://github.com/crimx/ext-saladict/commit/b8efad0))
* lang check ([a8bfe92](https://github.com/crimx/ext-saladict/commit/a8bfe92))
* **selection:** text field selection ([a8628b6](https://github.com/crimx/ext-saladict/commit/a8628b6))
* remove buttons option on filrefox ([970b921](https://github.com/crimx/ext-saladict/commit/970b921))
* remove scrollbar color on firefox ([a00214c](https://github.com/crimx/ext-saladict/commit/a00214c))
* skip empty src for speaker ([65ff654](https://github.com/crimx/ext-saladict/commit/65ff654))
* sync service download ([af05e51](https://github.com/crimx/ext-saladict/commit/af05e51))
* **components:** add appear styles for shadow portal ([b84a8e8](https://github.com/crimx/ext-saladict/commit/b84a8e8))
* **content:** max panel height calculation ([de30946](https://github.com/crimx/ext-saladict/commit/de30946))
* **content:** search on bowl hover ([d7e126d](https://github.com/crimx/ext-saladict/commit/d7e126d))
* **dicts:** axios api ([dda444d](https://github.com/crimx/ext-saladict/commit/dda444d))
* **dicts:** encode uri component ([101ae50](https://github.com/crimx/ext-saladict/commit/101ae50))
* **dicts:** update new speaker classname ([ad19c84](https://github.com/crimx/ext-saladict/commit/ad19c84))
* **i18n:** sync init ([3aedb2d](https://github.com/crimx/ext-saladict/commit/3aedb2d))
* **manifest:** new assets path ([67e3421](https://github.com/crimx/ext-saladict/commit/67e3421))
* **options:** new quick search locations ([667dc13](https://github.com/crimx/ext-saladict/commit/667dc13))
* **panel:** add dict item key ([e85f949](https://github.com/crimx/ext-saladict/commit/e85f949))
* **panel:** env detection ([7817f54](https://github.com/crimx/ext-saladict/commit/7817f54))
* **panel:** firefox detect height change ([9016d81](https://github.com/crimx/ext-saladict/commit/9016d81))
* **panel:** fix sluggish scroll on Firefox ([d054f81](https://github.com/crimx/ext-saladict/commit/d054f81))
* **panel:** open options page when clicking icon ([6e2dc5e](https://github.com/crimx/ext-saladict/commit/6e2dc5e))
* **panel:** prevent textarea input event propagation ([36285ff](https://github.com/crimx/ext-saladict/commit/36285ff))
* **popup:** qrcode panel z-index ([0234943](https://github.com/crimx/ext-saladict/commit/0234943))
* **selection:** skip extra event after instant capture ([1a01ac5](https://github.com/crimx/ext-saladict/commit/1a01ac5))
* **storybook:** add width for panel wrapper ([276139c](https://github.com/crimx/ext-saladict/commit/276139c))
* **wordpage:** context translation ([3f01b81](https://github.com/crimx/ext-saladict/commit/3f01b81))
* context menus locale name ([2617939](https://github.com/crimx/ext-saladict/commit/2617939))
* correctly made payload and meta optional ([9ac6fb3](https://github.com/crimx/ext-saladict/commit/9ac6fb3))
* css type ([de9b809](https://github.com/crimx/ext-saladict/commit/de9b809))
* firefox bugs ([efab253](https://github.com/crimx/ext-saladict/commit/efab253))
* **panel:** fix menu bar shrinking ([2e0c8fc](https://github.com/crimx/ext-saladict/commit/2e0c8fc))
* **panel:** panel opcaity transition ([673ce82](https://github.com/crimx/ext-saladict/commit/673ce82))
* **panel:** typo ([9f7626d](https://github.com/crimx/ext-saladict/commit/9f7626d))
* dom purify parse innerHTML ([6af3120](https://github.com/crimx/ext-saladict/commit/6af3120))
* getFullLink supports other protocols ([6b08d5f](https://github.com/crimx/ext-saladict/commit/6b08d5f))
* locale format ([3439005](https://github.com/crimx/ext-saladict/commit/3439005))
* nested p tags ([fb69f55](https://github.com/crimx/ext-saladict/commit/fb69f55))
* prevent dict panel being closed ([9c3fd0b](https://github.com/crimx/ext-saladict/commit/9c3fd0b))
* relative url ([2a565a6](https://github.com/crimx/ext-saladict/commit/2a565a6))
* reove style global reset ([5d89ebd](https://github.com/crimx/ext-saladict/commit/5d89ebd))
* union hack ([d0d3cdd](https://github.com/crimx/ext-saladict/commit/d0d3cdd))
* **storybook:** disable storybook shortcuts ([6da3254](https://github.com/crimx/ext-saladict/commit/6da3254))
* **storybook:** prevent full rerender ([fe996dd](https://github.com/crimx/ext-saladict/commit/fe996dd))
* **storybook:** skip wrapper components ([cd370c9](https://github.com/crimx/ext-saladict/commit/cd370c9))
* update namespace ([9f1e253](https://github.com/crimx/ext-saladict/commit/9f1e253))


### Build System

* add shadow dom css support and storybook addons ([211986a](https://github.com/crimx/ext-saladict/commit/211986a))
* add storybook ([5e1e88e](https://github.com/crimx/ext-saladict/commit/5e1e88e))
* fix mjs type ([d76f6c7](https://github.com/crimx/ext-saladict/commit/d76f6c7))
* new pack script ([78ee6aa](https://github.com/crimx/ext-saladict/commit/78ee6aa))
* remove style loader on development ([e4bd588](https://github.com/crimx/ext-saladict/commit/e4bd588))
* rename jsonp function ([5d4941c](https://github.com/crimx/ext-saladict/commit/5d4941c))
* split webpack chunks ([ad90c96](https://github.com/crimx/ext-saladict/commit/ad90c96))
* update build system to neutrino and babel-ts ([b3b05c3](https://github.com/crimx/ext-saladict/commit/b3b05c3))


### Features

* **panel:** add fancy scrollbar ([4be6ac1](https://github.com/crimx/ext-saladict/commit/4be6ac1))
* **popup:** add options for opening standalone panel [#470](https://github.com/crimx/ext-saladict/issues/470) ([2f0be7e](https://github.com/crimx/ext-saladict/commit/2f0be7e))
* **profile:** add nihongo profile ([285b08b](https://github.com/crimx/ext-saladict/commit/285b08b))
* add dark mode ([a9c9407](https://github.com/crimx/ext-saladict/commit/a9c9407))
* add shadow portal ([3d3e025](https://github.com/crimx/ext-saladict/commit/3d3e025))


### Tests

* update browser api specs ([768ce07](https://github.com/crimx/ext-saladict/commit/768ce07))
* update mocks ([cefd766](https://github.com/crimx/ext-saladict/commit/cefd766))
* **dicts:** add bing mock requests ([641d9db](https://github.com/crimx/ext-saladict/commit/641d9db))
* **dicts:** remove mock text ([3d57c20](https://github.com/crimx/ext-saladict/commit/3d57c20))
* **dicts:** udapte googledict html ([c5c6b80](https://github.com/crimx/ext-saladict/commit/c5c6b80))
* **storybook:** update stories ([780fade](https://github.com/crimx/ext-saladict/commit/780fade))
* added jest ([99484c7](https://github.com/crimx/ext-saladict/commit/99484c7))
* clean old test ([074f058](https://github.com/crimx/ext-saladict/commit/074f058))
* refactor background ([938aeea](https://github.com/crimx/ext-saladict/commit/938aeea))
* **storybook:** add dictionaries stories ([0714aed](https://github.com/crimx/ext-saladict/commit/0714aed))


### BREAKING CHANGES

* No compatible with the old build system

### [6.33.7](https://github.com/crimx/ext-saladict/compare/v6.33.6...v6.33.7) (2019-09-13)



### [6.33.6](https://github.com/crimx/ext-saladict/compare/v6.33.5...v6.33.6) (2019-09-12)


### Bug Fixes

* fit the outdated typings ([f019572](https://github.com/crimx/ext-saladict/commit/f019572))
* update dicts ([4492cd0](https://github.com/crimx/ext-saladict/commit/4492cd0))


### [6.33.5](https://github.com/crimx/ext-saladict/compare/v6.33.4...v6.33.5) (2019-08-11)


### Bug Fixes

* change the checksums of panel.css ([e2ed394](https://github.com/crimx/ext-saladict/commit/e2ed394))



### [6.33.4](https://github.com/crimx/ext-saladict/compare/v6.33.3...v6.33.4) (2019-08-09)


### Bug Fixes

* **manifest:** fix chrome 67 bug ([bca3b56](https://github.com/crimx/ext-saladict/commit/bca3b56))



### [6.33.3](https://github.com/crimx/ext-saladict/compare/v6.33.2...v6.33.3) (2019-08-08)


### Bug Fixes

* **manifest:** remvoe update url ([f83a485](https://github.com/crimx/ext-saladict/commit/f83a485))


<a name="6.33.2"></a>
## [6.33.2](https://github.com/crimx/ext-saladict/compare/v6.33.1...v6.33.2) (2019-06-27)



<a name="6.33.1"></a>
## [6.33.1](https://github.com/crimx/ext-saladict/compare/v6.33.0...v6.33.1) (2019-06-15)


### Bug Fixes

* **dicts:** https audio ([d8d569f](https://github.com/crimx/ext-saladict/commit/d8d569f))



<a name="6.33.0"></a>
# [6.33.0](https://github.com/crimx/ext-saladict/compare/v6.32.0...v6.33.0) (2019-06-12)


### Bug Fixes

* **dicts:** baidu options mixed with google ([239527e](https://github.com/crimx/ext-saladict/commit/239527e))
* **selection:** context extraction ([ec7421d](https://github.com/crimx/ext-saladict/commit/ec7421d))


### Features

* **dicts:** add weblio ejje ([5b01e1e](https://github.com/crimx/ext-saladict/commit/5b01e1e))



<a name="6.32.0"></a>
# [6.32.0](https://github.com/crimx/ext-saladict/compare/v6.31.1...v6.32.0) (2019-05-31)


### Bug Fixes

* same origin iframe ([39bacf9](https://github.com/crimx/ext-saladict/commit/39bacf9)), closes [#373](https://github.com/crimx/ext-saladict/issues/373)
* **dicts:** update zdic ([ebef2ce](https://github.com/crimx/ext-saladict/commit/ebef2ce))
* **options:** styles ([50cc464](https://github.com/crimx/ext-saladict/commit/50cc464))
* assgin timeout ticket ([23f85c5](https://github.com/crimx/ext-saladict/commit/23f85c5))
* correct popup page id ([45db00b](https://github.com/crimx/ext-saladict/commit/45db00b))
* ignore esc key on standalone panel ([1970556](https://github.com/crimx/ext-saladict/commit/1970556))


### Features

* add audio control ([6df1682](https://github.com/crimx/ext-saladict/commit/6df1682))
* add soundtouch ([ca7e7f8](https://github.com/crimx/ext-saladict/commit/ca7e7f8))



<a name="6.31.1"></a>
## [6.31.1](https://github.com/crimx/ext-saladict/compare/v6.31.0...v6.31.1) (2019-05-25)


### Bug Fixes

* **dicts:** multiline result ([b17e915](https://github.com/crimx/ext-saladict/commit/b17e915))



<a name="6.31.0"></a>
# [6.31.0](https://github.com/crimx/ext-saladict/compare/v6.30.0...v6.31.0) (2019-05-24)


### Bug Fixes

* **dicts:** caiyun options ([3efae72](https://github.com/crimx/ext-saladict/commit/3efae72))
* update typings ([a3074e0](https://github.com/crimx/ext-saladict/commit/a3074e0))
* **options:** use short title to prevent overflow ([52fb802](https://github.com/crimx/ext-saladict/commit/52fb802))


### Features

* **dicts:** add caiyun ([92ad971](https://github.com/crimx/ext-saladict/commit/92ad971))
* **dicts:** add tencent translate ([46657ea](https://github.com/crimx/ext-saladict/commit/46657ea))



<a name="6.30.0"></a>
# [6.30.0](https://github.com/crimx/ext-saladict/compare/v6.29.0...v6.30.0) (2019-05-11)


### Bug Fixes

* **sync:** replace settimeout with alarms ([05f1260](https://github.com/crimx/ext-saladict/commit/05f1260)), closes [#361](https://github.com/crimx/ext-saladict/issues/361)
* check empty word fields ([60f8066](https://github.com/crimx/ext-saladict/commit/60f8066)), closes [#363](https://github.com/crimx/ext-saladict/issues/363)
* typo ([8b0f3ff](https://github.com/crimx/ext-saladict/commit/8b0f3ff))
* **dicts:** get correct lang list on consecutive searches ([4ad4dcf](https://github.com/crimx/ext-saladict/commit/4ad4dcf)), closes [#360](https://github.com/crimx/ext-saladict/issues/360)


### Features

* **dicts:** add jukuu ([a4775fd](https://github.com/crimx/ext-saladict/commit/a4775fd))



<a name="6.29.0"></a>
# [6.29.0](https://github.com/crimx/ext-saladict/compare/v6.28.1...v6.29.0) (2019-05-02)


### Bug Fixes

* **panel:** correct history forward btn ([ee1d4f6](https://github.com/crimx/ext-saladict/commit/ee1d4f6)), closes [#349](https://github.com/crimx/ext-saladict/issues/349)
* add z-index to google page translate ([f59cc57](https://github.com/crimx/ext-saladict/commit/f59cc57))


### Features

* **dicts:** add cnki ([2743cac](https://github.com/crimx/ext-saladict/commit/2743cac)), closes [#336](https://github.com/crimx/ext-saladict/issues/336)
* add comp EntryBox ([fdd71dd](https://github.com/crimx/ext-saladict/commit/fdd71dd))



<a name="6.28.1"></a>
## [6.28.1](https://github.com/crimx/ext-saladict/compare/v6.28.0...v6.28.1) (2019-04-17)


### Bug Fixes

* add z-index to google page translate elements ([38b08e5](https://github.com/crimx/ext-saladict/commit/38b08e5))



<a name="6.28.0"></a>
# [6.28.0](https://github.com/crimx/ext-saladict/compare/v6.27.8...v6.28.0) (2019-04-17)


### Features

* add standalone sidebar layout ([6f4c5b8](https://github.com/crimx/ext-saladict/commit/6f4c5b8))



<a name="6.27.8"></a>
## [6.27.8](https://github.com/crimx/ext-saladict/compare/v6.27.7...v6.27.8) (2019-03-31)


### Bug Fixes

* **options:** correct import and export options ([cbf2921](https://github.com/crimx/ext-saladict/commit/cbf2921))



<a name="6.27.7"></a>
## [6.27.7](https://github.com/crimx/ext-saladict/compare/v6.27.6...v6.27.7) (2019-03-27)


### Bug Fixes

* **panel:** proper update dict styles ([264c731](https://github.com/crimx/ext-saladict/commit/264c731)), closes [#331](https://github.com/crimx/ext-saladict/issues/331)



<a name="6.27.6"></a>
## [6.27.6](https://github.com/crimx/ext-saladict/compare/v6.27.5...v6.27.6) (2019-03-27)


### Bug Fixes

* **panel:** correct dict style update ([81a1d08](https://github.com/crimx/ext-saladict/commit/81a1d08))



<a name="6.27.5"></a>
## [6.27.5](https://github.com/crimx/ext-saladict/compare/v6.27.4...v6.27.5) (2019-03-24)


### Bug Fixes

* **sync:** only sync on notebook changes ([90d4183](https://github.com/crimx/ext-saladict/commit/90d4183))



<a name="6.27.4"></a>
## [6.27.4](https://github.com/crimx/ext-saladict/compare/v6.27.3...v6.27.4) (2019-03-23)


### Bug Fixes

* **panel:** frame head typos ([94a055f](https://github.com/crimx/ext-saladict/commit/94a055f))
* **sync:** proper trun off shanbay ([af93ba0](https://github.com/crimx/ext-saladict/commit/af93ba0))



<a name="6.27.3"></a>
## [6.27.3](https://github.com/crimx/ext-saladict/compare/v6.27.2...v6.27.3) (2019-03-19)


### Bug Fixes

* **dicts:** update sogou token ([570dc90](https://github.com/crimx/ext-saladict/commit/570dc90))



<a name="6.27.2"></a>
## [6.27.2](https://github.com/crimx/ext-saladict/compare/v6.27.1...v6.27.2) (2019-03-18)


### Bug Fixes

* fix google translate ([d8715d1](https://github.com/crimx/ext-saladict/commit/d8715d1))
* **dicts:** disable passive wheel events on lastest Chrome ([9e8c3f0](https://github.com/crimx/ext-saladict/commit/9e8c3f0))



<a name="6.27.1"></a>
## [6.27.1](https://github.com/crimx/ext-saladict/compare/v6.27.0...v6.27.1) (2019-03-17)


### Bug Fixes

* **manifest:** firefox incognito mode ([58b946f](https://github.com/crimx/ext-saladict/commit/58b946f))



<a name="6.27.0"></a>
# [6.27.0](https://github.com/crimx/ext-saladict/compare/v6.26.0...v6.27.0) (2019-03-17)


### Bug Fixes

* compress data ([3795836](https://github.com/crimx/ext-saladict/commit/3795836))
* **dicts:** fix shanbay typing warning ([99caa99](https://github.com/crimx/ext-saladict/commit/99caa99))
* **dicts:** prevent in-panel search ([f88b960](https://github.com/crimx/ext-saladict/commit/f88b960))
* **dicts:** remove float elements ([143b258](https://github.com/crimx/ext-saladict/commit/143b258))
* **dicts:** typings ([bafe61c](https://github.com/crimx/ext-saladict/commit/bafe61c))
* **manifest:** load pdf viewer under incognito mode ([5d57b25](https://github.com/crimx/ext-saladict/commit/5d57b25))
* **menus:** prevent items being removed in incognito mode ([a380980](https://github.com/crimx/ext-saladict/commit/a380980))
* **panel:** disable fav icon on options page ([c616149](https://github.com/crimx/ext-saladict/commit/c616149))
* typings ([7f382a2](https://github.com/crimx/ext-saladict/commit/7f382a2))
* **panel:** center panel vertically when word editor shows up ([c31b5fa](https://github.com/crimx/ext-saladict/commit/c31b5fa)), closes [#315](https://github.com/crimx/ext-saladict/issues/315)
* **panel:** max z-index for dict panel ([51b60d5](https://github.com/crimx/ext-saladict/commit/51b60d5)), closes [#316](https://github.com/crimx/ext-saladict/issues/316)
* **sync:** duration ([4785a71](https://github.com/crimx/ext-saladict/commit/4785a71))


### Features

* **dicts:** add shanbay dictionary ([95ee0d5](https://github.com/crimx/ext-saladict/commit/95ee0d5))
* **panel:** add custom css ([4c58886](https://github.com/crimx/ext-saladict/commit/4c58886))
* **sync:** add shanbay ([a7389d5](https://github.com/crimx/ext-saladict/commit/a7389d5))


### Performance Improvements

* cache lang checks ([5e3034e](https://github.com/crimx/ext-saladict/commit/5e3034e))



<a name="6.26.0"></a>
# [6.26.0](https://github.com/crimx/ext-saladict/compare/v6.25.1...v6.26.0) (2019-03-09)


### Bug Fixes

* **dicts:** add mp3 playing and fixing styles ([aefd2b1](https://github.com/crimx/ext-saladict/commit/aefd2b1))
* **options:** change wording close [#314](https://github.com/crimx/ext-saladict/issues/314) ([17aa162](https://github.com/crimx/ext-saladict/commit/17aa162))
* **selection:** match frames ([c923ce8](https://github.com/crimx/ext-saladict/commit/c923ce8))


### Features

* **menus:** google page translation ([a023074](https://github.com/crimx/ext-saladict/commit/a023074))


### Performance Improvements

* **panel:** prevent flickering when switching profiles ([c0bc97f](https://github.com/crimx/ext-saladict/commit/c0bc97f))



<a name="6.25.1"></a>
## [6.25.1](https://github.com/crimx/ext-saladict/compare/v6.25.0...v6.25.1) (2019-03-04)


### Bug Fixes

* firefox style error ([8256e63](https://github.com/crimx/ext-saladict/commit/8256e63))
* **dicts:** omit cookies ([3b6d1a8](https://github.com/crimx/ext-saladict/commit/3b6d1a8)), closes [#312](https://github.com/crimx/ext-saladict/issues/312)
* correct lang selection ([86add32](https://github.com/crimx/ext-saladict/commit/86add32))



<a name="6.25.0"></a>
# [6.25.0](https://github.com/crimx/ext-saladict/compare/v6.24.4...v6.25.0) (2019-03-02)


### Bug Fixes

* type error ([75d93d9](https://github.com/crimx/ext-saladict/commit/75d93d9))
* **dicts:** update hjdict korean page ([66c7341](https://github.com/crimx/ext-saladict/commit/66c7341))
* **options:** popup options ([5701525](https://github.com/crimx/ext-saladict/commit/5701525))
* **options:** styling ([dca805f](https://github.com/crimx/ext-saladict/commit/dca805f))
* **options:** wording ([087102a](https://github.com/crimx/ext-saladict/commit/087102a))
* **panel:** prevent drag event losing ([05dbaec](https://github.com/crimx/ext-saladict/commit/05dbaec))
* better korean rendering ([e13b51e](https://github.com/crimx/ext-saladict/commit/e13b51e))


### Features

* **dicts:** add dict naver ([cef45b4](https://github.com/crimx/ext-saladict/commit/cef45b4))


### Performance Improvements

* **panel:** faster style loading ([e2757af](https://github.com/crimx/ext-saladict/commit/e2757af))
* **panel:** remove extra update for auto-pasting ([2f7182b](https://github.com/crimx/ext-saladict/commit/2f7182b))



<a name="6.24.4"></a>
## [6.24.4](https://github.com/crimx/ext-saladict/compare/v6.24.3...v6.24.4) (2019-02-17)


### Bug Fixes

* **dicts:** update sogou token ([82b18cf](https://github.com/crimx/ext-saladict/commit/82b18cf))



<a name="6.24.3"></a>
## [6.24.3](https://github.com/crimx/ext-saladict/compare/v6.24.2...v6.24.3) (2019-02-13)


### Bug Fixes

* csp ([7d8790d](https://github.com/crimx/ext-saladict/commit/7d8790d))
* fix analytics ([adebbd3](https://github.com/crimx/ext-saladict/commit/adebbd3))



<a name="6.24.2"></a>
## [6.24.2](https://github.com/crimx/ext-saladict/compare/v6.24.1...v6.24.2) (2019-02-13)


### Bug Fixes

* **panel:** fix changing page title ([1fe0acc](https://github.com/crimx/ext-saladict/commit/1fe0acc))
* **panel:** fix fav icon ([5f0433f](https://github.com/crimx/ext-saladict/commit/5f0433f))



<a name="6.24.1"></a>
## [6.24.1](https://github.com/crimx/ext-saladict/compare/v6.24.0...v6.24.1) (2019-02-13)


### Bug Fixes

* **background:** proper init ([9babdef](https://github.com/crimx/ext-saladict/commit/9babdef))



<a name="6.24.0"></a>
# [6.24.0](https://github.com/crimx/ext-saladict/compare/v6.23.1...v6.24.0) (2019-02-12)


### Bug Fixes

* **selection:** fixed [#296](https://github.com/crimx/ext-saladict/issues/296) ([1f9b6a6](https://github.com/crimx/ext-saladict/commit/1f9b6a6))
* fix typo ([129e863](https://github.com/crimx/ext-saladict/commit/129e863))
* **options:** add syncConfig ([51a9e57](https://github.com/crimx/ext-saladict/commit/51a9e57))


### Features

* **config:** add baidu to ctxTrans ([a2c1fda](https://github.com/crimx/ext-saladict/commit/a2c1fda))
* **dicts:** add baidu ([a9fecee](https://github.com/crimx/ext-saladict/commit/a9fecee))
* add analytics ([48582bd](https://github.com/crimx/ext-saladict/commit/48582bd))



<a name="6.23.1"></a>
## [6.23.1](https://github.com/crimx/ext-saladict/compare/v6.23.0...v6.23.1) (2019-01-28)


### Bug Fixes

* **options:** fix reset related errors ([55654e0](https://github.com/crimx/ext-saladict/commit/55654e0))
* **options:** wording ([8a47354](https://github.com/crimx/ext-saladict/commit/8a47354))
* **panel:** correct init selection ([b4a13eb](https://github.com/crimx/ext-saladict/commit/b4a13eb))



<a name="6.23.0"></a>
# [6.23.0](https://github.com/crimx/ext-saladict/compare/v6.22.8...v6.23.0) (2019-01-24)


### Bug Fixes

* **panel:** open notebook on right click ([0099024](https://github.com/crimx/ext-saladict/commit/0099024))
* close [#289](https://github.com/crimx/ext-saladict/issues/289) ([1615794](https://github.com/crimx/ext-saladict/commit/1615794))
* **options:** add description ([deca4cb](https://github.com/crimx/ext-saladict/commit/deca4cb))
* **options:** add valuePropName for switch ([8574a30](https://github.com/crimx/ext-saladict/commit/8574a30))
* **options:** close modal ([b241d8b](https://github.com/crimx/ext-saladict/commit/b241d8b))
* **options:** fix holding toggling ([5f7cdfe](https://github.com/crimx/ext-saladict/commit/5f7cdfe))
* **options:** get profile id list on init ([114ccf0](https://github.com/crimx/ext-saladict/commit/114ccf0))
* **options:** keep modal hide animation ([18ce805](https://github.com/crimx/ext-saladict/commit/18ce805))
* **options:** remove unused ([0c6ea6d](https://github.com/crimx/ext-saladict/commit/0c6ea6d))
* **popup:** fix popup flickering ([90b7d72](https://github.com/crimx/ext-saladict/commit/90b7d72))
* **selection:** extract sentence head ([d5649e0](https://github.com/crimx/ext-saladict/commit/d5649e0)), closes [#287](https://github.com/crimx/ext-saladict/issues/287)
* disable warning on dev ([2abc24a](https://github.com/crimx/ext-saladict/commit/2abc24a))
* fix config typing ([d164efb](https://github.com/crimx/ext-saladict/commit/d164efb))
* fix type error ([3db0b88](https://github.com/crimx/ext-saladict/commit/3db0b88))
* **options:** update active profile name on init ([83cadf3](https://github.com/crimx/ext-saladict/commit/83cadf3))
* remove activeProfileID when reset ([bbd5f01](https://github.com/crimx/ext-saladict/commit/bbd5f01))
* **options:** replace p elements with lis ([ed42ccb](https://github.com/crimx/ext-saladict/commit/ed42ccb))
* **profiles:** fix addActiveProfileListener ([2c67642](https://github.com/crimx/ext-saladict/commit/2c67642))
* langcode comparison ([4dade9b](https://github.com/crimx/ext-saladict/commit/4dade9b))


### Features

* **content:** add salad bowl clicking ([e6834af](https://github.com/crimx/ext-saladict/commit/e6834af))
* **popup:** add browser action behaviors ([6672a7a](https://github.com/crimx/ext-saladict/commit/6672a7a)), closes [#280](https://github.com/crimx/ext-saladict/issues/280)
* add context translate engines config ([52e390b](https://github.com/crimx/ext-saladict/commit/52e390b))



<a name="6.22.8"></a>
## [6.22.8](https://github.com/crimx/ext-saladict/compare/v6.22.7...v6.22.8) (2019-01-07)


### Bug Fixes

* blacklist stackedit.io ([775298d](https://github.com/crimx/ext-saladict/commit/775298d)), closes [#277](https://github.com/crimx/ext-saladict/issues/277)
* encode uri ([6098e34](https://github.com/crimx/ext-saladict/commit/6098e34))
* ignore &[#8203](https://github.com/crimx/ext-saladict/issues/8203); ([156275b](https://github.com/crimx/ext-saladict/commit/156275b)), closes [#274](https://github.com/crimx/ext-saladict/issues/274)


### Performance Improvements

* faster matching sentence head ([3fa2fb6](https://github.com/crimx/ext-saladict/commit/3fa2fb6)), closes [#274](https://github.com/crimx/ext-saladict/issues/274)



<a name="6.22.7"></a>
## [6.22.7](https://github.com/crimx/ext-saladict/compare/v6.22.6...v6.22.7) (2018-12-31)


### Bug Fixes

* better pdf context menu ([e7ada83](https://github.com/crimx/ext-saladict/commit/e7ada83))
* keep empty selected dicts ([acf3fb3](https://github.com/crimx/ext-saladict/commit/acf3fb3))



<a name="6.22.6"></a>
## [6.22.6](https://github.com/crimx/ext-saladict/compare/v6.22.5...v6.22.6) (2018-12-23)


### Bug Fixes

* fix pdf fetching ([c79fc89](https://github.com/crimx/ext-saladict/commit/c79fc89))



<a name="6.22.5"></a>
## [6.22.5](https://github.com/crimx/ext-saladict/compare/v6.22.4...v6.22.5) (2018-12-21)


### Bug Fixes

* fix google dict image src error ([682ae16](https://github.com/crimx/ext-saladict/commit/682ae16))



<a name="6.22.4"></a>
## [6.22.4](https://github.com/crimx/ext-saladict/compare/v6.22.3...v6.22.4) (2018-12-21)



<a name="6.22.3"></a>
## [6.22.3](https://github.com/crimx/ext-saladict/compare/v6.22.2...v6.22.3) (2018-12-20)


### Bug Fixes

* **dicts:** extract cambridge plurals ([2124c17](https://github.com/crimx/ext-saladict/commit/2124c17))
* **dicts:** update cambridge parser Closes [#266](https://github.com/crimx/ext-saladict/issues/266) ([b996c87](https://github.com/crimx/ext-saladict/commit/b996c87))



<a name="6.22.2"></a>
## [6.22.2](https://github.com/crimx/ext-saladict/compare/v6.22.1...v6.22.2) (2018-12-14)


### Bug Fixes

* **dicts:** update sogou api ([22f4d13](https://github.com/crimx/ext-saladict/commit/22f4d13))



<a name="6.22.1"></a>
## [6.22.1](https://github.com/crimx/ext-saladict/compare/v6.22.0...v6.22.1) (2018-12-10)


### Bug Fixes

* **dicts:** fix hjdict cookies ([b89618f](https://github.com/crimx/ext-saladict/commit/b89618f))
* **dicts:** use xhr to avoid Origin header ([36ffb4c](https://github.com/crimx/ext-saladict/commit/36ffb4c)), closes [#259](https://github.com/crimx/ext-saladict/issues/259)



<a name="6.22.0"></a>
# [6.22.0](https://github.com/crimx/ext-saladict/compare/v6.21.2...v6.22.0) (2018-12-04)


### Bug Fixes

* generate styles for all selected dicts ([1de0599](https://github.com/crimx/ext-saladict/commit/1de0599))
* highlight window and tab is exist ([840c085](https://github.com/crimx/ext-saladict/commit/840c085)), closes [#251](https://github.com/crimx/ext-saladict/issues/251)
* **dicts:** add id when searching ([246c9af](https://github.com/crimx/ext-saladict/commit/246c9af))
* inject panel to every page on install ([f108f2e](https://github.com/crimx/ext-saladict/commit/f108f2e))
* **manifest:** make dicts styles web accessible ([2bc0dff](https://github.com/crimx/ext-saladict/commit/2bc0dff))


### Features

* **dicts:** add dict Hjdict ([76b8210](https://github.com/crimx/ext-saladict/commit/76b8210)), closes [#252](https://github.com/crimx/ext-saladict/issues/252)
* **helpers:** add lang check ([5375f67](https://github.com/crimx/ext-saladict/commit/5375f67))


### Performance Improvements

* **dicts:** only load necessary styles ([e15fbdd](https://github.com/crimx/ext-saladict/commit/e15fbdd))



<a name="6.21.2"></a>
## [6.21.2](https://github.com/crimx/ext-saladict/compare/v6.21.1...v6.21.2) (2018-11-28)


### Bug Fixes

* **dicts:** encode sogou ([cd2cbc5](https://github.com/crimx/ext-saladict/commit/cd2cbc5))



<a name="6.21.1"></a>
## [6.21.1](https://github.com/crimx/ext-saladict/compare/v6.21.0...v6.21.1) (2018-11-26)


### Bug Fixes

* merge config ([791b7df](https://github.com/crimx/ext-saladict/commit/791b7df))



<a name="6.21.0"></a>
# [6.21.0](https://github.com/crimx/ext-saladict/compare/v6.20.2...v6.21.0) (2018-11-25)


### Bug Fixes

* download exported wordpage files on Firefox ([aaba271](https://github.com/crimx/ext-saladict/commit/aaba271))
* **dicts:** sogou api ([bdd0bb5](https://github.com/crimx/ext-saladict/commit/bdd0bb5))
* **helpers:** remove Chs chars from Korean matching ([1daed3c](https://github.com/crimx/ext-saladict/commit/1daed3c)), closes [#249](https://github.com/crimx/ext-saladict/issues/249)
* remove unused ([151bfb5](https://github.com/crimx/ext-saladict/commit/151bfb5))


### Features

* **dict:** add dict wikipedia ([603c558](https://github.com/crimx/ext-saladict/commit/603c558))



<a name="6.20.2"></a>
## [6.20.2](https://github.com/crimx/ext-saladict/compare/v6.20.1...v6.20.2) (2018-11-09)


### Bug Fixes

* **content:** exit after deleting word ([af34a37](https://github.com/crimx/ext-saladict/commit/af34a37)), closes [#245](https://github.com/crimx/ext-saladict/issues/245)



<a name="6.20.1"></a>
## [6.20.1](https://github.com/crimx/ext-saladict/compare/v6.20.0...v6.20.1) (2018-11-03)


### Bug Fixes

* suggests panel ([8f4e13d](https://github.com/crimx/ext-saladict/commit/8f4e13d))



<a name="6.20.0"></a>
# [6.20.0](https://github.com/crimx/ext-saladict/compare/v6.19.0...v6.20.0) (2018-11-03)


### Bug Fixes

* **content:** search context when jumping from popup to wordpage ([c1703ef](https://github.com/crimx/ext-saladict/commit/c1703ef))
* fix trans component ([0711058](https://github.com/crimx/ext-saladict/commit/0711058))
* **dicts:** remove trimming ([44f1fc4](https://github.com/crimx/ext-saladict/commit/44f1fc4))
* **panel:** fix suggests panel logic ([dff562d](https://github.com/crimx/ext-saladict/commit/dff562d))


### Features

* **dicts:** add options to remove linebreaks on PDF ([8b72b69](https://github.com/crimx/ext-saladict/commit/8b72b69))
* add search suggests ([f1f458b](https://github.com/crimx/ext-saladict/commit/f1f458b))



<a name="6.19.0"></a>
# [6.19.0](https://github.com/crimx/ext-saladict/compare/v6.18.1...v6.19.0) (2018-11-01)


### Bug Fixes

* **configs:** new value could be empty when deleting ([5a5fad5](https://github.com/crimx/ext-saladict/commit/5a5fad5))
* **dicts:** trim text ([5dac1e7](https://github.com/crimx/ext-saladict/commit/5dac1e7))
* **helpers:** ignore irrelevant events ([72aa11a](https://github.com/crimx/ext-saladict/commit/72aa11a))
* **sync:** correct interval repeat ([0c7b607](https://github.com/crimx/ext-saladict/commit/0c7b607))
* **wordpage:** reset selected rows on full fetch ([9f0f42e](https://github.com/crimx/ext-saladict/commit/9f0f42e))


### Features

* **background:** add badge text ([8477f65](https://github.com/crimx/ext-saladict/commit/8477f65))
* **helpers:** add webdav sync service ([64df7c3](https://github.com/crimx/ext-saladict/commit/64df7c3))
* **sync:** add sync options ([73e4ce6](https://github.com/crimx/ext-saladict/commit/73e4ce6))
* add shift for instant search ([20a942a](https://github.com/crimx/ext-saladict/commit/20a942a)), closes [#232](https://github.com/crimx/ext-saladict/issues/232)



<a name="6.18.1"></a>
## [6.18.1](https://github.com/crimx/ext-saladict/compare/v6.18.0...v6.18.1) (2018-10-17)



<a name="6.18.0"></a>
# [6.18.0](https://github.com/crimx/ext-saladict/compare/v6.17.1...v6.18.0) (2018-10-16)


### Bug Fixes

* **content:** fix triple ctrl switch ([d1dcdeb](https://github.com/crimx/ext-saladict/commit/d1dcdeb)), closes [#222](https://github.com/crimx/ext-saladict/issues/222)


### Features

* **content:** add more keys for holding mode ([bda8c07](https://github.com/crimx/ext-saladict/commit/bda8c07)), closes [#221](https://github.com/crimx/ext-saladict/issues/221)



<a name="6.17.1"></a>
## [6.17.1](https://github.com/crimx/ext-saladict/compare/v6.17.0...v6.17.1) (2018-10-12)


### Bug Fixes

* **panel:** fix panel not showing if animation is off ([a533f59](https://github.com/crimx/ext-saladict/commit/a533f59))
* **panel:** fix search text loading on standalone panel ([828e315](https://github.com/crimx/ext-saladict/commit/828e315))



<a name="6.17.0"></a>
# [6.17.0](https://github.com/crimx/ext-saladict/compare/v6.16.1...v6.17.0) (2018-10-11)


### Bug Fixes

* **background:** fix typing ([8cc0760](https://github.com/crimx/ext-saladict/commit/8cc0760))
* **dicts:** update google tk ([c36d15d](https://github.com/crimx/ext-saladict/commit/c36d15d)), closes [#212](https://github.com/crimx/ext-saladict/issues/212)
* **locales:** typo ([4934e7c](https://github.com/crimx/ext-saladict/commit/4934e7c))
* **panel:** only load on top frame ([c9a8bf7](https://github.com/crimx/ext-saladict/commit/c9a8bf7)), closes [#214](https://github.com/crimx/ext-saladict/issues/214)
* **panel:** prevent context menu on right click ([dd2b5ce](https://github.com/crimx/ext-saladict/commit/dd2b5ce))
* **selection:** input and textarea selection on Firefox ([dfa95f7](https://github.com/crimx/ext-saladict/commit/dfa95f7))


### Features

* **command:** add command for quick search panel ([dc34810](https://github.com/crimx/ext-saladict/commit/dc34810))
* **menu:** add google cn page translate ([f549fdc](https://github.com/crimx/ext-saladict/commit/f549fdc))
* **panel:** add quick search standalone panel ([2ff9fa2](https://github.com/crimx/ext-saladict/commit/2ff9fa2))



<a name="6.16.1"></a>
## [6.16.1](https://github.com/crimx/ext-saladict/compare/v6.16.0...v6.16.1) (2018-10-02)


### Bug Fixes

* **options:** support firefox export ([322ca3c](https://github.com/crimx/ext-saladict/commit/322ca3c)), closes [#210](https://github.com/crimx/ext-saladict/issues/210)



<a name="6.16.0"></a>
# [6.16.0](https://github.com/crimx/ext-saladict/compare/v6.15.4...v6.16.0) (2018-10-01)


### Features

* **dicts:** chs to chz ([c0cf11e](https://github.com/crimx/ext-saladict/commit/c0cf11e))



<a name="6.15.4"></a>
## [6.15.4](https://github.com/crimx/ext-saladict/compare/v6.15.3...v6.15.4) (2018-09-29)


### Bug Fixes

* **panel:** config not updating on init ([361c8ca](https://github.com/crimx/ext-saladict/commit/361c8ca)), closes [#209](https://github.com/crimx/ext-saladict/issues/209)
* **panel:** not selecting when panel is called by triple ctrl ([b34b84d](https://github.com/crimx/ext-saladict/commit/b34b84d)), closes [#193](https://github.com/crimx/ext-saladict/issues/193)



<a name="6.15.3"></a>
## [6.15.3](https://github.com/crimx/ext-saladict/compare/v6.15.2...v6.15.3) (2018-09-23)


### Bug Fixes

* **content:** fix salad bowl tomato on Firefox ([552f1ab](https://github.com/crimx/ext-saladict/commit/552f1ab))



<a name="6.15.2"></a>
## [6.15.2](https://github.com/crimx/ext-saladict/compare/v6.15.1...v6.15.2) (2018-09-23)


### Bug Fixes

* **panel:** dict info could be undefined ([388edc0](https://github.com/crimx/ext-saladict/commit/388edc0))



<a name="6.15.1"></a>
## [6.15.1](https://github.com/crimx/ext-saladict/compare/v6.15.0...v6.15.1) (2018-09-23)


### Bug Fixes

* **panel:** fix init config state mismatch ([06d7d5a](https://github.com/crimx/ext-saladict/commit/06d7d5a))
* **selection:** fix lang check for instant capture ([90aeb1b](https://github.com/crimx/ext-saladict/commit/90aeb1b))



<a name="6.15.0"></a>
# [6.15.0](https://github.com/crimx/ext-saladict/compare/v6.14.0...v6.15.0) (2018-09-16)


### Bug Fixes

* **panel:** fix line breaking in English ([4b76760](https://github.com/crimx/ext-saladict/commit/4b76760))
* **panel:** fix profile panel shows on hover ([4b96472](https://github.com/crimx/ext-saladict/commit/4b96472))
* **popup:** fix body width ([5212b6a](https://github.com/crimx/ext-saladict/commit/5212b6a))


### Features

* **dicts:** add lang selection for machine translations ([739e5ea](https://github.com/crimx/ext-saladict/commit/739e5ea))
* **panel:** enable searchText on dict result ([85ec153](https://github.com/crimx/ext-saladict/commit/85ec153))



<a name="6.14.0"></a>
# [6.14.0](https://github.com/crimx/ext-saladict/compare/v6.13.4...v6.14.0) (2018-09-11)


### Bug Fixes

* fix typings ([5678833](https://github.com/crimx/ext-saladict/commit/5678833))


### Features

* **components:** add dict weblio [#156](https://github.com/crimx/ext-saladict/issues/156) ([86bd514](https://github.com/crimx/ext-saladict/commit/86bd514))



<a name="6.13.4"></a>
## [6.13.4](https://github.com/crimx/ext-saladict/compare/v6.13.3...v6.13.4) (2018-09-06)


### Bug Fixes

* **panel:** fix focus losing on triple ctrl ([ff7a67b](https://github.com/crimx/ext-saladict/commit/ff7a67b)), closes [#193](https://github.com/crimx/ext-saladict/issues/193)



<a name="6.13.3"></a>
## [6.13.3](https://github.com/crimx/ext-saladict/compare/v6.13.2...v6.13.3) (2018-09-04)


### Bug Fixes

* **config:** fix quota bytes limit ([cfb7268](https://github.com/crimx/ext-saladict/commit/cfb7268))
* **panel:** fix mta box toggling on update ([9f9983f](https://github.com/crimx/ext-saladict/commit/9f9983f))



<a name="6.13.2"></a>
## [6.13.2](https://github.com/crimx/ext-saladict/compare/v6.13.1...v6.13.2) (2018-09-03)


### Bug Fixes

* **panel:** fix search box update on selection ([7f3a270](https://github.com/crimx/ext-saladict/commit/7f3a270)), closes [#197](https://github.com/crimx/ext-saladict/issues/197)



<a name="6.13.1"></a>
## [6.13.1](https://github.com/crimx/ext-saladict/compare/v6.13.0...v6.13.1) (2018-09-02)


### Bug Fixes

* **content:** fix popup init ([fc3cc85](https://github.com/crimx/ext-saladict/commit/fc3cc85))



<a name="6.13.0"></a>
# [6.13.0](https://github.com/crimx/ext-saladict/compare/v6.12.1...v6.13.0) (2018-09-02)


### Bug Fixes

* **config:** add met merge config ([74ae476](https://github.com/crimx/ext-saladict/commit/74ae476))
* **configs:** fix config not updating on init ([7d54aa0](https://github.com/crimx/ext-saladict/commit/7d54aa0))
* **dicts:** fix etymonline ([c5aeca2](https://github.com/crimx/ext-saladict/commit/c5aeca2))
* **helpers:** prevent profiles blow up ([a5b7d2f](https://github.com/crimx/ext-saladict/commit/a5b7d2f))
* **panel:** fix mta search box search text ([244a45c](https://github.com/crimx/ext-saladict/commit/244a45c))
* **panel:** fix typings ([f312ffe](https://github.com/crimx/ext-saladict/commit/f312ffe))
* **panel:** safety check ([23e06db](https://github.com/crimx/ext-saladict/commit/23e06db))


### Features

* **options:** add options for toggling multiline search box ([df4e241](https://github.com/crimx/ext-saladict/commit/df4e241))
* **panel:** add multiline search box ([7370fc5](https://github.com/crimx/ext-saladict/commit/7370fc5))



<a name="6.12.1"></a>
## [6.12.1](https://github.com/crimx/ext-saladict/compare/v6.12.0...v6.12.1) (2018-09-01)


### Bug Fixes

* **config:** fix quota bytes per item exceeds ([2a64195](https://github.com/crimx/ext-saladict/commit/2a64195))


### Features

* **options:** add profile adding ([22fe8e7](https://github.com/crimx/ext-saladict/commit/22fe8e7))



<a name="6.12.0"></a>
# [6.12.0](https://github.com/crimx/ext-saladict/compare/v6.11.0...v6.12.0) (2018-08-31)


### Bug Fixes

* **content:** correct config and selection listener order ([876b691](https://github.com/crimx/ext-saladict/commit/876b691))
* **content:** fix blank after new config ([ddc4953](https://github.com/crimx/ext-saladict/commit/ddc4953))
* **content:** hide config profile panel on options page ([a60ee25](https://github.com/crimx/ext-saladict/commit/a60ee25))
* **dicts:** fix camberidge audio ([f4c48b2](https://github.com/crimx/ext-saladict/commit/f4c48b2)), closes [#192](https://github.com/crimx/ext-saladict/issues/192)
* **helpers:** fix listener interface ([41133da](https://github.com/crimx/ext-saladict/commit/41133da))
* **panel:** add search box delay ([645797c](https://github.com/crimx/ext-saladict/commit/645797c))
* **panel:** fix search box selection delay ([a3ffe05](https://github.com/crimx/ext-saladict/commit/a3ffe05))
* **selection:** fix context matching line ending ([da80def](https://github.com/crimx/ext-saladict/commit/da80def))


### Features

* **config:** support multi-configs ([5d7660b](https://github.com/crimx/ext-saladict/commit/5d7660b))
* **content:** add never show button for word editor ([ef77e7c](https://github.com/crimx/ext-saladict/commit/ef77e7c))
* **content:** add UI for switching profile ([3507b45](https://github.com/crimx/ext-saladict/commit/3507b45))
* **helpers:** add config id list stream ([398e3fd](https://github.com/crimx/ext-saladict/commit/398e3fd))
* **options:** add config profile settings ([3825d74](https://github.com/crimx/ext-saladict/commit/3825d74))
* **options:** add profile operations ([c7a622c](https://github.com/crimx/ext-saladict/commit/c7a622c))



<a name="6.11.0"></a>
# [6.11.0](https://github.com/crimx/ext-saladict/compare/v6.10.2...v6.11.0) (2018-08-28)


### Bug Fixes

* **content:** fix typo ([ff6140a](https://github.com/crimx/ext-saladict/commit/ff6140a))
* **dicts:** fix typings ([2ea57d3](https://github.com/crimx/ext-saladict/commit/2ea57d3))


### Features

* **content:** auto-fill translation field ([efe95d2](https://github.com/crimx/ext-saladict/commit/efe95d2))
* **dicts:** add sogou translation ([3e11231](https://github.com/crimx/ext-saladict/commit/3e11231))
* **options:** add word of the day for options page ([251c119](https://github.com/crimx/ext-saladict/commit/251c119))



<a name="6.10.2"></a>
## [6.10.2](https://github.com/crimx/ext-saladict/compare/v6.10.1...v6.10.2) (2018-08-27)


### Bug Fixes

* **panel:** better search box focus ([fc16541](https://github.com/crimx/ext-saladict/commit/fc16541)), closes [#182](https://github.com/crimx/ext-saladict/issues/182)
* **panel:** fix typing ([4c706a7](https://github.com/crimx/ext-saladict/commit/4c706a7))
* **panel:** improve smoothness when panel shows up ([a3ee454](https://github.com/crimx/ext-saladict/commit/a3ee454))



<a name="6.10.1"></a>
## [6.10.1](https://github.com/crimx/ext-saladict/compare/v6.10.0...v6.10.1) (2018-08-27)


### Bug Fixes

* **dicts:** fix longman styles ([4dc74c4](https://github.com/crimx/ext-saladict/commit/4dc74c4))
* **locales:** typo ([f86f77e](https://github.com/crimx/ext-saladict/commit/f86f77e))



<a name="6.10.0"></a>
# [6.10.0](https://github.com/crimx/ext-saladict/compare/v6.9.0...v6.10.0) (2018-08-27)


### Features

* **background:** add pfd black and white list ([750a745](https://github.com/crimx/ext-saladict/commit/750a745))
* **dicts:** add google tl option ([489bdd9](https://github.com/crimx/ext-saladict/commit/489bdd9))
* **options:** dict options support select ([dcf6357](https://github.com/crimx/ext-saladict/commit/dcf6357))
* **panel:** add wordEditor deleteCards ([47f8f1b](https://github.com/crimx/ext-saladict/commit/47f8f1b))
* **panel:** improve fav word process ([b632a28](https://github.com/crimx/ext-saladict/commit/b632a28))
* **wordpage:** add page export/delete ([6ceb21a](https://github.com/crimx/ext-saladict/commit/6ceb21a))
* **wordpage:** add word count ([6667f53](https://github.com/crimx/ext-saladict/commit/6667f53))


### Performance Improvements

* **panel:** regression. remove search delay ([c65e53c](https://github.com/crimx/ext-saladict/commit/c65e53c))



<a name="6.9.0"></a>
# [6.9.0](https://github.com/crimx/ext-saladict/compare/v6.8.3...v6.9.0) (2018-08-04)


### Bug Fixes

* **panel:** patch internal panel css ([befe9ce](https://github.com/crimx/ext-saladict/commit/befe9ce))


### Features

* **dicts:** bing sentence highlight ([ed1b7c4](https://github.com/crimx/ext-saladict/commit/ed1b7c4))



<a name="6.8.3"></a>
## [6.8.3](https://github.com/crimx/ext-saladict/compare/v6.8.2...v6.8.3) (2018-07-27)


### Bug Fixes

* **dicts:** fix audio link ([8b7e140](https://github.com/crimx/ext-saladict/commit/8b7e140)), closes [#175](https://github.com/crimx/ext-saladict/issues/175)



<a name="6.8.2"></a>
## [6.8.2](https://github.com/crimx/ext-saladict/compare/v6.8.1...v6.8.2) (2018-07-26)


### Bug Fixes

* **panel:** triple ctrl auto search ([00a1381](https://github.com/crimx/ext-saladict/commit/00a1381)), closes [#174](https://github.com/crimx/ext-saladict/issues/174)



<a name="6.8.1"></a>
## [6.8.1](https://github.com/crimx/ext-saladict/compare/v6.8.0...v6.8.1) (2018-07-26)


### Bug Fixes

* **helpers:** remove chs chars from korean [#173](https://github.com/crimx/ext-saladict/issues/173) ([38f1dce](https://github.com/crimx/ext-saladict/commit/38f1dce))



<a name="6.8.0"></a>
# [6.8.0](https://github.com/crimx/ext-saladict/compare/v6.7.0...v6.8.0) (2018-07-26)


### Bug Fixes

* **selection:** correct word count ([6a28e3d](https://github.com/crimx/ext-saladict/commit/6a28e3d)), closes [#172](https://github.com/crimx/ext-saladict/issues/172)


### Features

* **panel:** open links in new tabs ([d40cf2a](https://github.com/crimx/ext-saladict/commit/d40cf2a))



<a name="6.7.0"></a>
# [6.7.0](https://github.com/crimx/ext-saladict/compare/v6.6.0...v6.7.0) (2018-07-26)


### Bug Fixes

* **dicts:** encode url ([0c0cd20](https://github.com/crimx/ext-saladict/commit/0c0cd20)), closes [#170](https://github.com/crimx/ext-saladict/issues/170)
* **options:** auto-search on options page ([39ed461](https://github.com/crimx/ext-saladict/commit/39ed461))
* **panel:** reset internal style ([3119084](https://github.com/crimx/ext-saladict/commit/3119084))
* **selection:** better ctrl detection ([9f0c6b6](https://github.com/crimx/ext-saladict/commit/9f0c6b6)), closes [#168](https://github.com/crimx/ext-saladict/issues/168)
* **selection:** better language detection ([c1f24e2](https://github.com/crimx/ext-saladict/commit/c1f24e2))


### Features

* **dicts:** add google tts ([5af7145](https://github.com/crimx/ext-saladict/commit/5af7145))
* **options:** add minor language options ([f269d0f](https://github.com/crimx/ext-saladict/commit/f269d0f))
* **selection:** minor lang selection ([8948f3c](https://github.com/crimx/ext-saladict/commit/8948f3c))



<a name="6.6.0"></a>
# [6.6.0](https://github.com/crimx/ext-saladict/compare/v6.5.1...v6.6.0) (2018-07-19)


### Bug Fixes

* **content:** fix new selection interface ([2bb8ada](https://github.com/crimx/ext-saladict/commit/2bb8ada))
* **selection:** ignore right click [#166](https://github.com/crimx/ext-saladict/issues/166) ([ee5b794](https://github.com/crimx/ext-saladict/commit/ee5b794))
* **selection:** ignore triple ctrl when panel is visible [#162](https://github.com/crimx/ext-saladict/issues/162) ([e0e3208](https://github.com/crimx/ext-saladict/commit/e0e3208))


### Features

* **selection:** add selection inside dict panel [#165](https://github.com/crimx/ext-saladict/issues/165) ([f8da4be](https://github.com/crimx/ext-saladict/commit/f8da4be))
* **selection:** support selection on internal pages ([226be86](https://github.com/crimx/ext-saladict/commit/226be86))


### Performance Improvements

* **dicts:** improve google translate stability ([edd5fa9](https://github.com/crimx/ext-saladict/commit/edd5fa9))



<a name="6.5.1"></a>
# [6.5.1](https://github.com/crimx/ext-saladict/compare/v6.1.0...v6.5.1) (2018-07-10)


### Bug Fixes

* **panel:** support span links ([32b4a3a](https://github.com/crimx/ext-saladict/commit/32b4a3a))



<a name="6.5.0"></a>
# [6.5.0](https://github.com/crimx/ext-saladict/compare/v6.4.1...v6.5.0) (2018-07-08)


### Bug Fixes

* **options:** missing files breaks CI build ([ae35a49](https://github.com/crimx/ext-saladict/commit/ae35a49))
* update ci ([ba3108e](https://github.com/crimx/ext-saladict/commit/ba3108e))
* update ci ([97e5201](https://github.com/crimx/ext-saladict/commit/97e5201))
* update ci ([7dd28a8](https://github.com/crimx/ext-saladict/commit/7dd28a8))
* **popup:** fix preloading selection on popup page ([5912183](https://github.com/crimx/ext-saladict/commit/5912183))


### Features

* **$browser:** longman dictionary's exmaples add speaker ([8601078](https://github.com/crimx/ext-saladict/commit/8601078))
* **$browser:** longman max level is 3 ([c9a4a80](https://github.com/crimx/ext-saladict/commit/c9a4a80))
* **context:** add context menus saladict search [#152](https://github.com/crimx/ext-saladict/issues/152) ([6125ca8](https://github.com/crimx/ext-saladict/commit/6125ca8))
* **dicts:** add google dict ([355740c](https://github.com/crimx/ext-saladict/commit/355740c)), closes [#145](https://github.com/crimx/ext-saladict/issues/145)
* **options:** add balck-white list [#155](https://github.com/crimx/ext-saladict/issues/155) ([a2c8d13](https://github.com/crimx/ext-saladict/commit/a2c8d13))
* **selection:** support Monaco editor ([edd0012](https://github.com/crimx/ext-saladict/commit/edd0012))



<a name="6.4.1"></a>
## [6.4.1](https://github.com/crimx/ext-saladict/compare/v6.4.0...v6.4.1) (2018-06-28)


### Bug Fixes

* **content:** fix dynamic document.body [#150](https://github.com/crimx/ext-saladict/issues/150) ([27f2787](https://github.com/crimx/ext-saladict/commit/27f2787))
* **manifest:** fix browser global conflict [#148](https://github.com/crimx/ext-saladict/issues/148) ([ca0d8a1](https://github.com/crimx/ext-saladict/commit/ca0d8a1))



<a name="6.4.0"></a>
# [6.4.0](https://github.com/crimx/ext-saladict/compare/v6.3.2...v6.4.0) (2018-06-17)


### Bug Fixes

* **background:** regression. mistakenly added new code ([f974c61](https://github.com/crimx/ext-saladict/commit/f974c61))
* **content:** prevent selection detection on word editor ([8cc86a8](https://github.com/crimx/ext-saladict/commit/8cc86a8))
* **content:** regression: use position ([b5d75d8](https://github.com/crimx/ext-saladict/commit/b5d75d8))
* **panel:** fix Firefox popup page delay bug ([c5a4d6d](https://github.com/crimx/ext-saladict/commit/c5a4d6d))
* **panel:** iframe occasionally flickering ([e89cd03](https://github.com/crimx/ext-saladict/commit/e89cd03))
* **selection:** range could be null ([3cc2ec2](https://github.com/crimx/ext-saladict/commit/3cc2ec2))
* **selection:** update context matching [#144](https://github.com/crimx/ext-saladict/issues/144) ([fa20ab7](https://github.com/crimx/ext-saladict/commit/fa20ab7))


### Features

* **background:** add page translations [#146](https://github.com/crimx/ext-saladict/issues/146) ([c5d6225](https://github.com/crimx/ext-saladict/commit/c5d6225))
* **background:** add shortcut for instant capture ([bc46a2f](https://github.com/crimx/ext-saladict/commit/bc46a2f))
* **content:** add query panel state ([c92a7d0](https://github.com/crimx/ext-saladict/commit/c92a7d0))
* **content:** broadcast store state ([d0a356f](https://github.com/crimx/ext-saladict/commit/d0a356f))
* **options:** add instant capture ([71955a4](https://github.com/crimx/ext-saladict/commit/71955a4))
* **popup:** add instant capture toggle ([32dcfdc](https://github.com/crimx/ext-saladict/commit/32dcfdc))
* **selection:** add cursor instant capture [#14](https://github.com/crimx/ext-saladict/issues/14) ([ef37346](https://github.com/crimx/ext-saladict/commit/ef37346))



<a name="6.3.2"></a>
## [6.3.2](https://github.com/crimx/ext-saladict/compare/v6.3.1...v6.3.2) (2018-06-13)


### Bug Fixes

* **popup:** qrcode hiding ([eec0d02](https://github.com/crimx/ext-saladict/commit/eec0d02))



<a name="6.3.1"></a>
## [6.3.1](https://github.com/crimx/ext-saladict/compare/v6.3.0...v6.3.1) (2018-06-13)


### Bug Fixes

* **config:** increase default word count ([a8d98c4](https://github.com/crimx/ext-saladict/commit/a8d98c4))
* **config:** lang code auto update ([cffa171](https://github.com/crimx/ext-saladict/commit/cffa171))
* **popup:** fix id ([830386a](https://github.com/crimx/ext-saladict/commit/830386a))



<a name="6.3.0"></a>
# [6.3.0](https://github.com/crimx/ext-saladict/compare/v6.2.2...v6.3.0) (2018-06-12)


### Bug Fixes

* **panel:** reset dict height ([f359205](https://github.com/crimx/ext-saladict/commit/f359205))


### Features

* **background:** add shortcuts [#141](https://github.com/crimx/ext-saladict/issues/141) ([76a35a2](https://github.com/crimx/ext-saladict/commit/76a35a2))
* **content:** add search history incognito mode ([8168c12](https://github.com/crimx/ext-saladict/commit/8168c12))
* **popup:** add active toggle ([3f1d115](https://github.com/crimx/ext-saladict/commit/3f1d115)), closes [#140](https://github.com/crimx/ext-saladict/issues/140)


### Performance Improvements

* **panel:** better animation ([8777470](https://github.com/crimx/ext-saladict/commit/8777470))



<a name="6.2.2"></a>
## [6.2.2](https://github.com/crimx/ext-saladict/compare/v6.2.1...v6.2.2) (2018-06-08)


### Bug Fixes

* **panel:** fix missing calculation on hiding [#135](https://github.com/crimx/ext-saladict/issues/135) ([bb5823e](https://github.com/crimx/ext-saladict/commit/bb5823e))



<a name="6.2.1"></a>
## [6.2.1](https://github.com/crimx/ext-saladict/compare/v6.2.0...v6.2.1) (2018-06-08)


### Features

* **config:** add sogou [#134](https://github.com/crimx/ext-saladict/issues/134) ([8833a69](https://github.com/crimx/ext-saladict/commit/8833a69))



<a name="6.2.0"></a>
# [6.2.0](https://github.com/crimx/ext-saladict/compare/v6.1.3...v6.2.0) (2018-06-07)


### Bug Fixes

* **content:** animation toggle on word editor ([a1c7efd](https://github.com/crimx/ext-saladict/commit/a1c7efd))
* **dicts:** hide sharing ([f1bd672](https://github.com/crimx/ext-saladict/commit/f1bd672))


### Features

* **dicts:** add google options ([9b4790d](https://github.com/crimx/ext-saladict/commit/9b4790d))
* **panel:** add double click search [#115](https://github.com/crimx/ext-saladict/issues/115) ([313ff16](https://github.com/crimx/ext-saladict/commit/313ff16))
* **panel:** selection word count [#129](https://github.com/crimx/ext-saladict/issues/129) ([a4eb1a1](https://github.com/crimx/ext-saladict/commit/a4eb1a1))


### Performance Improvements

* **content:** increase responsiveness ([b95f2ae](https://github.com/crimx/ext-saladict/commit/b95f2ae))



<a name="6.1.3"></a>
## [6.1.3](https://github.com/crimx/ext-saladict/compare/v6.1.2...v6.1.3) (2018-06-06)


### Bug Fixes

* **panel:** remove panel visibility delay [#132](https://github.com/crimx/ext-saladict/issues/132) ([305de64](https://github.com/crimx/ext-saladict/commit/305de64))



<a name="6.1.2"></a>
## [6.1.2](https://github.com/crimx/ext-saladict/compare/v6.1.1...v6.1.2) (2018-06-06)


### Bug Fixes

* **panel:** fix null pointer ([dc3a41e](https://github.com/crimx/ext-saladict/commit/dc3a41e)), closes [#130](https://github.com/crimx/ext-saladict/issues/130)



<a name="6.1.1"></a>
## [6.1.1](https://github.com/crimx/ext-saladict/compare/v6.1.0...v6.1.1) (2018-06-05)


### Bug Fixes

* **panel:** fix right click ([d06be31](https://github.com/crimx/ext-saladict/commit/d06be31))



<a name="6.1.0"></a>
# [6.1.0](https://github.com/crimx/ext-saladict/compare/v6.0.0...v6.1.0) (2018-06-05)


### Bug Fixes

* **panel:** fix auto focus [#124](https://github.com/crimx/ext-saladict/issues/124) ([4d03bda](https://github.com/crimx/ext-saladict/commit/4d03bda))
* **panel:** fix entering in options page and popup page ([298bbb1](https://github.com/crimx/ext-saladict/commit/298bbb1))
* **panel:** fix height calc ([148cd56](https://github.com/crimx/ext-saladict/commit/148cd56))
* **panel:** fix iframe flickering in Chrome [#124](https://github.com/crimx/ext-saladict/issues/124) [#113](https://github.com/crimx/ext-saladict/issues/113) [#119](https://github.com/crimx/ext-saladict/issues/119) ([922d8d4](https://github.com/crimx/ext-saladict/commit/922d8d4))
* **panel:** popup preload [#124](https://github.com/crimx/ext-saladict/issues/124) ([69aa7a8](https://github.com/crimx/ext-saladict/commit/69aa7a8))
* **panel:** remove animation ([55ef5fa](https://github.com/crimx/ext-saladict/commit/55ef5fa)), closes [#123](https://github.com/crimx/ext-saladict/issues/123)
* **selection:** always update last selection text ([c6aca15](https://github.com/crimx/ext-saladict/commit/c6aca15))
* **selection:** ctrl key detection [#124](https://github.com/crimx/ext-saladict/issues/124) [#122](https://github.com/crimx/ext-saladict/issues/122) [#114](https://github.com/crimx/ext-saladict/issues/114) ([a5893d2](https://github.com/crimx/ext-saladict/commit/a5893d2))


### Features

* **components:** explain export ([c6022c3](https://github.com/crimx/ext-saladict/commit/c6022c3))
* **config:** add toggle for word editor [#118](https://github.com/crimx/ext-saladict/issues/118) ([eb95680](https://github.com/crimx/ext-saladict/commit/eb95680))
* **content:** explain translations ([c6d9d50](https://github.com/crimx/ext-saladict/commit/c6d9d50)), closes [#117](https://github.com/crimx/ext-saladict/issues/117)



<a name="6.0.0"></a>
# [6.0.0](https://github.com/crimx/ext-saladict/compare/v5.31.7...v6.0.0) (2018-05-30)


### Bug Fixes

* **assets:** assets to static ([8dc5092](https://github.com/crimx/ext-saladict/commit/8dc5092))
* **background:** content script cannot catch rejections from bg ([29667a5](https://github.com/crimx/ext-saladict/commit/29667a5))
* **background:** context menus i18n init event ([25dbeef](https://github.com/crimx/ext-saladict/commit/25dbeef))
* **background:** fix typo ([6d7e25c](https://github.com/crimx/ext-saladict/commit/6d7e25c))
* **browser:** fix diffrenent removeListener api ([40c4721](https://github.com/crimx/ext-saladict/commit/40c4721))
* **browser:** fix webext polyfills ([ce11f10](https://github.com/crimx/ext-saladict/commit/ce11f10))
* **build:** fix fake env ([a1bf3ae](https://github.com/crimx/ext-saladict/commit/a1bf3ae))
* **components:** better keys for star rates ([6b50750](https://github.com/crimx/ext-saladict/commit/6b50750))
* **components:** fix Speaker svg dimension ([7d48654](https://github.com/crimx/ext-saladict/commit/7d48654))
* **components:** fix StarRates style ([1f65959](https://github.com/crimx/ext-saladict/commit/1f65959))
* **components:** stop setState when unmounted ([0d86b56](https://github.com/crimx/ext-saladict/commit/0d86b56))
* **config:** more test friendly ([a8e194f](https://github.com/crimx/ext-saladict/commit/a8e194f))
* **config:** replace the empty sting ([56937a9](https://github.com/crimx/ext-saladict/commit/56937a9))
* **config:** update config ([635608b](https://github.com/crimx/ext-saladict/commit/635608b))
* **content:** close on save & filter self ([e92a2f6](https://github.com/crimx/ext-saladict/commit/e92a2f6))
* **content:** delay injecting css ([a12e070](https://github.com/crimx/ext-saladict/commit/a12e070))
* **content:** fix close panel when pinned ([4771637](https://github.com/crimx/ext-saladict/commit/4771637))
* **content:** fix dict item height restore on search ([d5fbc78](https://github.com/crimx/ext-saladict/commit/d5fbc78))
* **content:** fix firefox !important bug ([73c162a](https://github.com/crimx/ext-saladict/commit/73c162a))
* **content:** fix firefox svg animation ([76f17cb](https://github.com/crimx/ext-saladict/commit/76f17cb))
* **content:** fix iframe flickering in Chrome ([9bab2af](https://github.com/crimx/ext-saladict/commit/9bab2af))
* **content:** fix init position since now use translate ([9ffb1ef](https://github.com/crimx/ext-saladict/commit/9ffb1ef))
* **content:** fix inject css ([4a82878](https://github.com/crimx/ext-saladict/commit/4a82878))
* **content:** fix long press ctrl ([e2613fc](https://github.com/crimx/ext-saladict/commit/e2613fc))
* **content:** fix mask button disabled on fold ([35769e9](https://github.com/crimx/ext-saladict/commit/35769e9))
* **content:** fix new config refresh bug ([3f44afc](https://github.com/crimx/ext-saladict/commit/3f44afc))
* **content:** get the first config before listening ([2a6fdf6](https://github.com/crimx/ext-saladict/commit/2a6fdf6))
* **database:** ignore case ([72f6abe](https://github.com/crimx/ext-saladict/commit/72f6abe))
* **dicts:** add space after basic ([8bbfb08](https://github.com/crimx/ext-saladict/commit/8bbfb08))
* **dicts:** bypass etymonline referer checking ([a105eec](https://github.com/crimx/ext-saladict/commit/a105eec))
* **dicts:** change url ([4772fa9](https://github.com/crimx/ext-saladict/commit/4772fa9))
* **dicts:** fix bing audio ([b0b641f](https://github.com/crimx/ext-saladict/commit/b0b641f))
* **dicts:** fix bing audio language detection ([ad577c3](https://github.com/crimx/ext-saladict/commit/ad577c3))
* **dicts:** fix bing phsym key ([d248a6d](https://github.com/crimx/ext-saladict/commit/d248a6d))
* **dicts:** fix cambridge link ([68b0a4d](https://github.com/crimx/ext-saladict/commit/68b0a4d))
* **dicts:** fix COBUILD page link ([7a6f45e](https://github.com/crimx/ext-saladict/commit/7a6f45e))
* **dicts:** fix img style ([130158a](https://github.com/crimx/ext-saladict/commit/130158a))
* **dicts:** fix lang code ([b6532cd](https://github.com/crimx/ext-saladict/commit/b6532cd))
* **dicts:** fix locales ([c39151e](https://github.com/crimx/ext-saladict/commit/c39151e))
* **dicts:** fix macmillan style ([64aee9b](https://github.com/crimx/ext-saladict/commit/64aee9b))
* **dicts:** fix p margin ([1561888](https://github.com/crimx/ext-saladict/commit/1561888))
* **dicts:** get correct href ([cd887e1](https://github.com/crimx/ext-saladict/commit/cd887e1))
* **dicts:** remove logging ([b19dab8](https://github.com/crimx/ext-saladict/commit/b19dab8))
* **dicts:** use innerHTML ([dee2afd](https://github.com/crimx/ext-saladict/commit/dee2afd))
* **dicts:** use lower case ([f66e99a](https://github.com/crimx/ext-saladict/commit/f66e99a))
* **helper:** rxjs6 fromEventPattern inconsistency ([7c1594d](https://github.com/crimx/ext-saladict/commit/7c1594d))
* **helpers:** always merge config ([49e01ff](https://github.com/crimx/ext-saladict/commit/49e01ff))
* **helpers:** fix wrong deletion ([a55c46d](https://github.com/crimx/ext-saladict/commit/a55c46d))
* **helpers:** get first config ([d8bb3fa](https://github.com/crimx/ext-saladict/commit/d8bb3fa))
* **helpers:** get initial config ([a221bc7](https://github.com/crimx/ext-saladict/commit/a221bc7))
* **helpers:** handle annoying msg errors from webext polyfill ([272f1eb](https://github.com/crimx/ext-saladict/commit/272f1eb))
* **helpers:** props added to window should be optional ([1f12b26](https://github.com/crimx/ext-saladict/commit/1f12b26))
* **locales:** add from Saladict ([b3b215e](https://github.com/crimx/ext-saladict/commit/b3b215e))
* **locales:** add missing locales ([fc500ab](https://github.com/crimx/ext-saladict/commit/fc500ab))
* **locales:** fix browser ui locale naming ([e57e61c](https://github.com/crimx/ext-saladict/commit/e57e61c))
* **locales:** fix wording ([2d7486e](https://github.com/crimx/ext-saladict/commit/2d7486e))
* **locales:** use standard lang code ([7a901ec](https://github.com/crimx/ext-saladict/commit/7a901ec))
* **manifest:** declare wordeditor as web accessible resources ([f9984f5](https://github.com/crimx/ext-saladict/commit/f9984f5))
* **manifest:** fix manifest ([685ded1](https://github.com/crimx/ext-saladict/commit/685ded1))
* **menus:** fix rxjs path ([07fc3a9](https://github.com/crimx/ext-saladict/commit/07fc3a9))
* **options:** add  key for v-for ([becfe1d](https://github.com/crimx/ext-saladict/commit/becfe1d))
* **options:** add max width ([45a1532](https://github.com/crimx/ext-saladict/commit/45a1532))
* **options:** fix auto search ([cd87b86](https://github.com/crimx/ext-saladict/commit/cd87b86))
* **options:** fix decimal bug ([835e1ca](https://github.com/crimx/ext-saladict/commit/835e1ca))
* **options:** fix language code ([d86b5c0](https://github.com/crimx/ext-saladict/commit/d86b5c0))
* **options:** fix modal scroll bar flickering ([9294de4](https://github.com/crimx/ext-saladict/commit/9294de4))
* **options:** fix style ([2417ec4](https://github.com/crimx/ext-saladict/commit/2417ec4))
* **options:** search text when options page is opened ([c359b70](https://github.com/crimx/ext-saladict/commit/c359b70))
* **package:** update normalize.css to version 8.0.0 ([1dbc42f](https://github.com/crimx/ext-saladict/commit/1dbc42f))
* **panel:** blur input on drag start ([1759053](https://github.com/crimx/ext-saladict/commit/1759053))
* **panel:** calculate margin height ([33d1a0a](https://github.com/crimx/ext-saladict/commit/33d1a0a))
* **panel:** can't unfold a dict when the panel fisrt popup ([41e9498](https://github.com/crimx/ext-saladict/commit/41e9498))
* **panel:** close panel and word editer on esc ([d133d6e](https://github.com/crimx/ext-saladict/commit/d133d6e))
* **panel:** debounce animation end ([0cd7e32](https://github.com/crimx/ext-saladict/commit/0cd7e32))
* **panel:** fix data inconsistency ([1b956aa](https://github.com/crimx/ext-saladict/commit/1b956aa))
* **panel:** fix firame flickering ([81aebc7](https://github.com/crimx/ext-saladict/commit/81aebc7))
* **panel:** fix icon bleeds ([9ce942a](https://github.com/crimx/ext-saladict/commit/9ce942a))
* **panel:** fix panel init height ([799cc4c](https://github.com/crimx/ext-saladict/commit/799cc4c))
* **panel:** fix panel init on options page ([be4815d](https://github.com/crimx/ext-saladict/commit/be4815d))
* **panel:** fix preload text ([79732b8](https://github.com/crimx/ext-saladict/commit/79732b8))
* **panel:** fix search box should follow history ([5cca229](https://github.com/crimx/ext-saladict/commit/5cca229))
* **panel:** fix styles ([557fdff](https://github.com/crimx/ext-saladict/commit/557fdff))
* **panel:** height recalculation on show full ([6f0077e](https://github.com/crimx/ext-saladict/commit/6f0077e))
* **panel:** hide dicts when the selection lang does not match ([b099b5f](https://github.com/crimx/ext-saladict/commit/b099b5f))
* **panel:** keep dict height unchanged when there is nothing ([47ef11b](https://github.com/crimx/ext-saladict/commit/47ef11b))
* **panel:** only set immediate to x and y when dragging ([ce0e252](https://github.com/crimx/ext-saladict/commit/ce0e252))
* **panel:** panel should listen to config on options page ([c751d44](https://github.com/crimx/ext-saladict/commit/c751d44))
* **panel:** recalc body height when expanding menus ([b6a5714](https://github.com/crimx/ext-saladict/commit/b6a5714))
* **panel:** record search text on options page ([86eec63](https://github.com/crimx/ext-saladict/commit/86eec63))
* **panel:** remove animation on popup page ([d298201](https://github.com/crimx/ext-saladict/commit/d298201))
* **panel:** replace same selection ([5270b8e](https://github.com/crimx/ext-saladict/commit/5270b8e))
* **panel:** stop following cursor when pinned ([c1d04c1](https://github.com/crimx/ext-saladict/commit/c1d04c1))
* **panel:** stop searching when selection lang doesn't match ([e506edd](https://github.com/crimx/ext-saladict/commit/e506edd))
* **panel:** try whatever I can to stop iframe flickering ([949d03e](https://github.com/crimx/ext-saladict/commit/949d03e))
* **panel:** tweak styles ([14437ef](https://github.com/crimx/ext-saladict/commit/14437ef))
* **popup:** add to notebook on popup page ([f27dc2f](https://github.com/crimx/ext-saladict/commit/f27dc2f))
* **popup:** remove white spaces ([c1f22e2](https://github.com/crimx/ext-saladict/commit/c1f22e2))
* **sass:** add global ([73aaffa](https://github.com/crimx/ext-saladict/commit/73aaffa))
* **selection:** compress whitespaces in selection ([d43eaa1](https://github.com/crimx/ext-saladict/commit/d43eaa1))
* **selection:** fix className breaking on svg elements ([f932de3](https://github.com/crimx/ext-saladict/commit/f932de3))
* **selection:** fix editor detection ([5d5c11a](https://github.com/crimx/ext-saladict/commit/5d5c11a))
* **selection:** fix ignoring same selection rule for double click ([a587c22](https://github.com/crimx/ext-saladict/commit/a587c22))
* **selection:** fix undefined detection ([2ad9269](https://github.com/crimx/ext-saladict/commit/2ad9269))
* **selection:** get target on mousedown ([248578d](https://github.com/crimx/ext-saladict/commit/248578d))
* **selection:** track same selection ([bbdbcbf](https://github.com/crimx/ext-saladict/commit/bbdbcbf))
* **static:** fix [#99](https://github.com/crimx/ext-saladict/issues/99) fanyi.youdao bypass http request ([fe84550](https://github.com/crimx/ext-saladict/commit/fe84550))
* **static:** use browser instead of chrome ([3709e3f](https://github.com/crimx/ext-saladict/commit/3709e3f))
* **types:** fix typings ([f242fd3](https://github.com/crimx/ext-saladict/commit/f242fd3))


### Features

* **background:** add auto pronounce ([20a8a33](https://github.com/crimx/ext-saladict/commit/20a8a33))
* **background:** add search result typing ([76dc07b](https://github.com/crimx/ext-saladict/commit/76dc07b))
* **background:** context menus with i18n ([9e66f55](https://github.com/crimx/ext-saladict/commit/9e66f55))
* **background:** timeout searching ([d2bd4d4](https://github.com/crimx/ext-saladict/commit/d2bd4d4))
* **build:** add devbuild flag ([a5f2af0](https://github.com/crimx/ext-saladict/commit/a5f2af0))
* **component:** add PortalFrame ([cbe2ddd](https://github.com/crimx/ext-saladict/commit/cbe2ddd))
* **components:** add word-phrase filter for WordPage ([29cf96a](https://github.com/crimx/ext-saladict/commit/29cf96a)), closes [#103](https://github.com/crimx/ext-saladict/issues/103)
* **components:** add WordPage ([0727db1](https://github.com/crimx/ext-saladict/commit/0727db1))
* **components:** add wordpage search text ([f4a61fd](https://github.com/crimx/ext-saladict/commit/f4a61fd))
* **components:** change Speaker to render nothing when no src ([5a50165](https://github.com/crimx/ext-saladict/commit/5a50165))
* **content:** add animation switch ([8c2939e](https://github.com/crimx/ext-saladict/commit/8c2939e))
* **content:** add component DictItem ([c600671](https://github.com/crimx/ext-saladict/commit/c600671))
* **content:** add component SaladBowl ([4200c19](https://github.com/crimx/ext-saladict/commit/4200c19))
* **content:** add content script entry ([a07519d](https://github.com/crimx/ext-saladict/commit/a07519d))
* **content:** add dict panel ([9a68f2c](https://github.com/crimx/ext-saladict/commit/9a68f2c))
* **content:** add i18n for menu bar ([b1a8c9e](https://github.com/crimx/ext-saladict/commit/b1a8c9e))
* **content:** add menu bar ([bf6b74f](https://github.com/crimx/ext-saladict/commit/bf6b74f))
* **content:** add menu bar search history ([5f33191](https://github.com/crimx/ext-saladict/commit/5f33191))
* **content:** add mouseevent on bowl ([44a37bd](https://github.com/crimx/ext-saladict/commit/44a37bd))
* **content:** add notebook ui logic ([dfd18ac](https://github.com/crimx/ext-saladict/commit/dfd18ac))
* **content:** add onhold ([6b0844e](https://github.com/crimx/ext-saladict/commit/6b0844e))
* **content:** add panel closing ([8a20f74](https://github.com/crimx/ext-saladict/commit/8a20f74))
* **content:** add panel dragging ([9682afc](https://github.com/crimx/ext-saladict/commit/9682afc))
* **content:** add redux store ([956d2af](https://github.com/crimx/ext-saladict/commit/956d2af))
* **content:** add related words ([25c6cf7](https://github.com/crimx/ext-saladict/commit/25c6cf7))
* **content:** add relationships between bowl and panel ([bd24060](https://github.com/crimx/ext-saladict/commit/bd24060))
* **content:** add saladbow redux container ([6699707](https://github.com/crimx/ext-saladict/commit/6699707))
* **content:** add search box text update ([2dc6bbc](https://github.com/crimx/ext-saladict/commit/2dc6bbc))
* **content:** add store dictionaries ([56ce6dc](https://github.com/crimx/ext-saladict/commit/56ce6dc))
* **content:** add store search text ([ff5c751](https://github.com/crimx/ext-saladict/commit/ff5c751))
* **content:** add triple ctrl ([69ae1c4](https://github.com/crimx/ext-saladict/commit/69ae1c4))
* **content:** add word editor ([9415cf0](https://github.com/crimx/ext-saladict/commit/9415cf0))
* **content:** connect word editor to main component ([38a566c](https://github.com/crimx/ext-saladict/commit/38a566c))
* **content:** delay mouse on bowl ([0aa1b90](https://github.com/crimx/ext-saladict/commit/0aa1b90))
* **content:** finish word editor feature ([c77978c](https://github.com/crimx/ext-saladict/commit/c77978c))
* **content:** intergrate content script into options page ([5c946f1](https://github.com/crimx/ext-saladict/commit/5c946f1))
* **content:** listen to edit word event ([9188f21](https://github.com/crimx/ext-saladict/commit/9188f21))
* **content:** move search logic together ([f7a1294](https://github.com/crimx/ext-saladict/commit/f7a1294))
* **content:** notify parents of hight changing ([1d90c45](https://github.com/crimx/ext-saladict/commit/1d90c45))
* **content:** setup files ([90c41c3](https://github.com/crimx/ext-saladict/commit/90c41c3))
* **content:** support important styling ([d150e45](https://github.com/crimx/ext-saladict/commit/d150e45))
* **content:** supprot max height ([deecdcc](https://github.com/crimx/ext-saladict/commit/deecdcc))
* **content:** sync panel height with dict item height ([a0d215a](https://github.com/crimx/ext-saladict/commit/a0d215a))
* **context-menus:** add youglish ([cd39f22](https://github.com/crimx/ext-saladict/commit/cd39f22))
* **dicts:** add %h hyphen joining ([311ae79](https://github.com/crimx/ext-saladict/commit/311ae79))
* **dicts:** add cambridge ([be329bd](https://github.com/crimx/ext-saladict/commit/be329bd))
* **dicts:** add helper ([09f929f](https://github.com/crimx/ext-saladict/commit/09f929f))
* **dicts:** add helpers ([999362c](https://github.com/crimx/ext-saladict/commit/999362c))
* **dicts:** add helpers ([428cd08](https://github.com/crimx/ext-saladict/commit/428cd08))
* **dicts:** add Longman ([90688b6](https://github.com/crimx/ext-saladict/commit/90688b6))
* **dicts:** add oald ([65b7327](https://github.com/crimx/ext-saladict/commit/65b7327))
* **dicts:** add webster learners dict ([6e0f1ee](https://github.com/crimx/ext-saladict/commit/6e0f1ee))
* **dicts:** add youdao ([57ec2b3](https://github.com/crimx/ext-saladict/commit/57ec2b3))
* **dicts:** fix longman style ([95f172e](https://github.com/crimx/ext-saladict/commit/95f172e))
* **dicts:** more robust google engine ([701d1d4](https://github.com/crimx/ext-saladict/commit/701d1d4))
* **helpers:** let openURL support ext based url ([e89eb54](https://github.com/crimx/ext-saladict/commit/e89eb54))
* **history:** add history entry ([750a51a](https://github.com/crimx/ext-saladict/commit/750a51a))
* **i18n:** loader accepts callback ([c9077b8](https://github.com/crimx/ext-saladict/commit/c9077b8))
* **locale:** add back and next ([97d7094](https://github.com/crimx/ext-saladict/commit/97d7094))
* **locales:** add locales ([10e9a2e](https://github.com/crimx/ext-saladict/commit/10e9a2e))
* **locales:** update options locales ([5fbc0d1](https://github.com/crimx/ext-saladict/commit/5fbc0d1))
* **manifest:** support dynamically generated iframes ([94ff5d4](https://github.com/crimx/ext-saladict/commit/94ff5d4)), closes [#106](https://github.com/crimx/ext-saladict/issues/106)
* **notebook:** add notebook entry ([b24c7db](https://github.com/crimx/ext-saladict/commit/b24c7db))
* **options:** add Acknowledgement ([578891a](https://github.com/crimx/ext-saladict/commit/578891a))
* **options:** add animation option ([4da7b31](https://github.com/crimx/ext-saladict/commit/4da7b31))
* **options:** add config import and export ([21d32d1](https://github.com/crimx/ext-saladict/commit/21d32d1))
* **options:** add displaying supported languages ([6bb345e](https://github.com/crimx/ext-saladict/commit/6bb345e))
* **options:** smart searching ([451860f](https://github.com/crimx/ext-saladict/commit/451860f))
* **options:** update options ([817a314](https://github.com/crimx/ext-saladict/commit/817a314))
* **options:** update options to the latest config ([6901f84](https://github.com/crimx/ext-saladict/commit/6901f84))
* **panel:** add error boundary for dict ([56e957d](https://github.com/crimx/ext-saladict/commit/56e957d))
* **panel:** add touch support ([2e856b4](https://github.com/crimx/ext-saladict/commit/2e856b4))
* **panel:** disable buttons in popup page ([2b80ea4](https://github.com/crimx/ext-saladict/commit/2b80ea4))
* **panel:** get all dict styles ([a80d0ac](https://github.com/crimx/ext-saladict/commit/a80d0ac))
* **panel:** integrate panel with popup page ([fddbc38](https://github.com/crimx/ext-saladict/commit/fddbc38))
* **panel:** open exteranl link ([9aaf70d](https://github.com/crimx/ext-saladict/commit/9aaf70d))
* **panel:** open url base on lang code ([efb5187](https://github.com/crimx/ext-saladict/commit/efb5187))
* **panel:** sticky header! pure css! ([e9490ac](https://github.com/crimx/ext-saladict/commit/e9490ac))
* **popup:** add temporary disabling dict panel ([7710e3c](https://github.com/crimx/ext-saladict/commit/7710e3c))
* **scss:** add scss globals ([af6e6df](https://github.com/crimx/ext-saladict/commit/af6e6df))
* **selection:** add double click detection ([1299bec](https://github.com/crimx/ext-saladict/commit/1299bec))
* **selection:** add get empty selection info ([9d01d9c](https://github.com/crimx/ext-saladict/commit/9d01d9c))
* **selection:** add noTypeField ([f395f8c](https://github.com/crimx/ext-saladict/commit/f395f8c))
* **selection:** detect esc key in all frames ([1e6ecc5](https://github.com/crimx/ext-saladict/commit/1e6ecc5))
* **test:** add snapshot testing ([0be395c](https://github.com/crimx/ext-saladict/commit/0be395c))
* **wordbook:** add database for words ([46c4327](https://github.com/crimx/ext-saladict/commit/46c4327))


### Performance Improvements

* **config:** refactor to get ride of cloneDeep ([d986b53](https://github.com/crimx/ext-saladict/commit/d986b53))
* **helpers:** use DOMParser which is 6 time faster ([157a929](https://github.com/crimx/ext-saladict/commit/157a929))
* **message:** change message type to typescript enum ([7682a1d](https://github.com/crimx/ext-saladict/commit/7682a1d))



# Changelog

[Unreleased]

[5.31.7] - 2017-12-18
### Added
- 使用 webRequest 拦截 PDF 请求

### Changed
- 钉住时快速查询不移动窗口
- 设置页面增加反馈链接

### Fixed
- 第二次打开浏览器右键菜单不显示
- 必应词典相关单词可点击

[5.30.0] - 2017-12-08
### Changed
- 可同时选择多个划词模式
- 工具栏“选项”按钮改为词典目录

### Fixed
- 修复词典标题点击跳转

[5.29.3] - 2017-11-29
### Added
- 单词记录同时保存上下文和来源
- 可编辑单词记录,可添加翻译和注释笔记
- 可自定义导出模板

### Changed
- 使用无限容量权限

### Fixed
- 编辑完后卡片响应
- 查词框输入后马上点添加生词出现不匹配

[5.28.1] - 2017-11-26
### Added
- 增加生词本

### Changed
- 可配置预加载内容(剪贴板或页面选中词)与自动开始查词,快捷查词可设置出现的位置

### Fixed
- 重构代码,减少耦合

[5.27.3] - 2017-11-23
### Added
- 增加有道分级网页翻译2.0(支持 HTTPS)
- 增加自动发音
- 增加查词历史记录
- 面板钉住时支持多种查词模式
- 必应词典无结果时增加相关词语
- 词带内部双击查词,点击单词链接也能直接查词
- 对抓取页面筛选节点以增强安全性
- 自身页面通信增加 page id 以解决冲突问题

### Changed
- 查看页面二维码移到地址栏旁的图标中
- Chrome 最低版本支持提升为 55 以提升性能与减少大小
- 重构代码以分散复杂度
- 二维码生成改用 vue-qriously 更轻盈

### Fixed
- 修复打开 PDF 时弹出框查词自动粘贴失效
- 修复 howjsay 相关词语获取
- 修复查词滚动错误

[5.19.1] - 2017-11-15
### Added
- 可配置双击时长

### Fixed
- 默认不显示词典以避免闪现

[5.18.5] - 2017-11-13
### Added
- 增加汉典
- 可配置词典只在某种语言下显示

### Fixed
- 修复繁体词典不能查简体字问题
- 修复默认收起的词典不能隐藏
- 更新 vuedraggable 修复拖动问题
- 延迟音频播放避免误触
- 每次查词滚动到顶端

[5.16.1] - 2017-10-28
### Added
- 添加 PDF 支持

### Fixed
- 修复通知框点击

[5.15.21] - 2017-10-26
### Changed
- 全不选时右键菜单隐藏

### Fixed
- 更新时才弹出通知
- 重构 event page,顶层只保留监听,加快加载速度
- 去掉 require.context,webpack 会自动生成路径

[5.15.19] - 2017-10-11
### Changed
- 重构事件监听
- 重构 chrome api wrap

### Fixed
- 点击发音
- 自动恢复 dom 挂载
- 更新 etymonline 词典

[5.15.14] - 2017-09-05
### Changed
- 弹出查词框时自动选中所有剪贴板内容
- 查词结构导出图片样式调整

[5.15.12] - 2017-09-02
### Fixed
- 修复 ctrl/⌘ 模式时切换窗口的问题
- 麦克米伦标题修复

### Changed
- 关闭自动查词

[5.15.9] - 2017-08-23
### Fixed
- 更新必应词典
- 修复拖动抖动问题
- 样式修补

### Changed
- 第一次安装时打开设置页面

[5.15.4] - 2017-08-10
### Fixed
- 词典样式
- 麦克米伦检测问题

[5.15.2] - 2017-08-06
### Added
- Macmillan 词典
- 海词词频分级
- 彩蛋

### Fixed
- 拖动问题
- 其它小修正

[5.12.8] - 2017-07-31
### Added
-  增加 Longman Business 词典

### Changed
- 只对剪贴板单个单词自动查词,多个单词会自动粘贴,但不开始查找,需要再按一下回车
- 使用懒加载性能大幅度优化,提取公共模块体积减少
- 更紧凑的架构设计,添加词典更简单

### Fixed
- 修复 Bing 发音问题

## [5.11.23] - 2017-07-13
### Added
- 增加两岸词典与国语辞典
- 增加点击图标弹出查词面板
- 查词结果可以导出图片,在绿色工具栏上可以看到

### Changed
- 二维码功能移到工具栏上

### Fixed
- i18n 带 fallback
- svg 属性迁就 html2canvas
- 设置页面开始连查两遍的问题
- 通过 `:root:root:root:root:root` 进一步增加元素权值
- 改为插到 body 末尾

## [5.7.20] - 2017-05-21
### Added
- 添加词源词典
- 右键添加有道词典、海词词典和金山词霸

### Security
- 增强稳定性

## [5.5.14] - 2017-05-15
### Changed
- 词典可默认不展开

## [5.5.12] - 2017-05-15
### Added
- 增加右键谷歌网页翻译
- 增加双语例句

## [5.3.9] - 2017-05-03
### Added
- 添加重置按钮
- 增加 Howjsay 发音

### Fixed
- 降低查词图标敏感度

## [5.1.6] - 2017-04-06
### Added
- 增加双击查词

### Fixed
- 减少动画加快显示
- 修复无法关闭
- 修复设置时高度不更新

## [5.0.0] - 2017-04-04
### Changed
- 全新重写,全面优化,性能大幅度提高。
- 词典可以增删排序。
- 新增多个词典。
- 右键支持更多词典搜索。
- 保留了置顶与拖动功能。
- 更好用的配置界面。
- 更多变化使用中发现吧。

## [4.1.1] - 2015-12-27
### Changed
- 在必应词典和 Urban Dictionary 基础上增加 Vocabulary.com 海词统计和 Howjsay ,释义发音更详细。
- 右键查词,选词后右键可直达牛津词典、韦氏词典、词源、谷歌翻译等等。
- 新增三种划词模式,适合各种强迫症。
- 连续按三次ctrl还可以直接查词,随时查词,无需再另开词典占内存啦。
- 词典界面可以拖动,还可以固定在网页上,看论文利器啊。
- 延迟响应时间,不容易误按,手残党福利。
- 保留了显示当前页面二维码功能(设置界面,鼠标悬停在 “Saladict”标题上)。
- 更多功能慢慢发现吧;D

## 3.0.1
### Changed
- 增加了划译开关
- 增加了 urban 词典的例子
- 增加了必应搜索图标
- 搜索图标右击可以变成翻译搜索
- 修复了几处错误并加速了结果显示

[Unreleased]: https://github.com/crimx/ext-saladict/compare/v5.31.7...HEAD
[5.31.7]: https://github.com/crimx/ext-saladict/compare/v5.30.0...v5.31.7
[5.30.0]: https://github.com/crimx/ext-saladict/compare/v5.28.3...v5.30.0
[5.29.3]: https://github.com/crimx/ext-saladict/compare/v5.28.1...v5.29.3
[5.28.1]: https://github.com/crimx/ext-saladict/compare/v5.27.3...v5.28.1
[5.27.3]: https://github.com/crimx/ext-saladict/compare/v5.19.1...v5.27.3
[5.19.1]: https://github.com/crimx/ext-saladict/compare/v5.18.5...v5.19.1
[5.18.5]: https://github.com/crimx/ext-saladict/compare/v5.16.1...v5.18.5
[5.16.1]: https://github.com/crimx/ext-saladict/compare/v5.15.21...v5.16.1
[5.15.21]: https://github.com/crimx/ext-saladict/compare/v5.15.19...v5.15.21
[5.15.19]: https://github.com/crimx/ext-saladict/compare/v5.15.14...v5.15.19
[5.15.14]: https://github.com/crimx/ext-saladict/compare/v5.15.12...v5.15.14
[5.15.12]: https://github.com/crimx/ext-saladict/compare/v5.15.9...v5.15.12
[5.15.9]: https://github.com/crimx/ext-saladict/compare/v5.15.4...v5.15.9
[5.15.4]: https://github.com/crimx/ext-saladict/compare/v5.15.2...v5.15.4
[5.15.2]: https://github.com/crimx/ext-saladict/compare/v5.12.8...v5.15.2
[5.12.8]: https://github.com/crimx/ext-saladict/compare/v5.11.23...v5.12.8
[5.11.23]: https://github.com/crimx/ext-saladict/compare/v5.7.20...v5.11.23
[5.7.20]: https://github.com/crimx/ext-saladict/compare/v5.5.14...v5.7.20
[5.5.14]: https://github.com/crimx/ext-saladict/compare/v5.5.12...v5.5.14
[5.5.12]: https://github.com/crimx/ext-saladict/compare/v5.3.9...v5.5.12
[5.3.9]: https://github.com/crimx/ext-saladict/compare/v5.1.6...v5.3.9
[5.1.6]: https://github.com/crimx/ext-saladict/compare/v5.0.0...v5.1.6
[5.0.0]: https://github.com/crimx/ext-saladict/compare/v4.1.1...v5.0.0
[4.1.1]: https://github.com/crimx/ext-saladict/tree/v4.1.1


================================================
FILE: CONTRIBUTING-zh.md
================================================
# 沙拉查词贡献指南

:+1::tada: 首先,感谢你愿意抽时间为这个项目作贡献! :tada::+1:

## 贡献前注意

:warning: 除非是小的修复,在动手前建议新开一个 WIP(施工中)issue 或 PR 阐述你要做的东西以及将要如何实现,以保证大家达成一致认识,而不白白浪费互相的时间与精力。

- 先阅读 [如何开始](#如何开始).
- 遵循[代码格式](#代码格式)以及 [commit 格式](#commit格式).
- 提交前先本地跑[测试](#测试)以及[构建](#构建)。也可以交给 CI 处理。

## 如何开始

```bash
git clone git@github.com:crimx/ext-saladict.git
cd ext-saladict
yarn install
yarn pdf
```

在项目根添加 `.env` 文件,参考 `.env.example` 格式(可留空如果你不需要这些词典)。

## 修改 UI

运行 `yarn fixtures` 下载测试文件(下载完成以后不必再运行)。

运行 `yarn storybook` 查看所有 UI 组件。

运行 `yarn start --wextentry [entry id]` 查看特定入口。项目会运行在 Webpack 开发服务器下的虚拟扩展环境中。

## 测试

运行 `yarn test`。支持所有 Jest [参数](https://jestjs.io/docs/en/cli)。

## 构建

运行 `yarn build`。

参数:

- `--debug`: 取消压缩代码并输出源码映射(map)文件。
- `--analyze`: 显示打包分析图。

## 如何添加词典

出于安全性和可维护性,沙拉查词不提供热添加词典的功能,所有的词典添加必须向本项目提交 PR 合并。如果词典使用了未公开接口请另起项目发布到 NPM 再引用进来。

1. 在 [`src/components/dictionaries/`](./src/components/dictionaries/) 下以词典 id 新建一个目录。
   1. 可参考已有的词典如[必应](./src/components/dictionaries/bing),复制文件到新建的目录中。
   1. 把图标换成该词典的 LOGO。
   1. 编辑 `config.ts` 修改词典默认设置。参见 `DictItem` 类型查看选项含义。在 [app config](./src/app-config/dicts.ts) 中注册词典让 TypeScript 生成正确的类型。词典 **必须** 遵循字母表顺序。
   1. 更新 `_locales.json` 添加多语言的词典名字。如果词典有自定义选项请一并添加多语言的名字。
   1. `engine.ts` **必须** `export` 至少两个函数:
      1. `getSrcPage` 函数。当用户点击词典标题时计算出相应的链接。
      1. `search` 函数。负责获取、解析和返回词典结果,可参考类型了解细节。
         - 从网页中解析信息 **必须** 使用 [../helpers.ts](./components/dictionaries/helpers.ts) 中的辅助方法以保证数据干净。
         - 如果词典支持自动发音:
           1. 在 [`config.autopron`](https://github.com/crimx/ext-saladict/blob/a88cfed84129418b65914351ca14b86d7b1b758b/src/app-config/index.ts#L202-L223) 中注册 id。
           2. 在返回的结果中附带 [`audio`](https://github.com/crimx/ext-saladict/blob/a88cfed84129418b65914351ca14b86d7b1b758b/src/typings/server.ts#L5-L9) 域。
      1. 其它 `export` 的方法可以在 `View.tsx` 中通过 `'DICT_ENGINE_METHOD'` 通信通道调用。类型细节见 `src/typings/message`。也可以在项目中搜索 `DICT_ENGINE_METHOD` 查看例子。通信 **必须** 通过 `'@/_helpers/browser-api'` 的 `message` 而不是原生的 `sendMessage` 方法.
   1. 词典结果最终会传到 `View.tsx` 中的 React 组件中。该组件 **应该** 只负责渲染结果而不带复杂逻辑。
   1. `_style.scss` 中的选择器 **应该** 遵循类似 [ECSS](http://ecss.io/chapter5.html#anatomy-of-the-ecss-naming-convention) 的命名方式。

### 热更新开发词典 UI 组件

为了方便在 Storybook 中开发组件我们需要拦截词典引擎的网络请求返回本地文件。

1. 新建 `fixtures.js` 在 `test/specs/components/dictionaries/[dictID]` 下。
   - 格式可参考其它词典。
   - 每个请求可以提供页面链接或者 axios 设置(见 `mojidict` 词典)。如果后面的请求依赖前面请求的结果,可以通过参数获得。
1. 运行 `yarn fixtures` 下载结果。
1. 编辑 `test/specs/components/dictionaries/[dictID]/request.mock.ts`。它会在开发时拦截词典请求并返回下载好的结果。
1. 运行 `yarn storybook`。

### 添加测试

1. 添加 `[dictID]/engine.spec.ts` 测试引擎。

## 代码格式

本项目遵循 [Standard](https://standardjs.com) 的 TypeScript 变种格式。运行 `yarn lint` 可检查。

如果使用 VSCode 等 IDE 请确保 *eslint* 和 *prettier* 插件已安装。或者构建的时候也会进行 TypeScript 完整检查。

## Commit 格式

本项目遵循 [conventional](https://conventionalcommits.org/) commit 格式。

你可以在 commit 时运行 `yarn commit` 按指示选择。或者在 VSCode 中使用 [VSCode Conventional Commits](https://github.com/vivaxy/vscode-conventional-commits) 插件。


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Saladict

:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:

## How to Contribute

:warning: Unless it is a small hot fix, before you write any code and get your hands dirty, please open an issue or make a WIP pull request to elaborate what you are trying to do and how you are going to implement it. Just to make sure we are on the same page and nobody's time and effort are wasted.

- Read [How to get started](#how-to-get-started).
- Follow [code style](#code-style) and [commit style](#commit-style).
- Before submit, run [test](#testing) and [build](#building) locally. Or leave it to CI.

## How to get started

```bash
git clone git@github.com:crimx/ext-saladict.git
cd ext-saladict
yarn install
yarn pdf
```

Add a `.env` file following the `.env.example` format(leave empty if you don't use these dictionaries).

## UI Tweaking

Run `yarn fixtures` to download fixtures(only need to run once).

Run `yarn storybook` to view all the components.

Run `yarn start --wextentry [entry id]` to view a certain entry with WDS in a fake WebExtension environment.

## Testing

Run `yarn test` to run Jest. Supports all the Jest [options](https://jestjs.io/docs/en/cli).

## Building

Run `yarn build` to start a full build.

Toggle:

- `--debug`: Remove compression and generate sourcemaps.
- `--analyze`: Show detailed Webpack bundle analyzer.

## How to add a dictionary

For safety and maintainability reason, Saladict will not support adding dictionaries on the fly. All dictionaries must be merged to this project via pull requests.

If dictionary implementation makes use of private API please move it to an independent project, release on NPM, then import it to Saladict.

1. Create a directory at [`src/components/dictionaries/`](./src/components/dictionaries/), with the name of the dict ID.
   1. Use any existing dictionary as guidance, e.g. [Bing](./src/components/dictionaries/bing). Copy files to the new directory.
   1. Replace the favicon with a new LOGO.
   1. Edit `config.ts` to change default options. See the `DictItem` type and explanation for more details. Register the dictionary in [app config](./src/app-config/dicts.ts) so that TypeScript generates the correct typings. Dict ID **MUST** follow alphabetical order.
   1. Update `_locales.json` with the new dictionary name. Add locales for options, if any.
   1. `engine.ts` **MUST** export at least two functions:
      1. `getSrcPage` function which is responsible for generating source page url base on search text and app config. Source page url is opened when user clicks the dictionary title.
      1. `search` function which is responsible for fetching, parsing and returning dictionary results. See the typings for more detail.
         - Extracting information from a webpage **MUST** use helper functions in [../helpers.ts](./components/dictionaries/helpers.ts) for data cleansing.
         - If the dictionary supports pronunciation:
           1. Register the ID at [`config.autopron`](https://github.com/crimx/ext-saladict/blob/a88cfed84129418b65914351ca14b86d7b1b758b/src/app-config/index.ts#L202-L223).
           1. Include an [`audio`](https://github.com/crimx/ext-saladict/blob/a88cfed84129418b65914351ca14b86d7b1b758b/src/typings/server.ts#L5-L9) field in the object which search engine returns.
      1. Other exported functions can be called from `View.tsx` via `'DICT_ENGINE_METHOD'` message channel. See `src/typings/message` for typing details and search `DICT_ENGINE_METHOD` project-wise for examples. Messages **MUST** be sent via `message` from `'@/_helpers/browser-api'` instead of the native `sendMessage` function.
   1. Search result will ultimately be passed to a React PureComponent in `View.tsx`, which **SHOULD** be a dumb component that renders the result accordingly.
   1. Selectors in `_style.scss` **SHOULD** follow [ECSS](http://ecss.io/chapter5.html#anatomy-of-the-ecss-naming-convention)-ish naming convention.

### Develop the dictionary UI live

To develop the component in Storybook we need to intercept http requests from dictionary engines and replace with the downloaded results.

1. Add `fixtures.js` at `test/specs/components/dictionaries/[dictID]`.
   - See other dictionaries for example.
   - You can offer url or axios config (See `mojidict` dictionary). All results from previous requests will be passed to the next request as array.
1. Run `yarn fixtures` to download fixtures.
1. Edit `test/specs/components/dictionaries/[dictID]/request.mock.ts`. It will intercept requests and return the downloaded fixtures.
1. Run `yarn storybook`.

### Add Testing

1. Add `[dictID]/engine.spec.ts` to test the engine.

## Code Style

This project follows the TypeScript variation of [Standard](https://standardjs.com) JavaScript code style.

If you are using IDEs like VSCode, make sure *eslint* and *prettier* plugins are installed. Or you can just run [building command](#building) to perform a TypeScript full check.

## Commit Style

This project follows [conventional](https://conventionalcommits.org/) commit style.

You can run `yarn commit` and follow the instructions, or use [VSCode Conventional Commits](https://github.com/vivaxy/vscode-conventional-commits) extension in VSCode.


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 CRIMX

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: README-zh.md
================================================
# 沙拉查词 Saladict

[![Version](https://img.shields.io/github/release/crimx/ext-saladict.svg?label=version)](https://github.com/crimx/ext-saladict/releases)
[![Chrome Web Store](https://badgen.net/chrome-web-store/users/cdonnmffkdaoajfknoeeecmchibpmkmg?icon=chrome&color=0f9d58)](https://chrome.google.com/webstore/detail/cdonnmffkdaoajfknoeeecmchibpmkmg?hl=en)
[![Chrome Web Store](https://badgen.net/chrome-web-store/stars/cdonnmffkdaoajfknoeeecmchibpmkmg?icon=chrome&color=0f9d58)](https://chrome.google.com/webstore/detail/cdonnmffkdaoajfknoeeecmchibpmkmg?hl=en)
[![Mozilla Add-on](https://badgen.net/amo/users/ext-saladict?icon=firefox&color=ff9500)](https://addons.mozilla.org/firefox/addon/ext-saladict/)
[![Mozilla Add-on](https://badgen.net/amo/stars/ext-saladict?icon=firefox&color=ff9500)](https://addons.mozilla.org/firefox/addon/ext-saladict/)

[![Build Status](https://travis-ci.com/crimx/ext-saladict.svg)](https://travis-ci.com/crimx/ext-saladict)
[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg?maxAge=2592000)](http://commitizen.github.io/cz-cli/)
[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-brightgreen.svg?maxAge=2592000)](https://conventionalcommits.org)
[![Standard - JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg?maxAge=2592000)](https://standardjs.com/)
[![License](https://img.shields.io/github/license/crimx/ext-saladict.svg?colorB=44cc11?maxAge=2592000)](https://github.com/crimx/ext-saladict/blob/dev/LICENSE)

[【官网】](https://www.crimx.com/ext-saladict/)Chrome/Firefox 浏览器插件,网页划词翻译。

<p align="center">
  <a href="https://github.com/crimx/ext-saladict/releases/" target="_blank"><img src="https://raw.githubusercontent.com/wiki/crimx/ext-saladict/images/notebook.gif" /></a>
</p>

沙拉查词 7 为完全重写的版本。增加了更多细腻的动效与流畅的交互,更快速更稳定更多自定义设置。

## 下载

见[下载页面](https://saladict.crimx.com/download.html)。

## 改动日志

[CHANGELOG.md](./CHANGELOG.md)

## 从源码构建

```bash
git clone git@github.com:crimx/ext-saladict.git
cd ext-saladict
yarn install
yarn pdf
```

在项目根添加 `.env` 文件,参考 `.env.example` 格式(可留空如果你不需要这些词典)。

```bash
yarn build
```

在 `build/` 目录下可查看针对各个浏览器打包好的扩展包。

## 开发

见[项目贡献指南](./CONTRIBUTING-zh.md)。

## 如何向本项目贡献代码

见[项目贡献指南](./CONTRIBUTING-zh.md)。

## 声明

声明:沙拉查词作为自由开源的浏览器辅助插件,仅供学习交流,任何人均可免费获取产品与源码。如果认为你的合法权益收到侵犯请马上联系[作者](https://github.com/crimx)。

沙拉查词项目为 [MIT](https://github.com/crimx/ext-saladict/blob/dev/LICENSE) 许可,你可以随意使用源码,但必须附带该许可与版权声明。请勿用于任何违法犯罪行为,沙拉查词强烈谴责并会尽可能配合追究责任。对于照搬源码二次发布的套壳项目沙拉查词有责任对平台和用户发出相应的举报和提醒。

## 更多截图

<p align="center">
  <a href="https://github.com/crimx/ext-saladict/releases/" target="_blank"><img src="https://github.com/crimx/ext-saladict/wiki/images/youdao-page.gif" /></a>
</p>

<p align="center">
  <a href="https://github.com/crimx/ext-saladict/releases/" target="_blank"><img src="https://github.com/crimx/ext-saladict/wiki/images/screen-notebook.png" /></a>
</p>

<p align="center">
  <a href="https://github.com/crimx/ext-saladict/releases/" target="_blank"><img src="https://github.com/crimx/ext-saladict/wiki/images/pin.gif" /></a>
</p>


================================================
FILE: README.md
================================================
# Saladict 沙拉查词

[![Version](https://img.shields.io/github/release/crimx/ext-saladict.svg?label=version)](https://github.com/crimx/ext-saladict/releases)
[![Chrome Web Store](https://badgen.net/chrome-web-store/users/cdonnmffkdaoajfknoeeecmchibpmkmg?icon=chrome&color=0f9d58)](https://chrome.google.com/webstore/detail/cdonnmffkdaoajfknoeeecmchibpmkmg?hl=en)
[![Chrome Web Store](https://badgen.net/chrome-web-store/stars/cdonnmffkdaoajfknoeeecmchibpmkmg?icon=chrome&color=0f9d58)](https://chrome.google.com/webstore/detail/cdonnmffkdaoajfknoeeecmchibpmkmg?hl=en)
[![Mozilla Add-on](https://badgen.net/amo/users/ext-saladict?icon=firefox&color=ff9500)](https://addons.mozilla.org/firefox/addon/ext-saladict/)
[![Mozilla Add-on](https://badgen.net/amo/stars/ext-saladict?icon=firefox&color=ff9500)](https://addons.mozilla.org/firefox/addon/ext-saladict/)

[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg?maxAge=2592000)](http://commitizen.github.io/cz-cli/)
[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-brightgreen.svg?maxAge=2592000)](https://conventionalcommits.org)
[![Standard - JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg?maxAge=2592000)](https://standardjs.com/)
[![License](https://img.shields.io/github/license/crimx/ext-saladict.svg?colorB=44cc11?maxAge=2592000)](https://github.com/crimx/ext-saladict/blob/dev/LICENSE)

Chrome/Firefox WebExtension. Feature-rich inline translator with PDF support.

[【中文说明】](./README-zh.md)Chrome/Firefox 浏览器插件,网页划词翻译。

<p align="center">
  <a href="https://github.com/crimx/ext-saladict/releases/" target="_blank"><img src="https://raw.githubusercontent.com/wiki/crimx/ext-saladict/images/notebook.gif" /></a>
</p>

## Downloads

- [Chrome Web Store](https://chrome.google.com/webstore/detail/cdonnmffkdaoajfknoeeecmchibpmkmg?hl=en)
- [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/ext-saladict/)
- [Microsoft Edge Addons](https://microsoftedge.microsoft.com/addons/detail/idghocbbahafpfhjnfhpbfbmpegphmmp)(Uploaded by @rumosky)
- See [releases](https://github.com/crimx/ext-saladict/releases) for more.

Saladict 7 is a complete rewrite with sophisticated interaction and buttery smooth experience. Built for speed, stability and customization.

## Change Log

[CHANGELOG.md](./CHANGELOG.md)

## build from source

```bash
git clone git@github.com:crimx/ext-saladict.git
cd ext-saladict
yarn install
yarn pdf
```

Add a `.env` file following the `.env.example` format(leave empty if you don't use these dictionaries).

```bash
yarn build
```

Artifacts can be found in `build/`.

## Development

See the [contributing guide](./CONTRIBUTING.md).

## How can I contribute?

[CONTRIBUTING.md](./CONTRIBUTING.md)

## Notice

Saladict is a free and open-sourced project for study purpose only. Anyone can obtain a copy of Saladict free of charge. If you believe your legal rights have been violated please contact the [author](https://github.com/crimx) immediately.

Saladict is licensed under [MIT](https://github.com/crimx/ext-saladict/blob/dev/LICENSE). You can use the source code freely as long as including a copy of license and copyright notice of Saladict.

DO NOT use Saladict for any illegal or criminal activity. Saladict strongly condemns this behavior and will cooperate to the fullest extent possible in holding it accountable.

As for copy-and-paste clone products Saladict has the responsibility to send corresponding reports and warnings to platforms and users.

## More screenshots:

<p align="center">
  <a href="https://github.com/crimx/ext-saladict/releases/" target="_blank"><img src="https://github.com/crimx/ext-saladict/wiki/images/youdao-page.gif" /></a>
</p>

<p align="center">
  <a href="https://github.com/crimx/ext-saladict/releases/" target="_blank"><img src="https://github.com/crimx/ext-saladict/wiki/images/screen-notebook.png" /></a>
</p>

<p align="center">
  <a href="https://github.com/crimx/ext-saladict/releases/" target="_blank"><img src="https://github.com/crimx/ext-saladict/wiki/images/pin.gif" /></a>
</p>


================================================
FILE: assets/content.css
================================================
.saladict-div,
.saladict-div > .saladict-external,
.saladict-div > .saladict-panel {
  display: block !important;
  width: 0 !important;
  height: 0 !important;
  margin: 0 !important;
  padding: 0 !important;
  border: none !important;
  outline: none !important;
}


================================================
FILE: assets/fanyi.youdao.2.0/all-packed.css
================================================
html{_background:url(null) fixed;}.forbid-select{-moz-user-select:none;-khtml-user-select:none;user-select:none;}.OUTFOX_JTR_BAR{width:100%;margin:0;padding:0;border:none;position:fixed;z-index:2147483646;top:0;left:0;height:50px;_position:absolute;_top:expression((body.scrollTop+documentElement.scrollTop)+'px');}#OUTFOX_JTR_BAR_CLOSE_UPDATE_TIP{color:#429d3b;height:38px;width:200px;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/ydd_tip.png") left top no-repeat;overflow:hidden;text-align:left;margin:0 auto;display:none;position:relative;top:-31px;z-index:1;}#OUTFOX_JTR_BAR_CLOSE_UPDATE_TIP div{margin-left:5px;color:#429d3b;height:38px;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/ydd_tip.png") right top no-repeat;padding:3px 8px 3px 3px;}#OUTFOX_JTR_BAR_CLOSE_UPDATE_TIP .update-date{margin-left:20px;}#OUTFOX_JTR_BAR_UPDATE_SHADE{background-color:#818181;height:50px;left:0;position:absolute;top:0;width:100%;opacity:.75;filter:alpha(opacity = 75);display:none;}#OUTFOX_JTR_BAR_CLOSE_UPDATE_TIP_CONTENT_CLOSE{width:10px;height:10px;position:absolute;right:5px;top:5px;cursor:pointer;}.OUTFOX_JTR_BAR_CLOSE{display:block;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") -35px -69px no-repeat;width:17px;height:13px;position:absolute;top:1px;right:1px;cursor:pointer;}.OUTFOX_JTR_BAR_CLOSE:hover{background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") -56px -69px no-repeat;}#OUTFOX_JTR_BAR_BODY{margin:0;padding:0;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp-repeat-x.png") 0 -92px repeat-x;font-size:12px;height:50px;overflow:hidden;color:#6F6F6F;text-align:center;border:0;}#OUTFOX_JTR_BAR_BODY #wrapper{*width:960px;padding:0 10px;max-width:960px;margin:0 auto;text-align:left;}#OUTFOX_JTR_BAR_BODY .OUTFOX_BAR_TOTAL_NUM{font-family:Arial;font-size:18px;margin:0 5px;}#OUTFOX_JTR_BAR_BODY #headerLogo{background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/logo.png") no-repeat;text-indent:-999em;display:block;width:141px;height:41px;float:left;margin-top:7px;font-size:0;_background-image:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/header_logo.png");_margin-top:17px;}#OUTFOX_JTR_BAR_BODY #sliderLabel{float:left;margin:22px 0 0 20px;}#OUTFOX_JTR_BAR_BODY #sliderWrapper{float:left;margin-top:6px;position:relative;left:15px;width:269px;}#OUTFOX_JTR_BAR_BODY #levelLabel{position:relative;height:20px;}#OUTFOX_JTR_BAR_BODY #level-0{right:10px;}#OUTFOX_JTR_BAR_BODY #level-1{left:149px;}#OUTFOX_JTR_BAR_BODY #level-2{left:83px;}#OUTFOX_JTR_BAR_BODY #level-3{left:17px;}#OUTFOX_JTR_BAR_BODY #levelLabel label{position:absolute;cursor:pointer;color:#4E86CC;}#OUTFOX_JTR_BAR_BODY.disable #levelLabel label{color:#ccc;cursor:default;}#OUTFOX_JTR_BAR_BODY #levelLabel .active{color:#707070;cursor:default;font-weight:bold;}#OUTFOX_JTR_BAR_BODY #status{float:left;margin:20px 10px 0 20px;_margin-top:22px;}#OUTFOX_JTR_BAR_BODY .statistic #status{margin-top:16px;}#OUTFOX_JTR_BAR_BODY #switchWrapper{float:right;margin-top:16px;}#OUTFOX_JTR_BAR_BODY #feedback{margin:18px 0 0 15px;float:right;text-align:right;}#OUTFOX_JTR_BAR_BODY #feedback a{color:#4E86CC;text-decoration:none;}#OUTFOX_JTR_BAR_BODY #feedback #fb{color:#FF8D3D;}#OUTFOX_JTR_BAR_BODY #feedback a:hover{text-decoration:underline;}#OUTFOX_JTR_BAR_BODY a:link{color:#4E86CC;text-decoration:none;}#OUTFOX_JTR_BAR_BODY #switch{color:#4D86CC;background-image:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/switch_button.png");display:block;width:70px;height:23px;cursor:pointer;line-height:23px;text-align:center;text-decoration:none;}#OUTFOX_JTR_BAR_BODY #switch:hover{background-image:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/switch_button_hover.png");}.OUTFOX_JTR_TRANSTIP_WRAPPER{z-index:2147483640;max-width:300px;*width:300px;}.OUTFOX_JTR_TRANSTIP_WRAPPER p{padding:10px;margin:0;}.OUTFOX_JTR_TRANSTIP_ADVISE_TOGGLE{display:block;cursor:pointer;}.OUTFOX_JTR_TRANSTIP_ADVISE_THANK_TIP .OUTFOX_JTR_TRANSTIP_ADVISE_TOGGLE{display:none;}.OUTFOX_JTR_TRANSTIP_ADVISE_THANK{display:none;}.OUTFOX_JTR_TRANSTIP_ADVISE_THANK_TIP .OUTFOX_JTR_TRANSTIP_ADVISE_THANK{display:inline;}.expand .OUTFOX_JTR_TRANSTIP_ADVISE_TEXT{width:250px;height:50px;margin:10px 0 0;resize:none;}.OUTFOX_JTR_NANCI_BAR{position:absolute;text-decoration:none;overflow:hidden;background:#fff;border:1px solid #AFCEF5;padding-left:3px;z-index:2147483641;-webkit-box-shadow:2px 2px 2px #ccc;-moz-box-shadow:2px 2px 2px #ccc;box-shadow:2px 2px 2px #ccc;}.OUTFOX_JTR_NANCI_BAR a{cursor:pointer;text-decoration:none;text-indent:-999em;width:15px;height:15px;display:inline-block;}.OUTFOX_JTR_NANCI_CTRL_DETAIL_BG{_width:15px;_height:15px;_zoom:1;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/icon_detail.png");}.OUTFOX_JTR_NANCI_CTRL_CLOSE_BG{_width:15px;_height:15px;_zoom:1;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/icon_delete.png");}.OUTFOX_JTR_NANCI_CTRL_DETAIL{_position:absolute;_margin-left:-8px;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") 0 -68px no-repeat;_background-image:none;}.OUTFOX_JTR_NANCI_CTRL_CLOSE{_position:absolute;_margin-left:-6px;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") -13px -70px no-repeat;_background-image:none;}.OUTFOX_JTR_TRANSTIP_ORIGIN .OUTFOX_JTR_TRANSTIP_ADVISE{padding-bottom:14px;}.OUTFOX_JTR_TRANSTIP_ADVISE_TEXT,.OUTFOX_JTR_TRANSTIP_ADVISE_SUBMIT{display:none;}.expand .OUTFOX_JTR_TRANSTIP_ADVISE_TEXT,.expand .OUTFOX_JTR_TRANSTIP_ADVISE_SUBMIT{display:block;}.finish .OUTFOX_JTR_TRANSTIP_ADVISE_TEXT,.finish .OUTFOX_JTR_TRANSTIP_ADVISE_SUBMIT{display:block;visibility:hidden;}div.expand a.OUTFOX_JTR_TRANSTIP_ADVISE_SUBMIT{background-image:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/trans_tip_submit_bg.png");width:96px;height:23px;line-height:23px;text-align:center;cursor:pointer;float:right;margin-top:10px;outline:none;text-decoration:none;}div.expand a.OUTFOX_JTR_TRANSTIP_ADVISE_SUBMIT:hover{background-image:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/trans_tip_submit_bg_hover.png");}.OUTFOX_NANCI_TIPS{white-space:nowrap;}.OUTFOX_JTR_NANCI_CTRL_WORD{color:#000;margin-right:5px;}#OUTFOX_JTR_BAR_BODY #failed{line-height:50px;}#OUTFOX_BAR_WRAPPER iframe.OUTFOX_JTR_BAR_HIDE{display:none;}*html .OUTFOX_JTR_TRANSTIP_WRAPPER .ydd-bg-bottom,*html .OUTFOX_JTR_TRANSTIP_WRAPPER .ydd-bg-top{width:300px;}*html .OUTFOX_JTR_TRANSTIP_WRAPPER{width:300px;border-width:0 1px;border-color:#d9d9d9;border-style:solid;}#yddWrapper{z-index:2147483640;max-width:280px;display:none;}.ydd-container *{padding:0;margin:0;font-size:12px;color:#2A2A2A;}.ydd-container{display:block;position:relative;width:100%;height:100%;font-size:12px;text-align:left;opacity:.95;*filter:alpha(opacity = 95);*background-color:#FFF;}.ydd-container div{display:block;float:none;}.ydd-container a{color:#4E86CC;}.ydd-container a:link{text-decoration:none;}.ydd-container a:hover{text-decoration:underline;}.ydd-body-wrapper{position:relative;padding:0 5px 0 6px;*background-color:transparent;}.ydd-body{padding:0 15px 10px;overflow:hidden;background-color:#fff;*background-color:transparent;}.ydd-lb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAoCAYAAADdaosOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTUvMTDB0g89AAAANklEQVQoke3LsQ0AIAgF0YOEwsbZnPQPxSK6ALRWXPtyAA4EsIAt6WTmdZpKMLMa2mNgYOAbPAs0Bm/LtPJAAAAAAElFTkSuQmCC);*background-image:none;background-repeat:repeat-y;background-position:left 0;width:6px;height:100%;position:absolute;left:0;top:0;}.ydd-rb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAoCAYAAADdaosOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTUvMTDB0g89AAAANElEQVQoke3JoREAIAwEwQuDwKDov7AvJhMaCBrzJ2/JzJJUwAE2sIA5IoKuN7TXYDB8hwuIjQgBYxgxJgAAAABJRU5ErkJggg==);*background-image:none;background-repeat:repeat-y;background-position:right 0;width:6px;height:100%;position:absolute;right:0;top:0;}.ydd-top-wrapper{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAUCAYAAAC07qxWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMC8xNS8xMMHSDz0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAA2ElEQVQokcWQMY6DMBRE37etSAsFot8bUFPlAjlDjrIHyFFyAK7henuKPQAIEAhHeBsnIsFC0TY70sguxuOZEe8970AAE+4+kMiJBg7hwSufoIEPQL0ItsKqqk55nvfWWrfnKHVde+cczrmfYRiuZVlegFvgcqc0TeO11izLQtd1tG37XRTFEXBrsRrHkb7vmaaJJEnIsqyw1n6F/PfsKBFBRPDeM88zxhjSND0H0aOkUUptxtVaf67dAIzIpuCj6HqBqGNky/jXEdddxye8L9wp80fH/8v4C8bURyFzKYfYAAAAAElFTkSuQmCC);*background-image:none;background-repeat:no-repeat;background-position:right 0;padding-right:10px;height:20px;}.ydd-top{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVAAAAAUCAYAAADbVmUXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZFJREFUeNrs2ktKw1AYhuFzSaIQLGRkRqEjR67A7Th1Irq0LqILElpDk3jS5nJ6/C0WYgn2fSAE21ILhZePpLppGtXSWiuB+CAAzNBf9ar58R8KAdXCB9IEFcDMRRMHsxEC2pwKqB9K6QCAubqZeHVKx1FE/YD2gTRdLE0QT8MKBTBj6cTr0z9q7zy8LgxoH03rnY0QUwCYm2zi5Vl3R9U9V4UR9a8Z6CCa0Wq1eiqK4jmO40djzD3fD4B/HtDePpxuYH66864bmd9uJvkL1HrxjNfr9Uue5+9pmqokSZS1lq8HwLUEVPVtdOet6+NWiqi4QNvlmWXZ62KxUFVVqc1mM7wZAFwT177bboXuwp97SgE1y+XyzcXTlmU5Pqm59Ang+rTt6yL6cfhzXKFiQKMoejDGEE0AOKxQK43JMKD7O+7uBXdtQAEAQx9PBvQIAQWAYYGq3wR0+J0nAQWA8wLKAgWAQF3XQzgJKACc6ayAcgceAMYeskAB4BILlIACAAEFgMsGlGugADD2UArolwADAA7gcFvj3gN0AAAAAElFTkSuQmCC);*background-image:none;background-repeat:no-repeat;background-position:left 0;height:20px;*width:240px;}.ydd-bottom-wrapper{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAeCAYAAAAVdY8wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTUvMTDB0g89AAAArElEQVQ4jeWUsQ3CMBBFX4AJEDukSJ2K/SgYhI3oU2SBFCnC4X8UOGCSECgoEJx0siw/ve9z4azrOmdQVVWR5/kGOAEGnFfuI26y3gclfdj4n9E/Ncz3RnvsWTA98FfgvDGEUANKrSNQEm3bHiLYw4/R7o6ZHcuy3AEhtS4kIQkzq5um2RdFsQXOEbzdMwPWcdNHhcR2j+b6bfgA9hTqQUum8ydNBiwHbze1cgH57aT/yHsyngAAAABJRU5ErkJggg==);*background-image:none;background-repeat:no-repeat;background-position:right 0;padding-right:10px;height:30px;}.ydd-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU8AAAAeCAYAAACsaJwUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTUvMTDB0g89AAABXklEQVR4nO3dPY7TUBQF4PNshxSp0qVgB5Qp0rMMNkFHwYIowyqoUqJkJaTEpsAWJmQG6RWTjPJ90pOVn+JWR+e6eSVJk6RN0iVZ7Pf799vt9utmswkA13VP/TAMw0vOAfCqCE+AClfDcxiG9H3/0rMAvBqaJ0AF4QlQwdoOUEHzBKggPAEqWNsBKmieABU0T4AKmidABeEJUMHaDlBB8wSoIDwBKljbASpongAVpvAcxpOmaYZEeAI8p8sYmqNBeAL8X5uk5PclcCVJs16vf+x2u49N09x2MoA7VvInPKcbNN+cTqfvy+Xy7U0nA7hjl+88+yQ/z+fzl67rPmmfANeV/N0+m4z3tx+Px2+LxeJdKeWW8wHcpTJ7TuHZjqc7HA6fV6vVh7ZtrfAAM/PwvGygU4hOn8vs/wAPbf7Oc9LPvuvzb3AKUODhXQZheeLkyhPgYV0LwufCUnACJPkFXHpxDgJO4nYAAAAASUVORK5CYII=);*background-image:none;background-repeat:no-repeat;background-position:left 0;height:30px;_line-height:24px;line-height:24px;padding:0 15px;*width:210px;}.ydd-key-title{font-size:13px;font-weight:bold;}.ydd-phonetic{font-family:"lucida sans unicode",arial,sans-serif;color:#999;}.ydd-base-trans .ydd-tabs{display:none;}.ydd-trans-wrapper{margin:5px 0;}.ydd-trans-wrapper a{color:#999;}.ydd-tabs{background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/swipe_hr.png") 0 9px no-repeat;margin:5px 0;}.ydd-tab{color:#707070;background:#fff;padding-right:5px;}.ydd-voice{margin:0 5px;}.ydd-no-result{margin-top:7px;}html* .ydd-bg-top{background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp-repeat-x.png") 0 0 repeat-x;width:280px;height:40px;position:absolute;z-index:-1;top:0;left:0;}html* .ydd-bottom-wrapper{background:url(chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp-repeat-x.png) 0 -46px repeat-x;}html* #yddWrapper{width:280px;border-width:0 1px;border-color:#d9d9d9;border-style:solid;}html* .OUTFOX_JTR_TRANSTIP_WRAPPER #yddWrapper,html* .OUTFOX_JTR_TRANSTIP_WRAPPER .ydd-bg-bottom,html* .OUTFOX_JTR_TRANSTIP_WRAPPER .ydd-bg-top{width:300px;}html* .ydd-title{line-height:14px;}.slider-container{height:9px;width:269px;margin:0;cursor:pointer;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") 0 -56px no-repeat;_background-image:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/slider_bg.png");}.disable .slider-container{cursor:default;}#sliderBackground{width:0;overflow:hidden;}.slider-background{height:100%;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") 0 -23px no-repeat;_background-image:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/slider_bar.png");}.disable .slider-background{background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") 0 -39px no-repeat;_background-image:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/slider_bar_gray.png");}.slider{display:block;height:20px;width:75px;top:14px;position:absolute;background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") 0 0 no-repeat;_background-image:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/slider.png");cursor:pointer;}.slider:hover{background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") -157px 0 no-repeat;_background-image:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/slider_hover.png");}.disable .slider,.disable .slider:hover{background:url("chrome-extension://__MSG_@@extension_id__/assets/fanyi.youdao.2.0/bar-sp.png") -78px 0 no-repeat;_background-image:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled = true,sizingMethod = image,src = "http://shared.ydstatic.com/jtr/v1/images/slider_gray.png");}


================================================
FILE: assets/fanyi.youdao.2.0/conn.html
================================================

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script type="text/javascript" src="../browser-polyfill.min.js"></script>
<script type="text/javascript" src="./conn.js"></script>
</head>
<body></body>
</html>


================================================
FILE: assets/fanyi.youdao.2.0/conn.js
================================================
if (!this.JSON) {
  this.JSON = {};
}
/**
* JSON 解析库
*/
(function() {
  function f(n) {
      return n < 10 ? '0' + n : n;
  }

  if (typeof Date.prototype.toJSON !== 'function') {
      Date.prototype.toJSON = function(key) {
          return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' +
                  f(this.getUTCMonth() + 1) + '-' +
                  f(this.getUTCDate()) + 'T' +
                  f(this.getUTCHours()) + ':' +
                  f(this.getUTCMinutes()) + ':' +
                  f(this.getUTCSeconds()) + 'Z' : null;
      };
      String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function(key) {
          return this.valueOf();
      };
  }
  var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta = {'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;

  function quote(string) {
      escapable.lastIndex = 0;
      return escapable.test(string) ? '"' + string.replace(escapable, function(a) {
          var c = meta[a];
          return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
      }) + '"' : '"' + string + '"';
  }

  function str(key, holder) {
      var i,k,v,length,mind = gap,partial,value = holder[key];
      if (value && typeof value === 'object' && typeof value.toJSON === 'function') {
          value = value.toJSON(key);
      }
      if (typeof rep === 'function') {
          value = rep.call(holder, key, value);
      }
      switch (typeof value) {case'string':return quote(value);case'number':return isFinite(value) ? String(value) : 'null';case'boolean':case'null':return String(value);case'object':if (!value) {
          return'null';
      }
          gap += indent;partial = [];if (Object.prototype.toString.apply(value) === '[object Array]') {
              length = value.length;
              for (i = 0; i < length; i += 1) {
                  partial[i] = str(i, value) || 'null';
              }
              v = partial.length === 0 ? '[]' : gap ? '[\n' + gap +
                      partial.join(',\n' + gap) + '\n' +
                      mind + ']' : '[' + partial.join(',') + ']';
              gap = mind;
              return v;
          }
          if (rep && typeof rep === 'object') {
              length = rep.length;
              for (i = 0; i < length; i += 1) {
                  k = rep[i];
                  if (typeof k === 'string') {
                      v = str(k, value);
                      if (v) {
                          partial.push(quote(k) + (gap ? ': ' : ':') + v);
                      }
                  }
              }
          } else {
              for (k in value) {
                  if (Object.hasOwnProperty.call(value, k)) {
                      v = str(k, value);
                      if (v) {
  
Download .txt
gitextract_w8wgf1mm/

├── .browserslistrc
├── .editorconfig
├── .eslintrc.js
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── _bug_report_chs.md
│   │   ├── _feature_request_chs.md
│   │   ├── _new_dict_chs.md
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   └── feature_request.md
│   ├── config.yml
│   └── no-response.yml
├── .gitignore
├── .neutrinorc.js
├── .prettierrc
├── .storybook/
│   ├── addons.ts
│   ├── config.ts
│   ├── configs/
│   │   └── contexts.tsx
│   ├── manager-head.html
│   ├── preview-head.html
│   ├── style.css
│   └── webpack.config.js
├── .travis.yml
├── .vscode/
│   ├── locales.schema.json
│   └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING-zh.md
├── CONTRIBUTING.md
├── LICENSE
├── README-zh.md
├── README.md
├── assets/
│   ├── content.css
│   ├── fanyi.youdao.2.0/
│   │   ├── all-packed.css
│   │   ├── conn.html
│   │   ├── conn.js
│   │   └── main.js
│   ├── google-page-trans.js
│   ├── inject-dict-panel.js
│   └── vimium-c-injector.js
├── commitlint.config.js
├── config/
│   └── jest/
│       ├── cssTransform.js
│       ├── fileTransform.js
│       └── setupTests.js
├── jest.config.js
├── jsconfig.json
├── mac-app/
│   └── Saladict - Pop-up Dictionary and Page Translator/
│       ├── Saladict - Pop-up Dictionary and Page Translator/
│       │   ├── AppDelegate.swift
│       │   ├── Assets.xcassets/
│       │   │   ├── AccentColor.colorset/
│       │   │   │   └── Contents.json
│       │   │   ├── AppIcon.appiconset/
│       │   │   │   └── Contents.json
│       │   │   └── Contents.json
│       │   ├── Base.lproj/
│       │   │   └── Main.storyboard
│       │   ├── Info.plist
│       │   ├── Saladict___Pop_up_Dictionary_and_Page_Translator.entitlements
│       │   └── ViewController.swift
│       ├── Saladict - Pop-up Dictionary and Page Translator Extension/
│       │   ├── Info.plist
│       │   ├── SafariWebExtensionHandler.swift
│       │   └── Saladict___Pop_up_Dictionary_and_Page_Translator_Extension.entitlements
│       └── Saladict - Pop-up Dictionary and Page Translator.xcodeproj/
│           ├── project.pbxproj
│           ├── project.xcworkspace/
│           │   ├── contents.xcworkspacedata
│           │   ├── xcshareddata/
│           │   │   └── IDEWorkspaceChecks.plist
│           │   └── xcuserdata/
│           │       └── crimx.xcuserdatad/
│           │           └── UserInterfaceState.xcuserstate
│           └── xcuserdata/
│               └── crimx.xcuserdatad/
│                   └── xcschemes/
│                       └── xcschememanagement.plist
├── package.json
├── postcss.config.js
├── scripts/
│   ├── after-build.js
│   ├── build.js
│   ├── firefox-fix.js
│   ├── fixtures.js
│   ├── pdf.js
│   ├── setup-env.js
│   ├── start.js
│   ├── style-extractor.js
│   └── test.js
├── src/
│   ├── _helpers/
│   │   ├── __mocks__/
│   │   │   ├── browser-api.ts
│   │   │   ├── config-manager.ts
│   │   │   └── selection.ts
│   │   ├── analytics/
│   │   │   ├── events.ts
│   │   │   └── index.ts
│   │   ├── browser-api.ts
│   │   ├── check-update.ts
│   │   ├── chs-to-chz.ts
│   │   ├── config-manager.ts
│   │   ├── dom.ts
│   │   ├── fetch-dom.ts
│   │   ├── getSuggests.ts
│   │   ├── hooks.ts
│   │   ├── i18n.ts
│   │   ├── injectSaladictInternal.ts
│   │   ├── integrity.ts
│   │   ├── lang-check.ts
│   │   ├── matchPatternToRegExpStr.ts
│   │   ├── observables.ts
│   │   ├── permission-manager.ts
│   │   ├── profile-manager.ts
│   │   ├── promise-more.ts
│   │   ├── record-manager.ts
│   │   ├── saladict.ts
│   │   ├── scrollbar-width.ts
│   │   ├── storybook.tsx
│   │   ├── titlebar-offset.ts
│   │   ├── translateCtx.ts
│   │   ├── uniqueKey.ts
│   │   └── wordoftheday.ts
│   ├── _locales/
│   │   ├── en/
│   │   │   ├── background.ts
│   │   │   ├── common.ts
│   │   │   ├── content.ts
│   │   │   ├── langcode.ts
│   │   │   ├── menus.ts
│   │   │   ├── options.ts
│   │   │   ├── popup.ts
│   │   │   └── wordpage.ts
│   │   ├── es/
│   │   │   ├── background.ts
│   │   │   ├── common.ts
│   │   │   ├── content.ts
│   │   │   ├── langcode.ts
│   │   │   ├── menus.ts
│   │   │   ├── options.ts
│   │   │   ├── popup.ts
│   │   │   └── wordpage.ts
│   │   ├── manifest/
│   │   │   ├── en/
│   │   │   │   └── messages.json
│   │   │   ├── np/
│   │   │   │   └── messages.json
│   │   │   ├── zh_CN/
│   │   │   │   └── messages.json
│   │   │   └── zh_TW/
│   │   │       └── messages.json
│   │   ├── ne/
│   │   │   ├── background.ts
│   │   │   ├── common.ts
│   │   │   ├── content.ts
│   │   │   ├── langcode.ts
│   │   │   ├── menus.ts
│   │   │   ├── options.ts
│   │   │   ├── popup.ts
│   │   │   └── wordpage.ts
│   │   ├── zh-CN/
│   │   │   ├── background.ts
│   │   │   ├── common.ts
│   │   │   ├── content.ts
│   │   │   ├── langcode.ts
│   │   │   ├── menus.ts
│   │   │   ├── options.ts
│   │   │   ├── popup.ts
│   │   │   └── wordpage.ts
│   │   └── zh-TW/
│   │       ├── background.ts
│   │       ├── common.ts
│   │       ├── content.ts
│   │       ├── langcode.ts
│   │       ├── menus.ts
│   │       ├── options.ts
│   │       ├── popup.ts
│   │       └── wordpage.ts
│   ├── _sass_shared/
│   │   ├── _fancy-scrollbar.scss
│   │   ├── _global/
│   │   │   ├── _interfaces.scss
│   │   │   ├── _mixins.scss
│   │   │   ├── _variables.scss
│   │   │   └── _z-indices.scss
│   │   ├── _namespace.scss
│   │   ├── _reset.scss
│   │   └── _theme.scss
│   ├── app-config/
│   │   ├── auth.ts
│   │   ├── context-menus.ts
│   │   ├── dicts.ts
│   │   ├── index.ts
│   │   ├── merge-config.ts
│   │   ├── merge-profile.ts
│   │   └── profiles.ts
│   ├── audio-control/
│   │   ├── audio-control.scss
│   │   └── index.tsx
│   ├── background/
│   │   ├── __fake__/
│   │   │   └── env.ts
│   │   ├── __mocks__/
│   │   │   └── database.ts
│   │   ├── audio-manager.ts
│   │   ├── badge.ts
│   │   ├── clipboard-manager.ts
│   │   ├── context-menus.ts
│   │   ├── database/
│   │   │   ├── core.ts
│   │   │   ├── index.ts
│   │   │   ├── read.ts
│   │   │   ├── sync-meta.ts
│   │   │   └── write.ts
│   │   ├── env.ts
│   │   ├── i18n-manager.ts
│   │   ├── index.ts
│   │   ├── initialization.ts
│   │   ├── page-translate/
│   │   │   └── caiyun.ts
│   │   ├── pdf-sniffer.ts
│   │   ├── server.ts
│   │   ├── sync-manager/
│   │   │   ├── __mocks__/
│   │   │   │   └── helpers.ts
│   │   │   ├── helpers.ts
│   │   │   ├── index.ts
│   │   │   ├── interface.ts
│   │   │   └── services/
│   │   │       ├── ankiconnect/
│   │   │       │   ├── _locales/
│   │   │       │   │   ├── en.ts
│   │   │       │   │   ├── zh-CN.ts
│   │   │       │   │   └── zh-TW.ts
│   │   │       │   └── index.ts
│   │   │       ├── eudic/
│   │   │       │   ├── _locales/
│   │   │       │   │   ├── en.ts
│   │   │       │   │   ├── zh-CN.ts
│   │   │       │   │   └── zh-TW.ts
│   │   │       │   └── index.ts
│   │   │       ├── shanbay/
│   │   │       │   ├── _locales/
│   │   │       │   │   ├── en.ts
│   │   │       │   │   ├── zh-CN.ts
│   │   │       │   │   └── zh-TW.ts
│   │   │       │   └── index.ts
│   │   │       └── webdav/
│   │   │           ├── _locales/
│   │   │           │   ├── en.ts
│   │   │           │   ├── zh-CN.ts
│   │   │           │   └── zh-TW.ts
│   │   │           └── index.ts
│   │   ├── types.ts
│   │   └── windows-manager.ts
│   ├── components/
│   │   ├── AntdRoot/
│   │   │   ├── AntdRootContainer.tsx
│   │   │   ├── _style.scss
│   │   │   └── index.tsx
│   │   ├── EntryBox/
│   │   │   ├── EntryBox.scss
│   │   │   ├── EntryBox.stories.tsx
│   │   │   └── index.tsx
│   │   ├── ErrorBoundary.tsx
│   │   ├── FloatBox/
│   │   │   ├── FloatBox.scss
│   │   │   ├── FloatBox.stories.tsx
│   │   │   └── index.tsx
│   │   ├── HoverBox/
│   │   │   ├── HoverBox.scss
│   │   │   └── index.tsx
│   │   ├── MachineTrans/
│   │   │   ├── MachineTrans.scss
│   │   │   ├── MachineTrans.stories.tsx
│   │   │   ├── MachineTrans.tsx
│   │   │   └── engine.ts
│   │   ├── ShadowPortal/
│   │   │   ├── ShadowPortal.scss
│   │   │   └── index.tsx
│   │   ├── Speaker/
│   │   │   ├── Speaker.scss
│   │   │   ├── Speaker.stories.tsx
│   │   │   └── index.tsx
│   │   ├── StarRates/
│   │   │   └── index.tsx
│   │   ├── StrElm/
│   │   │   └── index.tsx
│   │   ├── Waveform/
│   │   │   ├── Waveform.scss
│   │   │   ├── Waveform.stories.tsx
│   │   │   └── Waveform.tsx
│   │   ├── WordPage/
│   │   │   ├── ExportModal/
│   │   │   │   ├── Linebreak.tsx
│   │   │   │   ├── PlaceholderTable.tsx
│   │   │   │   └── index.tsx
│   │   │   ├── Header.tsx
│   │   │   ├── WordTable.tsx
│   │   │   ├── _style.scss
│   │   │   └── index.tsx
│   │   └── dictionaries/
│   │       ├── ahdict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── baidu/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── bing/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── caiyun/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── cambridge/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── cnki/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── cobuild/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── dictionaries.stories.tsx
│   │       ├── etymonline/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── eudic/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── google/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── googledict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── guoyu/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── helpers.ts
│   │       ├── hjdict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── jikipedia/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── jukuu/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── lexico/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── liangan/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── locales.ts
│   │       ├── longman/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── macmillan/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── merriamwebster/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── mojidict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── naver/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── oaldict/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── renren/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── shanbay/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── sogou/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── tencent/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── urban/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── vocabulary/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── weblio/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── weblioejje/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── websterlearner/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── wikipedia/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── youdao/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.json
│   │       │   ├── _style.shadow.scss
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       ├── youdaotrans/
│   │       │   ├── View.tsx
│   │       │   ├── _locales.ts
│   │       │   ├── _style.shadow.scss
│   │       │   ├── auth.ts
│   │       │   ├── config.ts
│   │       │   └── engine.ts
│   │       └── zdic/
│   │           ├── View.tsx
│   │           ├── _locales.json
│   │           ├── _style.shadow.scss
│   │           ├── config.ts
│   │           └── engine.ts
│   ├── content/
│   │   ├── __fake__/
│   │   │   ├── env-instant-capture.ts
│   │   │   ├── env-select-text.ts
│   │   │   └── env.ts
│   │   ├── _style.scss
│   │   ├── components/
│   │   │   ├── DictItem/
│   │   │   │   ├── DictItem.scss
│   │   │   │   ├── DictItem.stories.tsx
│   │   │   │   ├── DictItem.tsx
│   │   │   │   ├── DictItemBody.tsx
│   │   │   │   ├── DictItemContent.shadow.scss
│   │   │   │   ├── DictItemHead.scss
│   │   │   │   └── DictItemHead.tsx
│   │   │   ├── DictList/
│   │   │   │   ├── DictList.container.tsx
│   │   │   │   ├── DictList.scss
│   │   │   │   ├── DictList.stories.tsx
│   │   │   │   └── DictList.tsx
│   │   │   ├── DictPanel/
│   │   │   │   ├── DictPanel.container.tsx
│   │   │   │   ├── DictPanel.portal.tsx
│   │   │   │   ├── DictPanel.scss
│   │   │   │   ├── DictPanel.shadow.scss
│   │   │   │   ├── DictPanel.stories.tsx
│   │   │   │   ├── DictPanel.tsx
│   │   │   │   ├── DictPanelStandalone.container.tsx
│   │   │   │   ├── DictPanelStandalone.scss
│   │   │   │   └── DictPanelStandalone.tsx
│   │   │   ├── MenuBar/
│   │   │   │   ├── MenuBar.container.tsx
│   │   │   │   ├── MenuBar.scss
│   │   │   │   ├── MenuBar.stories.tsx
│   │   │   │   ├── MenuBar.tsx
│   │   │   │   ├── MenubarBtns.scss
│   │   │   │   ├── MenubarBtns.stories.tsx
│   │   │   │   ├── MenubarBtns.tsx
│   │   │   │   ├── Profiles.scss
│   │   │   │   ├── Profiles.stories.tsx
│   │   │   │   ├── Profiles.tsx
│   │   │   │   ├── SearchBox.scss
│   │   │   │   ├── SearchBox.stories.tsx
│   │   │   │   ├── SearchBox.tsx
│   │   │   │   ├── Suggest.scss
│   │   │   │   ├── Suggest.stories.tsx
│   │   │   │   └── Suggest.tsx
│   │   │   ├── MtaBox/
│   │   │   │   ├── MtaBox.container.tsx
│   │   │   │   ├── MtaBox.scss
│   │   │   │   ├── MtaBox.stories.tsx
│   │   │   │   └── MtaBox.tsx
│   │   │   ├── SaladBowl/
│   │   │   │   ├── SaladBowl.container.tsx
│   │   │   │   ├── SaladBowl.portal.tsx
│   │   │   │   ├── SaladBowl.shadow.scss
│   │   │   │   ├── SaladBowl.stories.tsx
│   │   │   │   └── SaladBowl.tsx
│   │   │   ├── WaveformBox/
│   │   │   │   ├── WaveformBox.container.tsx
│   │   │   │   ├── WaveformBox.scss
│   │   │   │   ├── WaveformBox.stories.tsx
│   │   │   │   └── WaveformBox.tsx
│   │   │   └── WordEditor/
│   │   │       ├── CtxTransList.scss
│   │   │       ├── CtxTransList.stories.tsx
│   │   │       ├── CtxTransList.tsx
│   │   │       ├── Notes.scss
│   │   │       ├── Notes.tsx
│   │   │       ├── WordCards.scss
│   │   │       ├── WordCards.tsx
│   │   │       ├── WordEditor.container.tsx
│   │   │       ├── WordEditor.portal.tsx
│   │   │       ├── WordEditor.scss
│   │   │       ├── WordEditor.shadow.scss
│   │   │       ├── WordEditor.stories.tsx
│   │   │       ├── WordEditor.tsx
│   │   │       ├── WordEditorPanel.scss
│   │   │       ├── WordEditorPanel.stories.tsx
│   │   │       ├── WordEditorPanel.tsx
│   │   │       └── WordEditorStandalone.container.tsx
│   │   ├── index.tsx
│   │   └── redux/
│   │       ├── epics/
│   │       │   ├── index.ts
│   │       │   ├── newSelection.epic.ts
│   │       │   ├── searchStart.epic.ts
│   │       │   └── utils.ts
│   │       ├── index.ts
│   │       ├── init.ts
│   │       └── modules/
│   │           ├── action-catalog.ts
│   │           ├── action-handlers/
│   │           │   ├── index.ts
│   │           │   ├── new-selection.ts
│   │           │   ├── open-qs-panel.ts
│   │           │   └── search-start.ts
│   │           ├── index.ts
│   │           └── state.ts
│   ├── history/
│   │   ├── env.ts
│   │   └── index.tsx
│   ├── manifest/
│   │   ├── chrome.manifest.json
│   │   ├── common.manifest.js
│   │   ├── edge.manifest.json
│   │   ├── firefox.manifest.json
│   │   └── safari.manifest.json
│   ├── notebook/
│   │   ├── env.ts
│   │   └── index.tsx
│   ├── options/
│   │   ├── __fake__/
│   │   │   └── env.ts
│   │   ├── _style.scss
│   │   ├── acknowledgement.ts
│   │   ├── components/
│   │   │   ├── BtnPreview/
│   │   │   │   ├── PreviewIcon.tsx
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── Entries/
│   │   │   │   ├── BlackWhiteList.tsx
│   │   │   │   ├── ContextMenus/
│   │   │   │   │   ├── AddModal.tsx
│   │   │   │   │   ├── EditeModal.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── DictAuths.tsx
│   │   │   │   ├── DictPanel.tsx
│   │   │   │   ├── Dictionaries/
│   │   │   │   │   ├── AllDicts.tsx
│   │   │   │   │   ├── DictTitle/
│   │   │   │   │   │   ├── _style.scss
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── EditModal.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── General.tsx
│   │   │   │   ├── ImportExport.tsx
│   │   │   │   ├── Notebook/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── sync-services/
│   │   │   │   │       ├── ankiconnect.tsx
│   │   │   │   │       ├── eudic.tsx
│   │   │   │   │       ├── shanbay.tsx
│   │   │   │   │       └── webdav.tsx
│   │   │   │   ├── PDF.tsx
│   │   │   │   ├── Permissions.tsx
│   │   │   │   ├── Popup.tsx
│   │   │   │   ├── Privacy.tsx
│   │   │   │   ├── Profiles/
│   │   │   │   │   ├── EditNameModal.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── Pronunciation.tsx
│   │   │   │   ├── QuickSearch/
│   │   │   │   │   ├── StandaloneModal.tsx
│   │   │   │   │   ├── TitlebarOffsetModal.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   └── SearchModes/
│   │   │   │       ├── index.tsx
│   │   │   │       └── searchMode.tsx
│   │   │   ├── EntryError.tsx
│   │   │   ├── EntrySideBar/
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── Header/
│   │   │   │   ├── HeadInfo/
│   │   │   │   │   ├── AckList.tsx
│   │   │   │   │   ├── _style.scss
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── InputNumberGroup/
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── MainEntry.tsx
│   │   │   ├── MatchPatternModal/
│   │   │   │   ├──  PatternItem.tsx
│   │   │   │   └── index.tsx
│   │   │   ├── SaladictForm/
│   │   │   │   ├── SaveBtn.tsx
│   │   │   │   ├── _style.scss
│   │   │   │   └── index.tsx
│   │   │   ├── SaladictModalForm.tsx
│   │   │   └── SortableList/
│   │   │       ├── _style.scss
│   │   │       ├── index.tsx
│   │   │       └── reorder.ts
│   │   ├── env.ts
│   │   ├── helpers/
│   │   │   ├── change-entry.ts
│   │   │   ├── layout.ts
│   │   │   ├── panel-store.ts
│   │   │   ├── path-joiner.ts
│   │   │   ├── upload.ts
│   │   │   ├── use-check-dict-auth.ts
│   │   │   └── use-form-dirty.ts
│   │   └── index.tsx
│   ├── popup/
│   │   ├── Notebook.tsx
│   │   ├── Popup.tsx
│   │   ├── __fake__/
│   │   │   ├── _style.scss
│   │   │   └── env.ts
│   │   ├── _style.scss
│   │   ├── env.ts
│   │   └── index.tsx
│   ├── quick-search/
│   │   ├── env.ts
│   │   ├── index.tsx
│   │   └── quick-search.scss
│   ├── selection/
│   │   ├── helper.ts
│   │   ├── index.ts
│   │   ├── instant-capture.ts
│   │   ├── message.ts
│   │   ├── quick-search.ts
│   │   └── select-text.ts
│   ├── typings/
│   │   ├── css.d.ts
│   │   ├── global.d.ts
│   │   ├── helpers.ts
│   │   └── message.ts
│   └── word-editor/
│       ├── env.ts
│       ├── index.tsx
│       └── word-editor.scss
├── test/
│   ├── helper.ts
│   └── specs/
│       ├── _helpers/
│       │   ├── browser-api.spec.ts
│       │   ├── check-update.spec.ts
│       │   ├── chs-to-chz.spec.ts
│       │   ├── lang-check.spec.ts
│       │   ├── profile-manager.spec.ts
│       │   └── promise-more.spec.ts
│       ├── background/
│       │   ├── audio-manager.spec.ts
│       │   ├── context-menus.spec.ts
│       │   ├── initialization.spec.ts
│       │   ├── pdf-sniffer.spec.ts
│       │   └── sync-manager/
│       │       └── services/
│       │           ├── ankiconnect.spec.ts
│       │           └── webdav.spec.ts
│       └── components/
│           └── dictionaries/
│               ├── ahdict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── bing/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── cambridge/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── cnki/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── cobuild/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── etymonline/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── eudic/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── googledict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── guoyu/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── helpers.ts
│               ├── hjdict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── jikipedia/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── jukuu/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── lexico/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── liangan/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── longman/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── macmillan/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── merriamwebster/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   ├── requests.mock.ts
│               │   └── testCases.ts
│               ├── mojidict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── naver/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── oaldict/
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── renren/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── shanbay/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── urban/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── vocabulary/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── weblio/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── weblioejje/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── websterlearner/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── wikipedia/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               ├── youdao/
│               │   ├── engine.spec.ts
│               │   ├── fixtures.js
│               │   └── requests.mock.ts
│               └── zdic/
│                   ├── engine.spec.ts
│                   ├── fixtures.js
│                   └── requests.mock.ts
├── tsconfig.json
└── webpack.config.js
Download .txt
SYMBOL INDEX (1035 symbols across 271 files)

FILE: .storybook/config.ts
  function loadStories (line 44) | function loadStories() {

FILE: .storybook/configs/contexts.tsx
  type I18nWrapProps (line 9) | interface I18nWrapProps {

FILE: assets/fanyi.youdao.2.0/conn.js
  function f (line 8) | function f(n) {
  function quote (line 27) | function quote(string) {
  function str (line 35) | function str(key, holder) {
  function walk (line 106) | function walk(holder, key) {
  function createXMLHttpObject (line 244) | function createXMLHttpObject() {

FILE: assets/fanyi.youdao.2.0/main.js
  function f (line 5) | function f(n){return n<10?"0"+n:n}
  function quote (line 5) | function quote(string){escapable.lastIndex=0;return escapable.test(strin...
  function str (line 5) | function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[...
  function walk (line 5) | function walk(holder,key){var k,v,value=holder[key];if(value&&typeof val...
  function d (line 5) | function d(g,i){var h=30;var j=new Date();j.setTime(j.getTime()+h*24*60*...
  function e (line 5) | function e(h){var g=document.cookie.match(new RegExp("(^| )"+h+"=([^;]*)...
  function g (line 5) | function g(k){k.innerHTML='<iframe id="OUTFOX_JTR_BAR" src="" style="dis...

FILE: config/jest/cssTransform.js
  method process (line 7) | process() {
  method getCacheKey (line 10) | getCacheKey() {

FILE: config/jest/fileTransform.js
  method process (line 9) | process(src, filename) {

FILE: scripts/after-build.js
  method apply (line 5) | apply(compiler) {
  function firefoxFix (line 15) | async function firefoxFix() {
  function removeYoudaoFanyi (line 20) | async function removeYoudaoFanyi() {
  function removeCaiyun (line 32) | async function removeCaiyun() {

FILE: scripts/build.js
  constant WARN_AFTER_BUNDLE_GZIP_SIZE (line 45) | const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024
  constant WARN_AFTER_CHUNK_GZIP_SIZE (line 46) | const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024
  function build (line 98) | function build (previousFileSizes) {
  function generateByBrowser (line 140) | function generateByBrowser () {
  function genLocales (line 187) | function genLocales () {
  function writeLocales (line 204) | function writeLocales (localesPath, localesJSON) {
  function patchInternalCSS (line 216) | function patchInternalCSS () {

FILE: scripts/firefox-fix.js
  function main (line 16) | async function main() {
  function getStaticChunks (line 92) | async function getStaticChunks(htmls) {

FILE: scripts/fixtures.js
  function main (line 25) | async function main() {
  function add (line 36) | async function add() {
  function deletion (line 187) | async function deletion() {

FILE: scripts/pdf.js
  function startUpgrade (line 43) | async function startUpgrade() {
  function modifyViewrJS (line 64) | async function modifyViewrJS() {
  function modifyViewerHTML (line 99) | async function modifyViewerHTML() {
  function cleanInit (line 123) | function cleanInit() {
  function exists (line 129) | async function exists(path) {
  function exec (line 138) | function exec(command, errorMsg) {
  function cloneFiles (line 151) | async function cloneFiles() {

FILE: scripts/setup-env.js
  function main (line 7) | async function main() {
  function isDirectory (line 35) | async function isDirectory(dirPath) {
  function swallow (line 40) | function swallow() {

FILE: scripts/start.js
  constant DEFAULT_PORT (line 41) | const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000
  constant HOST (line 42) | const HOST = process.env.HOST || '0.0.0.0'

FILE: scripts/style-extractor.js
  function getIdsAndClassNames (line 11) | function getIdsAndClassNames(root) {
  function getStylesByAttrs (line 41) | function getStylesByAttrs(attrs, from, to) {

FILE: src/_helpers/__mocks__/browser-api.ts
  type StorageArea (line 13) | type StorageArea = 'all' | 'local' | 'sync'
  type StorageListenerCb (line 15) | type StorageListenerCb = (
  type onMessageEvent (line 20) | type onMessageEvent = (
  type Window (line 36) | interface Window {
  function _storageClear (line 152) | function _storageClear() {
  function _storageRemove (line 160) | function _storageRemove() {
  function _storageGet (line 168) | function _storageGet() {
  function _storageSet (line 178) | function _storageSet() {
  function _storageAddListener (line 186) | function _storageAddListener(area: string) {
  function _storageRemoveListener (line 222) | function _storageRemoveListener(area: string) {
  function _storageCreateStream (line 260) | function _storageCreateStream(area: string) {
  type DispatchStorageEventOptions (line 272) | interface DispatchStorageEventOptions {
  type DispatchStorageEventOptionsGeneral (line 279) | interface DispatchStorageEventOptionsGeneral
  function _dispatchStorageEvent (line 284) | function _dispatchStorageEvent(area: 'sync' | 'local') {
  function dispatchStorageEvent (line 291) | function dispatchStorageEvent(
  function _messageSend (line 317) | function _messageSend(self: boolean) {
  function _messageAddListener (line 331) | function _messageAddListener(self: boolean) {
  function _messageRemoveListener (line 364) | function _messageRemoveListener(self: boolean) {
  function _messageCreateStream (line 396) | function _messageCreateStream(self: boolean) {
  type DispatchMessageEventOptions (line 417) | interface DispatchMessageEventOptions {
  type DispatchMessageEventOptionsGeneral (line 423) | interface DispatchMessageEventOptionsGeneral
  function _dispatchMessageEvent (line 428) | function _dispatchMessageEvent(self: boolean) {
  function dispatchMessageEvent (line 435) | function dispatchMessageEvent(

FILE: src/_helpers/__mocks__/config-manager.ts
  type AppConfigChanged (line 8) | interface AppConfigChanged {
  function dispatchConfigChangedEvent (line 41) | function dispatchConfigChangedEvent(

FILE: src/_helpers/__mocks__/selection.ts
  type SelectionMock (line 1) | interface SelectionMock {

FILE: src/_helpers/analytics/events.ts
  type GAEventBase (line 1) | type GAEventBase = {
  type GAEventFactory (line 8) | type GAEventFactory<T extends GAEventBase> = T
  type GAEvent (line 10) | type GAEvent = GAEventFactory<

FILE: src/_helpers/analytics/index.ts
  type GAParams (line 9) | type GAParams = { [key: string]: string }
  function reportPageView (line 11) | async function reportPageView(page: string): Promise<void> {
  function reportEvent (line 47) | async function reportEvent(event: GAEvent) {
  function requestGA (line 71) | async function requestGA(extraParams: GAParams) {
  function setupRequestGAListener (line 112) | function setupRequestGAListener() {

FILE: src/_helpers/browser-api.ts
  type StorageArea (line 15) | type StorageArea = 'all' | 'local' | 'sync'
  type StorageChange (line 17) | type StorageChange<T> = {
  type StorageUpdate (line 22) | type StorageUpdate<T> = {
  type StorageListenerCb (line 27) | type StorageListenerCb<T = any, K extends string = string> = (
  type onMessageEvent (line 34) | type onMessageEvent<T extends Message = Message> = (
  method __storageArea__ (line 90) | get __storageArea__(): 'sync' {
  method __storageArea__ (line 104) | get __storageArea__(): 'local' {
  method __storageArea__ (line 113) | get __storageArea__(): 'all' {
  method __self__ (line 127) | get __self__(): false {
  method __self__ (line 138) | get __self__(): true {
  type OpenUrlOptions (line 144) | interface OpenUrlOptions {
  function openUrl (line 159) | async function openUrl(
  type StorageThisTwo (line 192) | type StorageThisTwo = typeof storage.sync | typeof storage.local
  type StorageThisThree (line 193) | type StorageThisThree = StorageThisTwo | typeof storage
  function storageClear (line 196) | function storageClear(this: StorageThisThree): Promise<void> {
  function storageRemove (line 206) | function storageRemove(
  function storageGet (line 217) | function storageGet<T = any>(this: StorageThisTwo, ...args) {
  function storageSet (line 224) | function storageSet(this: StorageThisTwo, keys: any): Promise<void> {
  function storageAddListener (line 233) | function storageAddListener(this: StorageThisThree, ...args): void {
  function storageRemoveListener (line 269) | function storageRemoveListener(this: StorageThisThree, ...args): void {
  function storageCreateStream (line 309) | function storageCreateStream<T = any>(
  type MessageThis (line 333) | type MessageThis = typeof message | typeof message.self
  function messageSend (line 342) | function messageSend<T extends MsgType>(
  function messageSendSelf (line 359) | async function messageSendSelf<T extends MsgType, R = undefined>(
  function messageAddListener (line 391) | function messageAddListener<T extends MsgType>(
  function messageRemoveListener (line 431) | function messageRemoveListener(
  function messageCreateStream (line 468) | function messageCreateStream<T extends MsgType>(
  function initClient (line 489) | function initClient(): Promise<typeof window.pageId> {
  function initServer (line 513) | function initServer(): void {
  function _getPageInfo (line 541) | function _getPageInfo(sender: browser.runtime.MessageSender) {

FILE: src/_helpers/check-update.ts
  type ReleaseData (line 1) | interface ReleaseData {
  type VersionDiff (line 15) | type VersionDiff = number
  type ReleaseResponse (line 17) | type ReleaseResponse = {
  function checkUpdate (line 22) | async function checkUpdate(

FILE: src/_helpers/chs-to-chz.ts
  function chsToChz (line 2641) | function chsToChz(text: string): string {

FILE: src/_helpers/config-manager.ts
  type StorageChanged (line 9) | interface StorageChanged<T> {
  type AppConfigChanged (line 14) | interface AppConfigChanged {
  type AppConfigCompressed (line 20) | interface AppConfigCompressed {
  function deflate (line 27) | function deflate(config: AppConfig): AppConfigCompressed {
  function inflate (line 39) | function inflate(
  function initConfig (line 50) | async function initConfig(): Promise<AppConfig> {
  function resetConfig (line 62) | async function resetConfig() {
  function getConfig (line 68) | async function getConfig(): Promise<AppConfig> {
  function updateConfig (line 75) | function updateConfig(baseconfig: AppConfig): Promise<void> {
  function addConfigListener (line 85) | async function addConfigListener(
  function createConfigStream (line 103) | function createConfigStream(): Observable<AppConfig> {

FILE: src/_helpers/dom.ts
  function isTagName (line 4) | function isTagName(node: Node, tagName: string): boolean {

FILE: src/_helpers/fetch-dom.ts
  function fetchDOM (line 4) | function fetchDOM(
  function fetchDirtyDOM (line 16) | function fetchDirtyDOM(
  function fetchPlainText (line 32) | function fetchPlainText(

FILE: src/_helpers/getSuggests.ts
  type Suggest (line 3) | interface Suggest {
  function getSuggests (line 8) | function getSuggests(text: string): Promise<Suggest[]> {
  function getCiba (line 12) | function getCiba(text: string): Promise<Suggest[]> {
  function getYoudao (line 37) | function getYoudao(text: string): Promise<Suggest[]> {

FILE: src/_helpers/hooks.ts
  function useFixedCallback (line 6) | function useFixedCallback<T>(fn: T): T {
  function useFixedMemo (line 13) | function useFixedMemo<T>(fn: () => T): T {

FILE: src/_helpers/i18n.ts
  type LangCode (line 15) | type LangCode = 'zh-CN' | 'zh-TW' | 'en'
  type Namespace (line 16) | type Namespace =
  type RawLocale (line 27) | interface RawLocale {
  type RawLocales (line 33) | interface RawLocales {
  type RawDictLocales (line 37) | interface RawDictLocales {
  type DictLocales (line 43) | interface DictLocales {
  function i18nLoader (line 53) | async function i18nLoader(): Promise<i18n.i18n> {
  type UseTranslateResult (line 148) | interface UseTranslateResult {
  function useTranslate (line 170) | function useTranslate(
  function extractDictLocales (line 279) | function extractDictLocales(lang: LangCode) {
  function extractSyncServiceLocales (line 302) | function extractSyncServiceLocales(lang: LangCode) {

FILE: src/_helpers/injectSaladictInternal.ts
  function injectDictPanel (line 1) | async function injectDictPanel(tab: browser.tabs.Tab | undefined) {

FILE: src/_helpers/lang-check.ts
  type Languages (line 13) | type Languages = typeof languages[number]
  type SupportedLangs (line 87) | type SupportedLangs = {
  function checkSupportedLangs (line 97) | function checkSupportedLangs(

FILE: src/_helpers/matchPatternToRegExpStr.ts
  function matchPatternToRegExpStr (line 1) | function matchPatternToRegExpStr(pattern: string): string {

FILE: src/_helpers/observables.ts
  function hover (line 29) | function hover<N extends Node>(
  function hoverWithDelay (line 46) | function hoverWithDelay<N extends Node>(
  function focusBlur (line 58) | function focusBlur(event$: Observable<{ type: string }>) {
  function switchMapBy (line 69) | function switchMapBy<T, R>(
  function mapToTrue (line 84) | function mapToTrue<T>(input$: Observable<T>) {

FILE: src/_helpers/permission-manager.ts
  function checkBackgroundPermission (line 4) | async function checkBackgroundPermission(

FILE: src/_helpers/profile-manager.ts
  type StorageChanged (line 19) | interface StorageChanged<T> {
  type ProfileChanged (line 24) | interface ProfileChanged {
  type ProfileCompressed (line 30) | interface ProfileCompressed {
  function deflate (line 37) | function deflate(profile: Profile): ProfileCompressed {
  function inflate (line 49) | function inflate(
  function getProfileName (line 60) | function getProfileName(name: string, t: TFunction): string {
  function initProfiles (line 69) | async function initProfiles(): Promise<Profile> {
  function resetAllProfiles (line 122) | async function resetAllProfiles() {
  function getProfile (line 140) | async function getProfile(id: string): Promise<Profile | undefined> {
  function updateProfile (line 147) | async function updateProfile(profile: Profile): Promise<void> {
  function addProfile (line 159) | async function addProfile(profileID: ProfileID): Promise<void> {
  function removeProfile (line 174) | async function removeProfile(id: string): Promise<void> {
  function getActiveProfile (line 196) | async function getActiveProfile(): Promise<Profile> {
  function getActiveProfileID (line 207) | async function getActiveProfileID(): Promise<string> {
  function updateActiveProfileID (line 211) | function updateActiveProfileID(id: string): Promise<void> {
  function getProfileIDList (line 218) | async function getProfileIDList(): Promise<ProfileIDList> {
  function updateProfileIDList (line 225) | function updateProfileIDList(list: ProfileIDList): Promise<void> {
  function addActiveProfileIDListener (line 229) | function addActiveProfileIDListener(
  function addProfileIDListListener (line 239) | function addProfileIDListListener(
  function addActiveProfileListener (line 252) | async function addActiveProfileListener(
  function createProfileIDListStream (line 302) | function createProfileIDListStream(): Observable<ProfileIDList> {
  function createActiveProfileStream (line 316) | function createActiveProfileStream(): Observable<Profile> {

FILE: src/_helpers/promise-more.ts
  function reflect (line 16) | function reflect(iterable: ArrayLike<any>) {
  function any (line 34) | function any(iterable: ArrayLike<any>) {
  function first (line 67) | function first (iterable: ArrayLike<any>) {
  function timer (line 89) | function timer(...args) {
  function timeout (line 102) | function timeout<T>(pr: PromiseLike<T>, delay = 0): Promise<T> {

FILE: src/_helpers/record-manager.ts
  type Word (line 7) | interface Word {
  type DBArea (line 26) | type DBArea = 'notebook' | 'history'
  function newWord (line 28) | function newWord(word?: Partial<Word>): Word {
  function isInNotebook (line 52) | function isInNotebook(word: Word): Promise<boolean> {
  function saveWord (line 58) | async function saveWord(area: DBArea, word: Word): Promise<void> {
  function deleteWords (line 62) | async function deleteWords(
  function getWordsByText (line 70) | function getWordsByText(
  function getWords (line 83) | function getWords(
  function logError (line 103) | function logError<T = any>(valPassThrough: T): (x: any) => T {

FILE: src/_helpers/saladict.ts
  constant SALADICT_EXTERNAL (line 21) | const SALADICT_EXTERNAL = 'saladict-external'
  constant SALADICT_PANEL (line 23) | const SALADICT_PANEL = 'saladict-panel'
  function isInSaladictExternal (line 32) | function isInSaladictExternal(
  function isInDictPanel (line 51) | function isInDictPanel(element: Node | EventTarget | null): boolean {

FILE: src/_helpers/storybook.tsx
  type StyleWrapProps (line 10) | interface StyleWrapProps {
  function withLocalStyle (line 28) | function withLocalStyle(style: object | string) {
  function withi18nNS (line 52) | function withi18nNS(ns: Namespace | Namespace[]) {
  function withSideEffect (line 64) | function withSideEffect(fn: React.EffectCallback) {
  function mockRuntimeMessage (line 73) | function mockRuntimeMessage(fn: (message: Message) => Promise<any>) {
  type WithSaladictPanelOptions (line 82) | interface WithSaladictPanelOptions {
  function withSaladictPanel (line 96) | function withSaladictPanel(options: WithSaladictPanelOptions) {

FILE: src/_helpers/titlebar-offset.ts
  type TitlebarOffset (line 9) | interface TitlebarOffset {
  function getTitlebarOffset (line 16) | async function getTitlebarOffset(): Promise<TitlebarOffset | undefined> {
  function setTitlebarOffset (line 24) | function setTitlebarOffset(offset: TitlebarOffset): Promise<void> {
  function calibrateTitlebarOffset (line 28) | async function calibrateTitlebarOffset(): Promise<

FILE: src/_helpers/translateCtx.ts
  type CtxTranslatorId (line 6) | type CtxTranslatorId = keyof AppConfig['ctxTrans']
  type CtxTranslateResults (line 8) | type CtxTranslateResults = {
  type FetchDictResultResponse (line 12) | interface FetchDictResultResponse {
  function translateCtx (line 22) | async function translateCtx(
  function translateCtxs (line 56) | async function translateCtxs(
  function parseCtxText (line 83) | function parseCtxText(text: string): CtxTranslateResults {
  function genCtxText (line 100) | function genCtxText(

FILE: src/_helpers/uniqueKey.ts
  function genUniqueKey (line 4) | function genUniqueKey(): string {
  function genUniqueKeyThunk (line 15) | function genUniqueKeyThunk() {
  function isGeneratedKey (line 19) | function isGeneratedKey(key: unknown): boolean {

FILE: src/_helpers/wordoftheday.ts
  function getWordOfTheDay (line 5) | async function getWordOfTheDay(): Promise<string> {
  function getWebsterWordOfTheDay (line 17) | async function getWebsterWordOfTheDay(): Promise<string> {
  function getDictionaryWordOfTheDay (line 26) | async function getDictionaryWordOfTheDay(): Promise<string> {

FILE: src/app-config/auth.ts
  type DictAuths (line 15) | type DictAuths = typeof defaultDictAuths

FILE: src/app-config/context-menus.ts
  type CustomContextItem (line 1) | interface CustomContextItem {
  type ContextItem (line 6) | type ContextItem = string | CustomContextItem
  function getAllContextMenus (line 8) | function getAllContextMenus(): { [id: string]: ContextItem } {

FILE: src/app-config/dicts.ts
  type AllDicts (line 81) | type AllDicts = typeof defaultAllDicts
  type DictItemBase (line 86) | interface DictItemBase {
  type DictItemWithOptions (line 118) | type DictItemWithOptions<
  type SelectOptions (line 127) | type SelectOptions<
  type DictItem (line 144) | type DictItem<

FILE: src/app-config/index.ts
  type LangCode (line 9) | type LangCode = 'zh-CN' | 'zh-TW' | 'en'
  type DictConfigsMutable (line 19) | type DictConfigsMutable = ReturnType<typeof getAllDicts>
  type DictConfigs (line 20) | type DictConfigs = DeepReadonly<DictConfigsMutable>
  type DictID (line 21) | type DictID = keyof DictConfigsMutable
  type MtaAutoUnfold (line 22) | type MtaAutoUnfold = _MtaAutoUnfold
  type TCDirection (line 24) | type TCDirection =
  type InstantSearchKey (line 35) | type InstantSearchKey = 'direct' | 'ctrl' | 'alt' | 'shift'
  type PreloadSource (line 38) | type PreloadSource = '' | 'clipboard' | 'selection'
  type AllDicts (line 40) | type AllDicts = ReturnType<typeof getAllDicts>
  type AppConfigMutable (line 42) | type AppConfigMutable = ReturnType<typeof _getDefaultConfig>
  type AppConfig (line 43) | type AppConfig = DeepReadonly<AppConfigMutable>
  function _getDefaultConfig (line 48) | function _getDefaultConfig() {

FILE: src/app-config/merge-config.ts
  function mergeConfig (line 13) | function mergeConfig(

FILE: src/app-config/merge-profile.ts
  function mergeProfile (line 11) | function mergeProfile(

FILE: src/app-config/profiles.ts
  type MtaAutoUnfold (line 5) | type MtaAutoUnfold = '' | 'once' | 'always' | 'popup' | 'hide'
  type ProfileMutable (line 7) | type ProfileMutable = ReturnType<typeof _getDefaultProfile>
  type Profile (line 8) | type Profile = DeepReadonly<ProfileMutable>
  type ProfileID (line 10) | interface ProfileID {
  type ProfileIDList (line 15) | type ProfileIDList = Array<ProfileID>
  function _getDefaultProfile (line 21) | function _getDefaultProfile(id?: string) {
  function getDefaultProfileID (line 58) | function getDefaultProfileID(id?: string): ProfileID {
  type ProfileStorage (line 65) | interface ProfileStorage {
  function genProfilesStorage (line 70) | function genProfilesStorage(): {
  function sentence (line 99) | function sentence(): ProfileStorage {
  function scholar (line 136) | function scholar(): ProfileStorage {
  function translation (line 197) | function translation(): ProfileStorage {
  function nihongo (line 217) | function nihongo(): ProfileStorage {

FILE: src/background/audio-manager.ts
  class AudioManager (line 6) | class AudioManager {
    method getInstance (line 9) | static getInstance() {
    method constructor (line 15) | private constructor() {}
    method reset (line 21) | reset() {
    method load (line 31) | load(src: string): HTMLAudioElement {
    method play (line 37) | async play(src?: string): Promise<void> {

FILE: src/background/badge.ts
  type UpdateBadgeOptions (line 6) | interface UpdateBadgeOptions {
  function initBadge (line 59) | function initBadge() {
  function setOff (line 74) | function setOff(tabId: number) {
  function setTempOff (line 85) | function setTempOff(tabId: number) {
  function setUnsupported (line 96) | function setUnsupported(tabId: number) {
  function setDefault (line 105) | function setDefault(tabId: number) {
  function setIcon (line 111) | function setIcon(gray: boolean, tabId: number) {

FILE: src/background/clipboard-manager.ts
  function copyTextToClipboard (line 3) | async function copyTextToClipboard(text: string): Promise<void> {
  function getTextFromClipboard (line 23) | async function getTextFromClipboard(): Promise<string> {

FILE: src/background/context-menus.ts
  type CreateMenuOptions (line 18) | interface CreateMenuOptions {
  type ContextMenusClickInfo (line 26) | type ContextMenusClickInfo = Pick<
  class ContextMenus (line 31) | class ContextMenus {
    method getInstance (line 32) | static async getInstance() {
    method openGoogle (line 62) | static openGoogle() {
    method openCaiyunTrs (line 69) | static openCaiyunTrs() {
    method openYoudao (line 75) | static async openYoudao() {
    method openBaiduPage (line 96) | static openBaiduPage() {
    method openSogouPage (line 114) | static openSogouPage() {
    method openMicrosoftPage (line 127) | static openMicrosoftPage() {
    method requestSelection (line 145) | static requestSelection() {
    method handleContextMenusClick (line 153) | private handleContextMenusClick(info: ContextMenusClickInfo) {
    method constructor (line 218) | private constructor() {
    method setContextMenus (line 230) | private async setContextMenus([{ searchHistory, contextMenus }, t]: [
  function tryExecuteScript (line 398) | async function tryExecuteScript(
  function reportMenusEvent (line 419) | function reportMenusEvent(

FILE: src/background/database/core.ts
  class SaladictDB (line 4) | class SaladictDB extends Dexie {
    method constructor (line 12) | constructor() {
  function getDB (line 31) | async function getDB() {

FILE: src/background/database/read.ts
  function isInNotebook (line 5) | async function isInNotebook(word: Message<'IS_IN_NOTEBOOK'>['payload']) {
  function getWordsByText (line 14) | async function getWordsByText({
  function getWords (line 25) | async function getWords({

FILE: src/background/database/sync-meta.ts
  function getSyncMeta (line 3) | async function getSyncMeta(serviceID: string) {
  function setSyncMeta (line 16) | async function setSyncMeta(serviceID: string, text: string) {
  function deleteSyncMeta (line 21) | async function deleteSyncMeta(serviceID: string) {

FILE: src/background/database/write.ts
  function saveWord (line 5) | async function saveWord({
  function saveWords (line 13) | async function saveWords({
  function deleteWords (line 29) | async function deleteWords({

FILE: src/background/i18n-manager.ts
  class I18nManager (line 6) | class I18nManager {
    method getInstance (line 9) | static async getInstance() {
    method constructor (line 25) | private constructor() {
    method getFixedT$ (line 35) | getFixedT$(ns: Namespace | Namespace[]): Observable<TFunction> {

FILE: src/background/initialization.ts
  function onCommand (line 39) | function onCommand(command: string) {
  function onInstalled (line 181) | async function onInstalled({
  function onStartup (line 258) | function onStartup(): void {
  function genClickListener (line 339) | function genClickListener(url: string) {
  function loadDictPanelToAllTabs (line 357) | async function loadDictPanelToAllTabs() {
  function searchTextBox (line 370) | async function searchTextBox() {
  function addNotebook (line 387) | async function addNotebook() {

FILE: src/background/page-translate/caiyun.ts
  function setupCaiyunTrsBackend (line 1) | function setupCaiyunTrsBackend() {

FILE: src/background/pdf-sniffer.ts
  function init (line 9) | function init(config: AppConfig) {
  function openPDF (line 35) | async function openPDF(url?: string, force?: boolean) {
  function extractPDFUrl (line 64) | function extractPDFUrl(fullurl?: string): string | void {
  function startListening (line 72) | function startListening() {
  function stopListening (line 101) | function stopListening() {
  function otherPdfListener (line 106) | function otherPdfListener({
  function httpPdfListener (line 133) | function httpPdfListener({
  function openPDFStandalone (line 175) | function openPDFStandalone(url: string) {

FILE: src/background/server.ts
  class BackgroundServer (line 28) | class BackgroundServer {
    method getInstance (line 31) | static getInstance() {
    method getDictEngine (line 40) | static getDictEngine<P = {}>(
    method constructor (line 56) | private constructor() {
    method openQSPanel (line 126) | async openQSPanel(): Promise<void> {
    method searchClipboard (line 134) | async searchClipboard(): Promise<void> {
    method searchPageSelection (line 148) | async searchPageSelection(): Promise<void> {
    method openSrcPage (line 171) | async openSrcPage({
    method fetchDictResult (line 187) | async fetchDictResult(
    method callDictEngineMethod (line 233) | async callDictEngineMethod(data: Message<'DICT_ENGINE_METHOD'>['payloa...
    method notifyWordSaved (line 238) | notifyWordSaved() {
    method youdaoTranslateAjax (line 253) | youdaoTranslateAjax(request: any): Promise<any> {

FILE: src/background/sync-manager/helpers.ts
  type StorageSyncConfig (line 12) | interface StorageSyncConfig {
  function setSyncConfig (line 16) | async function setSyncConfig<T = any>(
  function getSyncConfig (line 28) | async function getSyncConfig<T>(
  function removeSyncConfig (line 37) | async function removeSyncConfig(serviceID?: string): Promise<void> {
  function setMeta (line 49) | async function setMeta<T = any>(
  function getMeta (line 60) | async function getMeta<T>(serviceID: string): Promise<T | undefined> {
  function deleteMeta (line 71) | async function deleteMeta(serviceID: string): Promise<void> {
  function setNotebook (line 75) | async function setNotebook(words: Word[]): Promise<void> {
  function getNotebook (line 79) | async function getNotebook(): Promise<Word[]> {
  function notifyError (line 83) | async function notifyError(

FILE: src/background/sync-manager/index.ts
  function startSyncServiceInterval (line 17) | function startSyncServiceInterval() {
  function syncServiceUpload (line 61) | async function syncServiceUpload(

FILE: src/background/sync-manager/interface.ts
  type NotebookFile (line 3) | interface NotebookFile {
  type DlResponse (line 8) | interface DlResponse {
  type AddConfig (line 13) | interface AddConfig {
  type DeleteConfig (line 19) | interface DeleteConfig {
  type DownloadConfig (line 25) | interface DownloadConfig<Config = any> {
  type SyncServiceConfigBase (line 32) | interface SyncServiceConfigBase {
  method getDefaultConfig (line 50) | static getDefaultConfig() {
  method getDefaultMeta (line 54) | static getDefaultMeta() {
  method constructor (line 58) | constructor(config: Config) {
  method delete (line 67) | async delete(config: DeleteConfig): Promise<void> {}
  method destroy (line 69) | async destroy() {}
  method download (line 71) | async download(config: DownloadConfig): Promise<void> {}
  method onStart (line 73) | onStart() {}
  type SyncServiceAbstractClass (line 76) | type SyncServiceAbstractClass = typeof SyncService
  type SyncServiceConstructor (line 77) | interface SyncServiceConstructor extends SyncServiceAbstractClass {}

FILE: src/background/sync-manager/services/ankiconnect/index.ts
  type SyncConfig (line 9) | interface SyncConfig {
  class Service (line 25) | class Service extends SyncService<SyncConfig> {
    method getDefaultConfig (line 28) | static getDefaultConfig(): SyncConfig {
    method init (line 46) | async init() {
    method onStart (line 73) | onStart() {
    method destroy (line 77) | async destroy() {
    method findNote (line 81) | async findNote(date: number): Promise<number | undefined> {
    method add (line 97) | async add({ words, force }: AddConfig) {
    method addWord (line 136) | async addWord(word: Readonly<Word>) {
    method updateWord (line 151) | async updateWord(noteId: number, word: Readonly<Word>) {
    method addDeck (line 160) | async addDeck() {
    method addNoteType (line 164) | async addNoteType() {
    method request (line 207) | async request<R = void>(action: string, params?: any): Promise<R> {
    method wordToFields (line 234) | async wordToFields(word: Readonly<Word>): Promise<{ [k: string]: strin...
    method getNotefields (line 272) | async getNotefields(): Promise<string[]> {
    method multiline (line 318) | multiline(text: string, escape: boolean): string {
    method parseTrans (line 327) | parseTrans(text: string, escape: boolean): string {
    method escapeHTML (line 349) | escapeHTML(text: string): string {
    method extractTags (line 358) | extractTags(): string[] {
    method isServerUp (line 365) | async isServerUp(): Promise<boolean> {
  function cardText (line 377) | function cardText(front: boolean, nf: string[]) {
  function cardCss (line 409) | function cardCss() {

FILE: src/background/sync-manager/services/eudic/index.ts
  type SyncConfig (line 5) | interface SyncConfig {
  type Books (line 11) | interface Books {
  class Service (line 17) | class Service extends SyncService<SyncConfig> {
    method getDefaultConfig (line 20) | static getDefaultConfig(): SyncConfig {
    method init (line 28) | async init() {
    method add (line 36) | async add(config: AddConfig) {
    method addWordOrPatch (line 43) | async addWordOrPatch({ words, force }: AddConfig) {
    method getWordbooks (line 64) | async getWordbooks<R = void>(): Promise<R> {
    method requestAddWords (line 97) | async requestAddWords(words: string | string[]) {

FILE: src/background/sync-manager/services/shanbay/index.ts
  type SyncConfig (line 8) | interface SyncConfig {
  class Service (line 12) | class Service extends SyncService<SyncConfig> {
    method getDefaultConfig (line 15) | static getDefaultConfig(): SyncConfig {
    method openLogin (line 21) | static openLogin() {
    method init (line 25) | async init() {
    method add (line 31) | async add(config: AddConfig) {
    method addInternal (line 38) | async addInternal({ words, force }: AddConfig): Promise<number> {
    method addWord (line 79) | async addWord(text: string) {
    method isLogin (line 122) | async isLogin(): Promise<boolean> {
    method notifyLogin (line 131) | async notifyLogin() {
  function handleLoginNotification (line 162) | function handleLoginNotification(id: string) {
  function removeNotificationHandler (line 169) | function removeNotificationHandler(id: string) {

FILE: src/background/sync-manager/services/webdav/index.ts
  type SyncConfig (line 19) | interface SyncConfig extends SyncServiceConfigBase {
  type SyncMeta (line 28) | interface SyncMeta {
  class Service (line 33) | class Service extends SyncService<SyncConfig, SyncMeta> {
    method getDefaultConfig (line 36) | static getDefaultConfig(): SyncConfig {
    method onStart (line 48) | async onStart() {
    method checkDir (line 112) | async checkDir(): Promise<boolean> {
    method init (line 168) | async init() {
    method add (line 199) | async add({ force }: AddConfig) {
    method delete (line 249) | delete({ force }) {
    method download (line 254) | async download({ testConfig, noCache }: DownloadConfig): Promise<void> {
    method destroy (line 352) | async destroy() {
    method setMeta (line 357) | setMeta(meta: SyncMeta) {
    method getMeta (line 362) | async getMeta() {

FILE: src/background/types.ts
  type Window (line 5) | interface Window {

FILE: src/background/windows-manager.ts
  type WinRect (line 6) | interface WinRect {
  class MainWindowsManager (line 19) | class MainWindowsManager {
    method correctTop (line 23) | async correctTop(originTop?: number) {
    method focus (line 32) | async focus(): Promise<void> {
    method takeSnapshot (line 38) | async takeSnapshot(): Promise<browser.windows.Window | null> {
    method destroySnapshot (line 69) | destroySnapshot(): void {
    method makeRoomForSidebar (line 73) | async makeRoomForSidebar(
    method restoreSnapshot (line 117) | async restoreSnapshot(): Promise<void> {
  class QsPanelManager (line 137) | class QsPanelManager {
    method correctTop (line 143) | async correctTop(originTop?: number) {
    method create (line 155) | async create(preload?: Word): Promise<void> {
    method getWin (line 243) | async getWin(): Promise<browser.windows.Window | null> {
    method destroy (line 250) | async destroy(): Promise<void> {
    method isQsPanel (line 267) | isQsPanel(winId?: number): boolean {
    method hasCreated (line 271) | async hasCreated(): Promise<boolean> {
    method focus (line 279) | async focus(): Promise<void> {
    method takeSnapshot (line 289) | async takeSnapshot(): Promise<void> {
    method destroySnapshot (line 297) | destroySnapshot(): void {
    method restoreSnapshot (line 301) | async restoreSnapshot(): Promise<void> {
    method moveToSidebar (line 320) | async moveToSidebar(side: 'left' | 'right'): Promise<void> {
    method toggleSidebar (line 328) | async toggleSidebar(side: 'left' | 'right'): Promise<void> {
    method getDefaultRect (line 342) | getDefaultRect(): WinRect {
    method getStorageRect (line 400) | async getStorageRect(): Promise<WinRect | null> {
    method getSidebarRect (line 411) | async getSidebarRect(side: 'left' | 'right'): Promise<WinRect> {

FILE: src/components/AntdRoot/AntdRootContainer.tsx
  type AntdRootContainerProps (line 21) | interface AntdRootContainerProps {

FILE: src/components/AntdRoot/index.tsx
  function switchAntdTheme (line 44) | async function switchAntdTheme(darkMode: boolean): Promise<void> {

FILE: src/components/EntryBox/index.tsx
  type EntryBoxProps (line 3) | interface EntryBoxProps extends Omit<ComponentProps<'div'>, 'title'> {

FILE: src/components/ErrorBoundary.tsx
  type ErrorBoundaryProps (line 3) | interface ErrorBoundaryProps {
  type ErrorBoundaryState (line 8) | interface ErrorBoundaryState {
  class ErrorBoundary (line 12) | class ErrorBoundary extends React.PureComponent<
    method getDerivedStateFromError (line 20) | static getDerivedStateFromError() {
    method render (line 24) | render() {

FILE: src/components/FloatBox/FloatBox.stories.tsx
  function uniqueWordList (line 71) | function uniqueWordList(max: number): string[] {

FILE: src/components/FloatBox/index.tsx
  type FloatBoxItem (line 5) | type FloatBoxItem =
  type FloatBoxProps (line 24) | interface FloatBoxProps {
  function renderBoxItem (line 96) | function renderBoxItem(item: FloatBoxItem) {
  function onSelectItemChange (line 134) | function onSelectItemChange(e: React.ChangeEvent<HTMLSelectElement>) {
  function onBtnItemClick (line 144) | function onBtnItemClick(e: React.MouseEvent<HTMLButtonElement>) {
  function onBtnItemKeyDown (line 151) | function onBtnItemKeyDown(e: React.KeyboardEvent<HTMLButtonElement>) {

FILE: src/components/HoverBox/index.tsx
  type HoverBoxItem (line 19) | type HoverBoxItem = FloatBoxItem
  type HoverBoxProps (line 31) | interface HoverBoxProps {

FILE: src/components/MachineTrans/MachineTrans.tsx
  type MachineTransProps (line 131) | type MachineTransProps = ViewPorps<MachineTranslateResult<DictID>>
  function renderCredential (line 201) | function renderCredential() {

FILE: src/components/MachineTrans/engine.ts
  type MachineTranslatePayload (line 8) | interface MachineTranslatePayload<Lang = string> {
  type MachineTranslateResult (line 13) | interface MachineTranslateResult<ID extends DictID> {
  type DefaultMachineOptions (line 31) | type DefaultMachineOptions<Lang extends Language> = {
  type MachineDictItem (line 40) | type MachineDictItem<
  type ExtractLangFromConfig (line 45) | type ExtractLangFromConfig<Config> = Config extends MachineDictItem<
  type ExtractOptionsFromConfig (line 52) | type ExtractOptionsFromConfig<Config> = Config extends MachineDictItem<
  function getMTArgs (line 62) | async function getMTArgs(
  function machineConfig (line 150) | function machineConfig<Config extends MachineDictItem<Language>>(
  function machineResult (line 205) | function machineResult<ID extends DictID>(

FILE: src/components/ShadowPortal/index.tsx
  type ShadowPortalOwnProps (line 16) | interface ShadowPortalOwnProps {
  type ShadowPortalProps (line 26) | type ShadowPortalProps = ShadowPortalOwnProps & CSSTransitionProps

FILE: src/components/Speaker/index.tsx
  type SpeakerProps (line 17) | interface SpeakerProps {
  type StaticSpeakerContainerProps (line 67) | interface StaticSpeakerContainerProps

FILE: src/components/StarRates/index.tsx
  type StarRatesProps (line 3) | interface StarRatesProps {
  class StarRates (line 12) | class StarRates extends React.PureComponent<StarRatesProps> {
    method render (line 13) | render() {

FILE: src/components/StrElm/index.tsx
  type StrElmProps (line 4) | type StrElmProps<

FILE: src/components/Waveform/Waveform.tsx
  type AnyObject (line 10) | interface AnyObject {
  type WaveformProps (line 14) | interface WaveformProps {
  type WaveformState (line 18) | interface WaveformState {
  class Waveform (line 27) | class Waveform extends React.PureComponent<
    method componentDidMount (line 276) | async componentDidMount() {
    method componentWillUnmount (line 306) | componentWillUnmount() {
    method render (line 314) | render() {

FILE: src/components/WordPage/ExportModal/Linebreak.tsx
  type LineBreakOption (line 5) | type LineBreakOption = '' | 'n' | 'p' | 'br' | 'space'
  type LineBreakProps (line 7) | interface LineBreakProps {

FILE: src/components/WordPage/ExportModal/PlaceholderTable.tsx
  type PlaceholderTableProps (line 5) | interface PlaceholderTableProps {

FILE: src/components/WordPage/ExportModal/index.tsx
  type ExportModalTitle (line 12) | type ExportModalTitle = 'all' | 'selected' | 'page' | ''
  type ExportModalProps (line 14) | interface ExportModalProps {

FILE: src/components/WordPage/Header.tsx
  type WordPageProps (line 8) | interface WordPageProps {

FILE: src/components/WordPage/WordTable.tsx
  type WordTableProps (line 16) | interface WordTableProps
  function renderSource (line 99) | function renderSource(_: any, record: Word): ReactNode {
  function renderParagraphs (line 117) | function renderParagraphs(text?: string): ReactNode {
  function renderTrans (line 124) | function renderTrans(_: any, record: Word): ReactNode {
  function renderNote (line 128) | function renderNote(_: any, record: Word): ReactNode {
  function renderDate (line 132) | function renderDate(datenum: number): ReactNode {
  function renderEdit (line 145) | function renderEdit(t: TFunction, area: DBArea, record: Word): ReactNode {

FILE: src/components/WordPage/index.tsx
  constant ITEMS_PER_PAGE (line 16) | const ITEMS_PER_PAGE = 200
  type TableInfo (line 18) | type TableInfo = Pick<
  type FetchWordsConfig (line 23) | interface FetchWordsConfig {
  type WordPageProps (line 39) | interface WordPageProps {

FILE: src/components/dictionaries/ahdict/config.ts
  type AhdictConfig (line 3) | type AhdictConfig = DictItem<{

FILE: src/components/dictionaries/ahdict/engine.ts
  constant HOST (line 17) | const HOST = 'https://ahdictionary.com'
  type Idiom (line 19) | interface Idiom {
  type AhdictResultItem (line 25) | interface AhdictResultItem {
  type AhdictResult (line 38) | type AhdictResult = AhdictResultItem[]
  type AhdictSearchResult (line 40) | type AhdictSearchResult = DictSearchResult<AhdictResult>
  function handleDOM (line 58) | function handleDOM(

FILE: src/components/dictionaries/baidu/config.ts
  type BaiduLanguage (line 8) | type BaiduLanguage = Subunion<
  type BaiduConfig (line 13) | type BaiduConfig = MachineDictItem<BaiduLanguage>

FILE: src/components/dictionaries/baidu/engine.ts
  type BaiduResult (line 39) | type BaiduResult = MachineTranslateResult<'baidu'>

FILE: src/components/dictionaries/bing/View.tsx
  function renderLex (line 27) | function renderLex(result: BingResultLex) {
  function renderMachine (line 88) | function renderMachine(result: BingResultMachine) {
  function renderRelated (line 92) | function renderRelated(result: BingResultRelated) {

FILE: src/components/dictionaries/bing/config.ts
  type BingConfig (line 3) | type BingConfig = DictItem<{

FILE: src/components/dictionaries/bing/engine.ts
  constant HOST (line 18) | const HOST = 'https://cn.bing.com'
  constant DICT_LINK (line 20) | const DICT_LINK =
  type BingResultLex (line 24) | interface BingResultLex {
  type BingResultMachine (line 52) | interface BingResultMachine {
  type BingResultRelated (line 59) | interface BingResultRelated {
  type BingResult (line 72) | type BingResult = BingResultLex | BingResultMachine | BingResultRelated
  type BingConfig (line 74) | type BingConfig = DictConfigs['bing']
  type BingSearchResultLex (line 76) | type BingSearchResultLex = DictSearchResult<BingResultLex>
  type BingSearchResultMachine (line 77) | type BingSearchResultMachine = DictSearchResult<BingResultMachine>
  type BingSearchResultRelated (line 78) | type BingSearchResultRelated = DictSearchResult<BingResultRelated>
  function handleLexResult (line 113) | function handleLexResult(
  function handleMachineResult (line 225) | function handleMachineResult(
  function handleRelatedResult (line 243) | function handleRelatedResult(

FILE: src/components/dictionaries/caiyun/config.ts
  type CaiyunLanguage (line 8) | type CaiyunLanguage = Subunion<Language, 'zh-CN' | 'en' | 'ja'>
  type CaiyunConfig (line 10) | type CaiyunConfig = MachineDictItem<CaiyunLanguage>

FILE: src/components/dictionaries/caiyun/engine.ts
  type CaiyunResult (line 30) | type CaiyunResult = MachineTranslateResult<'caiyun'>

FILE: src/components/dictionaries/cambridge/View.tsx
  function handleEntryClick (line 23) | function handleEntryClick(e: React.MouseEvent<HTMLElement>) {

FILE: src/components/dictionaries/cambridge/config.ts
  type CambridgeConfig (line 3) | type CambridgeConfig = DictItem<{

FILE: src/components/dictionaries/cambridge/engine.ts
  constant HOST (line 62) | const HOST = 'https://dictionary.cambridge.org'
  type CambridgeResultItem (line 64) | type CambridgeResultItem = {
  type CambridgeResult (line 69) | type CambridgeResult = CambridgeResultItem[]
  type CambridgeSearchResult (line 71) | type CambridgeSearchResult = DictSearchResult<CambridgeResult>
  function handleDOM (line 84) | function handleDOM(
  function sanitizeEntry (line 181) | function sanitizeEntry<E extends Element>($entry: E): E {

FILE: src/components/dictionaries/cnki/config.ts
  type CnkiConfig (line 3) | type CnkiConfig = DictItem<{

FILE: src/components/dictionaries/cnki/engine.ts
  constant HOST (line 21) | const HOST = 'http://dict.cnki.net/old'
  type CNKIDictItem (line 23) | interface CNKIDictItem {
  type CNKISensItem (line 28) | interface CNKISensItem {
  type CNKIResult (line 34) | interface CNKIResult {
  type CNKISearchResult (line 44) | type CNKISearchResult = DictSearchResult<CNKIResult>
  function handleDOM (line 60) | function handleDOM(
  function extractSens (line 145) | function extractSens(

FILE: src/components/dictionaries/cobuild/View.tsx
  function renderCiba (line 20) | function renderCiba(result: COBUILDCibaResult) {
  function renderCol (line 51) | function renderCol(result: COBUILDColResult) {

FILE: src/components/dictionaries/cobuild/config.ts
  type CobuildConfig (line 3) | type CobuildConfig = DictItem<{

FILE: src/components/dictionaries/cobuild/engine.ts
  type COBUILDCibaResult (line 23) | interface COBUILDCibaResult {
  type COBUILDColResult (line 35) | interface COBUILDColResult {
  type COBUILDResult (line 47) | type COBUILDResult = COBUILDCibaResult | COBUILDColResult
  function handleDOM (line 79) | async function handleDOM(
  function getAudio (line 180) | function getAudio($section: HTMLElement): string | undefined {

FILE: src/components/dictionaries/dictionaries.stories.tsx
  function Dict (line 84) | function Dict(props: {

FILE: src/components/dictionaries/etymonline/config.ts
  type EtymonlineConfig (line 3) | type EtymonlineConfig = DictItem<{

FILE: src/components/dictionaries/etymonline/engine.ts
  constant HOST (line 19) | const HOST = 'https://www.etymonline.com'
  type EtymonlineResultItem (line 21) | type EtymonlineResultItem = {
  type EtymonlineResult (line 29) | type EtymonlineResult = EtymonlineResultItem[]
  type EtymonlineSearchResult (line 31) | type EtymonlineSearchResult = DictSearchResult<EtymonlineResult>
  function handleDOM (line 49) | function handleDOM(

FILE: src/components/dictionaries/eudic/config.ts
  type EudicConfig (line 3) | type EudicConfig = DictItem<{

FILE: src/components/dictionaries/eudic/engine.ts
  type EudicResultItem (line 15) | interface EudicResultItem {
  type EudicResult (line 22) | type EudicResult = EudicResultItem[]
  type EudicSearchResult (line 24) | type EudicSearchResult = DictSearchResult<EudicResult>
  function handleDOM (line 48) | function handleDOM(
  function validator (line 95) | function validator(doc: Document): Document | Promise<Document> {

FILE: src/components/dictionaries/google/config.ts
  type GoogleLanguage (line 8) | type GoogleLanguage = Subunion<
  type GoogleConfig (line 13) | type GoogleConfig = MachineDictItem<

FILE: src/components/dictionaries/google/engine.ts
  type GoogleResult (line 25) | type GoogleResult = MachineTranslateResult<'google'>
  function getTTS (line 83) | async function getTTS(text: string, lang: Language): Promise<string> {

FILE: src/components/dictionaries/googledict/View.tsx
  function onEntryClick (line 15) | function onEntryClick(e: React.MouseEvent) {

FILE: src/components/dictionaries/googledict/config.ts
  type GoogledictConfig (line 3) | type GoogledictConfig = DictItem<{

FILE: src/components/dictionaries/googledict/engine.ts
  type GoogleDictResult (line 24) | interface GoogleDictResult {
  type GoogleDictSearchResult (line 29) | type GoogleDictSearchResult = DictSearchResult<GoogleDictResult>
  function handleDOM (line 59) | function handleDOM(
  function extFragements (line 171) | function extFragements(text: string): Array<{ id: string; innerHTML: str...
  function extractImg (line 188) | function extractImg(text: string): Array<{ id: string; src: string }> {
  function decodeHex (line 201) | function decodeHex(m: string, code: string): string {

FILE: src/components/dictionaries/guoyu/View.tsx
  function replaceLink (line 65) | function replaceLink(text: string) {

FILE: src/components/dictionaries/guoyu/config.ts
  type GuoyuConfig (line 3) | type GuoyuConfig = DictItem<{

FILE: src/components/dictionaries/guoyu/engine.ts
  type GuoYuResult (line 19) | interface GuoYuResult {
  function moedictSearch (line 65) | async function moedictSearch<R extends GuoYuResult>(

FILE: src/components/dictionaries/helpers.ts
  type SearchFunction (line 14) | interface SearchFunction<Result, Payload = {}> {
  type DictSearchResult (line 23) | interface DictSearchResult<Result> {
  type GetSrcPageFunction (line 55) | interface GetSrcPageFunction {
  type MockRequest (line 64) | interface MockRequest {
  type HTMLString (line 68) | type HTMLString = string
  type ViewPorps (line 70) | interface ViewPorps<T> {
  type SearchErrorType (line 81) | type SearchErrorType = 'NO_RESULT' | 'NETWORK_ERROR'
  function handleNoResult (line 83) | function handleNoResult<T = any>(): Promise<T> {
  function handleNetWorkError (line 87) | function handleNetWorkError(): Promise<never> {
  function getChsToChz (line 100) | async function getChsToChz(
  function getText (line 121) | function getText(
  type GetHTMLConfig (line 152) | interface GetHTMLConfig {
  function getHTML (line 170) | function getHTML(
  function getInnerHTML (line 222) | function getInnerHTML(
  function getOuterHTML (line 235) | function getOuterHTML(
  function removeChild (line 251) | function removeChild(parent: ParentNode, selector: string) {
  function removeChildren (line 261) | function removeChildren(parent: ParentNode, selector: string) {
  function decodeHEX (line 268) | function decodeHEX(text: string): string {
  function externalLink (line 278) | function externalLink($a: HTMLElement) {
  function getFullLink (line 283) | function getFullLink(host: string, el: Element, attr: string): string {
  function _useHorizontalScrollOnWheel (line 332) | function _useHorizontalScrollOnWheel(event$: Observable<WheelEvent>) {

FILE: src/components/dictionaries/hjdict/View.tsx
  function Lex (line 16) | function Lex(props: ViewPorps<HjdictResult>) {
  function Related (line 31) | function Related(props: ViewPorps<HjdictResult>) {
  function LangSelect (line 43) | function LangSelect(props: ViewPorps<HjdictResult>) {
  function handleClick (line 66) | function handleClick(e: React.MouseEvent<HTMLElement>): void {
  function getWordDetailsTab (line 91) | function getWordDetailsTab(target: any): HTMLElement | null {

FILE: src/components/dictionaries/hjdict/config.ts
  type HjdictConfig (line 3) | type HjdictConfig = DictItem<{

FILE: src/components/dictionaries/hjdict/engine.ts
  constant HOST (line 30) | const HOST = 'https://www.hjdict.com'
  type HjdictResultLex (line 32) | interface HjdictResultLex {
  type HjdictResultRelated (line 39) | interface HjdictResultRelated {
  type HjdictResult (line 45) | type HjdictResult = HjdictResultLex | HjdictResultRelated
  type HjdictSearchResult (line 47) | type HjdictSearchResult = DictSearchResult<HjdictResult>
  type HjdictPayload (line 49) | interface HjdictPayload {
  function handleDOM (line 97) | function handleDOM(
  function wrapNoResult (line 157) | function wrapNoResult(langCode: string): DictSearchResult<HjdictResultRe...
  function getLangCode (line 190) | function getLangCode(text: string, profile: Profile): string {
  function getUUID (line 237) | function getUUID(e?: number): string {

FILE: src/components/dictionaries/jikipedia/config.ts
  type UrbanConfig (line 3) | type UrbanConfig = DictItem<{

FILE: src/components/dictionaries/jikipedia/engine.ts
  constant HOST (line 18) | const HOST = 'https://jikipedia.com'
  type JikipediaResultItem (line 20) | interface JikipediaResultItem {
  type JikipediaResult (line 31) | type JikipediaResult = JikipediaResultItem[]
  type JikipediaSearchResult (line 33) | type JikipediaSearchResult = DictSearchResult<JikipediaResult>
  function handleDOM (line 50) | function handleDOM(

FILE: src/components/dictionaries/jukuu/config.ts
  type JukuuConfig (line 3) | type JukuuConfig = DictItem<{

FILE: src/components/dictionaries/jukuu/engine.ts
  type JukuuLang (line 14) | type JukuuLang = 'engjp' | 'zhjp' | 'zheng'
  function getUrl (line 16) | function getUrl(text: string, lang: JukuuLang) {
  type JukuuTransItem (line 34) | interface JukuuTransItem {
  type JukuuResult (line 40) | interface JukuuResult {
  type JukuuPayload (line 45) | interface JukuuPayload {
  type JukuuSearchResult (line 49) | type JukuuSearchResult = DictSearchResult<JukuuResult>
  function handleDOM (line 66) | function handleDOM(doc: Document): JukuuTransItem[] {

FILE: src/components/dictionaries/lexico/View.tsx
  function renderLex (line 17) | function renderLex(result: LexicoResultLex) {
  function renderRelated (line 27) | function renderRelated(result: LexicoResultRelated) {
  function onLexClick (line 50) | function onLexClick(e: React.MouseEvent): void {

FILE: src/components/dictionaries/lexico/config.ts
  type LexicoConfig (line 3) | type LexicoConfig = DictItem<{

FILE: src/components/dictionaries/lexico/engine.ts
  constant HOST (line 23) | const HOST = 'https://www.lexico.com'
  type LexicoResultLex (line 25) | interface LexicoResultLex {
  type LexicoResultRelated (line 30) | interface LexicoResultRelated {
  type LexicoResult (line 38) | type LexicoResult = LexicoResultLex | LexicoResultRelated
  function handleDOM (line 74) | function handleDOM(

FILE: src/components/dictionaries/liangan/config.ts
  type LianganConfig (line 3) | type LianganConfig = DictItem<{

FILE: src/components/dictionaries/liangan/engine.ts
  type LiangAnResult (line 9) | type LiangAnResult = GuoYuResult

FILE: src/components/dictionaries/locales.ts
  type LocaleItem (line 1) | interface LocaleItem {
  type LocaleObject (line 7) | interface LocaleObject {
  function getMachineLocales (line 11) | function getMachineLocales(

FILE: src/components/dictionaries/longman/View.tsx
  function renderEntry (line 22) | function renderEntry(entry: LongmanResultEntry) {
  function renderLex (line 109) | function renderLex(result: LongmanResultLex) {
  function renderRelated (line 139) | function renderRelated(result: LongmanResultRelated) {

FILE: src/components/dictionaries/longman/config.ts
  type LongmanConfig (line 3) | type LongmanConfig = DictItem<{

FILE: src/components/dictionaries/longman/engine.ts
  constant HOST (line 23) | const HOST = 'https://www.ldoceonline.com'
  type LongmanResultEntry (line 25) | interface LongmanResultEntry {
  type LongmanResultLex (line 56) | interface LongmanResultLex {
  type LongmanResultRelated (line 64) | interface LongmanResultRelated {
  type LongmanResult (line 69) | type LongmanResult = LongmanResultLex | LongmanResultRelated
  type LongmanSearchResult (line 71) | type LongmanSearchResult = DictSearchResult<LongmanResult>
  type LongmanSearchResultLex (line 72) | type LongmanSearchResultLex = DictSearchResult<LongmanResultLex>
  type LongmanSearchResultRelated (line 73) | type LongmanSearchResultRelated = DictSearchResult<LongmanResultRelated>
  function handleDOM (line 90) | function handleDOM(
  function handleDOMLex (line 102) | function handleDOMLex(
  function handleDOMRelated (line 247) | function handleDOMRelated(

FILE: src/components/dictionaries/macmillan/View.tsx
  function renderSelect (line 28) | function renderSelect(
  function renderLex (line 56) | function renderLex(result: MacmillanResultLex, select: ReactNode) {
  function renderRelated (line 74) | function renderRelated(result: MacmillanResultRelated) {
  function onEntryClick (line 89) | function onEntryClick(event: React.MouseEvent<HTMLElement>) {

FILE: src/components/dictionaries/macmillan/config.ts
  type MacmillanConfig (line 3) | type MacmillanConfig = DictItem<{

FILE: src/components/dictionaries/macmillan/engine.ts
  constant HOST (line 28) | const HOST = 'http://www.macmillandictionary.com'
  type MacmillanResultLex (line 30) | interface MacmillanResultLex {
  type MacmillanResultRelated (line 48) | interface MacmillanResultRelated {
  type MacmillanResult (line 56) | type MacmillanResult = MacmillanResultLex | MacmillanResultRelated
  type MacmillanSearchResult (line 58) | type MacmillanSearchResult = DictSearchResult<MacmillanResult>
  type MacmillanPayload (line 60) | interface MacmillanPayload {
  function checkResult (line 79) | async function checkResult(
  function handleDOM (line 104) | function handleDOM(
  function fetchMacmillanDom (line 172) | async function fetchMacmillanDom(url: string): Promise<Document> {

FILE: src/components/dictionaries/merriamwebster/config.ts
  type MerriamWebsterConfig (line 3) | type MerriamWebsterConfig = DictItem<{

FILE: src/components/dictionaries/merriamwebster/engine.ts
  type Meaning (line 12) | interface Meaning {
  type MeaningGroup (line 17) | type MeaningGroup = Meaning[]
  type Section (line 19) | interface Section {
  type Phonetic (line 25) | interface Phonetic {
  type Pronunciation (line 30) | interface Pronunciation {
  type Group (line 35) | interface Group {
  type MerriamWebsterResultV2 (line 44) | interface MerriamWebsterResultV2 {
  function _getContentEle (line 69) | function _getContentEle(doc: Document): Element {
  function _getGroupsEles (line 78) | function _getGroupsEles(content: Element): Element[] {
  function _getSynonyms (line 88) | function _getSynonyms(
  function _getEtymology (line 115) | function _getEtymology(
  function _getTitle (line 137) | function _getTitle(group: Element): string | undefined {
  function _getPartOfSpeech (line 144) | function _getPartOfSpeech(group: Element): string | undefined {
  function _getPrEle (line 152) | function _getPrEle(group: Element): Element | undefined {
  function _getSyllable (line 158) | function _getSyllable(pr: Element): string | undefined {
  function _getPhoneticEles (line 162) | function _getPhoneticEles(pr: Element): Element[] | undefined {
  function _getPhoneticSymbol (line 171) | function _getPhoneticSymbol(pt: Element): string | undefined {
  function _getPhoneticAudio (line 178) | function _getPhoneticAudio(pt: Element): string | undefined {
  function _getConjugation (line 190) | function _getConjugation(group: Element): string | undefined {
  function _getSectionsEles (line 204) | function _getSectionsEles(group: Element): Element[] | undefined {
  function _getForms (line 209) | function _getForms(group: Element): string[] {
  function _getSectionTitle (line 213) | function _getSectionTitle(section: Element): string | undefined {
  function _getMeaningGroupEles (line 220) | function _getMeaningGroupEles(section: Element): Element[] | undefined {
  function _getMeaningEles (line 225) | function _getMeaningEles(mg: Element): Element[] | undefined {
  function _getExpaining (line 230) | function _getExpaining(meaning: Element): string | undefined {
  function _getExamples (line 237) | function _getExamples(meaning: Element): string[] | undefined {
  function getResult (line 247) | function getResult(dom: Document): MerriamWebsterResultV2 {

FILE: src/components/dictionaries/mojidict/config.ts
  type LianganConfig (line 3) | type LianganConfig = DictItem

FILE: src/components/dictionaries/mojidict/engine.ts
  type FetchWordResult (line 23) | interface FetchWordResult {
  type SuggestsResult (line 51) | interface SuggestsResult {
  type FetchTtsResult (line 68) | interface FetchTtsResult {
  type MojidictResult (line 81) | interface MojidictResult {
  function getSuggests (line 178) | async function getSuggests(text: string): Promise<SuggestsResult> {
  function getTTS (line 205) | async function getTTS(
  type GetTTS (line 228) | type GetTTS = typeof getTTS
  function requestPayload (line 230) | function requestPayload(data: object) {
  function getInstallationId (line 239) | function getInstallationId() {
  function s (line 243) | function s() {

FILE: src/components/dictionaries/naver/config.ts
  type NaverConfig (line 3) | type NaverConfig = DictItem<{

FILE: src/components/dictionaries/naver/engine.ts
  type NaverResult (line 18) | interface NaverResult {
  type NaverPayload (line 27) | interface NaverPayload {
  type NaverSearchResult (line 31) | type NaverSearchResult = DictSearchResult<NaverResult>
  function zhDict (line 53) | async function zhDict(text: string): Promise<NaverSearchResult> {
  function jaDict (line 76) | async function jaDict(text: string): Promise<NaverSearchResult> {

FILE: src/components/dictionaries/oaldict/config.ts
  type OalDictConfig (line 3) | type OalDictConfig = DictItem

FILE: src/components/dictionaries/oaldict/engine.ts
  constant HOST (line 18) | const HOST = 'https://www.oxfordlearnersdictionaries.com'
  type Idiom (line 20) | interface Idiom {
  type Mean (line 27) | interface Mean {
  type Sense (line 39) | interface Sense {
  type Ipron (line 46) | interface Ipron {
  type OaldictResultItem (line 57) | interface OaldictResultItem {
  type OaldictResult (line 73) | type OaldictResult = OaldictResultItem
  type OaldictSearchResult (line 75) | type OaldictSearchResult = DictSearchResult<OaldictResult>
  function handleDOM (line 91) | function handleDOM(

FILE: src/components/dictionaries/renren/View.tsx
  type RenrenSlideProps (line 8) | interface RenrenSlideProps {

FILE: src/components/dictionaries/renren/config.ts
  type RenrenConfig (line 3) | type RenrenConfig = DictItem

FILE: src/components/dictionaries/renren/engine.ts
  constant HOST (line 20) | const HOST = 'https://www.91dict.com'
  type RenrenSlide (line 22) | interface RenrenSlide {
  type RenrenResultItem (line 29) | interface RenrenResultItem {
  type RenrenResult (line 40) | type RenrenResult = RenrenResultItem[]
  type RenrenSearchResult (line 42) | type RenrenSearchResult = DictSearchResult<RenrenResult>
  function handleDOM (line 59) | function handleDOM(
  function getDetail (line 112) | async function getDetail(src: string): Promise<RenrenSlide[]> {
  function extractSlide (line 130) | function extractSlide($li: Element): RenrenSlide | null {

FILE: src/components/dictionaries/shanbay/config.ts
  type ShanbayConfig (line 3) | type ShanbayConfig = DictItem<{

FILE: src/components/dictionaries/shanbay/engine.ts
  constant HOST (line 20) | const HOST = 'http://www.shanbay.com'
  type ShanbayResultLex (line 22) | interface ShanbayResultLex {
  type ShanbayResult (line 40) | type ShanbayResult = ShanbayResultLex
  type ShanbaySearchResult (line 42) | type ShanbaySearchResult = DictSearchResult<ShanbayResult>
  function checkResult (line 58) | function checkResult(
  function loadSentences (line 69) | function loadSentences(id: string) {
  function handleDOM (line 89) | async function handleDOM(

FILE: src/components/dictionaries/sogou/config.ts
  type SogouLanguage (line 8) | type SogouLanguage = Subunion<
  type SogouConfig (line 13) | type SogouConfig = MachineDictItem<SogouLanguage>

FILE: src/components/dictionaries/sogou/engine.ts
  type SogouResult (line 39) | type SogouResult = MachineTranslateResult<'sogou'>

FILE: src/components/dictionaries/tencent/config.ts
  type TencentLanguage (line 8) | type TencentLanguage = Subunion<
  type TencentConfig (line 13) | type TencentConfig = MachineDictItem<TencentLanguage>

FILE: src/components/dictionaries/tencent/engine.ts
  type TencentResult (line 40) | type TencentResult = MachineTranslateResult<'tencent'>

FILE: src/components/dictionaries/urban/config.ts
  type UrbanConfig (line 3) | type UrbanConfig = DictItem<{

FILE: src/components/dictionaries/urban/engine.ts
  constant HOST (line 19) | const HOST = 'https://www.urbandictionary.com'
  type UrbanResultItem (line 21) | interface UrbanResultItem {
  type thumbItem (line 41) | interface thumbItem {
  type thumbRes (line 48) | interface thumbRes {
  type thumbMapItem (line 52) | interface thumbMapItem {
  type thumbMap (line 57) | interface thumbMap {
  type UrbanResult (line 61) | type UrbanResult = UrbanResultItem[]
  type UrbanSearchResult (line 63) | type UrbanSearchResult = DictSearchResult<UrbanResult>
  function getThumbsNums (line 82) | async function getThumbsNums(ids: string): Promise<thumbMap | null> {
  function handleDOM (line 106) | async function handleDOM(

FILE: src/components/dictionaries/vocabulary/config.ts
  type VocabularyConfig (line 3) | type VocabularyConfig = DictItem

FILE: src/components/dictionaries/vocabulary/engine.ts
  type VocabularyResult (line 15) | interface VocabularyResult {
  type VocabularySearchResult (line 20) | type VocabularySearchResult = DictSearchResult<VocabularyResult>
  function handleDOM (line 36) | function handleDOM(

FILE: src/components/dictionaries/weblio/config.ts
  type WeblioConfig (line 3) | type WeblioConfig = DictItem

FILE: src/components/dictionaries/weblio/engine.ts
  constant HOST (line 19) | const HOST = 'https://www.weblio.jp'
  type WeblioResult (line 21) | type WeblioResult = Array<{
  type WeblioSearchResult (line 26) | type WeblioSearchResult = DictSearchResult<WeblioResult>
  function handleDOM (line 42) | function handleDOM(

FILE: src/components/dictionaries/weblioejje/config.ts
  type VocabularyConfig (line 3) | type VocabularyConfig = DictItem

FILE: src/components/dictionaries/weblioejje/engine.ts
  constant HOST (line 22) | const HOST = 'https://ejje.weblio.jp'
  type WeblioejjeResult (line 24) | type WeblioejjeResult = Array<{
  type WeblioejjeSearchResult (line 29) | type WeblioejjeSearchResult = DictSearchResult<WeblioejjeResult>
  function handleDOM (line 42) | function handleDOM(

FILE: src/components/dictionaries/websterlearner/View.tsx
  function renderLex (line 24) | function renderLex(result: WebsterLearnerResultLex) {
  function renderRelated (line 52) | function renderRelated(result: WebsterLearnerResultRelated) {

FILE: src/components/dictionaries/websterlearner/config.ts
  type WebsterlearnerConfig (line 3) | type WebsterlearnerConfig = DictItem<{

FILE: src/components/dictionaries/websterlearner/engine.ts
  constant HOST (line 20) | const HOST = 'http://www.learnersdictionary.com'
  type WebsterLearnerResultItem (line 22) | interface WebsterLearnerResultItem {
  type WebsterLearnerResultLex (line 36) | interface WebsterLearnerResultLex {
  type WebsterLearnerResultRelated (line 41) | interface WebsterLearnerResultRelated {
  type WebsterLearnerResult (line 46) | type WebsterLearnerResult =
  type WebsterLearnerSearchResult (line 50) | type WebsterLearnerSearchResult = DictSearchResult<WebsterLearnerResult>
  type WebsterLearnerSearchResultLex (line 51) | type WebsterLearnerSearchResultLex = DictSearchResult<WebsterLearnerResu...
  function checkResult (line 69) | function checkResult(
  function handleDOM (line 89) | function handleDOM(

FILE: src/components/dictionaries/wikipedia/View.tsx
  function handleEntryClick (line 85) | function handleEntryClick(e: React.MouseEvent<HTMLDivElement>) {

FILE: src/components/dictionaries/wikipedia/config.ts
  type WikipediaConfig (line 3) | type WikipediaConfig = DictItem<{

FILE: src/components/dictionaries/wikipedia/engine.ts
  type LangListItem (line 25) | type LangListItem = {
  type LangList (line 30) | type LangList = LangListItem[]
  type WikipediaResult (line 32) | interface WikipediaResult {
  type WikipediaSearchResult (line 38) | type WikipediaSearchResult = DictSearchResult<WikipediaResult>
  type WikipediaPayload (line 40) | type WikipediaPayload = {
  function fetchLangList (line 74) | function fetchLangList(langSelector: string) {
  function handleDOM (line 83) | function handleDOM(
  function getSubdomain (line 139) | function getSubdomain(
  function getLangList (line 154) | function getLangList(doc: Document): LangList {

FILE: src/components/dictionaries/youdao/config.ts
  type YoudaoConfig (line 3) | type YoudaoConfig = DictItem<{

FILE: src/components/dictionaries/youdao/engine.ts
  constant HOST (line 19) | const HOST = 'http://www.youdao.com'
  type YoudaoResultLex (line 21) | interface YoudaoResultLex {
  type YoudaoResultRelated (line 41) | interface YoudaoResultRelated {
  type YoudaoResult (line 46) | type YoudaoResult = YoudaoResultLex | YoudaoResultRelated
  type YoudaoSearchResult (line 48) | type YoudaoSearchResult = DictSearchResult<YoudaoResult>
  function checkResult (line 66) | function checkResult(
  function handleDOM (line 85) | function handleDOM(

FILE: src/components/dictionaries/youdaotrans/config.ts
  type YoudaotransLanguage (line 8) | type YoudaotransLanguage = Subunion<
  type YoudaotransConfig (line 13) | type YoudaotransConfig = MachineDictItem<YoudaotransLanguage>

FILE: src/components/dictionaries/youdaotrans/engine.ts
  type YoudaotransResult (line 30) | type YoudaotransResult = MachineTranslateResult<'youdaotrans'>

FILE: src/components/dictionaries/zdic/config.ts
  type ZdicConfig (line 3) | type ZdicConfig = DictItem<{

FILE: src/components/dictionaries/zdic/engine.ts
  constant HOST (line 17) | const HOST = 'https://www.zdic.net'
  type ZdicResult (line 19) | type ZdicResult = Array<{
  type ZdicSearchResult (line 24) | type ZdicSearchResult = DictSearchResult<ZdicResult>
  function handleDOM (line 47) | function handleDOM(
  function modifyReferer (line 87) | function modifyReferer() {

FILE: src/content/components/DictItem/DictItem.tsx
  constant DICT_ITEM_HEAD_HEIGHT (line 22) | const DICT_ITEM_HEAD_HEIGHT = 20
  type DictItemProps (line 24) | interface DictItemProps
  function searchLinkText (line 193) | function searchLinkText(e: React.MouseEvent<HTMLElement>) {
  function toggleFold (line 236) | function toggleFold() {

FILE: src/content/components/DictItem/DictItemBody.tsx
  type DictItemBodyProps (line 14) | interface DictItemBodyProps {
  function DictRenderError (line 106) | function DictRenderError() {

FILE: src/content/components/DictItem/DictItemHead.tsx
  type DictItemHeadProps (line 8) | interface DictItemHeadProps {
  function MenusBtn (line 164) | function MenusBtn(props: React.ComponentProps<'button'>) {

FILE: src/content/components/DictList/DictList.container.tsx
  type Dispatchers (line 26) | type Dispatchers = ExtractDispatchers<

FILE: src/content/components/DictList/DictList.stories.tsx
  function TestComp (line 84) | function TestComp({ result }: { result: { paragraphs: string } }) {

FILE: src/content/components/DictList/DictList.tsx
  type DictListItemKeys (line 11) | type DictListItemKeys =
  type DictListProps (line 18) | interface DictListProps
  type Height (line 44) | type Height = {

FILE: src/content/components/DictPanel/DictPanel.container.tsx
  type Dispatchers (line 19) | type Dispatchers = ExtractDispatchers<DictPanelPortalProps, 'onDragEnd'>

FILE: src/content/components/DictPanel/DictPanel.portal.tsx
  type DictPanelPortalProps (line 9) | interface DictPanelPortalProps extends DictPanelProps {

FILE: src/content/components/DictPanel/DictPanel.stories.tsx
  function useDictPanelProps (line 71) | function useDictPanelProps(): DictPanelPortalProps {
  function TestComp (line 230) | function TestComp({ result }: { result: { paragraphs: string } }) {
  function fakeSuggest (line 240) | function fakeSuggest(text: string): SuggestItem[] {

FILE: src/content/components/DictPanel/DictPanel.tsx
  type DictPanelProps (line 15) | interface DictPanelProps {
  function reconcileX (line 158) | function reconcileX(width: number, x: number): number {
  function reconcileY (line 173) | function reconcileY(height: number, y: number): number {

FILE: src/content/components/DictPanel/DictPanelStandalone.container.tsx
  type OwnProps (line 17) | type OwnProps = 'height' | 'width'

FILE: src/content/components/DictPanel/DictPanelStandalone.tsx
  type DictPanelStandaloneProps (line 6) | interface DictPanelStandaloneProps {

FILE: src/content/components/MenuBar/MenuBar.container.tsx
  type Dispatchers (line 21) | type Dispatchers = ExtractDispatchers<

FILE: src/content/components/MenuBar/MenuBar.stories.tsx
  function fakeSuggest (line 96) | function fakeSuggest(text: string): SuggestItem[] {

FILE: src/content/components/MenuBar/MenuBar.tsx
  type MenuBarProps (line 32) | interface MenuBarProps {
  function heightChangeTransform (line 202) | function heightChangeTransform(

FILE: src/content/components/MenuBar/MenubarBtns.stories.tsx
  function BtnsParent (line 149) | function BtnsParent(props: { story: any }) {

FILE: src/content/components/MenuBar/MenubarBtns.tsx
  type MenubarBtnProps (line 4) | interface MenubarBtnProps
  type FavBtnProps (line 97) | interface FavBtnProps extends MenubarBtnProps {
  type PinBtnProps (line 169) | interface PinBtnProps extends MenubarBtnProps {
  type FocusBtnProps (line 200) | interface FocusBtnProps extends MenubarBtnProps {

FILE: src/content/components/MenuBar/Profiles.tsx
  type ProfilesProps (line 10) | interface ProfilesProps {
  function ProfilesBtn (line 57) | function ProfilesBtn(props: React.ComponentProps<'button'>) {

FILE: src/content/components/MenuBar/SearchBox.stories.tsx
  function fakeSuggest (line 70) | function fakeSuggest(text: string): SuggestItem[] {
  function BtnsParent (line 77) | function BtnsParent(props: { story: any }) {

FILE: src/content/components/MenuBar/SearchBox.tsx
  type SearchBoxProps (line 17) | interface SearchBoxProps {

FILE: src/content/components/MenuBar/Suggest.stories.tsx
  function fakeSuggest (line 56) | function fakeSuggest(text: string): SuggestItem[] {

FILE: src/content/components/MenuBar/Suggest.tsx
  type SuggestItem (line 15) | interface SuggestItem {
  type SuggestProps (line 20) | type SuggestProps = {

FILE: src/content/components/MtaBox/MtaBox.container.tsx
  type Dispatchers (line 12) | type Dispatchers = ExtractDispatchers<

FILE: src/content/components/MtaBox/MtaBox.tsx
  type MtaBoxProps (line 9) | interface MtaBoxProps {
  function transformTyping (line 118) | function transformTyping(event$: Observable<React.KeyboardEvent>) {

FILE: src/content/components/SaladBowl/SaladBowl.container.tsx
  type Dispatchers (line 10) | type Dispatchers = ExtractDispatchers<SaladBowlPortalProps, 'onActive'>

FILE: src/content/components/SaladBowl/SaladBowl.portal.tsx
  type SaladBowlPortalProps (line 8) | interface SaladBowlPortalProps extends Omit<SaladBowlProps, 'onHover'> {

FILE: src/content/components/SaladBowl/SaladBowl.stories.tsx
  function BowlBackground (line 44) | function BowlBackground() {

FILE: src/content/components/SaladBowl/SaladBowl.tsx
  type SaladBowlProps (line 7) | interface SaladBowlProps {

FILE: src/content/components/WaveformBox/WaveformBox.container.tsx
  type Dispatchers (line 10) | type Dispatchers = ExtractDispatchers<

FILE: src/content/components/WaveformBox/WaveformBox.tsx
  type WaveformBoxProps (line 5) | interface WaveformBoxProps {

FILE: src/content/components/WordEditor/CtxTransList.tsx
  type CtxTransListProps (line 10) | interface CtxTransListProps {

FILE: src/content/components/WordEditor/Notes.tsx
  type NotesProps (line 44) | interface NotesProps
  function stopPropagation (line 392) | function stopPropagation(e: React.KeyboardEvent<HTMLElement>) {

FILE: src/content/components/WordEditor/WordCards.tsx
  type WordCardsProps (line 5) | interface WordCardsProps {
  function genParagraphs (line 105) | function genParagraphs(text: string): React.ReactNode {

FILE: src/content/components/WordEditor/WordEditor.container.tsx
  type Dispatchers (line 10) | type Dispatchers = ExtractDispatchers<WordEditorPortalProps, 'onClose'>

FILE: src/content/components/WordEditor/WordEditor.portal.tsx
  type WordEditorPortalProps (line 7) | interface WordEditorPortalProps extends WordEditorProps {

FILE: src/content/components/WordEditor/WordEditor.tsx
  type WordEditorProps (line 5) | interface WordEditorProps extends NotesProps {}

FILE: src/content/components/WordEditor/WordEditorPanel.tsx
  type WordEditorPanelBtns (line 4) | type WordEditorPanelBtns = Array<{
  type WordEditorPanelProps (line 10) | interface WordEditorPanelProps {

FILE: src/content/index.tsx
  function main (line 20) | async function main() {

FILE: src/content/redux/epics/newSelection.epic.ts
  function selectionInsideDictPanel (line 60) | function selectionInsideDictPanel(
  function selectionToQSPanel (line 91) | function selectionToQSPanel(

FILE: src/content/redux/epics/utils.ts
  type Epic (line 6) | type Epic<

FILE: src/content/redux/index.ts
  function queryStoreState (line 97) | async function queryStoreState() {

FILE: src/content/redux/init.ts
  function initStandaloneQuickSearch (line 237) | async function initStandaloneQuickSearch(
  function initPopup (line 287) | async function initPopup(dispatch: StoreDispatch, state: StoreState) {
  function initTripleCtrl (line 318) | async function initTripleCtrl(dispatch: StoreDispatch, state: StoreState) {

FILE: src/content/redux/modules/action-catalog.ts
  type ActionCatalog (line 8) | type ActionCatalog = CreateActionCatalog<{

FILE: src/content/redux/modules/index.ts
  type StoreState (line 10) | type StoreState = State
  type StoreActionCatalog (line 12) | type StoreActionCatalog = ActionCatalog
  type StoreActionType (line 14) | type StoreActionType = ActionType<StoreActionCatalog>
  type StoreAction (line 16) | type StoreAction<T extends StoreActionType = StoreActionType> = Action<
  type ThunkAction (line 21) | type ThunkAction<
  type StoreDispatch (line 31) | type StoreDispatch<

FILE: src/content/redux/modules/state.ts
  type State (line 111) | type State = PromiseType<ReturnType<typeof initState>>

FILE: src/options/acknowledgement.ts
  type Acknowledgement (line 1) | type Acknowledgement = Array<{

FILE: src/options/components/Entries/ContextMenus/AddModal.tsx
  type AddModalProps (line 21) | interface AddModalProps {
  function renderListItem (line 59) | function renderListItem(menuID: string) {
  function addItem (line 146) | function addItem() {

FILE: src/options/components/Entries/ContextMenus/EditeModal.tsx
  type EditModalProps (line 11) | interface EditModalProps {
  function submitForm (line 74) | function submitForm() {
  function closeModal (line 80) | function closeModal() {

FILE: src/options/components/Entries/Dictionaries/AllDicts.tsx
  type AllDictsProps (line 8) | interface AllDictsProps {

FILE: src/options/components/Entries/Dictionaries/DictTitle/index.tsx
  type DictTitleProps (line 8) | interface DictTitleProps {
  function openDictSrcPage (line 55) | function openDictSrcPage(dictID: DictID, dictLangs: string) {

FILE: src/options/components/Entries/Dictionaries/EditModal.tsx
  type EditModalProps (line 18) | interface EditModalProps {

FILE: src/options/components/Entries/ImportExport.tsx
  type ConfigStorage (line 16) | type ConfigStorage = {
  function importConfig (line 69) | async function importConfig(file: RcFile, t: TFunction) {
  function exportConfig (line 151) | async function exportConfig(t: TFunction) {

FILE: src/options/components/Entries/Notebook/sync-services/ankiconnect.tsx
  type AnkiConnectModalProps (line 21) | interface AnkiConnectModalProps {
  function submitForm (line 172) | function submitForm() {
  function closeModal (line 178) | function closeModal() {
  function verify (line 191) | async function verify(service: Service) {
  function verifyService (line 252) | async function verifyService() {
  function saveService (line 271) | async function saveService() {
  function extractConfigFromForm (line 298) | function extractConfigFromForm(): SyncConfig | undefined {
  function notifyError (line 313) | function notifyError(error: Error | string) {

FILE: src/options/components/Entries/Notebook/sync-services/eudic.tsx
  type EudicModalProps (line 18) | interface EudicModalProps {
  function submitForm (line 104) | function submitForm() {
  function closeModal (line 110) | function closeModal() {
  function verify (line 123) | async function verify(service: Service): Promise<Boolean> {
  function verifyService (line 136) | async function verifyService() {
  function saveService (line 149) | async function saveService() {
  function extractConfigFromForm (line 179) | function extractConfigFromForm(): SyncConfig | undefined {
  function onSyncAll (line 194) | async function onSyncAll(service: Service) {
  function syncWords (line 206) | async function syncWords(service: Service) {
  function notifyError (line 222) | function notifyError(error: Error | string, message: string = 'Error') {

FILE: src/options/components/Entries/Notebook/sync-services/shanbay.tsx
  type WebdavModalProps (line 8) | interface WebdavModalProps {
  function onToggleEnable (line 51) | async function onToggleEnable(enable: boolean) {
  function onSyncAll (line 85) | async function onSyncAll() {
  function onSyncLast (line 97) | async function onSyncLast() {
  function syncWords (line 109) | async function syncWords(words?: Word[]) {

FILE: src/options/components/Entries/Notebook/sync-services/webdav.tsx
  type WebdavModalProps (line 22) | interface WebdavModalProps {
  function submitForm (line 119) | function submitForm() {
  function closeModal (line 125) | function closeModal() {
  function deleteService (line 138) | function deleteService() {
  function verifyService (line 149) | async function verifyService() {
  function saveService (line 183) | async function saveService() {
  function extractConfigFromForm (line 218) | function extractConfigFromForm(): SyncConfig | undefined {
  function tryTo (line 241) | async function tryTo(action: () => any): Promise<void> {
  function notifyError (line 254) | function notifyError(error: Error | string) {

FILE: src/options/components/Entries/Profiles/EditNameModal.tsx
  type EditNameModalProps (line 5) | interface EditNameModalProps {

FILE: src/options/components/Entries/QuickSearch/StandaloneModal.tsx
  type StandaloneModalProps (line 10) | interface StandaloneModalProps {

FILE: src/options/components/Entries/QuickSearch/TitlebarOffsetModal.tsx
  type TitlebarOffsetModalProps (line 15) | interface TitlebarOffsetModalProps {

FILE: src/options/components/Entries/SearchModes/searchMode.tsx
  type Mode (line 10) | type Mode = 'mode' | 'pinMode' | 'panelMode' | 'qsPanelMode'

FILE: src/options/components/EntrySideBar/index.tsx
  type EntrySideBarProps (line 30) | interface EntrySideBarProps {

FILE: src/options/components/Header/HeadInfo/index.tsx
  function preventDefault (line 71) | function preventDefault(e: React.MouseEvent<HTMLElement>) {

FILE: src/options/components/Header/index.tsx
  type HeaderProps (line 11) | interface HeaderProps {

FILE: src/options/components/InputNumberGroup/index.tsx
  type InputNumberGroupProps (line 7) | interface InputNumberGroupProps extends InputNumberProps {

FILE: src/options/components/MainEntry.tsx
  function getEntry (line 110) | function getEntry(): string {

FILE: src/options/components/MatchPatternModal/ PatternItem.tsx
  type PatternItemProps (line 5) | interface PatternItemProps {

FILE: src/options/components/MatchPatternModal/index.tsx
  type MatchPatternModalProps (line 15) | interface MatchPatternModalProps {
  function validatePatterns (line 49) | async function validatePatterns(rule: Rule, value: [string, string]) {

FILE: src/options/components/SaladictForm/index.tsx
  type FieldValues (line 26) | interface FieldValues {
  type FieldShow (line 30) | interface FieldShow {
  type SaladictFormItem (line 34) | interface SaladictFormItem
  type SaladictFormProps (line 48) | interface SaladictFormProps
  function extractInitial (line 68) | function extractInitial(
  function genFormItems (line 115) | function genFormItems(items: SaladictFormItem[]) {
  constant NUMBER_RULES (line 229) | const NUMBER_RULES: Rule[] = [

FILE: src/options/components/SaladictModalForm.tsx
  type SaladictModalFormProps (line 17) | interface SaladictModalFormProps

FILE: src/options/components/SortableList/index.tsx
  type SortableListItem (line 18) | type SortableListItem = { value: string; title: React.ReactNode }
  type SortableListItemProps (line 20) | interface SortableListItemProps {
  type SortableListProps (line 29) | interface SortableListProps
  function SortableList (line 45) | function SortableList(props: SortableListProps) {

FILE: src/options/components/SortableList/reorder.ts
  function reorder (line 1) | function reorder<T extends readonly any[]>(

FILE: src/options/helpers/path-joiner.ts
  function getConfigPath (line 103) | function getConfigPath(...args: string[]): string {
  function getProfilePath (line 211) | function getProfilePath(...args: string[]): string {

FILE: src/options/helpers/upload.ts
  function checkOptionalPermissions (line 84) | async function checkOptionalPermissions(

FILE: src/popup/Notebook.tsx
  type NotebookProps (line 6) | interface NotebookProps {
  function renderError (line 36) | function renderError(t: TFunction) {
  function renderEmpty (line 57) | function renderEmpty(t: TFunction) {
  function renderSuccess (line 78) | function renderSuccess(t: TFunction, word: Word) {

FILE: src/popup/Popup.tsx
  type PopupProps (line 17) | interface PopupProps {
  function toggleTempOff (line 199) | function toggleTempOff() {
  function toggleInsCap (line 227) | function toggleInsCap() {
  function toggleAppActive (line 240) | function toggleAppActive() {
  function showQRcode (line 247) | async function showQRcode() {

FILE: src/popup/__fake__/env.ts
  function main (line 5) | async function main() {

FILE: src/popup/index.tsx
  function showPanel (line 63) | async function showPanel(config: AppConfig) {
  function addNotebook (line 80) | async function addNotebook() {
  function openOptions (line 128) | function openOptions() {
  function sendContextMenusClick (line 132) | async function sendContextMenusClick(menuItemId: string) {

FILE: src/selection/helper.ts
  function isQSKey (line 13) | function isQSKey(evt: KeyboardEvent): boolean {
  function isEscapeKey (line 20) | function isEscapeKey(evt: KeyboardEvent): boolean {
  function whenKeyPressed (line 24) | function whenKeyPressed(
  function isTypeField (line 43) | function isTypeField(element: Node | EventTarget | null): boolean {
  function isBlacklisted (line 71) | function isBlacklisted(config: AppConfig): boolean {
  function newSelectionWord (line 82) | async function newSelectionWord(

FILE: src/selection/instant-capture.ts
  function createIntantCaptureStream (line 25) | function createIntantCaptureStream(config: AppConfig | null) {
  function getCursorWord (line 127) | function getCursorWord(

FILE: src/selection/message.ts
  type PostMessageEvent (line 4) | interface PostMessageEvent extends MessageEvent {
  function postMessageHandler (line 11) | function postMessageHandler({ data, source }: PostMessageEvent) {
  function sendMessage (line 38) | function sendMessage(payload: Message<'SELECTION'>['payload']) {
  function sendEmptyMessage (line 64) | function sendEmptyMessage(isDictPanel: boolean) {

FILE: src/selection/quick-search.ts
  function createQuickSearchStream (line 12) | function createQuickSearchStream(config: AppConfig | null) {

FILE: src/selection/select-text.ts
  function createSelectTextStream (line 36) | function createSelectTextStream(config: AppConfig | null) {
  function withTouchMode (line 44) | function withTouchMode(config: AppConfig) {
  function withoutTouchMode (line 168) | function withoutTouchMode(config: AppConfig) {
  function useInPanelSelect (line 238) | function useInPanelSelect(
  function clickPeriodCountStream (line 343) | function clickPeriodCountStream(

FILE: src/typings/css.d.ts
  type Properties (line 5) | interface Properties {

FILE: src/typings/global.d.ts
  type Window (line 1) | interface Window {

FILE: src/typings/helpers.ts
  type DeepReadonlyArray (line 1) | interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}
  type DeepReadonlyObject (line 3) | type DeepReadonlyObject<T> = {
  type DeepReadonly (line 7) | type DeepReadonly<T> = T extends (infer R)[]
  type Diff (line 15) | type Diff<T, K> = Exclude<T, K>
  type Omit (line 17) | type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>
  type Mutable (line 19) | type Mutable<T> = { -readonly [P in keyof T]: T[P] }
  type UnionKeys (line 21) | type UnionKeys<T> = T extends any ? keyof T : never
  type UnionPick (line 22) | type UnionPick<T, K extends UnionKeys<T>> = T extends any
  type Subunion (line 26) | type Subunion<T, U extends T> = U

FILE: src/typings/message.ts
  type MessageConfigType (line 6) | type MessageConfigType<
  type MessageConfig (line 12) | type MessageConfig = MessageConfigType<{
  type MsgType (line 364) | type MsgType = keyof MessageConfig
  type Message (line 368) | type Message<T extends MsgType = MsgType> = T extends any
  type MessageResponse (line 378) | type MessageResponse<T extends MsgType> = Readonly<

FILE: test/specs/_helpers/lang-check.spec.ts
  function tlHelper (line 23) | function tlHelper(matchAll: boolean) {

FILE: test/specs/_helpers/profile-manager.spec.ts
  function fakeStorageGet (line 12) | function fakeStorageGet(store) {

FILE: test/specs/background/context-menus.spec.ts
  function specialConfig (line 18) | function specialConfig() {

FILE: test/specs/background/pdf-sniffer.spec.ts
  function hasListenerPatch (line 12) | function hasListenerPatch(fn) {
  function changeConfig (line 21) | function changeConfig(newConfig: AppConfig, oldConfig: AppConfig) {

FILE: test/specs/background/sync-manager/services/webdav.spec.ts
  method checkServer (line 15) | checkServer(config: SyncConfig) {
  method createDir (line 30) | createDir(config: SyncConfig) {
  method upload (line 43) | upload(config: SyncConfig, body: any = '') {
  method download (line 57) | download(config: SyncConfig, headers: { [index: string]: string } = {}) {
  function mockFetch (line 72) | function mockFetch(
  function genXML (line 719) | function genXML(withDir?: boolean): string {
  function getWord (line 781) | function getWord(word: Partial<Word> = {}): Word {

FILE: test/specs/components/dictionaries/helpers.ts
  function retry (line 3) | async function retry(executor: () => Promise<any>, retryTimes = 1) {

FILE: test/specs/components/dictionaries/mojidict/fixtures.js
  function getInstallationId (line 65) | function getInstallationId() {
  function s (line 69) | function s() {
Condensed preview — 707 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,353K chars).
[
  {
    "path": ".browserslistrc",
    "chars": 26,
    "preview": "Firefox > 67\nChrome >= 63\n"
  },
  {
    "path": ".editorconfig",
    "chars": 147,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\ntrim_"
  },
  {
    "path": ".eslintrc.js",
    "chars": 1079,
    "preview": "module.exports = {\n  env: {\n    browser: true,\n    node: true,\n    'jest/globals': true\n  },\n  extends: [\n    'standard'"
  },
  {
    "path": ".gitattributes",
    "chars": 137,
    "preview": "*.min.js binary\n/public/** binary\n\n# For Github language details\n/test/**/response/*.html linguist-vendored\n/public/** l"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 621,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/_bug_report_chs.md",
    "chars": 1105,
    "preview": "---\nname: 反馈 Bug\nabout: 沙拉查词运行出现不正确行为。\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!--\n反馈前请阅读\n\n- 使用说明: https://saladict.cr"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/_feature_request_chs.md",
    "chars": 992,
    "preview": "---\nname: 功能建议\nabout: 请求实现新功能或改进已有功能。\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!--\n反馈前请阅读\n\n- 使用说明: https://saladict.cri"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/_new_dict_chs.md",
    "chars": 659,
    "preview": "---\nname: 词典推荐\nabout: 请求沙拉查词添加新词典。\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!--\n- 使用说明: https://saladict.crimx.com/manu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 667,
    "preview": "---\nname: Bug report\nabout: Bug related issue.\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n## Device info\n - OS: [e.g. Wind"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 28,
    "preview": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 627,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for Saladict\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature"
  },
  {
    "path": ".github/config.yml",
    "chars": 1481,
    "preview": "# Configuration for request-info - https://github.com/behaviorbot/request-info\n\n# *OPTIONAL* Comment to reply with\n# Can"
  },
  {
    "path": ".github/no-response.yml",
    "chars": 697,
    "preview": "# Configuration for probot-no-response - https://github.com/probot/no-response\n\n# Number of days of inactivity before an"
  },
  {
    "path": ".gitignore",
    "chars": 1371,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Diagnostic reports (https://nodejs."
  },
  {
    "path": ".neutrinorc.js",
    "chars": 10963,
    "preview": "const path = require('path')\nconst fs = require('fs')\nconst webpack = require('webpack')\nconst react = require('@neutrin"
  },
  {
    "path": ".prettierrc",
    "chars": 42,
    "preview": "tabWidth: 2\nsemi: false\nsingleQuote: true\n"
  },
  {
    "path": ".storybook/addons.ts",
    "chars": 547,
    "preview": "import '@storybook/addon-knobs/register'\nimport '@storybook/addon-contexts/register'\nimport '@storybook/addon-actions/re"
  },
  {
    "path": ".storybook/config.ts",
    "chars": 1298,
    "preview": "import {\n  configure,\n  addDecorator,\n  StoryDecorator,\n  addParameters\n} from '@storybook/react'\nimport { withContexts "
  },
  {
    "path": ".storybook/configs/contexts.tsx",
    "chars": 1268,
    "preview": "import React, { FC, useContext, useEffect } from 'react'\nimport {\n  I18nContextProvider,\n  I18nContext,\n  i18nLoader\n} f"
  },
  {
    "path": ".storybook/manager-head.html",
    "chars": 118,
    "preview": "<style>\n  /* disable upgrade floaty */\n  [href='/?path=/settings/about'] {\n    display: none !important;\n  }\n</style>\n"
  },
  {
    "path": ".storybook/preview-head.html",
    "chars": 60,
    "preview": "<style>\n  #story-root {\n    min-height: 100px;\n  }\n</style>\n"
  },
  {
    "path": ".storybook/style.css",
    "chars": 117,
    "preview": "body {\n  width: unset;\n  height: unset;\n  overflow-y: scroll;\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n"
  },
  {
    "path": ".storybook/webpack.config.js",
    "chars": 3771,
    "preview": "const path = require('path')\nconst fs = require('fs')\nconst Neutrino = require('neutrino/Neutrino')\nconst neutrinorc = r"
  },
  {
    "path": ".travis.yml",
    "chars": 168,
    "preview": "language: node_js\nnode_js:\n  - 'stable'\nscript:\n  - yarn lint\n  - yarn build\n  # remove agnostic tests\n  - yarn test --t"
  },
  {
    "path": ".vscode/locales.schema.json",
    "chars": 729,
    "preview": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\": {\n      \"$ref\": \"#/definitions/locale\"\n    },\n    \"options\": {\n     "
  },
  {
    "path": ".vscode/settings.json",
    "chars": 608,
    "preview": "{\n  \"json.schemas\": [\n    {\n      \"fileMatch\": [\"src/components/dictionaries/**/_locales.json\"],\n      \"url\": \".vscode/l"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 130932,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file. See [standard-version](https://github."
  },
  {
    "path": "CONTRIBUTING-zh.md",
    "chars": 3001,
    "preview": "# 沙拉查词贡献指南\n\n:+1::tada: 首先,感谢你愿意抽时间为这个项目作贡献! :tada::+1:\n\n## 贡献前注意\n\n:warning: 除非是小的修复,在动手前建议新开一个 WIP(施工中)issue 或 PR 阐述你要做的"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5257,
    "preview": "# Contributing to Saladict\n\n:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:\n\n## How to Contri"
  },
  {
    "path": "LICENSE",
    "chars": 1073,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 CRIMX\n\nPermission is hereby granted, free of charge, to any person obtaining a"
  },
  {
    "path": "README-zh.md",
    "chars": 3123,
    "preview": "# 沙拉查词 Saladict\n\n[![Version](https://img.shields.io/github/release/crimx/ext-saladict.svg?label=version)](https://github"
  },
  {
    "path": "README.md",
    "chars": 4127,
    "preview": "# Saladict 沙拉查词\n\n[![Version](https://img.shields.io/github/release/crimx/ext-saladict.svg?label=version)](https://github"
  },
  {
    "path": "assets/content.css",
    "chars": 267,
    "preview": ".saladict-div,\n.saladict-div > .saladict-external,\n.saladict-div > .saladict-panel {\n  display: block !important;\n  widt"
  },
  {
    "path": "assets/fanyi.youdao.2.0/all-packed.css",
    "chars": 14926,
    "preview": "html{_background:url(null) fixed;}.forbid-select{-moz-user-select:none;-khtml-user-select:none;user-select:none;}.OUTFOX"
  },
  {
    "path": "assets/fanyi.youdao.2.0/conn.html",
    "chars": 261,
    "preview": "\n<!DOCTYPE HTML>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n<script type=\"text/j"
  },
  {
    "path": "assets/fanyi.youdao.2.0/conn.js",
    "chars": 11503,
    "preview": "if (!this.JSON) {\n  this.JSON = {};\n}\n/**\n* JSON 解析库\n*/\n(function() {\n  function f(n) {\n      return n < 10 ? '0' + n : "
  },
  {
    "path": "assets/fanyi.youdao.2.0/main.js",
    "chars": 57256,
    "preview": "/* eslint-disable */\n\n;(function () {\n  var JSONDAO, TR;\n  if(this.JSON&&this.JSON.stringify.toString().indexOf(\"[native"
  },
  {
    "path": "assets/google-page-trans.js",
    "chars": 2496,
    "preview": ";(function () {\n  const $script = document.createElement('script');\n  $script.type = 'text/javascript';\n  $script.charse"
  },
  {
    "path": "assets/inject-dict-panel.js",
    "chars": 689,
    "preview": "const manifest = browser.runtime.getManifest()\nif (manifest.content_scripts) {\n  for (const script of manifest.content_s"
  },
  {
    "path": "assets/vimium-c-injector.js",
    "chars": 6206,
    "preview": "\"use strict\"; // eslint-disable-line strict\n(function () {\n    /**\n     * Vimium C 生命周期回调函数,在 https://github.com/gdh1995"
  },
  {
    "path": "commitlint.config.js",
    "chars": 68,
    "preview": "module.exports = {\n  extends: ['@commitlint/config-conventional']\n}\n"
  },
  {
    "path": "config/jest/cssTransform.js",
    "chars": 316,
    "preview": "'use strict'\n\n// This is a custom Jest transformer turning style imports into empty objects.\n// http://facebook.github.i"
  },
  {
    "path": "config/jest/fileTransform.js",
    "chars": 307,
    "preview": "'use strict'\n\nconst path = require('path')\n\n// This is a custom Jest transformer turning file imports into filenames.\n//"
  },
  {
    "path": "config/jest/setupTests.js",
    "chars": 747,
    "preview": "import browser from 'sinon-chrome/extensions'\n// import Enzyme from 'enzyme'\n// import Adapter from 'enzyme-adapter-reac"
  },
  {
    "path": "jest.config.js",
    "chars": 128,
    "preview": "const neutrino = require('neutrino')\n\nprocess.env.NODE_ENV = process.env.NODE_ENV || 'test'\n\nmodule.exports = neutrino()"
  },
  {
    "path": "jsconfig.json",
    "chars": 96,
    "preview": "{\n  \"compilerOptions\": {\n    \"baseUrl\": \"./\",\n    \"paths\": {\n      \"@/*\": [\"src/*\"]\n    }\n  }\n}\n"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator/AppDelegate.swift",
    "chars": 587,
    "preview": "//\n//  AppDelegate.swift\n//  Saladict - Pop-up Dictionary and Page Translator\n//\n//  Created by Jack Wong on 2021/5/31.\n"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator/Assets.xcassets/AccentColor.colorset/Contents.json",
    "chars": 123,
    "preview": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 972,
    "preview": "{\n  \"images\" : [\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"icon-16.png\",\n      \"scale\" : "
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator/Assets.xcassets/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator/Base.lproj/Main.storyboard",
    "chars": 12684,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" t"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator/Info.plist",
    "chars": 973,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator/Saladict___Pop_up_Dictionary_and_Page_Translator.entitlements",
    "chars": 322,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator/ViewController.swift",
    "chars": 1763,
    "preview": "//\n//  ViewController.swift\n//  Saladict - Pop-up Dictionary and Page Translator\n//\n//  Created by Jack Wong on 2021/5/3"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator Extension/Info.plist",
    "chars": 1155,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator Extension/SafariWebExtensionHandler.swift",
    "chars": 804,
    "preview": "//\n//  SafariWebExtensionHandler.swift\n//  Saladict - Pop-up Dictionary and Page Translator Extension\n//\n//  Created by "
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator Extension/Saladict___Pop_up_Dictionary_and_Page_Translator_Extension.entitlements",
    "chars": 322,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator.xcodeproj/project.pbxproj",
    "chars": 25806,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "mac-app/Saladict - Pop-up Dictionary and Page Translator/Saladict - Pop-up Dictionary and Page Translator.xcodeproj/xcuserdata/crimx.xcuserdatad/xcschemes/xcschememanagement.plist",
    "chars": 383,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "package.json",
    "chars": 6031,
    "preview": "{\n  \"name\": \"saladict\",\n  \"version\": \"7.20.0\",\n  \"description\": \"Chrome extension and Firefox WebExtension; inline trans"
  },
  {
    "path": "postcss.config.js",
    "chars": 172,
    "preview": "module.exports = () => ({\n  plugins: [\n    require('postcss-flexbugs-fixes'),\n    require('autoprefixer')({\n      browse"
  },
  {
    "path": "scripts/after-build.js",
    "chars": 810,
    "preview": "const fs = require('fs-extra')\nconst path = require('path')\n\nmodule.exports = class AfterBuildPlugin {\n  apply(compiler)"
  },
  {
    "path": "scripts/build.js",
    "chars": 7628,
    "preview": "'use strict'\n\n// Do this as the first thing so that any code reading it knows the right env.\nprocess.env.BABEL_ENV = 'pr"
  },
  {
    "path": "scripts/firefox-fix.js",
    "chars": 3163,
    "preview": "// Firefox does not support dynamic import in WebExtension\n// https://bugzilla.mozilla.org/show_bug.cgi?id=1536094\n\ncons"
  },
  {
    "path": "scripts/fixtures.js",
    "chars": 5134,
    "preview": "const path = require('path')\nconst fs = require('fs-extra')\nconst axios = require('axios')\nconst SocksProxyAgent = requi"
  },
  {
    "path": "scripts/pdf.js",
    "chars": 4839,
    "preview": "/** !\n * Upgrade PDF.js\n */\n\nconst shell = require('shelljs')\nconst path = require('path')\nconst fs = require('fs-extra'"
  },
  {
    "path": "scripts/setup-env.js",
    "chars": 1212,
    "preview": "const fs = require('fs-extra')\nconst path = require('path')\n\nmain().catch(swallow)\n\n// set-up local testing env\nasync fu"
  },
  {
    "path": "scripts/start.js",
    "chars": 3057,
    "preview": "'use strict'\n\n// Do this as the first thing so that any code reading it knows the right env.\nprocess.env.BABEL_ENV = 'de"
  },
  {
    "path": "scripts/style-extractor.js",
    "chars": 1553,
    "preview": "/* eslint-disable @typescript-eslint/no-unused-vars */\nconst postcss = require('postcss')\nconst fs = require('fs')\nconst"
  },
  {
    "path": "scripts/test.js",
    "chars": 903,
    "preview": "'use strict'\n\n// Do this as the first thing so that any code reading it knows the right env.\nprocess.env.BABEL_ENV = 'te"
  },
  {
    "path": "src/_helpers/__mocks__/browser-api.ts",
    "chars": 12810,
    "preview": "/**\n * @file Wraps some of the extension apis\n */\n\nimport { Observable, fromEventPattern } from 'rxjs'\nimport { map } fr"
  },
  {
    "path": "src/_helpers/__mocks__/config-manager.ts",
    "chars": 1269,
    "preview": "import { AppConfig, getDefaultConfig } from '@/app-config'\n\nimport { Observable, fromEventPattern, of, concat } from 'rx"
  },
  {
    "path": "src/_helpers/__mocks__/selection.ts",
    "chars": 264,
    "preview": "export interface SelectionMock {\n  hasSelection: jest.Mock\n  getSelectionText: jest.Mock\n  getSelectionSentence: jest.Mo"
  },
  {
    "path": "src/_helpers/analytics/events.ts",
    "chars": 587,
    "preview": "export type GAEventBase = {\n  category: string\n  action: string\n  label?: string\n  value?: string\n}\n\ntype GAEventFactory"
  },
  {
    "path": "src/_helpers/analytics/index.ts",
    "chars": 2677,
    "preview": "import UAParser from 'ua-parser-js'\nimport axios from 'axios'\nimport uuid from 'uuid/v4'\nimport { message, storage } fro"
  },
  {
    "path": "src/_helpers/browser-api.ts",
    "chars": 15832,
    "preview": "/**\n * @file Wraps some of the extension apis\n */\n\nimport { Observable, fromEventPattern } from 'rxjs'\nimport { map, fil"
  },
  {
    "path": "src/_helpers/check-update.ts",
    "chars": 1153,
    "preview": "export interface ReleaseData {\n  version: string\n  data: string[]\n}\n\n/**\n * 3 major newer\n * 2 minor newer\n * 1 patch ne"
  },
  {
    "path": "src/_helpers/chs-to-chz.ts",
    "chars": 37174,
    "preview": "const charMap = new Map([\n  ['与', '與'],\n  ['丒', '囟'],\n  ['专', '專'],\n  ['丗', '卅'],\n  ['业', '業'],\n  ['丛', '叢'],\n  ['东', '東"
  },
  {
    "path": "src/_helpers/config-manager.ts",
    "chars": 2738,
    "preview": "import pako from 'pako'\nimport { getDefaultConfig, AppConfig } from '@/app-config'\nimport { mergeConfig } from '@/app-co"
  },
  {
    "path": "src/_helpers/dom.ts",
    "chars": 205,
    "preview": "/**\n * xhtml returns small case\n */\nexport function isTagName(node: Node, tagName: string): boolean {\n  return (\n    ((n"
  },
  {
    "path": "src/_helpers/fetch-dom.ts",
    "chars": 1157,
    "preview": "import DOMPurify from 'dompurify'\nimport axios, { AxiosRequestConfig } from 'axios'\n\nexport function fetchDOM(\n  url: st"
  },
  {
    "path": "src/_helpers/getSuggests.ts",
    "chars": 1481,
    "preview": "import { first } from './promise-more'\n\ninterface Suggest {\n  entry: string\n  explain: string\n}\n\nexport function getSugg"
  },
  {
    "path": "src/_helpers/hooks.ts",
    "chars": 439,
    "preview": "import { useRef } from 'react'\n\n/**\n * Equivalent to useCallback(fn, [])\n */\nexport function useFixedCallback<T>(fn: T):"
  },
  {
    "path": "src/_helpers/i18n.ts",
    "chars": 7402,
    "preview": "import React, {\n  useState,\n  useLayoutEffect,\n  FC,\n  useContext,\n  useRef,\n  Fragment,\n  PropsWithChildren\n} from 'rea"
  },
  {
    "path": "src/_helpers/injectSaladictInternal.ts",
    "chars": 973,
    "preview": "export async function injectDictPanel(tab: browser.tabs.Tab | undefined) {\n  if (tab && tab.id) {\n    const tabId = tab."
  },
  {
    "path": "src/_helpers/integrity.ts",
    "chars": 285,
    "preview": "export const isExtTainted =\n  browser.runtime.id !== atob('Y2Rvbm5tZmZrZGFvYWpma25vZWVlY21jaGlicG1rbWc=') &&\n  browser.r"
  },
  {
    "path": "src/_helpers/lang-check.ts",
    "chars": 4688,
    "preview": "import memoizeOne from 'memoize-one'\n\nconst languages = [\n  'chinese',\n  'english',\n  'japanese',\n  'korean',\n  'french'"
  },
  {
    "path": "src/_helpers/matchPatternToRegExpStr.ts",
    "chars": 1115,
    "preview": "export function matchPatternToRegExpStr(pattern: string): string {\n  if (pattern === '') {\n    return '^(?:http|https|fi"
  },
  {
    "path": "src/_helpers/observables.ts",
    "chars": 1902,
    "preview": "import {\n  filter,\n  map,\n  switchMap,\n  delay,\n  debounceTime,\n  mergeMap,\n  takeUntil,\n  mapTo\n} from 'rxjs/operators'"
  },
  {
    "path": "src/_helpers/permission-manager.ts",
    "chars": 944,
    "preview": "import { AppConfig } from '@/app-config'\nimport { isFirefox, isOpera, isSafari } from './saladict'\n\nexport async functio"
  },
  {
    "path": "src/_helpers/profile-manager.ts",
    "chars": 8570,
    "preview": "/**\n * Profiles are switchable profiles\n */\nimport pako from 'pako'\nimport {\n  getDefaultProfile,\n  Profile,\n  genProfil"
  },
  {
    "path": "src/_helpers/promise-more.ts",
    "chars": 8779,
    "preview": "/* eslint-disable prettier/prettier */\n\n/**\n * Like Promise.all but always resolves.\n */\nexport function reflect<T1, T2,"
  },
  {
    "path": "src/_helpers/record-manager.ts",
    "chars": 2459,
    "preview": "/**\n * Abstracted layer for storing large amount of word records.\n */\n\nimport { message } from '@/_helpers/browser-api'\n"
  },
  {
    "path": "src/_helpers/saladict.ts",
    "chars": 1753,
    "preview": "/** Pages with the Saladict extension domain */\nexport const isBackgroundPage = () => !!window.__SALADICT_BACKGROUND_PAG"
  },
  {
    "path": "src/_helpers/scrollbar-width.ts",
    "chars": 514,
    "preview": "import memoizeOne from 'memoize-one'\n\nexport const getScrollbarWidth = memoizeOne(() => {\n  if (typeof document === 'und"
  },
  {
    "path": "src/_helpers/storybook.tsx",
    "chars": 4376,
    "preview": "import React, { FC, useState, useEffect } from 'react'\nimport classNames from 'classnames'\nimport root from 'react-shado"
  },
  {
    "path": "src/_helpers/titlebar-offset.ts",
    "chars": 1554,
    "preview": "/**\n * Extension API is inconsistent with the window top.\n * Sometimes the titlebar height is included, sometimes not.\n "
  },
  {
    "path": "src/_helpers/translateCtx.ts",
    "chars": 2981,
    "preview": "import { DictID, AppConfig } from '@/app-config'\nimport { MachineTranslateResult } from '@/components/dictionaries/helpe"
  },
  {
    "path": "src/_helpers/uniqueKey.ts",
    "chars": 376,
    "preview": "/**\n * Generate a unique key\n */\nexport function genUniqueKey(): string {\n  return (\n    Date.now()\n      .toString()\n  "
  },
  {
    "path": "src/_helpers/wordoftheday.ts",
    "chars": 1102,
    "preview": "import { fetchDirtyDOM } from '@/_helpers/fetch-dom'\nimport { first } from '@/_helpers/promise-more'\nimport { handleNoRe"
  },
  {
    "path": "src/_locales/en/background.ts",
    "chars": 399,
    "preview": "import { locale as _locale } from '../zh-CN/background'\n\nexport const locale: typeof _locale = {\n  app: {\n    off: 'Sala"
  },
  {
    "path": "src/_locales/en/common.ts",
    "chars": 1392,
    "preview": "import { locale as _locale } from '../zh-CN/common'\n\nexport const locale: typeof _locale = {\n  add: 'Add',\n  delete: 'De"
  },
  {
    "path": "src/_locales/en/content.ts",
    "chars": 1782,
    "preview": "import { locale as _locale } from '../zh-CN/content'\n\nexport const locale: typeof _locale = {\n  chooseLang: 'Choose anot"
  },
  {
    "path": "src/_locales/en/langcode.ts",
    "chars": 684,
    "preview": "import en from '@opentranslate/languages/locales/en.json'\nimport { locale as _locale } from '../zh-CN/langcode'\n\nexport "
  },
  {
    "path": "src/_locales/en/menus.ts",
    "chars": 1549,
    "preview": "import { locale as _locale } from '../zh-CN/menus'\n\nexport const locale: typeof _locale = {\n  baidu_page_translate: 'Bai"
  },
  {
    "path": "src/_locales/en/options.ts",
    "chars": 19527,
    "preview": "import { locale as _locale } from '../zh-CN/options'\n\nexport const locale: typeof _locale = {\n  title: 'Saladict Options"
  },
  {
    "path": "src/_locales/en/popup.ts",
    "chars": 556,
    "preview": "import { locale as _locale } from '../zh-CN/popup'\n\nexport const locale: typeof _locale = {\n  title: 'Saladict Browser A"
  },
  {
    "path": "src/_locales/en/wordpage.ts",
    "chars": 1430,
    "preview": "import { locale as _locale } from '../zh-CN/wordpage'\n\nexport const locale: typeof _locale = {\n  title: {\n    history: '"
  },
  {
    "path": "src/_locales/es/background.ts",
    "chars": 452,
    "preview": "import { locale as _locale } from '../zh-CN/background'\n\nexport const locale: typeof _locale = {\n  app: {\n    off: 'Sala"
  },
  {
    "path": "src/_locales/es/common.ts",
    "chars": 1463,
    "preview": "import { locale as _locale } from '../zh-CN/common'\n\nexport const locale: typeof _locale = {\n  add: 'Añadir',\n  delete: "
  },
  {
    "path": "src/_locales/es/content.ts",
    "chars": 1919,
    "preview": "import { locale as _locale } from '../zh-CN/content'\n\nexport const locale: typeof _locale = {\n  chooseLang: 'elegir otro"
  },
  {
    "path": "src/_locales/es/langcode.ts",
    "chars": 660,
    "preview": "import en from '@opentranslate/languages/locales/en.json'\nimport { locale as _locale } from '../zh-CN/langcode'\n\nexport "
  },
  {
    "path": "src/_locales/es/menus.ts",
    "chars": 1632,
    "preview": "import { locale as _locale } from '../zh-CN/menus'\n\nexport const locale: typeof _locale = {\n  baidu_page_translate: 'Tra"
  },
  {
    "path": "src/_locales/es/options.ts",
    "chars": 22480,
    "preview": "import { locale as _locale } from '../zh-CN/options'\n\nexport const locale: typeof _locale = {\n  title: 'Saladict Opcione"
  },
  {
    "path": "src/_locales/es/popup.ts",
    "chars": 633,
    "preview": "import { locale as _locale } from '../zh-CN/popup'\n\nexport const locale: typeof _locale = {\n  title: 'Panel de acciones "
  },
  {
    "path": "src/_locales/es/wordpage.ts",
    "chars": 1581,
    "preview": "import { locale as _locale } from '../zh-CN/wordpage'\n\nexport const locale: typeof _locale = {\n  title: {\n    history: '"
  },
  {
    "path": "src/_locales/manifest/en/messages.json",
    "chars": 1798,
    "preview": "{\n  \"extension_name\": {\n    \"description\": \"Extension name\",\n    \"message\": \"Saladict - Pop-up Dictionary and Page Trans"
  },
  {
    "path": "src/_locales/manifest/np/messages.json",
    "chars": 1790,
    "preview": "{\n  \"extension_name\": {\n    \"description\": \"Extension name\",\n    \"message\": \"सलाडिक्ट - पप-अप शब्दकोश र पृष्ठ अनुवादक\"\n "
  },
  {
    "path": "src/_locales/manifest/zh_CN/messages.json",
    "chars": 1442,
    "preview": "{\n  \"extension_name\": {\n    \"description\": \"Extension name\",\n    \"message\": \"沙拉查词-聚合词典划词翻译\"\n  },\n  \"extension_short_name"
  },
  {
    "path": "src/_locales/manifest/zh_TW/messages.json",
    "chars": 1451,
    "preview": "{\n  \"extension_name\": {\n    \"description\": \"Extension name\",\n    \"message\": \"沙拉查詞-多字典滑鼠選字翻譯\"\n  },\n  \"extension_short_nam"
  },
  {
    "path": "src/_locales/ne/background.ts",
    "chars": 403,
    "preview": "import { locale as _locale } from '../zh-CN/background'\n\nexport const locale: typeof _locale = {\n  app: {\n    off: 'सलाड"
  },
  {
    "path": "src/_locales/ne/common.ts",
    "chars": 1490,
    "preview": "import { locale as _locale } from '../zh-CN/common'\n\nexport const locale: typeof _locale = {\n  add: 'थप्नुहोस्',\n  delet"
  },
  {
    "path": "src/_locales/ne/content.ts",
    "chars": 1926,
    "preview": "import { locale as _locale } from '../zh-CN/content'\n\nexport const locale: typeof _locale = {\n  chooseLang: 'अर्को भाषा "
  },
  {
    "path": "src/_locales/ne/langcode.ts",
    "chars": 714,
    "preview": "import en from '@opentranslate/languages/locales/en.json'\nimport { locale as _locale } from '../zh-CN/langcode'\n\nexport "
  },
  {
    "path": "src/_locales/ne/menus.ts",
    "chars": 1547,
    "preview": "import { locale as _locale } from '../zh-CN/menus'\n\nexport const locale: typeof _locale = {\n  baidu_page_translate: 'बाइ"
  },
  {
    "path": "src/_locales/ne/options.ts",
    "chars": 19527,
    "preview": "import { locale as _locale } from '../zh-CN/options'\n\nexport const locale: typeof _locale = {\n  title: 'Saladict Options"
  },
  {
    "path": "src/_locales/ne/popup.ts",
    "chars": 580,
    "preview": "import { locale as _locale } from '../zh-CN/popup'\n\nexport const locale: typeof _locale = {\n  title: 'सलाडिक्ट ब्राउजर ए"
  },
  {
    "path": "src/_locales/ne/wordpage.ts",
    "chars": 1613,
    "preview": "import { locale as _locale } from '../zh-CN/wordpage'\n\nexport const locale: typeof _locale = {\n  title: {\n    history: '"
  },
  {
    "path": "src/_locales/zh-CN/background.ts",
    "chars": 155,
    "preview": "export const locale = {\n  app: {\n    off: '沙拉查词已关闭(快捷查词依然可用)',\n    tempOff: '沙拉查词已对当前标签关闭(快捷查词依然可用)',\n    unsupported: '"
  },
  {
    "path": "src/_locales/zh-CN/common.ts",
    "chars": 1056,
    "preview": "export const locale = {\n  add: '添加',\n  delete: '删除',\n  save: '保存',\n  cancel: '取消',\n\n  edit: '编辑',\n  sort: '排序',\n  rename"
  },
  {
    "path": "src/_locales/zh-CN/content.ts",
    "chars": 1140,
    "preview": "export const locale = {\n  chooseLang: '-选择其它语言-',\n  standalone: '沙拉查词-独立查词窗口',\n  fetchLangList: '获取全部语言列表',\n  transConte"
  },
  {
    "path": "src/_locales/zh-CN/langcode.ts",
    "chars": 470,
    "preview": "import zhCN from '@opentranslate/languages/locales/zh-CN.json'\n\nexport const locale = {\n  ...zhCN,\n  default: '随扩展语言',\n "
  },
  {
    "path": "src/_locales/zh-CN/menus.ts",
    "chars": 1040,
    "preview": "export const locale = {\n  baidu_page_translate: '百度网页翻译',\n  baidu_search: '百度搜索',\n  bing_dict: '必应词典',\n  bing_search: '必"
  },
  {
    "path": "src/_locales/zh-CN/options.ts",
    "chars": 11620,
    "preview": "export const locale = {\n  title: '沙拉查词设置',\n  previewPanel: '预览查词面板',\n  shortcuts: '设置快捷键',\n  msg_update_error: '设置更新失败',"
  },
  {
    "path": "src/_locales/zh-CN/popup.ts",
    "chars": 330,
    "preview": "export const locale = {\n  title: '沙拉查词-右上弹框',\n  app_active_title: '启用划词',\n  app_temp_active_title: '对当前页暂时关闭划词',\n  insta"
  },
  {
    "path": "src/_locales/zh-CN/wordpage.ts",
    "chars": 1047,
    "preview": "export const locale = {\n  title: {\n    history: '沙拉查词-查词记录',\n    notebook: '沙拉查词-生词本'\n  },\n\n  localonly: '仅本地保存',\n\n  col"
  },
  {
    "path": "src/_locales/zh-TW/background.ts",
    "chars": 228,
    "preview": "import { locale as _locale } from '../zh-CN/background'\n\nexport const locale: typeof _locale = {\n  app: {\n    off: '沙拉查詞"
  },
  {
    "path": "src/_locales/zh-TW/common.ts",
    "chars": 1126,
    "preview": "import { locale as _locale } from '../zh-CN/common'\n\nexport const locale: typeof _locale = {\n  add: '新增',\n  delete: '删除'"
  },
  {
    "path": "src/_locales/zh-TW/content.ts",
    "chars": 1216,
    "preview": "import { locale as _locale } from '../zh-CN/content'\n\nexport const locale: typeof _locale = {\n  chooseLang: '-選擇其它語言-',\n"
  },
  {
    "path": "src/_locales/zh-TW/langcode.ts",
    "chars": 540,
    "preview": "import zhTW from '@opentranslate/languages/locales/zh-TW.json'\nimport { locale as _locale } from '../zh-CN/langcode'\n\nex"
  },
  {
    "path": "src/_locales/zh-TW/menus.ts",
    "chars": 1147,
    "preview": "import { locale as _locale } from '../zh-CN/menus'\n\nexport const locale: typeof _locale = {\n  baidu_page_translate: '百度網"
  },
  {
    "path": "src/_locales/zh-TW/options.ts",
    "chars": 11777,
    "preview": "import { locale as _locale } from '../zh-CN/options'\n\nexport const locale: typeof _locale = {\n  title: '沙拉查詞設定',\n  previ"
  },
  {
    "path": "src/_locales/zh-TW/popup.ts",
    "chars": 404,
    "preview": "import { locale as _locale } from '../zh-CN/popup'\n\nexport const locale: typeof _locale = {\n  title: '沙拉查詞-右上彈框',\n  app_"
  },
  {
    "path": "src/_locales/zh-TW/wordpage.ts",
    "chars": 1121,
    "preview": "import { locale as _locale } from '../zh-CN/wordpage'\n\nexport const locale: typeof _locale = {\n  title: {\n    history: '"
  },
  {
    "path": "src/_sass_shared/_fancy-scrollbar.scss",
    "chars": 1276,
    "preview": "$scrollbar-size: 8px;\n$scrollbar-ff-width: auto; // FF-only accepts auto, thin, none\n$scrollbar-minlength: 50px; // Mini"
  },
  {
    "path": "src/_sass_shared/_global/_interfaces.scss",
    "chars": 3073,
    "preview": "/*-----------------------------------------------*\\\n    Tailored for exposed components\n\\*------------------------------"
  },
  {
    "path": "src/_sass_shared/_global/_mixins.scss",
    "chars": 910,
    "preview": "// Wrapper for @at-root.\n// Emits values with namespace selectors.\n// Usage\n// @include atRoot(.ns) { ... }\n// @include "
  },
  {
    "path": "src/_sass_shared/_global/_variables.scss",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/_sass_shared/_global/_z-indices.scss",
    "chars": 711,
    "preview": "// Max 2^31 − 1 = 2147483647\n\n$global-zindex-dropdown-backdrop: 2147483639 !default;\n$global-zindex-navbar:            2"
  },
  {
    "path": "src/_sass_shared/_namespace.scss",
    "chars": 18,
    "preview": "@use \"sass:math\";\n"
  },
  {
    "path": "src/_sass_shared/_reset.scss",
    "chars": 610,
    "preview": "/*-----------------------------------------------*\\\n    Custom reset\n\\*-----------------------------------------------*/"
  },
  {
    "path": "src/_sass_shared/_theme.scss",
    "chars": 485,
    "preview": ".saladict-theme {\n  background-color: #fff;\n  color: #333;\n  --color-brand: #5caf9e;\n  --color-background: #fff;\n  --col"
  },
  {
    "path": "src/app-config/auth.ts",
    "chars": 602,
    "preview": "import { auth as baidu } from '@/components/dictionaries/baidu/auth'\nimport { auth as caiyun } from '@/components/dictio"
  },
  {
    "path": "src/app-config/context-menus.ts",
    "chars": 1647,
    "preview": "export interface CustomContextItem {\n  name: string\n  url: string\n}\n\nexport type ContextItem = string | CustomContextIte"
  },
  {
    "path": "src/app-config/dicts.ts",
    "chars": 5628,
    "preview": "import { SupportedLangs } from '@/_helpers/lang-check'\n\nimport baidu from '@/components/dictionaries/baidu/config'\nimpor"
  },
  {
    "path": "src/app-config/index.ts",
    "chars": 8816,
    "preview": "import { DeepReadonly } from '@/typings/helpers'\nimport { SupportedLangs } from '@/_helpers/lang-check'\nimport { getAllD"
  },
  {
    "path": "src/app-config/merge-config.ts",
    "chars": 7315,
    "preview": "import { getDefaultConfig, AppConfig, AppConfigMutable } from '@/app-config'\nimport { defaultAllDicts } from './dicts'\n\n"
  },
  {
    "path": "src/app-config/merge-profile.ts",
    "chars": 6032,
    "preview": "import { Profile, ProfileMutable, getDefaultProfile } from './profiles'\n\nimport forEach from 'lodash/forEach'\nimport isN"
  },
  {
    "path": "src/app-config/profiles.ts",
    "chars": 5384,
    "preview": "import { DeepReadonly } from '@/typings/helpers'\nimport { genUniqueKey } from '@/_helpers/uniqueKey'\nimport { getAllDict"
  },
  {
    "path": "src/audio-control/audio-control.scss",
    "chars": 165,
    "preview": "html,\nbody {\n  height: 165px;\n  overflow: hidden;\n  margin: 0;\n  padding: 0;\n}\n\n@import '@/_sass_shared/_theme.scss';\n@i"
  },
  {
    "path": "src/audio-control/index.tsx",
    "chars": 347,
    "preview": "import React from 'react'\nimport ReactDOM from 'react-dom'\nimport Waveform from '@/components/Waveform/Waveform'\n\nimport"
  },
  {
    "path": "src/background/__fake__/env.ts",
    "chars": 598,
    "preview": "import axios from 'axios'\nimport AxiosMockAdapter from 'axios-mock-adapter'\n\nbrowser.runtime.sendMessage['_sender'].call"
  },
  {
    "path": "src/background/__mocks__/database.ts",
    "chars": 213,
    "preview": "export const db = jest.fn()\nexport const isInNotebook = jest.fn()\nexport const saveWord = jest.fn()\nexport const deleteW"
  },
  {
    "path": "src/background/audio-manager.ts",
    "chars": 1118,
    "preview": "import { timer } from '@/_helpers/promise-more'\n\n/**\n * To make sure only one audio plays at a time\n */\nexport class Aud"
  },
  {
    "path": "src/background/badge.ts",
    "chars": 3358,
    "preview": "import { message } from '@/_helpers/browser-api'\nimport { Subject } from 'rxjs'\nimport { switchMapBy } from '@/_helpers/"
  },
  {
    "path": "src/background/clipboard-manager.ts",
    "chars": 1280,
    "preview": "import { openUrl } from '@/_helpers/browser-api'\n\nexport async function copyTextToClipboard(text: string): Promise<void>"
  },
  {
    "path": "src/background/context-menus.ts",
    "chars": 12855,
    "preview": "import { message, openUrl } from '@/_helpers/browser-api'\nimport { AppConfig } from '@/app-config'\nimport isEqual from '"
  },
  {
    "path": "src/background/database/core.ts",
    "chars": 894,
    "preview": "import Dexie from 'dexie'\nimport { Word } from '@/_helpers/record-manager'\n\nexport class SaladictDB extends Dexie {\n  //"
  },
  {
    "path": "src/background/database/index.ts",
    "chars": 936,
    "preview": "export { isInNotebook, getWordsByText, getWords } from './read'\nimport {\n  saveWord as _saveWord,\n  saveWords as _saveWo"
  },
  {
    "path": "src/background/database/read.ts",
    "chars": 2282,
    "preview": "import { isContainChinese, isContainEnglish } from '@/_helpers/lang-check'\nimport { Message, MessageResponse } from '@/t"
  },
  {
    "path": "src/background/database/sync-meta.ts",
    "chars": 668,
    "preview": "import { getDB } from './core'\n\nexport async function getSyncMeta(serviceID: string) {\n  const db = await getDB()\n  retu"
  },
  {
    "path": "src/background/database/write.ts",
    "chars": 786,
    "preview": "import { Word, DBArea } from '@/_helpers/record-manager'\nimport { Message } from '@/typings/message'\nimport { getDB } fr"
  },
  {
    "path": "src/background/env.ts",
    "chars": 95,
    "preview": "export {}\n\nwindow.__SALADICT_INTERNAL_PAGE__ = true\nwindow.__SALADICT_BACKGROUND_PAGE__ = true\n"
  },
  {
    "path": "src/background/i18n-manager.ts",
    "chars": 1052,
    "preview": "import i18next, { TFunction } from 'i18next'\nimport { i18nLoader, Namespace } from '@/_helpers/i18n'\nimport { BehaviorSu"
  },
  {
    "path": "src/background/index.ts",
    "chars": 1182,
    "preview": "import './env'\nimport './initialization'\nimport { getConfig, addConfigListener } from '@/_helpers/config-manager'\nimport"
  },
  {
    "path": "src/background/initialization.ts",
    "chars": 12183,
    "preview": "import mapValues from 'lodash/mapValues'\nimport { message, storage, openUrl } from '@/_helpers/browser-api'\nimport { isE"
  },
  {
    "path": "src/background/page-translate/caiyun.ts",
    "chars": 971,
    "preview": "export function setupCaiyunTrsBackend() {\n  browser.runtime.onMessage.addListener(msg => {\n    if (msg.contentScriptQuer"
  },
  {
    "path": "src/background/pdf-sniffer.ts",
    "chars": 4616,
    "preview": "/**\n * Open pdf link directly\n */\n\nimport { AppConfig } from '@/app-config'\nimport { addConfigListener } from '@/_helper"
  },
  {
    "path": "src/background/server.ts",
    "chars": 7566,
    "preview": "import { message, openUrl } from '@/_helpers/browser-api'\nimport { timeout, timer } from '@/_helpers/promise-more'\nimpor"
  },
  {
    "path": "src/background/sync-manager/__mocks__/helpers.ts",
    "chars": 523,
    "preview": "import { EMPTY, Observable } from 'rxjs'\n\nconst emptyPromise = (): Promise<any> => Promise.resolve()\n\nexport const setSy"
  },
  {
    "path": "src/background/sync-manager/helpers.ts",
    "chars": 2845,
    "preview": "import { storage } from '@/_helpers/browser-api'\nimport { Word } from '@/_helpers/record-manager'\nimport { getWords } fr"
  },
  {
    "path": "src/background/sync-manager/index.ts",
    "chars": 2568,
    "preview": "import { SyncService, SyncServiceConstructor } from './interface'\nimport { concat, from } from 'rxjs'\nimport { filter, p"
  },
  {
    "path": "src/background/sync-manager/interface.ts",
    "chars": 1795,
    "preview": "import { Word } from '@/_helpers/record-manager'\n\nexport interface NotebookFile {\n  timestamp: number\n  words: Word[]\n}\n"
  },
  {
    "path": "src/background/sync-manager/services/ankiconnect/_locales/en.ts",
    "chars": 330,
    "preview": "import { locale as _locale } from './zh-CN'\n\nexport const locale: typeof _locale = {\n  title: 'Anki Connect',\n  error: {"
  },
  {
    "path": "src/background/sync-manager/services/ankiconnect/_locales/zh-CN.ts",
    "chars": 204,
    "preview": "export const locale = {\n  title: 'Anki Connect',\n  error: {\n    server: '无法连接 Anki Connect,请确认 Anki 已在运行。',\n    deck: 'A"
  },
  {
    "path": "src/background/sync-manager/services/ankiconnect/_locales/zh-TW.ts",
    "chars": 265,
    "preview": "import { locale as _locale } from './zh-CN'\n\nexport const locale: typeof _locale = {\n  title: 'Anki Connect',\n  error: {"
  },
  {
    "path": "src/background/sync-manager/services/ankiconnect/index.ts",
    "chars": 10389,
    "preview": "import axios from 'axios'\nimport { Word } from '@/_helpers/record-manager'\nimport { parseCtxText } from '@/_helpers/tran"
  },
  {
    "path": "src/background/sync-manager/services/eudic/_locales/en.ts",
    "chars": 486,
    "preview": "import { locale as _locale } from './zh-CN'\n\nexport const locale: typeof _locale = {\n  title: 'Eudic Word Syncing',\n  op"
  },
  {
    "path": "src/background/sync-manager/services/eudic/_locales/zh-CN.ts",
    "chars": 193,
    "preview": "export const locale = {\n  title: '欧路单词同步',\n  open: '打开',\n  error: {\n    network: '无法访问欧路词典生词本,请检查网络。',\n    illegal_token"
  },
  {
    "path": "src/background/sync-manager/services/eudic/_locales/zh-TW.ts",
    "chars": 254,
    "preview": "import { locale as _locale } from './zh-CN'\n\nexport const locale: typeof _locale = {\n  title: '歐路單字同步',\n  open: '開啟',\n  "
  },
  {
    "path": "src/background/sync-manager/services/eudic/index.ts",
    "chars": 2651,
    "preview": "import { AddConfig, SyncService } from '../../interface'\nimport { getNotebook } from '../../helpers'\nimport axios from '"
  },
  {
    "path": "src/background/sync-manager/services/shanbay/_locales/en.ts",
    "chars": 408,
    "preview": "import { locale as _locale } from './zh-CN'\n\nexport const locale: typeof _locale = {\n  title: 'Shanbay Word Syncing',\n  "
  },
  {
    "path": "src/background/sync-manager/services/shanbay/_locales/zh-CN.ts",
    "chars": 179,
    "preview": "export const locale = {\n  title: '扇贝单词同步',\n  open: '打开',\n  error: {\n    login: '扇贝登录已失效,请点击打开官网重新登录。',\n    network: '无法访"
  },
  {
    "path": "src/background/sync-manager/services/shanbay/_locales/zh-TW.ts",
    "chars": 240,
    "preview": "import { locale as _locale } from './zh-CN'\n\nexport const locale: typeof _locale = {\n  title: '扇貝單字同步',\n  open: '開啟',\n  "
  },
  {
    "path": "src/background/sync-manager/services/shanbay/index.ts",
    "chars": 4355,
    "preview": "import { AddConfig, SyncService } from '../../interface'\nimport { getNotebook, notifyError } from '../../helpers'\nimport"
  },
  {
    "path": "src/background/sync-manager/services/webdav/_locales/en.ts",
    "chars": 703,
    "preview": "import { locale as _locale } from './zh-CN'\n\nexport const locale: typeof _locale = {\n  title: 'WebDAV Word Syncing',\n  e"
  },
  {
    "path": "src/background/sync-manager/services/webdav/_locales/zh-CN.ts",
    "chars": 372,
    "preview": "export const locale = {\n  title: 'WebDAV 单词同步',\n  error: {\n    dir: '服务器上“Saladict”目录格式不正确,请检查。',\n    download:\n      '下"
  },
  {
    "path": "src/background/sync-manager/services/webdav/_locales/zh-TW.ts",
    "chars": 433,
    "preview": "import { locale as _locale } from './zh-CN'\n\nexport const locale: typeof _locale = {\n  title: 'WebDAV 單字同步',\n  error: {\n"
  }
]

// ... and 507 more files (download for full content)

About this extraction

This page contains the full source code of the crimx/ext-saladict GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 707 files (2.1 MB), approximately 588.4k tokens, and a symbol index with 1035 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!