waybetter 0.1.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -6
- package/bin/waybetter.mjs +43 -0
- package/build/runtime.mjs +105 -0
- package/cli/buildenv.mjs +130 -0
- package/cli/dev.mjs +97 -0
- package/cli/i18n.mjs +382 -0
- package/cli/manifests.mjs +383 -0
- package/cli/release.mjs +437 -0
- package/cli/releasecheck.mjs +15 -0
- package/cli/remote.mjs +260 -0
- package/cli/store.mjs +378 -0
- package/cli/strings.mjs +123 -0
- package/dist/runtime/column.d.ts +93 -0
- package/dist/runtime/column.js +451 -0
- package/dist/runtime/column.js.map +1 -0
- package/dist/runtime/commandReport.d.ts +19 -0
- package/dist/runtime/commandReport.js +47 -0
- package/dist/runtime/commandReport.js.map +1 -0
- package/dist/runtime/commands.d.ts +72 -0
- package/dist/runtime/commands.js +214 -0
- package/dist/runtime/commands.js.map +1 -0
- package/dist/runtime/devErrors.d.ts +16 -0
- package/dist/runtime/devErrors.js +30 -0
- package/dist/runtime/devErrors.js.map +1 -0
- package/dist/runtime/domHub.d.ts +21 -0
- package/dist/runtime/domHub.js +139 -4
- package/dist/runtime/domHub.js.map +1 -1
- package/dist/runtime/featureModules.d.ts +157 -0
- package/dist/runtime/featureModules.js +484 -0
- package/dist/runtime/featureModules.js.map +1 -0
- package/dist/runtime/featureTable.d.ts +144 -0
- package/dist/runtime/featureTable.js +223 -0
- package/dist/runtime/featureTable.js.map +1 -0
- package/dist/runtime/fonts.d.ts +22 -0
- package/dist/runtime/fonts.js +72 -0
- package/dist/runtime/fonts.js.map +1 -0
- package/dist/runtime/i18n.d.ts +138 -0
- package/dist/runtime/i18n.js +614 -0
- package/dist/runtime/i18n.js.map +1 -0
- package/dist/runtime/i18nCheck.d.ts +30 -0
- package/dist/runtime/i18nCheck.js +224 -0
- package/dist/runtime/i18nCheck.js.map +1 -0
- package/dist/runtime/pageLang.d.ts +8 -0
- package/dist/runtime/pageLang.js +64 -0
- package/dist/runtime/pageLang.js.map +1 -0
- package/dist/runtime/pageStrings.d.ts +35 -0
- package/dist/runtime/pageStrings.js +76 -0
- package/dist/runtime/pageStrings.js.map +1 -0
- package/dist/runtime/panelButton.d.ts +33 -0
- package/dist/runtime/panelButton.js +83 -0
- package/dist/runtime/panelButton.js.map +1 -0
- package/dist/runtime/permissions.d.ts +47 -0
- package/dist/runtime/permissions.js +141 -0
- package/dist/runtime/permissions.js.map +1 -0
- package/dist/runtime/pluginApi.d.ts +51 -2
- package/dist/runtime/pluginApi.js +137 -22
- package/dist/runtime/pluginApi.js.map +1 -1
- package/dist/runtime/pluginI18n.d.ts +29 -0
- package/dist/runtime/pluginI18n.js +119 -0
- package/dist/runtime/pluginI18n.js.map +1 -0
- package/dist/runtime/settingsForm.d.ts +66 -0
- package/dist/runtime/settingsForm.js +114 -0
- package/dist/runtime/settingsForm.js.map +1 -0
- package/dist/runtime/site.d.ts +5 -0
- package/dist/runtime/site.js +1 -1
- package/dist/runtime/site.js.map +1 -1
- package/dist/runtime/siteRuntime.d.ts +144 -0
- package/dist/runtime/siteRuntime.js +175 -0
- package/dist/runtime/siteRuntime.js.map +1 -0
- package/dist/runtime/stringPackHook.d.ts +84 -0
- package/dist/runtime/stringPackHook.js +220 -0
- package/dist/runtime/stringPackHook.js.map +1 -0
- package/dist/runtime/stringPackTranslate.d.ts +61 -0
- package/dist/runtime/stringPackTranslate.js +267 -0
- package/dist/runtime/stringPackTranslate.js.map +1 -0
- package/dist/runtime/stringPacks.d.ts +248 -0
- package/dist/runtime/stringPacks.js +610 -0
- package/dist/runtime/stringPacks.js.map +1 -0
- package/dist/runtime/styles.d.ts +15 -0
- package/dist/runtime/styles.js +81 -0
- package/dist/runtime/styles.js.map +1 -0
- package/dist/runtime/textNet.d.ts +15 -0
- package/dist/runtime/textNet.js +131 -0
- package/dist/runtime/textNet.js.map +1 -0
- package/dist/runtime/themeApi.d.ts +121 -0
- package/dist/runtime/themeApi.js +220 -0
- package/dist/runtime/themeApi.js.map +1 -0
- package/dist/runtime/themeBar.d.ts +28 -0
- package/dist/runtime/themeBar.js +82 -0
- package/dist/runtime/themeBar.js.map +1 -0
- package/dist/runtime/themeChoice.d.ts +52 -0
- package/dist/runtime/themeChoice.js +69 -0
- package/dist/runtime/themeChoice.js.map +1 -0
- package/dist/runtime/themeComponents.d.ts +435 -0
- package/dist/runtime/themeComponents.js +476 -0
- package/dist/runtime/themeComponents.js.map +1 -0
- package/dist/runtime/themeDecor.d.ts +73 -0
- package/dist/runtime/themeDecor.js +133 -0
- package/dist/runtime/themeDecor.js.map +1 -0
- package/dist/runtime/themeDerive.d.ts +69 -0
- package/dist/runtime/themeDerive.js +117 -0
- package/dist/runtime/themeDerive.js.map +1 -0
- package/dist/runtime/themeDoctor.d.ts +52 -0
- package/dist/runtime/themeDoctor.js +112 -0
- package/dist/runtime/themeDoctor.js.map +1 -0
- package/dist/runtime/themeGuards.d.ts +60 -0
- package/dist/runtime/themeGuards.js +235 -0
- package/dist/runtime/themeGuards.js.map +1 -0
- package/dist/runtime/themeIcons.d.ts +130 -0
- package/dist/runtime/themeIcons.js +271 -0
- package/dist/runtime/themeIcons.js.map +1 -0
- package/dist/runtime/themeInk.d.ts +37 -0
- package/dist/runtime/themeInk.js +111 -0
- package/dist/runtime/themeInk.js.map +1 -0
- package/dist/runtime/themeInvariants.d.ts +39 -0
- package/dist/runtime/themeInvariants.js +273 -0
- package/dist/runtime/themeInvariants.js.map +1 -0
- package/dist/runtime/themeRuntime.d.ts +114 -0
- package/dist/runtime/themeRuntime.js +570 -0
- package/dist/runtime/themeRuntime.js.map +1 -0
- package/dist/runtime/themeSchema.d.ts +10 -0
- package/dist/runtime/themeSchema.js +150 -0
- package/dist/runtime/themeSchema.js.map +1 -0
- package/dist/runtime/themeSpec.d.ts +263 -0
- package/dist/runtime/themeSpec.js +435 -0
- package/dist/runtime/themeSpec.js.map +1 -0
- package/dist/runtime/themeTokens.d.ts +12 -0
- package/dist/runtime/themeTokens.js +14 -6
- package/dist/runtime/themeTokens.js.map +1 -1
- package/dist/runtime/themeVariants.d.ts +30 -0
- package/dist/runtime/themeVariants.js +53 -0
- package/dist/runtime/themeVariants.js.map +1 -0
- package/dist/runtime/ui.d.ts +192 -0
- package/dist/runtime/ui.js +926 -0
- package/dist/runtime/ui.js.map +1 -0
- package/dist/shell/InstallDialog.d.ts +40 -0
- package/dist/shell/InstallDialog.js +176 -0
- package/dist/shell/InstallDialog.js.map +1 -0
- package/dist/shell/StoreView.d.ts +78 -0
- package/dist/shell/StoreView.js +108 -0
- package/dist/shell/StoreView.js.map +1 -0
- package/dist/shell/addressModel.js.map +1 -1
- package/dist/shell/chrome.js.map +1 -1
- package/dist/shell/deckModel.d.ts +117 -0
- package/dist/shell/deckModel.js +267 -0
- package/dist/shell/deckModel.js.map +1 -0
- package/dist/shell/frame/AccountSwitcher.d.ts +42 -0
- package/dist/shell/frame/AccountSwitcher.js +243 -0
- package/dist/shell/frame/AccountSwitcher.js.map +1 -0
- package/dist/shell/frame/AddColumnDialog.d.ts +8 -0
- package/dist/shell/frame/AddColumnDialog.js +81 -0
- package/dist/shell/frame/AddColumnDialog.js.map +1 -0
- package/dist/shell/frame/AppMenu.d.ts +44 -0
- package/dist/shell/frame/AppMenu.js +721 -0
- package/dist/shell/frame/AppMenu.js.map +1 -0
- package/dist/shell/frame/CommandPalette.d.ts +7 -0
- package/dist/shell/frame/CommandPalette.js +118 -0
- package/dist/shell/frame/CommandPalette.js.map +1 -0
- package/dist/shell/frame/DeckView.d.ts +13 -0
- package/dist/shell/frame/DeckView.js +287 -0
- package/dist/shell/frame/DeckView.js.map +1 -0
- package/dist/shell/frame/FindBar.d.ts +10 -0
- package/dist/shell/frame/FindBar.js +108 -0
- package/dist/shell/frame/FindBar.js.map +1 -0
- package/dist/shell/frame/MediaPanel.d.ts +8 -0
- package/dist/shell/frame/MediaPanel.js +76 -0
- package/dist/shell/frame/MediaPanel.js.map +1 -0
- package/dist/shell/frame/NewTabPage.d.ts +9 -0
- package/dist/shell/frame/NewTabPage.js +71 -0
- package/dist/shell/frame/NewTabPage.js.map +1 -0
- package/dist/shell/frame/PaneTheme.d.ts +16 -0
- package/dist/shell/frame/PaneTheme.js +67 -0
- package/dist/shell/frame/PaneTheme.js.map +1 -0
- package/dist/shell/frame/ReportDialog.d.ts +3 -0
- package/dist/shell/frame/ReportDialog.js +95 -0
- package/dist/shell/frame/ReportDialog.js.map +1 -0
- package/dist/shell/frame/Shell.d.ts +9 -0
- package/dist/shell/frame/Shell.js +1139 -0
- package/dist/shell/frame/Shell.js.map +1 -0
- package/dist/shell/frame/Titlebar.d.ts +17 -0
- package/dist/shell/frame/Titlebar.js +79 -0
- package/dist/shell/frame/Titlebar.js.map +1 -0
- package/dist/shell/frame/TitlebarExtras.d.ts +4 -0
- package/dist/shell/frame/TitlebarExtras.js +202 -0
- package/dist/shell/frame/TitlebarExtras.js.map +1 -0
- package/dist/shell/frame/WebPanel.d.ts +4 -0
- package/dist/shell/frame/WebPanel.js +185 -0
- package/dist/shell/frame/WebPanel.js.map +1 -0
- package/dist/shell/frame/accountModel.d.ts +49 -0
- package/dist/shell/frame/accountModel.js +67 -0
- package/dist/shell/frame/accountModel.js.map +1 -0
- package/dist/shell/frame/accountSwitcher.css +91 -0
- package/dist/shell/frame/appI18n.d.ts +44 -0
- package/dist/shell/frame/appI18n.js +64 -0
- package/dist/shell/frame/appI18n.js.map +1 -0
- package/dist/shell/frame/appMenu.css +127 -0
- package/dist/shell/frame/backupModel.d.ts +38 -0
- package/dist/shell/frame/backupModel.js +192 -0
- package/dist/shell/frame/backupModel.js.map +1 -0
- package/dist/shell/frame/boot.d.ts +8 -0
- package/dist/shell/frame/boot.js +37 -0
- package/dist/shell/frame/boot.js.map +1 -0
- package/dist/shell/frame/brand.d.ts +1 -0
- package/dist/shell/frame/brand.js +4 -0
- package/dist/shell/frame/brand.js.map +1 -0
- package/dist/shell/frame/bridge.d.ts +35 -0
- package/dist/shell/frame/bridge.js +70 -0
- package/dist/shell/frame/bridge.js.map +1 -0
- package/dist/shell/frame/chromeTheme.d.ts +47 -0
- package/dist/shell/frame/chromeTheme.js +118 -0
- package/dist/shell/frame/chromeTheme.js.map +1 -0
- package/dist/shell/frame/deck.css +209 -0
- package/dist/shell/frame/deckStore.d.ts +89 -0
- package/dist/shell/frame/deckStore.js +239 -0
- package/dist/shell/frame/deckStore.js.map +1 -0
- package/dist/shell/frame/devHost.d.ts +35 -0
- package/dist/shell/frame/devHost.js +80 -0
- package/dist/shell/frame/devHost.js.map +1 -0
- package/dist/shell/frame/devModel.d.ts +7 -0
- package/dist/shell/frame/devModel.js +17 -0
- package/dist/shell/frame/devModel.js.map +1 -0
- package/dist/shell/frame/diag.d.ts +7 -0
- package/dist/shell/frame/diag.js +39 -0
- package/dist/shell/frame/diag.js.map +1 -0
- package/dist/shell/frame/edges.css +159 -0
- package/dist/shell/frame/findBar.css +14 -0
- package/dist/shell/frame/frameMessages.d.ts +248 -0
- package/dist/shell/frame/frameMessages.js +252 -0
- package/dist/shell/frame/frameMessages.js.map +1 -0
- package/dist/shell/frame/hooks.d.ts +39 -0
- package/dist/shell/frame/hooks.js +97 -0
- package/dist/shell/frame/hooks.js.map +1 -0
- package/dist/shell/frame/i18n.d.ts +27 -0
- package/dist/shell/frame/i18n.js +66 -0
- package/dist/shell/frame/i18n.js.map +1 -0
- package/dist/shell/frame/iconPack.d.ts +11 -0
- package/dist/shell/frame/iconPack.js +45 -0
- package/dist/shell/frame/iconPack.js.map +1 -0
- package/dist/shell/frame/icons.d.ts +71 -0
- package/dist/shell/frame/icons.js +75 -0
- package/dist/shell/frame/icons.js.map +1 -0
- package/dist/shell/frame/index.d.ts +34 -0
- package/dist/shell/frame/index.js +43 -0
- package/dist/shell/frame/index.js.map +1 -0
- package/dist/shell/frame/language.d.ts +58 -0
- package/dist/shell/frame/language.js +165 -0
- package/dist/shell/frame/language.js.map +1 -0
- package/dist/shell/frame/mediaModel.d.ts +47 -0
- package/dist/shell/frame/mediaModel.js +67 -0
- package/dist/shell/frame/mediaModel.js.map +1 -0
- package/dist/shell/frame/menuMessages.en.json +96 -0
- package/dist/shell/frame/menuModel.d.ts +319 -0
- package/dist/shell/frame/menuModel.js +301 -0
- package/dist/shell/frame/menuModel.js.map +1 -0
- package/dist/shell/frame/nativeMenu.d.ts +5 -0
- package/dist/shell/frame/nativeMenu.js +178 -0
- package/dist/shell/frame/nativeMenu.js.map +1 -0
- package/dist/shell/frame/nativeMenuModel.d.ts +102 -0
- package/dist/shell/frame/nativeMenuModel.js +186 -0
- package/dist/shell/frame/nativeMenuModel.js.map +1 -0
- package/dist/shell/frame/paletteModel.d.ts +139 -0
- package/dist/shell/frame/paletteModel.js +114 -0
- package/dist/shell/frame/paletteModel.js.map +1 -0
- package/dist/shell/frame/paneTheme.css +9 -0
- package/dist/shell/frame/pluginCommandStore.d.ts +23 -0
- package/dist/shell/frame/pluginCommandStore.js +70 -0
- package/dist/shell/frame/pluginCommandStore.js.map +1 -0
- package/dist/shell/frame/reportModel.d.ts +52 -0
- package/dist/shell/frame/reportModel.js +105 -0
- package/dist/shell/frame/reportModel.js.map +1 -0
- package/dist/shell/frame/safeStore.d.ts +7 -0
- package/dist/shell/frame/safeStore.js +40 -0
- package/dist/shell/frame/safeStore.js.map +1 -0
- package/dist/shell/frame/searchInput.d.ts +2 -0
- package/dist/shell/frame/searchInput.js +11 -0
- package/dist/shell/frame/searchInput.js.map +1 -0
- package/dist/shell/frame/shell.css +634 -0
- package/dist/shell/frame/site.d.ts +206 -0
- package/dist/shell/frame/site.js +22 -0
- package/dist/shell/frame/site.js.map +1 -0
- package/dist/shell/frame/state.d.ts +101 -0
- package/dist/shell/frame/state.js +286 -0
- package/dist/shell/frame/state.js.map +1 -0
- package/dist/shell/frame/syncGate.d.ts +10 -0
- package/dist/shell/frame/syncGate.js +36 -0
- package/dist/shell/frame/syncGate.js.map +1 -0
- package/dist/shell/frame/syncHost.d.ts +35 -0
- package/dist/shell/frame/syncHost.js +85 -0
- package/dist/shell/frame/syncHost.js.map +1 -0
- package/dist/shell/frame/tabStill.d.ts +2 -0
- package/dist/shell/frame/tabStill.js +62 -0
- package/dist/shell/frame/tabStill.js.map +1 -0
- package/dist/shell/frame/themeScopes.d.ts +29 -0
- package/dist/shell/frame/themeScopes.js +61 -0
- package/dist/shell/frame/themeScopes.js.map +1 -0
- package/dist/shell/frame/themeStore.d.ts +99 -0
- package/dist/shell/frame/themeStore.js +267 -0
- package/dist/shell/frame/themeStore.js.map +1 -0
- package/dist/shell/frame/windowBinding.d.ts +2 -0
- package/dist/shell/frame/windowBinding.js +7 -0
- package/dist/shell/frame/windowBinding.js.map +1 -0
- package/dist/shell/frame/workspaceModel.d.ts +82 -0
- package/dist/shell/frame/workspaceModel.js +250 -0
- package/dist/shell/frame/workspaceModel.js.map +1 -0
- package/dist/shell/frame/workspaces.css +84 -0
- package/dist/shell/frame/workspaces.d.ts +22 -0
- package/dist/shell/frame/workspaces.js +125 -0
- package/dist/shell/frame/workspaces.js.map +1 -0
- package/dist/shell/frame/zoomStore.d.ts +10 -0
- package/dist/shell/frame/zoomStore.js +65 -0
- package/dist/shell/frame/zoomStore.js.map +1 -0
- package/dist/shell/installController.d.ts +137 -0
- package/dist/shell/installController.js +172 -0
- package/dist/shell/installController.js.map +1 -0
- package/dist/shell/installerMessages.d.ts +30 -0
- package/dist/shell/installerMessages.js +36 -0
- package/dist/shell/installerMessages.js.map +1 -0
- package/dist/shell/linkDrop.js.map +1 -1
- package/dist/shell/messages.d.ts +16 -0
- package/dist/shell/messages.js +27 -0
- package/dist/shell/messages.js.map +1 -0
- package/dist/shell/palette.js.map +1 -1
- package/dist/shell/paneModel.d.ts +22 -0
- package/dist/shell/paneModel.js +24 -1
- package/dist/shell/paneModel.js.map +1 -1
- package/dist/shell/panel/Appearance.d.ts +8 -0
- package/dist/shell/panel/Appearance.js +265 -0
- package/dist/shell/panel/Appearance.js.map +1 -0
- package/dist/shell/panel/BackupPanel.d.ts +5 -0
- package/dist/shell/panel/BackupPanel.js +198 -0
- package/dist/shell/panel/BackupPanel.js.map +1 -0
- package/dist/shell/panel/DeveloperPanel.d.ts +4 -0
- package/dist/shell/panel/DeveloperPanel.js +51 -0
- package/dist/shell/panel/DeveloperPanel.js.map +1 -0
- package/dist/shell/panel/FeatureToggles.d.ts +13 -0
- package/dist/shell/panel/FeatureToggles.js +42 -0
- package/dist/shell/panel/FeatureToggles.js.map +1 -0
- package/dist/shell/panel/Home.d.ts +3 -0
- package/dist/shell/panel/Home.js +23 -0
- package/dist/shell/panel/Home.js.map +1 -0
- package/dist/shell/panel/IconPackInstall.d.ts +15 -0
- package/dist/shell/panel/IconPackInstall.js +41 -0
- package/dist/shell/panel/IconPackInstall.js.map +1 -0
- package/dist/shell/panel/LanguageSettings.d.ts +1 -0
- package/dist/shell/panel/LanguageSettings.js +54 -0
- package/dist/shell/panel/LanguageSettings.js.map +1 -0
- package/dist/shell/panel/MakePanel.d.ts +3 -0
- package/dist/shell/panel/MakePanel.js +237 -0
- package/dist/shell/panel/MakePanel.js.map +1 -0
- package/dist/shell/panel/MarkdownDoc.d.ts +6 -0
- package/dist/shell/panel/MarkdownDoc.js +35 -0
- package/dist/shell/panel/MarkdownDoc.js.map +1 -0
- package/dist/shell/panel/Modes.d.ts +40 -0
- package/dist/shell/panel/Modes.js +270 -0
- package/dist/shell/panel/Modes.js.map +1 -0
- package/dist/shell/panel/NavIcon.d.ts +4 -0
- package/dist/shell/panel/NavIcon.js +6 -0
- package/dist/shell/panel/NavIcon.js.map +1 -0
- package/dist/shell/panel/Panel.d.ts +7 -0
- package/dist/shell/panel/Panel.js +139 -0
- package/dist/shell/panel/Panel.js.map +1 -0
- package/dist/shell/panel/PluginFeatures.d.ts +24 -0
- package/dist/shell/panel/PluginFeatures.js +165 -0
- package/dist/shell/panel/PluginFeatures.js.map +1 -0
- package/dist/shell/panel/Plugins.d.ts +33 -0
- package/dist/shell/panel/Plugins.js +112 -0
- package/dist/shell/panel/Plugins.js.map +1 -0
- package/dist/shell/panel/PowerSettings.d.ts +4 -0
- package/dist/shell/panel/PowerSettings.js +52 -0
- package/dist/shell/panel/PowerSettings.js.map +1 -0
- package/dist/shell/panel/Settings.d.ts +23 -0
- package/dist/shell/panel/Settings.js +117 -0
- package/dist/shell/panel/Settings.js.map +1 -0
- package/dist/shell/panel/ShareSetup.d.ts +8 -0
- package/dist/shell/panel/ShareSetup.js +130 -0
- package/dist/shell/panel/ShareSetup.js.map +1 -0
- package/dist/shell/panel/StoreSection.d.ts +7 -0
- package/dist/shell/panel/StoreSection.js +78 -0
- package/dist/shell/panel/StoreSection.js.map +1 -0
- package/dist/shell/panel/StringPacks.d.ts +20 -0
- package/dist/shell/panel/StringPacks.js +131 -0
- package/dist/shell/panel/StringPacks.js.map +1 -0
- package/dist/shell/panel/ThemeBuilder.d.ts +5 -0
- package/dist/shell/panel/ThemeBuilder.js +205 -0
- package/dist/shell/panel/ThemeBuilder.js.map +1 -0
- package/dist/shell/panel/backup.css +34 -0
- package/dist/shell/panel/builder.css +240 -0
- package/dist/shell/panel/builderModel.d.ts +55 -0
- package/dist/shell/panel/builderModel.js +95 -0
- package/dist/shell/panel/builderModel.js.map +1 -0
- package/dist/shell/panel/compare.d.ts +10 -0
- package/dist/shell/panel/compare.js +51 -0
- package/dist/shell/panel/compare.js.map +1 -0
- package/dist/shell/panel/controls.d.ts +135 -0
- package/dist/shell/panel/controls.js +213 -0
- package/dist/shell/panel/controls.js.map +1 -0
- package/dist/shell/panel/featureModel.d.ts +69 -0
- package/dist/shell/panel/featureModel.js +79 -0
- package/dist/shell/panel/featureModel.js.map +1 -0
- package/dist/shell/panel/fonts/FontBrowser.d.ts +10 -0
- package/dist/shell/panel/fonts/FontBrowser.js +189 -0
- package/dist/shell/panel/fonts/FontBrowser.js.map +1 -0
- package/dist/shell/panel/fonts/FontRoles.d.ts +20 -0
- package/dist/shell/panel/fonts/FontRoles.js +77 -0
- package/dist/shell/panel/fonts/FontRoles.js.map +1 -0
- package/dist/shell/panel/fonts/catalog.d.ts +37 -0
- package/dist/shell/panel/fonts/catalog.js +68 -0
- package/dist/shell/panel/fonts/catalog.js.map +1 -0
- package/dist/shell/panel/fonts/googleFontsCatalog.json +1 -0
- package/dist/shell/panel/index.d.ts +20 -0
- package/dist/shell/panel/index.js +34 -0
- package/dist/shell/panel/index.js.map +1 -0
- package/dist/shell/panel/languageModel.d.ts +5 -0
- package/dist/shell/panel/languageModel.js +7 -0
- package/dist/shell/panel/languageModel.js.map +1 -0
- package/dist/shell/panel/make.css +73 -0
- package/dist/shell/panel/makeModel.d.ts +32 -0
- package/dist/shell/panel/makeModel.js +84 -0
- package/dist/shell/panel/makeModel.js.map +1 -0
- package/dist/shell/panel/markdown.d.ts +46 -0
- package/dist/shell/panel/markdown.js +100 -0
- package/dist/shell/panel/markdown.js.map +1 -0
- package/dist/shell/panel/nav.d.ts +12 -0
- package/dist/shell/panel/nav.js +50 -0
- package/dist/shell/panel/nav.js.map +1 -0
- package/dist/shell/panel/panel.css +401 -0
- package/dist/shell/panel/panelMessages.d.ts +803 -0
- package/dist/shell/panel/panelMessages.js +779 -0
- package/dist/shell/panel/panelMessages.js.map +1 -0
- package/dist/shell/panel/plugins.css +59 -0
- package/dist/shell/panel/setupModel.d.ts +87 -0
- package/dist/shell/panel/setupModel.js +152 -0
- package/dist/shell/panel/setupModel.js.map +1 -0
- package/dist/shell/panel/site.d.ts +259 -0
- package/dist/shell/panel/site.js +25 -0
- package/dist/shell/panel/site.js.map +1 -0
- package/dist/shell/panel/strings.css +7 -0
- package/dist/shell/panel/themes.d.ts +10 -0
- package/dist/shell/panel/themes.js +8 -0
- package/dist/shell/panel/themes.js.map +1 -0
- package/dist/shell/profileModel.d.ts +3 -2
- package/dist/shell/profileModel.js +7 -5
- package/dist/shell/profileModel.js.map +1 -1
- package/dist/shell/store.css +250 -0
- package/dist/shell/storeMessages.d.ts +193 -0
- package/dist/shell/storeMessages.js +196 -0
- package/dist/shell/storeMessages.js.map +1 -0
- package/dist/shell/storeModel.d.ts +205 -0
- package/dist/shell/storeModel.js +146 -0
- package/dist/shell/storeModel.js.map +1 -0
- package/dist/shell/stringPacksModel.d.ts +44 -0
- package/dist/shell/stringPacksModel.js +99 -0
- package/dist/shell/stringPacksModel.js.map +1 -0
- package/dist/shell/updateModel.d.ts +2 -1
- package/dist/shell/updateModel.js +5 -4
- package/dist/shell/updateModel.js.map +1 -1
- package/dist/shell/windowControls.d.ts +4 -0
- package/dist/shell/windowControls.js +5 -0
- package/dist/shell/windowControls.js.map +1 -1
- package/i18n-config.schema.json +29 -0
- package/i18n-meta.schema.json +26 -0
- package/i18n.schema.json +42 -0
- package/icons.schema.json +655 -0
- package/languages.schema.json +23 -0
- package/locales/ar-x-fm.json +11 -0
- package/locales/ar.json +1388 -0
- package/locales/bg.json +1387 -0
- package/locales/bn.json +1387 -0
- package/locales/ca.json +1387 -0
- package/locales/cs.json +1387 -0
- package/locales/da.json +1387 -0
- package/locales/de.json +1387 -0
- package/locales/el.json +1387 -0
- package/locales/en-GB.json +27 -0
- package/locales/en.json +1386 -0
- package/locales/en.meta.json +51 -0
- package/locales/es.json +1387 -0
- package/locales/eu.json +1387 -0
- package/locales/fa.json +1388 -0
- package/locales/fi.json +1387 -0
- package/locales/fil.json +1387 -0
- package/locales/fr.json +1387 -0
- package/locales/ga.json +1387 -0
- package/locales/gl.json +1387 -0
- package/locales/gu.json +1387 -0
- package/locales/ha.json +1387 -0
- package/locales/he.json +1388 -0
- package/locales/hi.json +1387 -0
- package/locales/hr.json +1387 -0
- package/locales/hu.json +1387 -0
- package/locales/id.json +1387 -0
- package/locales/ig.json +1387 -0
- package/locales/it.json +1387 -0
- package/locales/ja.json +1387 -0
- package/locales/kn.json +1387 -0
- package/locales/ko.json +1387 -0
- package/locales/mr.json +1387 -0
- package/locales/ms.json +1387 -0
- package/locales/nb.json +1387 -0
- package/locales/nl.json +1387 -0
- package/locales/pl.json +1387 -0
- package/locales/pt.json +1387 -0
- package/locales/ro.json +1387 -0
- package/locales/ru.json +1387 -0
- package/locales/sk.json +1387 -0
- package/locales/sr.json +1387 -0
- package/locales/sv.json +1387 -0
- package/locales/ta.json +1387 -0
- package/locales/th.json +1387 -0
- package/locales/tr.json +1387 -0
- package/locales/uk.json +1387 -0
- package/locales/ur.json +1388 -0
- package/locales/vi.json +1387 -0
- package/locales/yo.json +1387 -0
- package/locales/zh-Hans.json +1387 -0
- package/locales/zh-Hant.json +1387 -0
- package/package.json +138 -5
- package/store-catalog.schema.json +78 -0
- package/theme.schema.json +4668 -0
- package/windows/installer.nsi +946 -0
- package/windows/languages/Basque.nsh +28 -0
- package/windows/languages/Catalan.nsh +28 -0
- package/windows/languages/Croatian.nsh +28 -0
- package/windows/languages/Czech.nsh +28 -0
- package/windows/languages/Danish.nsh +28 -0
- package/windows/languages/Finnish.nsh +28 -0
- package/windows/languages/Galician.nsh +28 -0
- package/windows/languages/Greek.nsh +28 -0
- package/windows/languages/Hungarian.nsh +28 -0
- package/windows/languages/Indonesian.nsh +28 -0
- package/windows/languages/Irish.nsh +28 -0
- package/windows/languages/Malay.nsh +28 -0
- package/windows/languages/Polish.nsh +28 -0
- package/windows/languages/Romanian.nsh +28 -0
- package/windows/languages/Serbian.nsh +28 -0
- package/windows/languages/Slovak.nsh +28 -0
- package/windows/languages/Thai.nsh +28 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// The shell frame's words in English (`wb.*`), the source of the framework catalogs
|
|
2
|
+
// (`waybetter/locales/<bcp47>.json`). Placeholders: `{site}` is the site's name ("X"); the rest
|
|
3
|
+
// are counts, names and paths. The frame reads the translations through the app's i18n instance
|
|
4
|
+
// (setShellI18n); tests/frame.test.ts checks that every key the frame uses is here.
|
|
5
|
+
export const FRAME_MESSAGES = {
|
|
6
|
+
'wb.acct.actions': '{name} actions',
|
|
7
|
+
'wb.acct.add': 'Add account',
|
|
8
|
+
'wb.acct.addHint': 'Signs in to {site} in a new pane',
|
|
9
|
+
'wb.acct.buttonLabel': 'Accounts. This pane: {name}',
|
|
10
|
+
'wb.acct.buttonTitle': "This pane: {pane}\nNew tabs: {tabs}",
|
|
11
|
+
'wb.acct.goToPane': 'Go to pane',
|
|
12
|
+
'wb.acct.headAfter': 'new tab',
|
|
13
|
+
'wb.acct.headBefore': 'Click to open its feed beside this pane ·',
|
|
14
|
+
'wb.acct.more': 'More',
|
|
15
|
+
'wb.acct.moreFor': 'More for {name}',
|
|
16
|
+
'wb.acct.newTabs': 'New tabs',
|
|
17
|
+
'wb.acct.newTabsOpenHere': 'New tabs open here',
|
|
18
|
+
'wb.acct.newTabsTitle': 'New tabs open in this account',
|
|
19
|
+
'wb.acct.notRemoved': 'Not removed: a tab of this account is still open. Close it and try again.',
|
|
20
|
+
'wb.acct.openBeside': 'Open beside',
|
|
21
|
+
'wb.acct.openNewTab': 'Open in new tab',
|
|
22
|
+
'wb.acct.remove': 'Remove from this computer…',
|
|
23
|
+
'wb.acct.removeConfirm': 'Remove “{name}” from this computer? {tabs, plural, =0 {} one {Its open tab closes, } other {Its # open tabs close, }}its sign-in and site data here are deleted. The {site} account itself is not touched.',
|
|
24
|
+
'wb.acct.rowLabel': '{name}. {hint}',
|
|
25
|
+
'wb.acct.rowLabelNew': '{name}, not signed in. {hint}',
|
|
26
|
+
'wb.acct.rowLabelOut': '{name}, signed out. {hint}',
|
|
27
|
+
'wb.acct.shift': 'Shift',
|
|
28
|
+
'wb.acct.shiftClick': 'Shift click',
|
|
29
|
+
'wb.acct.signIn': 'Sign in on {site}',
|
|
30
|
+
'wb.acct.signInBeside': 'Sign in beside',
|
|
31
|
+
'wb.acct.signOut': 'Sign out on {site}…',
|
|
32
|
+
'wb.acct.signOutTitle': 'Opens {site}’s own sign-out page for this account',
|
|
33
|
+
'wb.acct.signedOut': 'Signed out · {handle}',
|
|
34
|
+
'wb.acct.thisPane': 'This pane',
|
|
35
|
+
'wb.acct.title': 'Accounts',
|
|
36
|
+
'wb.acct.useForNewTabs': 'Use for new tabs',
|
|
37
|
+
'wb.addcol.account': 'Account',
|
|
38
|
+
'wb.addcol.add': 'add',
|
|
39
|
+
'wb.addcol.close': 'close',
|
|
40
|
+
'wb.addcol.signedOut': 'signed out',
|
|
41
|
+
'wb.addcol.submit': 'Add column',
|
|
42
|
+
'wb.addcol.to': 'to {deck}',
|
|
43
|
+
'wb.addcol.type': 'Column type',
|
|
44
|
+
'wb.backup.alertsOn': 'On · {count, plural, one {# keyword} other {# keywords}}',
|
|
45
|
+
'wb.backup.detail.addsAccounts': 'Adds {names} (sign in again there; logins are never in a backup)',
|
|
46
|
+
'wb.backup.detail.changed': '{count} changed: {names}',
|
|
47
|
+
'wb.backup.detail.css': '{count, plural, one {# character} other {# characters}} (here: {here})',
|
|
48
|
+
'wb.backup.detail.customizations': 'Accent or customizations differ',
|
|
49
|
+
'wb.backup.detail.decks': '{count, plural, =0 {No decks} one {# deck: {names}} other {# decks: {names}}}; replaces the decks here',
|
|
50
|
+
'wb.backup.detail.differs': 'Differs from this computer',
|
|
51
|
+
'wb.backup.detail.drafts': '{count, plural, one {# draft} other {# drafts}}, added as new drafts (existing ones stay; exact duplicates are skipped)',
|
|
52
|
+
'wb.backup.detail.importedThemes': '{count, plural, one {# imported theme} other {# imported themes}}: {names}',
|
|
53
|
+
'wb.backup.detail.keywords': '{count, plural, one {# keyword} other {# keywords}}',
|
|
54
|
+
'wb.backup.detail.newPlugins': '{count, plural, one {# new plugin file} other {# new plugin files}}: {names}',
|
|
55
|
+
'wb.backup.detail.noneRemoved': 'No account is removed.',
|
|
56
|
+
'wb.backup.detail.renames': 'Renames/recolors {names}',
|
|
57
|
+
'wb.backup.detail.same': 'Same as on this computer',
|
|
58
|
+
'wb.backup.detail.scopes': 'Account/pane themes',
|
|
59
|
+
'wb.backup.detail.scopesAccounts': 'Account/pane themes: {count, plural, one {# account} other {# accounts}}',
|
|
60
|
+
'wb.backup.detail.settingsDiffer': '{count, plural, one {# setting differs} other {# settings differ}}: {names}',
|
|
61
|
+
'wb.backup.detail.theme': 'Theme: {from} → {to}',
|
|
62
|
+
'wb.backup.detail.turnsOff': 'Turns off: {names}',
|
|
63
|
+
'wb.backup.detail.turnsOn': 'Turns on: {names}',
|
|
64
|
+
'wb.backup.detail.tweaksDiffer': '{count, plural, one {# tweak differs} other {# tweaks differ}}: {names}',
|
|
65
|
+
'wb.backup.detail.workspaces': '{count, plural, one {# workspace} other {# workspaces}}; replaces the list here',
|
|
66
|
+
'wb.backup.detail.workspacesNew': '{count, plural, one {# workspace} other {# workspaces}} (new: {names}); replaces the list here',
|
|
67
|
+
'wb.backup.fromDevice': 'Settings from {device}',
|
|
68
|
+
'wb.backup.section.accounts': 'Accounts',
|
|
69
|
+
'wb.backup.section.alerts': 'Keyword alerts',
|
|
70
|
+
'wb.backup.section.customCss': 'Custom CSS',
|
|
71
|
+
'wb.backup.section.decks': 'Decks',
|
|
72
|
+
'wb.backup.section.drafts': 'Drafts',
|
|
73
|
+
'wb.backup.section.features': '{site} tweaks',
|
|
74
|
+
'wb.backup.section.plugins': 'Plugins',
|
|
75
|
+
'wb.backup.section.settings': 'Browser & links',
|
|
76
|
+
'wb.backup.section.themes': 'Themes',
|
|
77
|
+
'wb.backup.section.workspaces': 'Workspaces',
|
|
78
|
+
'wb.chip.dev.errors': '{count, plural, one {# error} other {# errors}}',
|
|
79
|
+
'wb.chip.dev.label': 'Dev',
|
|
80
|
+
'wb.chip.dev.title': 'Developer mode: plugins, custom CSS and the watched theme reload on save',
|
|
81
|
+
'wb.chip.sync.title': 'Settings synced from {device} {when}. Review what would change before anything is applied.',
|
|
82
|
+
'wb.common.cancel': 'Cancel',
|
|
83
|
+
'wb.common.close': 'Close',
|
|
84
|
+
'wb.common.loading': 'Loading…',
|
|
85
|
+
'wb.common.off': 'Off',
|
|
86
|
+
'wb.common.open': 'Open',
|
|
87
|
+
'wb.common.remove': 'Remove',
|
|
88
|
+
'wb.common.removeItem': 'Remove {item}',
|
|
89
|
+
'wb.common.save': 'Save',
|
|
90
|
+
'wb.deck.addColumn': 'Add a column',
|
|
91
|
+
'wb.deck.backTo': 'Back to {title}',
|
|
92
|
+
'wb.deck.column': 'Column',
|
|
93
|
+
'wb.deck.columnCount': '{count, plural, one {# column} other {# columns}}',
|
|
94
|
+
'wb.deck.columnLabel': '{title} column',
|
|
95
|
+
'wb.deck.emptyHint': 'Columns of {site} side by side, each in the account you pick. Every post, like and reply is {site}’s own.',
|
|
96
|
+
'wb.deck.filters': 'Filters',
|
|
97
|
+
'wb.deck.filters.label': 'Column filters',
|
|
98
|
+
'wb.deck.gone': 'This deck is gone',
|
|
99
|
+
'wb.deck.goneHint': 'It was removed in another window or from settings.',
|
|
100
|
+
'wb.deck.hideReplies': 'Hide replies',
|
|
101
|
+
'wb.deck.hideRepliesHint': 'Replies shown outside their thread',
|
|
102
|
+
'wb.deck.hideReposts': 'Hide reposts',
|
|
103
|
+
'wb.deck.hideRepostsHint': 'Only original posts',
|
|
104
|
+
'wb.deck.jumpUnread': 'Jump to unread',
|
|
105
|
+
'wb.deck.jumpUnreadTitle': 'Jump to unread (Alt+U)',
|
|
106
|
+
'wb.deck.key.columns': 'columns',
|
|
107
|
+
'wb.deck.key.jump': 'jump',
|
|
108
|
+
'wb.deck.key.post': 'post',
|
|
109
|
+
'wb.deck.key.read': 'mark read',
|
|
110
|
+
'wb.deck.markRead': 'Mark all read',
|
|
111
|
+
'wb.deck.mediaOnly': 'Media only',
|
|
112
|
+
'wb.deck.mediaOnlyHint': 'Posts with photos, videos or cards',
|
|
113
|
+
'wb.deck.memoryTitle': 'Each visible column is a full {site} page (about {count} fit one page; off-page columns are parked).',
|
|
114
|
+
'wb.deck.menu': 'Column menu',
|
|
115
|
+
'wb.deck.moveLeft': 'Move left',
|
|
116
|
+
'wb.deck.moveRight': 'Move right',
|
|
117
|
+
'wb.deck.muteLabel': 'Mute a word or regular expression',
|
|
118
|
+
'wb.deck.mutePlaceholder': 'Mute a word or /regex/',
|
|
119
|
+
'wb.deck.newCount': '{count} new',
|
|
120
|
+
'wb.deck.next': 'Next page',
|
|
121
|
+
'wb.deck.nextTitle': 'Next page (Alt+PageDown)',
|
|
122
|
+
'wb.deck.onScreen': '{visible}/{total} on screen',
|
|
123
|
+
'wb.deck.openAsTab': 'Open as tab',
|
|
124
|
+
'wb.deck.page': 'Page {n}',
|
|
125
|
+
'wb.deck.pages': 'Deck pages',
|
|
126
|
+
'wb.deck.post': 'Post',
|
|
127
|
+
'wb.deck.postTitle': 'Post (Ctrl+Alt+N)',
|
|
128
|
+
'wb.deck.prev': 'Previous page',
|
|
129
|
+
'wb.deck.prevTitle': 'Previous page (Alt+PageUp)',
|
|
130
|
+
'wb.deck.remove': 'Remove column',
|
|
131
|
+
'wb.deck.settings': 'Deck settings',
|
|
132
|
+
'wb.deck.title': 'Deck',
|
|
133
|
+
'wb.deck.unreadLabel': '{count} unread, jump to them',
|
|
134
|
+
'wb.deck.unreadTitle': 'Unread in this deck',
|
|
135
|
+
'wb.deck.viewingPost': 'Viewing a post',
|
|
136
|
+
'wb.deck.width': 'Width',
|
|
137
|
+
'wb.deck.widthLabel': 'Column width',
|
|
138
|
+
'wb.dev.reloaded': 'Reloaded {file}',
|
|
139
|
+
'wb.media.add': '+ Add',
|
|
140
|
+
'wb.media.addFolder': 'Add folder…',
|
|
141
|
+
'wb.media.attachTitle': '{name} — attach to the composer',
|
|
142
|
+
'wb.media.clickToAttach': 'Click to attach to the {site} composer',
|
|
143
|
+
'wb.media.clipEmpty': 'Copy an image or some text and it appears here.',
|
|
144
|
+
'wb.media.clipOff': 'Clipboard history is off. Turn it on in Settings to keep your last {count} copied images and texts on this device.',
|
|
145
|
+
'wb.media.clipboard': 'Clipboard',
|
|
146
|
+
'wb.media.closeTitle': 'Close (Esc)',
|
|
147
|
+
'wb.media.copiedImage': 'Copied image',
|
|
148
|
+
'wb.media.gallery': 'Gallery',
|
|
149
|
+
'wb.media.image': 'Image',
|
|
150
|
+
'wb.media.noComposer': 'Open an {site} tab with a composer first.',
|
|
151
|
+
'wb.media.noImages': 'No images in these folders yet.',
|
|
152
|
+
'wb.media.now': 'now',
|
|
153
|
+
'wb.media.pickFolders': 'Pick folders (screenshots, exports) to see their newest images here.',
|
|
154
|
+
'wb.media.putIn': 'Put into the composer',
|
|
155
|
+
'wb.media.removeFromHistory': 'Remove from history',
|
|
156
|
+
'wb.media.title': 'Gallery and clipboard',
|
|
157
|
+
'wb.media.youPost': 'You still post it yourself',
|
|
158
|
+
'wb.newtab.commands': 'Commands',
|
|
159
|
+
'wb.newtab.enter': 'Enter',
|
|
160
|
+
'wb.newtab.goTo': 'Go to',
|
|
161
|
+
'wb.newtab.openAs': 'Open as',
|
|
162
|
+
'wb.newtab.openLinksAs': 'Open links as',
|
|
163
|
+
'wb.newtab.recent': 'Recently closed',
|
|
164
|
+
'wb.newtab.reopen': 'Reopen tab',
|
|
165
|
+
'wb.newtab.split': 'Split',
|
|
166
|
+
'wb.palette.active': 'Active',
|
|
167
|
+
'wb.palette.addColumn': 'Add column…',
|
|
168
|
+
'wb.palette.focusColumn': 'Focus {name}',
|
|
169
|
+
'wb.palette.group.deck': 'Deck',
|
|
170
|
+
'wb.palette.group.profiles': 'Profiles',
|
|
171
|
+
'wb.palette.group.tabs': 'Tabs',
|
|
172
|
+
'wb.palette.group.workspaces': 'Workspaces',
|
|
173
|
+
'wb.palette.media': 'Gallery & clipboard',
|
|
174
|
+
'wb.palette.navigate': 'Navigate',
|
|
175
|
+
'wb.palette.newDeck': 'New deck',
|
|
176
|
+
'wb.palette.newTabAs': 'New tab as {name}',
|
|
177
|
+
'wb.palette.next': 'Next',
|
|
178
|
+
'wb.palette.none': 'No matches',
|
|
179
|
+
'wb.palette.onStart': 'on start',
|
|
180
|
+
'wb.palette.openPower': 'Open deck',
|
|
181
|
+
'wb.palette.plugins': 'Plugins',
|
|
182
|
+
'wb.palette.switchTo': 'Switch to {name}',
|
|
183
|
+
'wb.palette.title': 'Command palette',
|
|
184
|
+
'wb.pane.followAccount': 'Follow account',
|
|
185
|
+
'wb.pane.followApp': 'Follow app',
|
|
186
|
+
'wb.pane.theme': 'Theme for this pane',
|
|
187
|
+
'wb.pane.themesLink': 'Account and pane themes…',
|
|
188
|
+
'wb.shell.deck.default': 'Deck',
|
|
189
|
+
'wb.shell.menu.close': 'Close tab',
|
|
190
|
+
'wb.shell.menu.closeOthers': 'Close other tabs',
|
|
191
|
+
'wb.shell.menu.copyLink': 'Copy link',
|
|
192
|
+
'wb.shell.menu.duplicate': 'Duplicate',
|
|
193
|
+
'wb.shell.menu.openBrowser': 'Open in your browser',
|
|
194
|
+
'wb.shell.menu.paneTheme': 'Theme for this pane…',
|
|
195
|
+
'wb.shell.menu.pin': 'Pin tab',
|
|
196
|
+
'wb.shell.menu.reload': 'Reload',
|
|
197
|
+
'wb.shell.menu.splitDown': 'Split down',
|
|
198
|
+
'wb.shell.menu.splitRight': 'Split right',
|
|
199
|
+
'wb.shell.menu.unpin': 'Unpin tab',
|
|
200
|
+
'wb.shell.tab.account': 'Account: {name}',
|
|
201
|
+
'wb.shell.tab.closeTitle': 'Close (Ctrl+W)',
|
|
202
|
+
'wb.shell.tab.new': 'New tab',
|
|
203
|
+
'wb.shell.tab.newTitle': 'New tab (Ctrl+T)',
|
|
204
|
+
'wb.shell.window.maximize': 'Maximize',
|
|
205
|
+
'wb.shell.window.minimize': 'Minimize',
|
|
206
|
+
'wb.shell.window.restore': 'Restore',
|
|
207
|
+
'wb.web.address': 'Address',
|
|
208
|
+
'wb.web.addressValue': 'Address: {url}',
|
|
209
|
+
'wb.web.back': 'Back',
|
|
210
|
+
'wb.web.backTitle': 'Back (Alt+←)',
|
|
211
|
+
'wb.web.forward': 'Forward',
|
|
212
|
+
'wb.web.forwardTitle': 'Forward (Alt+→)',
|
|
213
|
+
'wb.web.insecure': 'Not secure',
|
|
214
|
+
'wb.web.paneAccount': 'This pane’s account: {name}',
|
|
215
|
+
'wb.web.reloadTitle': 'Reload (Ctrl+R)',
|
|
216
|
+
'wb.web.splitMore': 'Split and pane options',
|
|
217
|
+
'wb.web.splitTitle': "Split right (Ctrl+\\)",
|
|
218
|
+
'wb.web.stop': 'Stop',
|
|
219
|
+
'wb.web.tabKey': 'Tab',
|
|
220
|
+
'wb.ws.default': 'My workspace',
|
|
221
|
+
'wb.ws.defaultN': 'My workspace {n}',
|
|
222
|
+
'wb.ws.deleteConfirm': 'Delete {name}? Open tabs stay open.',
|
|
223
|
+
'wb.ws.deleteNamed': 'Delete {name}',
|
|
224
|
+
'wb.ws.empty': 'No saved workspaces yet. Save this layout to switch back to it any time.',
|
|
225
|
+
'wb.ws.err.id': 'Invalid workspace id.',
|
|
226
|
+
'wb.ws.err.noLayout': 'There is no layout to save.',
|
|
227
|
+
'wb.ws.err.noTabs': 'There are no tabs to save.',
|
|
228
|
+
'wb.ws.err.tooLarge': 'This layout is too large to save as a workspace.',
|
|
229
|
+
'wb.ws.err.tooMany': 'At most {count} workspaces. Delete one first.',
|
|
230
|
+
'wb.ws.hint': 'Tabs, splits, decks, accounts and pane themes, reopened in one click',
|
|
231
|
+
'wb.ws.name': 'Workspace name',
|
|
232
|
+
'wb.ws.namePlaceholder': 'Name, e.g. Launch day',
|
|
233
|
+
'wb.ws.named': 'Workspace {name}',
|
|
234
|
+
'wb.ws.newName': 'New name for {name}',
|
|
235
|
+
'wb.ws.notReady': 'The window is not ready yet.',
|
|
236
|
+
'wb.ws.onStart': 'On start',
|
|
237
|
+
'wb.ws.onStartTitle': 'Opens when wayBetter starts',
|
|
238
|
+
'wb.ws.openNow': 'open now',
|
|
239
|
+
'wb.ws.rename': 'Rename',
|
|
240
|
+
'wb.ws.renameNamed': 'Rename {name}',
|
|
241
|
+
'wb.ws.save': 'Save layout as workspace…',
|
|
242
|
+
'wb.ws.saveMeta': '{count, plural, one {# open tab} other {# open tabs}} · also in Ctrl+K',
|
|
243
|
+
'wb.ws.setStart': 'Open this workspace when wayBetter starts',
|
|
244
|
+
'wb.ws.setStartNamed': 'Open {name} on start',
|
|
245
|
+
'wb.ws.stopStart': 'Stop opening on start',
|
|
246
|
+
'wb.ws.stopStartNamed': 'Stop opening {name} on start',
|
|
247
|
+
'wb.ws.tabs': '{count, plural, one {# tab} other {# tabs}}',
|
|
248
|
+
'wb.ws.title': 'Workspaces',
|
|
249
|
+
'wb.ws.update': 'Save the current layout over this workspace',
|
|
250
|
+
'wb.ws.updateNamed': 'Update {name} with the current layout',
|
|
251
|
+
};
|
|
252
|
+
//# sourceMappingURL=frameMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameMessages.js","sourceRoot":"","sources":["../../../../../../shell/src/frame/frameMessages.ts"],"names":[],"mappings":"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","sourcesContent":["// The shell frame's words in English (`wb.*`), the source of the framework catalogs\n// (`waybetter/locales/<bcp47>.json`). Placeholders: `{site}` is the site's name (\"X\"); the rest\n// are counts, names and paths. The frame reads the translations through the app's i18n instance\n// (setShellI18n); tests/frame.test.ts checks that every key the frame uses is here.\n\nexport const FRAME_MESSAGES = {\n 'wb.acct.actions': '{name} actions',\n 'wb.acct.add': 'Add account',\n 'wb.acct.addHint': 'Signs in to {site} in a new pane',\n 'wb.acct.buttonLabel': 'Accounts. This pane: {name}',\n 'wb.acct.buttonTitle': \"This pane: {pane}\\nNew tabs: {tabs}\",\n 'wb.acct.goToPane': 'Go to pane',\n 'wb.acct.headAfter': 'new tab',\n 'wb.acct.headBefore': 'Click to open its feed beside this pane ·',\n 'wb.acct.more': 'More',\n 'wb.acct.moreFor': 'More for {name}',\n 'wb.acct.newTabs': 'New tabs',\n 'wb.acct.newTabsOpenHere': 'New tabs open here',\n 'wb.acct.newTabsTitle': 'New tabs open in this account',\n 'wb.acct.notRemoved': 'Not removed: a tab of this account is still open. Close it and try again.',\n 'wb.acct.openBeside': 'Open beside',\n 'wb.acct.openNewTab': 'Open in new tab',\n 'wb.acct.remove': 'Remove from this computer…',\n 'wb.acct.removeConfirm': 'Remove “{name}” from this computer? {tabs, plural, =0 {} one {Its open tab closes, } other {Its # open tabs close, }}its sign-in and site data here are deleted. The {site} account itself is not touched.',\n 'wb.acct.rowLabel': '{name}. {hint}',\n 'wb.acct.rowLabelNew': '{name}, not signed in. {hint}',\n 'wb.acct.rowLabelOut': '{name}, signed out. {hint}',\n 'wb.acct.shift': 'Shift',\n 'wb.acct.shiftClick': 'Shift click',\n 'wb.acct.signIn': 'Sign in on {site}',\n 'wb.acct.signInBeside': 'Sign in beside',\n 'wb.acct.signOut': 'Sign out on {site}…',\n 'wb.acct.signOutTitle': 'Opens {site}’s own sign-out page for this account',\n 'wb.acct.signedOut': 'Signed out · {handle}',\n 'wb.acct.thisPane': 'This pane',\n 'wb.acct.title': 'Accounts',\n 'wb.acct.useForNewTabs': 'Use for new tabs',\n 'wb.addcol.account': 'Account',\n 'wb.addcol.add': 'add',\n 'wb.addcol.close': 'close',\n 'wb.addcol.signedOut': 'signed out',\n 'wb.addcol.submit': 'Add column',\n 'wb.addcol.to': 'to {deck}',\n 'wb.addcol.type': 'Column type',\n 'wb.backup.alertsOn': 'On · {count, plural, one {# keyword} other {# keywords}}',\n 'wb.backup.detail.addsAccounts': 'Adds {names} (sign in again there; logins are never in a backup)',\n 'wb.backup.detail.changed': '{count} changed: {names}',\n 'wb.backup.detail.css': '{count, plural, one {# character} other {# characters}} (here: {here})',\n 'wb.backup.detail.customizations': 'Accent or customizations differ',\n 'wb.backup.detail.decks': '{count, plural, =0 {No decks} one {# deck: {names}} other {# decks: {names}}}; replaces the decks here',\n 'wb.backup.detail.differs': 'Differs from this computer',\n 'wb.backup.detail.drafts': '{count, plural, one {# draft} other {# drafts}}, added as new drafts (existing ones stay; exact duplicates are skipped)',\n 'wb.backup.detail.importedThemes': '{count, plural, one {# imported theme} other {# imported themes}}: {names}',\n 'wb.backup.detail.keywords': '{count, plural, one {# keyword} other {# keywords}}',\n 'wb.backup.detail.newPlugins': '{count, plural, one {# new plugin file} other {# new plugin files}}: {names}',\n 'wb.backup.detail.noneRemoved': 'No account is removed.',\n 'wb.backup.detail.renames': 'Renames/recolors {names}',\n 'wb.backup.detail.same': 'Same as on this computer',\n 'wb.backup.detail.scopes': 'Account/pane themes',\n 'wb.backup.detail.scopesAccounts': 'Account/pane themes: {count, plural, one {# account} other {# accounts}}',\n 'wb.backup.detail.settingsDiffer': '{count, plural, one {# setting differs} other {# settings differ}}: {names}',\n 'wb.backup.detail.theme': 'Theme: {from} → {to}',\n 'wb.backup.detail.turnsOff': 'Turns off: {names}',\n 'wb.backup.detail.turnsOn': 'Turns on: {names}',\n 'wb.backup.detail.tweaksDiffer': '{count, plural, one {# tweak differs} other {# tweaks differ}}: {names}',\n 'wb.backup.detail.workspaces': '{count, plural, one {# workspace} other {# workspaces}}; replaces the list here',\n 'wb.backup.detail.workspacesNew': '{count, plural, one {# workspace} other {# workspaces}} (new: {names}); replaces the list here',\n 'wb.backup.fromDevice': 'Settings from {device}',\n 'wb.backup.section.accounts': 'Accounts',\n 'wb.backup.section.alerts': 'Keyword alerts',\n 'wb.backup.section.customCss': 'Custom CSS',\n 'wb.backup.section.decks': 'Decks',\n 'wb.backup.section.drafts': 'Drafts',\n 'wb.backup.section.features': '{site} tweaks',\n 'wb.backup.section.plugins': 'Plugins',\n 'wb.backup.section.settings': 'Browser & links',\n 'wb.backup.section.themes': 'Themes',\n 'wb.backup.section.workspaces': 'Workspaces',\n 'wb.chip.dev.errors': '{count, plural, one {# error} other {# errors}}',\n 'wb.chip.dev.label': 'Dev',\n 'wb.chip.dev.title': 'Developer mode: plugins, custom CSS and the watched theme reload on save',\n 'wb.chip.sync.title': 'Settings synced from {device} {when}. Review what would change before anything is applied.',\n 'wb.common.cancel': 'Cancel',\n 'wb.common.close': 'Close',\n 'wb.common.loading': 'Loading…',\n 'wb.common.off': 'Off',\n 'wb.common.open': 'Open',\n 'wb.common.remove': 'Remove',\n 'wb.common.removeItem': 'Remove {item}',\n 'wb.common.save': 'Save',\n 'wb.deck.addColumn': 'Add a column',\n 'wb.deck.backTo': 'Back to {title}',\n 'wb.deck.column': 'Column',\n 'wb.deck.columnCount': '{count, plural, one {# column} other {# columns}}',\n 'wb.deck.columnLabel': '{title} column',\n 'wb.deck.emptyHint': 'Columns of {site} side by side, each in the account you pick. Every post, like and reply is {site}’s own.',\n 'wb.deck.filters': 'Filters',\n 'wb.deck.filters.label': 'Column filters',\n 'wb.deck.gone': 'This deck is gone',\n 'wb.deck.goneHint': 'It was removed in another window or from settings.',\n 'wb.deck.hideReplies': 'Hide replies',\n 'wb.deck.hideRepliesHint': 'Replies shown outside their thread',\n 'wb.deck.hideReposts': 'Hide reposts',\n 'wb.deck.hideRepostsHint': 'Only original posts',\n 'wb.deck.jumpUnread': 'Jump to unread',\n 'wb.deck.jumpUnreadTitle': 'Jump to unread (Alt+U)',\n 'wb.deck.key.columns': 'columns',\n 'wb.deck.key.jump': 'jump',\n 'wb.deck.key.post': 'post',\n 'wb.deck.key.read': 'mark read',\n 'wb.deck.markRead': 'Mark all read',\n 'wb.deck.mediaOnly': 'Media only',\n 'wb.deck.mediaOnlyHint': 'Posts with photos, videos or cards',\n 'wb.deck.memoryTitle': 'Each visible column is a full {site} page (about {count} fit one page; off-page columns are parked).',\n 'wb.deck.menu': 'Column menu',\n 'wb.deck.moveLeft': 'Move left',\n 'wb.deck.moveRight': 'Move right',\n 'wb.deck.muteLabel': 'Mute a word or regular expression',\n 'wb.deck.mutePlaceholder': 'Mute a word or /regex/',\n 'wb.deck.newCount': '{count} new',\n 'wb.deck.next': 'Next page',\n 'wb.deck.nextTitle': 'Next page (Alt+PageDown)',\n 'wb.deck.onScreen': '{visible}/{total} on screen',\n 'wb.deck.openAsTab': 'Open as tab',\n 'wb.deck.page': 'Page {n}',\n 'wb.deck.pages': 'Deck pages',\n 'wb.deck.post': 'Post',\n 'wb.deck.postTitle': 'Post (Ctrl+Alt+N)',\n 'wb.deck.prev': 'Previous page',\n 'wb.deck.prevTitle': 'Previous page (Alt+PageUp)',\n 'wb.deck.remove': 'Remove column',\n 'wb.deck.settings': 'Deck settings',\n 'wb.deck.title': 'Deck',\n 'wb.deck.unreadLabel': '{count} unread, jump to them',\n 'wb.deck.unreadTitle': 'Unread in this deck',\n 'wb.deck.viewingPost': 'Viewing a post',\n 'wb.deck.width': 'Width',\n 'wb.deck.widthLabel': 'Column width',\n 'wb.dev.reloaded': 'Reloaded {file}',\n 'wb.media.add': '+ Add',\n 'wb.media.addFolder': 'Add folder…',\n 'wb.media.attachTitle': '{name} — attach to the composer',\n 'wb.media.clickToAttach': 'Click to attach to the {site} composer',\n 'wb.media.clipEmpty': 'Copy an image or some text and it appears here.',\n 'wb.media.clipOff': 'Clipboard history is off. Turn it on in Settings to keep your last {count} copied images and texts on this device.',\n 'wb.media.clipboard': 'Clipboard',\n 'wb.media.closeTitle': 'Close (Esc)',\n 'wb.media.copiedImage': 'Copied image',\n 'wb.media.gallery': 'Gallery',\n 'wb.media.image': 'Image',\n 'wb.media.noComposer': 'Open an {site} tab with a composer first.',\n 'wb.media.noImages': 'No images in these folders yet.',\n 'wb.media.now': 'now',\n 'wb.media.pickFolders': 'Pick folders (screenshots, exports) to see their newest images here.',\n 'wb.media.putIn': 'Put into the composer',\n 'wb.media.removeFromHistory': 'Remove from history',\n 'wb.media.title': 'Gallery and clipboard',\n 'wb.media.youPost': 'You still post it yourself',\n 'wb.newtab.commands': 'Commands',\n 'wb.newtab.enter': 'Enter',\n 'wb.newtab.goTo': 'Go to',\n 'wb.newtab.openAs': 'Open as',\n 'wb.newtab.openLinksAs': 'Open links as',\n 'wb.newtab.recent': 'Recently closed',\n 'wb.newtab.reopen': 'Reopen tab',\n 'wb.newtab.split': 'Split',\n 'wb.palette.active': 'Active',\n 'wb.palette.addColumn': 'Add column…',\n 'wb.palette.focusColumn': 'Focus {name}',\n 'wb.palette.group.deck': 'Deck',\n 'wb.palette.group.profiles': 'Profiles',\n 'wb.palette.group.tabs': 'Tabs',\n 'wb.palette.group.workspaces': 'Workspaces',\n 'wb.palette.media': 'Gallery & clipboard',\n 'wb.palette.navigate': 'Navigate',\n 'wb.palette.newDeck': 'New deck',\n 'wb.palette.newTabAs': 'New tab as {name}',\n 'wb.palette.next': 'Next',\n 'wb.palette.none': 'No matches',\n 'wb.palette.onStart': 'on start',\n 'wb.palette.openPower': 'Open deck',\n 'wb.palette.plugins': 'Plugins',\n 'wb.palette.switchTo': 'Switch to {name}',\n 'wb.palette.title': 'Command palette',\n 'wb.pane.followAccount': 'Follow account',\n 'wb.pane.followApp': 'Follow app',\n 'wb.pane.theme': 'Theme for this pane',\n 'wb.pane.themesLink': 'Account and pane themes…',\n 'wb.shell.deck.default': 'Deck',\n 'wb.shell.menu.close': 'Close tab',\n 'wb.shell.menu.closeOthers': 'Close other tabs',\n 'wb.shell.menu.copyLink': 'Copy link',\n 'wb.shell.menu.duplicate': 'Duplicate',\n 'wb.shell.menu.openBrowser': 'Open in your browser',\n 'wb.shell.menu.paneTheme': 'Theme for this pane…',\n 'wb.shell.menu.pin': 'Pin tab',\n 'wb.shell.menu.reload': 'Reload',\n 'wb.shell.menu.splitDown': 'Split down',\n 'wb.shell.menu.splitRight': 'Split right',\n 'wb.shell.menu.unpin': 'Unpin tab',\n 'wb.shell.tab.account': 'Account: {name}',\n 'wb.shell.tab.closeTitle': 'Close (Ctrl+W)',\n 'wb.shell.tab.new': 'New tab',\n 'wb.shell.tab.newTitle': 'New tab (Ctrl+T)',\n 'wb.shell.window.maximize': 'Maximize',\n 'wb.shell.window.minimize': 'Minimize',\n 'wb.shell.window.restore': 'Restore',\n 'wb.web.address': 'Address',\n 'wb.web.addressValue': 'Address: {url}',\n 'wb.web.back': 'Back',\n 'wb.web.backTitle': 'Back (Alt+←)',\n 'wb.web.forward': 'Forward',\n 'wb.web.forwardTitle': 'Forward (Alt+→)',\n 'wb.web.insecure': 'Not secure',\n 'wb.web.paneAccount': 'This pane’s account: {name}',\n 'wb.web.reloadTitle': 'Reload (Ctrl+R)',\n 'wb.web.splitMore': 'Split and pane options',\n 'wb.web.splitTitle': \"Split right (Ctrl+\\\\)\",\n 'wb.web.stop': 'Stop',\n 'wb.web.tabKey': 'Tab',\n 'wb.ws.default': 'My workspace',\n 'wb.ws.defaultN': 'My workspace {n}',\n 'wb.ws.deleteConfirm': 'Delete {name}? Open tabs stay open.',\n 'wb.ws.deleteNamed': 'Delete {name}',\n 'wb.ws.empty': 'No saved workspaces yet. Save this layout to switch back to it any time.',\n 'wb.ws.err.id': 'Invalid workspace id.',\n 'wb.ws.err.noLayout': 'There is no layout to save.',\n 'wb.ws.err.noTabs': 'There are no tabs to save.',\n 'wb.ws.err.tooLarge': 'This layout is too large to save as a workspace.',\n 'wb.ws.err.tooMany': 'At most {count} workspaces. Delete one first.',\n 'wb.ws.hint': 'Tabs, splits, decks, accounts and pane themes, reopened in one click',\n 'wb.ws.name': 'Workspace name',\n 'wb.ws.namePlaceholder': 'Name, e.g. Launch day',\n 'wb.ws.named': 'Workspace {name}',\n 'wb.ws.newName': 'New name for {name}',\n 'wb.ws.notReady': 'The window is not ready yet.',\n 'wb.ws.onStart': 'On start',\n 'wb.ws.onStartTitle': 'Opens when wayBetter starts',\n 'wb.ws.openNow': 'open now',\n 'wb.ws.rename': 'Rename',\n 'wb.ws.renameNamed': 'Rename {name}',\n 'wb.ws.save': 'Save layout as workspace…',\n 'wb.ws.saveMeta': '{count, plural, one {# open tab} other {# open tabs}} · also in Ctrl+K',\n 'wb.ws.setStart': 'Open this workspace when wayBetter starts',\n 'wb.ws.setStartNamed': 'Open {name} on start',\n 'wb.ws.stopStart': 'Stop opening on start',\n 'wb.ws.stopStartNamed': 'Stop opening {name} on start',\n 'wb.ws.tabs': '{count, plural, one {# tab} other {# tabs}}',\n 'wb.ws.title': 'Workspaces',\n 'wb.ws.update': 'Save the current layout over this workspace',\n 'wb.ws.updateNamed': 'Update {name} with the current layout',\n} as const;\n\nexport type FrameKey = keyof typeof FRAME_MESSAGES;\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type UpdateStatus } from '../updateModel.ts';
|
|
2
|
+
import { t } from './i18n.ts';
|
|
3
|
+
import type { ThemeDoc, ThemeStore } from './themeStore.ts';
|
|
4
|
+
import type { ProfileSettings } from '../profileModel.ts';
|
|
5
|
+
/** Re-renders the calling component when the language changes; returns `t`. */
|
|
6
|
+
export declare function useT(): typeof t;
|
|
7
|
+
/** Current profile list; re-renders on every `setProfiles`. */
|
|
8
|
+
export declare function useProfiles(): ProfileSettings;
|
|
9
|
+
/** Re-renders when the focused pane (or the layout) changes. */
|
|
10
|
+
export declare function usePaneTick(): number;
|
|
11
|
+
/** Re-renders when the site's runtime text changes (`siteChanged()`). */
|
|
12
|
+
export declare const useSiteText: () => void;
|
|
13
|
+
/** Re-renders on deck and profile changes. */
|
|
14
|
+
export declare const useDecks: () => void;
|
|
15
|
+
export declare function useDev(): {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
errors: import("./devHost.ts").DevErrorInfo[];
|
|
18
|
+
last: {
|
|
19
|
+
text: string;
|
|
20
|
+
at: number;
|
|
21
|
+
} | null;
|
|
22
|
+
};
|
|
23
|
+
export declare function useSync(): {
|
|
24
|
+
status: import("./syncHost.ts").SyncStatus | null;
|
|
25
|
+
newer: import("./syncHost.ts").SnapshotInfo | null;
|
|
26
|
+
};
|
|
27
|
+
/** The theme state of `store`; loads it once. */
|
|
28
|
+
export declare function useThemeState<Choice, Spec extends ThemeDoc>(store: ThemeStore<Choice, Spec>): {
|
|
29
|
+
ready: boolean;
|
|
30
|
+
choice: Choice;
|
|
31
|
+
scopes: import("./themeScopes.ts").ThemeScopes;
|
|
32
|
+
fonts: import("./themeStore.ts").InstalledFont[];
|
|
33
|
+
preview: Spec | null;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Native update status for the titlebar chip. Native code checks, downloads and verifies; the
|
|
37
|
+
* shell only reads the status, confirms it started (`app_ready`) and asks to apply a ready update.
|
|
38
|
+
*/
|
|
39
|
+
export declare function useUpdateStatus(): [UpdateStatus, () => void];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// React hooks over the frame's shared state (profiles, decks, the language, site text, developer
|
|
2
|
+
// mode, sync, themes, the update status). Each re-renders its component when that state changes.
|
|
3
|
+
import { useEffect, useReducer, useState, useSyncExternalStore } from 'react';
|
|
4
|
+
import { parseUpdateStatus } from "../updateModel.js";
|
|
5
|
+
import { isTauri } from "../windowControls.js";
|
|
6
|
+
import { invoke, listen } from "./bridge.js";
|
|
7
|
+
import { dev } from "./devHost.js";
|
|
8
|
+
import { subscribeText, t, textLocale } from "./i18n.js";
|
|
9
|
+
import { shell } from "./state.js";
|
|
10
|
+
import { syncState } from "./syncHost.js";
|
|
11
|
+
/** Re-renders the calling component when the language changes; returns `t`. */
|
|
12
|
+
export function useT() {
|
|
13
|
+
useSyncExternalStore(subscribeText, textLocale, textLocale);
|
|
14
|
+
return t;
|
|
15
|
+
}
|
|
16
|
+
/** Re-renders on every window event in `events`. */
|
|
17
|
+
function useEvents(...events) {
|
|
18
|
+
const [, tick] = useReducer((n) => n + 1, 0);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
for (const event of events)
|
|
21
|
+
window.addEventListener(event, tick);
|
|
22
|
+
return () => { for (const event of events)
|
|
23
|
+
window.removeEventListener(event, tick); };
|
|
24
|
+
}, []);
|
|
25
|
+
}
|
|
26
|
+
/** Current profile list; re-renders on every `setProfiles`. */
|
|
27
|
+
export function useProfiles() {
|
|
28
|
+
const [profiles, set] = useState(shell.profiles);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
const update = () => set(shell.profiles);
|
|
31
|
+
window.addEventListener('bt-profiles', update);
|
|
32
|
+
update();
|
|
33
|
+
return () => window.removeEventListener('bt-profiles', update);
|
|
34
|
+
}, []);
|
|
35
|
+
return profiles;
|
|
36
|
+
}
|
|
37
|
+
/** Re-renders when the focused pane (or the layout) changes. */
|
|
38
|
+
export function usePaneTick() {
|
|
39
|
+
const [tick, setTick] = useState(0);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
const bump = () => setTick(value => value + 1);
|
|
42
|
+
window.addEventListener('bt-active-pane', bump);
|
|
43
|
+
return () => window.removeEventListener('bt-active-pane', bump);
|
|
44
|
+
}, []);
|
|
45
|
+
return tick;
|
|
46
|
+
}
|
|
47
|
+
/** Re-renders when the site's runtime text changes (`siteChanged()`). */
|
|
48
|
+
export const useSiteText = () => useEvents('bt-site');
|
|
49
|
+
/** Re-renders on deck and profile changes. */
|
|
50
|
+
export const useDecks = () => useEvents('bt-decks', 'bt-profiles');
|
|
51
|
+
export function useDev() {
|
|
52
|
+
useEvents('bt-dev');
|
|
53
|
+
return dev;
|
|
54
|
+
}
|
|
55
|
+
export function useSync() {
|
|
56
|
+
useEvents('bt-sync');
|
|
57
|
+
return syncState;
|
|
58
|
+
}
|
|
59
|
+
/** The theme state of `store`; loads it once. */
|
|
60
|
+
export function useThemeState(store) {
|
|
61
|
+
const [value, setValue] = useState(store.current());
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
const update = () => setValue(store.current());
|
|
64
|
+
const off = store.subscribe(update);
|
|
65
|
+
void store.loadThemes();
|
|
66
|
+
update();
|
|
67
|
+
return off;
|
|
68
|
+
}, [store]);
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Native update status for the titlebar chip. Native code checks, downloads and verifies; the
|
|
73
|
+
* shell only reads the status, confirms it started (`app_ready`) and asks to apply a ready update.
|
|
74
|
+
*/
|
|
75
|
+
export function useUpdateStatus() {
|
|
76
|
+
const [status, setStatus] = useState({ state: 'idle' });
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (!isTauri)
|
|
79
|
+
return;
|
|
80
|
+
let unlisten;
|
|
81
|
+
let disposed = false;
|
|
82
|
+
listen('update-status', event => setStatus(parseUpdateStatus(event.payload)))
|
|
83
|
+
.then(fn => { if (disposed)
|
|
84
|
+
fn();
|
|
85
|
+
else
|
|
86
|
+
unlisten = fn; })
|
|
87
|
+
.catch(() => { });
|
|
88
|
+
// Handshake: the shell rendered, so a just-installed update is confirmed working.
|
|
89
|
+
invoke('app_ready').then(value => setStatus(parseUpdateStatus(value))).catch(() => { });
|
|
90
|
+
return () => { disposed = true; unlisten?.(); };
|
|
91
|
+
}, []);
|
|
92
|
+
const apply = () => {
|
|
93
|
+
invoke('apply_update').catch(() => invoke('update_status').then(value => setStatus(parseUpdateStatus(value))).catch(() => { }));
|
|
94
|
+
};
|
|
95
|
+
return [status, apply];
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../../../../shell/src/frame/hooks.ts"],"names":[],"mappings":"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","sourcesContent":["// React hooks over the frame's shared state (profiles, decks, the language, site text, developer\n// mode, sync, themes, the update status). Each re-renders its component when that state changes.\n\nimport { useEffect, useReducer, useState, useSyncExternalStore } from 'react';\nimport { parseUpdateStatus, type UpdateStatus } from '../updateModel.ts';\nimport { isTauri } from '../windowControls.ts';\nimport { invoke, listen } from './bridge.ts';\nimport { dev } from './devHost.ts';\nimport { subscribeText, t, textLocale } from './i18n.ts';\nimport { shell } from './state.ts';\nimport { syncState } from './syncHost.ts';\nimport type { ThemeDoc, ThemeStore } from './themeStore.ts';\nimport type { ProfileSettings } from '../profileModel.ts';\n\n/** Re-renders the calling component when the language changes; returns `t`. */\nexport function useT(): typeof t {\n useSyncExternalStore(subscribeText, textLocale, textLocale);\n return t;\n}\n\n/** Re-renders on every window event in `events`. */\nfunction useEvents(...events: string[]) {\n const [, tick] = useReducer((n: number) => n + 1, 0);\n useEffect(() => {\n for (const event of events) window.addEventListener(event, tick);\n return () => { for (const event of events) window.removeEventListener(event, tick); };\n }, []);\n}\n\n/** Current profile list; re-renders on every `setProfiles`. */\nexport function useProfiles(): ProfileSettings {\n const [profiles, set] = useState(shell.profiles);\n useEffect(() => {\n const update = () => set(shell.profiles);\n window.addEventListener('bt-profiles', update);\n update();\n return () => window.removeEventListener('bt-profiles', update);\n }, []);\n return profiles;\n}\n\n/** Re-renders when the focused pane (or the layout) changes. */\nexport function usePaneTick(): number {\n const [tick, setTick] = useState(0);\n useEffect(() => {\n const bump = () => setTick(value => value + 1);\n window.addEventListener('bt-active-pane', bump);\n return () => window.removeEventListener('bt-active-pane', bump);\n }, []);\n return tick;\n}\n\n/** Re-renders when the site's runtime text changes (`siteChanged()`). */\nexport const useSiteText = () => useEvents('bt-site');\n\n/** Re-renders on deck and profile changes. */\nexport const useDecks = () => useEvents('bt-decks', 'bt-profiles');\n\nexport function useDev() {\n useEvents('bt-dev');\n return dev;\n}\n\nexport function useSync() {\n useEvents('bt-sync');\n return syncState;\n}\n\n/** The theme state of `store`; loads it once. */\nexport function useThemeState<Choice, Spec extends ThemeDoc>(store: ThemeStore<Choice, Spec>) {\n const [value, setValue] = useState(store.current());\n useEffect(() => {\n const update = () => setValue(store.current());\n const off = store.subscribe(update);\n void store.loadThemes();\n update();\n return off;\n }, [store]);\n return value;\n}\n\n/**\n * Native update status for the titlebar chip. Native code checks, downloads and verifies; the\n * shell only reads the status, confirms it started (`app_ready`) and asks to apply a ready update.\n */\nexport function useUpdateStatus(): [UpdateStatus, () => void] {\n const [status, setStatus] = useState<UpdateStatus>({ state: 'idle' });\n useEffect(() => {\n if (!isTauri) return;\n let unlisten: (() => void) | undefined;\n let disposed = false;\n listen('update-status', event => setStatus(parseUpdateStatus(event.payload)))\n .then(fn => { if (disposed) fn(); else unlisten = fn; })\n .catch(() => {});\n // Handshake: the shell rendered, so a just-installed update is confirmed working.\n invoke('app_ready').then(value => setStatus(parseUpdateStatus(value))).catch(() => {});\n return () => { disposed = true; unlisten?.(); };\n }, []);\n const apply = () => {\n invoke('apply_update').catch(() => invoke('update_status').then(value => setStatus(parseUpdateStatus(value))).catch(() => {}));\n };\n return [status, apply];\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type Params = Record<string, string | number | boolean | Date | null | undefined>;
|
|
2
|
+
/** The part of a waybetter/i18n instance the frame uses. */
|
|
3
|
+
export type ShellI18n = {
|
|
4
|
+
readonly locale: string;
|
|
5
|
+
tx(key: string, params?: Params, fallback?: string): string;
|
|
6
|
+
onChange(listener: (locale: string) => void): () => void;
|
|
7
|
+
number(value: number, options?: Intl.NumberFormatOptions): string;
|
|
8
|
+
relative(value: number, unit: Intl.RelativeTimeFormatUnit): string;
|
|
9
|
+
date(value: string | number | Date, options?: Intl.DateTimeFormatOptions): string;
|
|
10
|
+
};
|
|
11
|
+
/** Binds the frame to the app's i18n instance (once, before the shell renders). */
|
|
12
|
+
export declare function setShellI18n(i18n: ShellI18n): void;
|
|
13
|
+
/** Sets the parameters every frame message gets (createShell: `{ site }`). */
|
|
14
|
+
export declare function setTextDefaults(values: Params): void;
|
|
15
|
+
/** The message for a framework key in the active language (the key itself when unbound or missing). */
|
|
16
|
+
export declare function t(key: string, params?: Params): string;
|
|
17
|
+
/** Like `t` for keys assembled at runtime: `fallback` when the key is unknown. */
|
|
18
|
+
export declare function tx(key: string, params?: Params, fallback?: string): string;
|
|
19
|
+
/** Language changes (for `useT`). */
|
|
20
|
+
export declare function subscribeText(listener: () => void): () => void;
|
|
21
|
+
export declare const textLocale: () => string;
|
|
22
|
+
/** A number in the active language ("5 min", "5 dk" with a unit style). */
|
|
23
|
+
export declare function formatNumber(value: number, options?: Intl.NumberFormatOptions): string;
|
|
24
|
+
/** A date (and time) in the active language: `formatDate(iso, { dateStyle: 'medium' })`. */
|
|
25
|
+
export declare function formatDate(value: string | number | Date, options?: Intl.DateTimeFormatOptions): string;
|
|
26
|
+
/** "3 minutes ago" style text for a timestamp in the active language. */
|
|
27
|
+
export declare function relativeTime(then: number, now?: number): string;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// The shell frame's words. They live in the framework catalogs (`waybetter/locales/<bcp47>.json`,
|
|
2
|
+
// `wb.*`); the app hands the frame its i18n instance (`setShellI18n`, a `createI18n` from
|
|
3
|
+
// waybetter/i18n that has the framework catalogs merged in), so the frame speaks the app's language
|
|
4
|
+
// and re-renders when it changes (`useT`, hooks.ts). Without one (a unit test), a key reads as itself.
|
|
5
|
+
// Pure (no React, no Tauri), so the models that use it are unit-tested under node.
|
|
6
|
+
//
|
|
7
|
+
// Placeholders: `{site}` is the site's name ("X").
|
|
8
|
+
let current = null;
|
|
9
|
+
/** Parameters every frame message gets (`{site}`: the site's name, set by createShell). */
|
|
10
|
+
let defaults = {};
|
|
11
|
+
const listeners = new Set();
|
|
12
|
+
let unbind = null;
|
|
13
|
+
/** Binds the frame to the app's i18n instance (once, before the shell renders). */
|
|
14
|
+
export function setShellI18n(i18n) {
|
|
15
|
+
unbind?.();
|
|
16
|
+
current = i18n;
|
|
17
|
+
unbind = i18n.onChange(() => { for (const listener of [...listeners])
|
|
18
|
+
listener(); });
|
|
19
|
+
for (const listener of [...listeners])
|
|
20
|
+
listener();
|
|
21
|
+
}
|
|
22
|
+
/** Sets the parameters every frame message gets (createShell: `{ site }`). */
|
|
23
|
+
export function setTextDefaults(values) {
|
|
24
|
+
defaults = { ...values };
|
|
25
|
+
}
|
|
26
|
+
/** The message for a framework key in the active language (the key itself when unbound or missing). */
|
|
27
|
+
export function t(key, params) {
|
|
28
|
+
return current ? current.tx(key, { ...defaults, ...params }) : key;
|
|
29
|
+
}
|
|
30
|
+
/** Like `t` for keys assembled at runtime: `fallback` when the key is unknown. */
|
|
31
|
+
export function tx(key, params, fallback) {
|
|
32
|
+
return current ? current.tx(key, { ...defaults, ...params }, fallback) : fallback ?? key;
|
|
33
|
+
}
|
|
34
|
+
/** Language changes (for `useT`). */
|
|
35
|
+
export function subscribeText(listener) {
|
|
36
|
+
listeners.add(listener);
|
|
37
|
+
return () => { listeners.delete(listener); };
|
|
38
|
+
}
|
|
39
|
+
export const textLocale = () => current?.locale ?? '';
|
|
40
|
+
/** A number in the active language ("5 min", "5 dk" with a unit style). */
|
|
41
|
+
export function formatNumber(value, options) {
|
|
42
|
+
return current ? current.number(value, options) : String(value);
|
|
43
|
+
}
|
|
44
|
+
/** A date (and time) in the active language: `formatDate(iso, { dateStyle: 'medium' })`. */
|
|
45
|
+
export function formatDate(value, options = { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) {
|
|
46
|
+
return current ? current.date(value, options) : new Date(value).toISOString();
|
|
47
|
+
}
|
|
48
|
+
/** "3 minutes ago" style text for a timestamp in the active language. */
|
|
49
|
+
export function relativeTime(then, now = Date.now()) {
|
|
50
|
+
if (!current)
|
|
51
|
+
return new Date(then).toISOString();
|
|
52
|
+
const seconds = Math.round((then - now) / 1000);
|
|
53
|
+
const abs = Math.abs(seconds);
|
|
54
|
+
if (abs < 45)
|
|
55
|
+
return current.relative(0, 'second');
|
|
56
|
+
if (abs < 3600)
|
|
57
|
+
return current.relative(Math.round(seconds / 60), 'minute');
|
|
58
|
+
if (abs < 86400)
|
|
59
|
+
return current.relative(Math.round(seconds / 3600), 'hour');
|
|
60
|
+
if (abs < 86400 * 30)
|
|
61
|
+
return current.relative(Math.round(seconds / 86400), 'day');
|
|
62
|
+
if (abs < 86400 * 365)
|
|
63
|
+
return current.relative(Math.round(seconds / (86400 * 30)), 'month');
|
|
64
|
+
return current.relative(Math.round(seconds / (86400 * 365)), 'year');
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../../../../shell/src/frame/i18n.ts"],"names":[],"mappings":"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","sourcesContent":["// The shell frame's words. They live in the framework catalogs (`waybetter/locales/<bcp47>.json`,\n// `wb.*`); the app hands the frame its i18n instance (`setShellI18n`, a `createI18n` from\n// waybetter/i18n that has the framework catalogs merged in), so the frame speaks the app's language\n// and re-renders when it changes (`useT`, hooks.ts). Without one (a unit test), a key reads as itself.\n// Pure (no React, no Tauri), so the models that use it are unit-tested under node.\n//\n// Placeholders: `{site}` is the site's name (\"X\").\n\nexport type Params = Record<string, string | number | boolean | Date | null | undefined>;\n\n/** The part of a waybetter/i18n instance the frame uses. */\nexport type ShellI18n = {\n readonly locale: string;\n tx(key: string, params?: Params, fallback?: string): string;\n onChange(listener: (locale: string) => void): () => void;\n number(value: number, options?: Intl.NumberFormatOptions): string;\n relative(value: number, unit: Intl.RelativeTimeFormatUnit): string;\n date(value: string | number | Date, options?: Intl.DateTimeFormatOptions): string;\n};\n\nlet current: ShellI18n | null = null;\n/** Parameters every frame message gets (`{site}`: the site's name, set by createShell). */\nlet defaults: Params = {};\nconst listeners = new Set<() => void>();\nlet unbind: (() => void) | null = null;\n\n/** Binds the frame to the app's i18n instance (once, before the shell renders). */\nexport function setShellI18n(i18n: ShellI18n) {\n unbind?.();\n current = i18n;\n unbind = i18n.onChange(() => { for (const listener of [...listeners]) listener(); });\n for (const listener of [...listeners]) listener();\n}\n\n/** Sets the parameters every frame message gets (createShell: `{ site }`). */\nexport function setTextDefaults(values: Params) {\n defaults = { ...values };\n}\n\n/** The message for a framework key in the active language (the key itself when unbound or missing). */\nexport function t(key: string, params?: Params): string {\n return current ? current.tx(key, { ...defaults, ...params }) : key;\n}\n\n/** Like `t` for keys assembled at runtime: `fallback` when the key is unknown. */\nexport function tx(key: string, params?: Params, fallback?: string): string {\n return current ? current.tx(key, { ...defaults, ...params }, fallback) : fallback ?? key;\n}\n\n/** Language changes (for `useT`). */\nexport function subscribeText(listener: () => void): () => void {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n}\nexport const textLocale = () => current?.locale ?? '';\n\n/** A number in the active language (\"5 min\", \"5 dk\" with a unit style). */\nexport function formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\n return current ? current.number(value, options) : String(value);\n}\n\n/** A date (and time) in the active language: `formatDate(iso, { dateStyle: 'medium' })`. */\nexport function formatDate(value: string | number | Date, options: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }): string {\n return current ? current.date(value, options) : new Date(value).toISOString();\n}\n\n/** \"3 minutes ago\" style text for a timestamp in the active language. */\nexport function relativeTime(then: number, now = Date.now()): string {\n if (!current) return new Date(then).toISOString();\n const seconds = Math.round((then - now) / 1000);\n const abs = Math.abs(seconds);\n if (abs < 45) return current.relative(0, 'second');\n if (abs < 3600) return current.relative(Math.round(seconds / 60), 'minute');\n if (abs < 86400) return current.relative(Math.round(seconds / 3600), 'hour');\n if (abs < 86400 * 30) return current.relative(Math.round(seconds / 86400), 'day');\n if (abs < 86400 * 365) return current.relative(Math.round(seconds / (86400 * 30)), 'month');\n return current.relative(Math.round(seconds / (86400 * 365)), 'year');\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IconGlyph, IconName, IconPack } from '../../runtime/themeIcons.ts';
|
|
2
|
+
/** Sets the chrome's pack (the theme store calls it with the global theme's). */
|
|
3
|
+
export declare function setChromeIconPack(pack: IconPack | null): void;
|
|
4
|
+
export declare const useChromeIconPack: () => IconPack | null;
|
|
5
|
+
/** Which pack glyph stands for each of the frame's own glyph names. */
|
|
6
|
+
export declare const CHROME_ICON_NAMES: Readonly<Record<string, IconName>>;
|
|
7
|
+
/** One pack glyph as SVG children (no `<svg>` wrapper). */
|
|
8
|
+
export declare function GlyphPaths({ glyph, pack }: {
|
|
9
|
+
glyph: IconGlyph;
|
|
10
|
+
pack: IconPack;
|
|
11
|
+
}): import("react").JSX.Element;
|