waybetter 0.1.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -6
- package/bin/waybetter.mjs +46 -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/privacy.mjs +768 -0
- package/cli/release.mjs +444 -0
- package/cli/remote.mjs +260 -0
- package/cli/store.mjs +326 -0
- package/cli/strings.mjs +121 -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 +59 -0
- package/dist/runtime/stringPackTranslate.js +264 -0
- package/dist/runtime/stringPackTranslate.js.map +1 -0
- package/dist/runtime/stringPacks.d.ts +200 -0
- package/dist/runtime/stringPacks.js +474 -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/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 +463 -0
- package/dist/runtime/themeComponents.js.map +1 -0
- package/dist/runtime/themeDecor.d.ts +73 -0
- package/dist/runtime/themeDecor.js +131 -0
- package/dist/runtime/themeDecor.js.map +1 -0
- package/dist/runtime/themeDoctor.d.ts +11 -0
- package/dist/runtime/themeDoctor.js +51 -0
- package/dist/runtime/themeDoctor.js.map +1 -0
- package/dist/runtime/themeIcons.d.ts +130 -0
- package/dist/runtime/themeIcons.js +263 -0
- package/dist/runtime/themeIcons.js.map +1 -0
- package/dist/runtime/themeRuntime.d.ts +100 -0
- package/dist/runtime/themeRuntime.js +497 -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 +259 -0
- package/dist/runtime/themeSpec.js +439 -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 +170 -0
- package/dist/shell/InstallDialog.js.map +1 -0
- package/dist/shell/StoreView.d.ts +66 -0
- package/dist/shell/StoreView.js +103 -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 +21 -0
- package/dist/shell/frame/AppMenu.js +642 -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 +8 -0
- package/dist/shell/frame/Shell.js +1131 -0
- package/dist/shell/frame/Shell.js.map +1 -0
- package/dist/shell/frame/Titlebar.d.ts +16 -0
- package/dist/shell/frame/Titlebar.js +77 -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 +182 -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 +121 -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 +35 -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 +29 -0
- package/dist/shell/frame/chromeTheme.js +81 -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/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 +34 -0
- package/dist/shell/frame/mediaModel.js +53 -0
- package/dist/shell/frame/mediaModel.js.map +1 -0
- package/dist/shell/frame/menuMessages.en.json +54 -0
- package/dist/shell/frame/menuModel.d.ts +277 -0
- package/dist/shell/frame/menuModel.js +293 -0
- package/dist/shell/frame/menuModel.js.map +1 -0
- package/dist/shell/frame/paletteModel.d.ts +139 -0
- package/dist/shell/frame/paletteModel.js +112 -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 +629 -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 +99 -0
- package/dist/shell/frame/state.js +284 -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 +252 -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 +122 -0
- package/dist/shell/installController.js +146 -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 +256 -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 +116 -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 +6 -0
- package/dist/shell/panel/StoreSection.js +48 -0
- package/dist/shell/panel/StoreSection.js.map +1 -0
- package/dist/shell/panel/StringPacks.d.ts +11 -0
- package/dist/shell/panel/StringPacks.js +106 -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 +232 -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 +72 -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 +763 -0
- package/dist/shell/panel/panelMessages.js +767 -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 +230 -0
- package/dist/shell/storeMessages.d.ts +169 -0
- package/dist/shell/storeMessages.js +172 -0
- package/dist/shell/storeMessages.js.map +1 -0
- package/dist/shell/storeModel.d.ts +181 -0
- package/dist/shell/storeModel.js +133 -0
- package/dist/shell/storeModel.js.map +1 -0
- package/dist/shell/stringPacksModel.d.ts +44 -0
- package/dist/shell/stringPacksModel.js +94 -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 +646 -0
- package/languages.schema.json +23 -0
- package/locales/ar-x-fm.json +11 -0
- package/locales/ar.json +1281 -0
- package/locales/bg.json +1280 -0
- package/locales/bn.json +1280 -0
- package/locales/ca.json +1280 -0
- package/locales/cs.json +1280 -0
- package/locales/da.json +1280 -0
- package/locales/de.json +1280 -0
- package/locales/el.json +1280 -0
- package/locales/en-GB.json +27 -0
- package/locales/en.json +1280 -0
- package/locales/en.meta.json +51 -0
- package/locales/es.json +1280 -0
- package/locales/eu.json +1280 -0
- package/locales/fa.json +1281 -0
- package/locales/fi.json +1280 -0
- package/locales/fil.json +1280 -0
- package/locales/fr.json +1280 -0
- package/locales/ga.json +1280 -0
- package/locales/gl.json +1280 -0
- package/locales/gu.json +1280 -0
- package/locales/ha.json +1280 -0
- package/locales/he.json +1281 -0
- package/locales/hi.json +1280 -0
- package/locales/hr.json +1280 -0
- package/locales/hu.json +1279 -0
- package/locales/id.json +1280 -0
- package/locales/ig.json +1280 -0
- package/locales/it.json +1280 -0
- package/locales/ja.json +1280 -0
- package/locales/kn.json +1280 -0
- package/locales/ko.json +1280 -0
- package/locales/mr.json +1280 -0
- package/locales/ms.json +1280 -0
- package/locales/nb.json +1280 -0
- package/locales/nl.json +1280 -0
- package/locales/pl.json +1280 -0
- package/locales/pt.json +1280 -0
- package/locales/ro.json +1280 -0
- package/locales/ru.json +1280 -0
- package/locales/sk.json +1280 -0
- package/locales/sr.json +1280 -0
- package/locales/sv.json +1280 -0
- package/locales/ta.json +1280 -0
- package/locales/th.json +1280 -0
- package/locales/tr.json +1280 -0
- package/locales/uk.json +1280 -0
- package/locales/ur.json +1281 -0
- package/locales/vi.json +1280 -0
- package/locales/yo.json +1280 -0
- package/locales/zh-Hans.json +1280 -0
- package/locales/zh-Hant.json +1280 -0
- package/package.json +139 -5
- package/store-catalog.schema.json +65 -0
- package/theme.schema.json +4659 -0
- package/windows/installer.nsi +926 -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,463 @@
|
|
|
1
|
+
// Component tokens: the part of a theme that says how each piece of the site is built (a button's
|
|
2
|
+
// radius and border, a post's padding and fill, the size and case of a handle), instead of one radius
|
|
3
|
+
// and one density for everything. A theme names generic components (`post`, `buttonPrimary`,
|
|
4
|
+
// `navItem`); the site adapter says which selectors they are (its part map). Pure.
|
|
5
|
+
//
|
|
6
|
+
// Safety is the same as the rest of a theme document: every token is a clamped number, a fixed word
|
|
7
|
+
// or a color role name. No token carries CSS text, a selector or a color literal, so one contrast
|
|
8
|
+
// pass over the palette covers every component, and the CSS is built from the vocabulary below.
|
|
9
|
+
//
|
|
10
|
+
// How it lands in the page: values are custom properties at zero specificity
|
|
11
|
+
// (`:where(:root){--wb-part-post-radius:0px}`), rules are rigid (`:root:root <part>{border-radius:
|
|
12
|
+
// var(--wb-part-post-radius) !important}`). An owner's Custom CSS or a plugin overrides a value by
|
|
13
|
+
// setting the variable, for the whole page or for one subtree, without fighting `!important`.
|
|
14
|
+
//
|
|
15
|
+
// The bevel borders (`bevel-out`, `bevel-in`) follow 98.css's raised and sunken edges (MIT, Jordan
|
|
16
|
+
// Scales, https://github.com/jdan/98.css): four inset shadows, here computed from the theme's roles.
|
|
17
|
+
import { contrastRatio, hexToRgb, mix, relativeLuminance } from "./themeApi.js";
|
|
18
|
+
// ---------------------------------------------------------------------------------------------
|
|
19
|
+
// Vocabulary
|
|
20
|
+
/** Color roles a component may name. `onAccent` is the readable label on the accent. */
|
|
21
|
+
export const COLOR_ROLES = ['bg', 'surface', 'elevated', 'page', 'border', 'text', 'muted', 'accent', 'onAccent', 'inverse', 'onInverse'];
|
|
22
|
+
export const BORDER_STYLES = ['none', 'solid', 'dashed', 'dotted', 'double', 'bevel-out', 'bevel-in'];
|
|
23
|
+
export const SHADOWS = ['none', 'soft', 'deep', 'hard', 'inset', 'glow'];
|
|
24
|
+
export const CASES = ['none', 'upper', 'lower', 'capitalize', 'small-caps'];
|
|
25
|
+
export const AVATAR_SHAPES = ['circle', 'rounded', 'square', 'squircle', 'hexagon', 'octagon', 'diamond'];
|
|
26
|
+
export const CORNERS = ['round', 'cut'];
|
|
27
|
+
const FONT_ROLES = ['interface', 'post', 'heading', 'numbers', 'mono', 'chrome', 'dialog'];
|
|
28
|
+
const LABEL = [12, 20];
|
|
29
|
+
const SMALL = [11, 18];
|
|
30
|
+
/** Every component a theme can name. Sites map them to selectors; a component a site does not have is ignored. */
|
|
31
|
+
export const COMPONENTS = {
|
|
32
|
+
nav: { width: [56, 320], glass: true, gradient: true },
|
|
33
|
+
navItem: { height: [36, 64], fontSize: LABEL, text: true },
|
|
34
|
+
topBar: { height: [40, 64], glass: true, gradient: true, fontSize: LABEL },
|
|
35
|
+
tabs: { presets: 'tabs', gradient: true },
|
|
36
|
+
tab: { height: [32, 56], fontSize: LABEL, text: true, presets: 'tabs' },
|
|
37
|
+
post: { corner: true, presets: 'post', contrast: 7 },
|
|
38
|
+
avatar: { size: [20, 64], shape: true, visible: true },
|
|
39
|
+
displayName: { text: true, fontSize: LABEL, visible: true },
|
|
40
|
+
handle: { text: true, fontSize: SMALL, visible: true },
|
|
41
|
+
postText: { text: true, fontSize: [13, 24], contrast: 7 },
|
|
42
|
+
meta: { text: true, fontSize: SMALL },
|
|
43
|
+
actionBar: {},
|
|
44
|
+
action: { size: [28, 44] },
|
|
45
|
+
count: { text: true, fontSize: SMALL, visible: true },
|
|
46
|
+
media: { corner: true, maxHeight: [200, 700] },
|
|
47
|
+
linkCard: { corner: true },
|
|
48
|
+
quote: {},
|
|
49
|
+
button: { height: [24, 56], fontSize: LABEL, text: true, gradient: true, presets: 'button' },
|
|
50
|
+
buttonPrimary: { parent: 'button', height: [24, 56], fontSize: LABEL, text: true, gradient: true, presets: 'button' },
|
|
51
|
+
buttonSecondary: { parent: 'button', height: [24, 56], fontSize: LABEL, text: true, gradient: true, presets: 'button' },
|
|
52
|
+
buttonGhost: { parent: 'button', height: [24, 56], fontSize: LABEL, text: true, gradient: true, presets: 'button' },
|
|
53
|
+
input: { height: [32, 56], fontSize: LABEL, text: true, presets: 'input' },
|
|
54
|
+
search: { height: [32, 56], fontSize: LABEL, text: true, presets: 'input' },
|
|
55
|
+
composer: { fontSize: [13, 24], text: true },
|
|
56
|
+
/** The tool icons under a composer (media, poll, emoji); `text` is their color. */
|
|
57
|
+
composerTool: { size: [28, 44] },
|
|
58
|
+
panel: { glass: true, presets: 'panel' },
|
|
59
|
+
menu: { parent: 'panel', glass: true, presets: 'panel' },
|
|
60
|
+
dialog: { parent: 'panel', glass: true, presets: 'panel' },
|
|
61
|
+
toast: { parent: 'panel', glass: true, presets: 'panel' },
|
|
62
|
+
hoverCard: { parent: 'panel', glass: true, presets: 'panel' },
|
|
63
|
+
sidebarCard: { parent: 'panel', glass: true, corner: true, presets: 'panel' },
|
|
64
|
+
badge: { size: [14, 24], corner: true, fontSize: SMALL, text: true },
|
|
65
|
+
pill: { fontSize: SMALL, text: true },
|
|
66
|
+
divider: {},
|
|
67
|
+
scrollbar: {},
|
|
68
|
+
profileHeader: {},
|
|
69
|
+
};
|
|
70
|
+
export const COMPONENT_IDS = Object.keys(COMPONENTS);
|
|
71
|
+
/** Clamp ranges of the tokens every component shares (the JSON Schema says the same; tested). */
|
|
72
|
+
export const TOKEN_LIMITS = {
|
|
73
|
+
radius: [0, 32], borderWidth: [0, 4], padX: [0, 32], padY: [0, 32], gap: [0, 24], weight: [100, 900],
|
|
74
|
+
tracking: [-0.05, 0.2], leading: [1.1, 2], angle: [0, 360], lift: [0, 4], scale: [0.96, 1.04],
|
|
75
|
+
};
|
|
76
|
+
/** Named token bundles per family; a theme's own tokens win over its preset's. Frozen once shipped. */
|
|
77
|
+
export const PRESETS = {
|
|
78
|
+
button: {
|
|
79
|
+
pill: { radius: 'pill', borderWidth: 0 },
|
|
80
|
+
soft: { radius: 8, borderWidth: 0 },
|
|
81
|
+
square: { radius: 0, borderWidth: 1, borderStyle: 'solid' },
|
|
82
|
+
outline: { radius: 6, borderWidth: 1, borderStyle: 'solid', fill: 'transparent', text: 'text', borderColor: 'border' },
|
|
83
|
+
bevel: { radius: 0, borderStyle: 'bevel-out', fill: 'surface', text: 'text', active: { shadow: 'inset' } },
|
|
84
|
+
gloss: { radius: 'pill', borderWidth: 1, borderStyle: 'solid', shadow: 'soft' },
|
|
85
|
+
'flat-link': { radius: 0, borderWidth: 0, fill: 'transparent', text: 'accent', hover: { underline: true } },
|
|
86
|
+
},
|
|
87
|
+
post: {
|
|
88
|
+
flat: { radius: 0, borderWidth: 0, fill: 'transparent', shadow: 'none' },
|
|
89
|
+
card: { radius: 14, borderWidth: 1, borderStyle: 'solid', borderColor: 'border', fill: 'surface' },
|
|
90
|
+
bubble: { radius: 20, borderWidth: 0, fill: 'surface' },
|
|
91
|
+
window: { radius: 0, borderStyle: 'bevel-out', fill: 'surface' },
|
|
92
|
+
ruled: { radius: 0, borderWidth: 0, fill: 'transparent' },
|
|
93
|
+
},
|
|
94
|
+
input: {
|
|
95
|
+
pill: { radius: 'pill', borderWidth: 1, borderStyle: 'solid', borderColor: 'border' },
|
|
96
|
+
underline: { radius: 0, borderWidth: 0, fill: 'transparent' },
|
|
97
|
+
sunken: { radius: 0, borderStyle: 'bevel-in', fill: 'bg', text: 'text' },
|
|
98
|
+
boxed: { radius: 4, borderWidth: 1, borderStyle: 'solid', borderColor: 'border', fill: 'bg' },
|
|
99
|
+
},
|
|
100
|
+
panel: {
|
|
101
|
+
sheet: { radius: 12, borderWidth: 1, borderStyle: 'solid', borderColor: 'border', fill: 'surface', shadow: 'soft' },
|
|
102
|
+
window: { radius: 0, borderStyle: 'bevel-out', fill: 'surface', shadow: 'none' },
|
|
103
|
+
glass: { radius: 16, borderWidth: 1, borderStyle: 'solid', borderColor: 'border', fill: 'glass', shadow: 'soft' },
|
|
104
|
+
},
|
|
105
|
+
tabs: {
|
|
106
|
+
underline: { radius: 0 },
|
|
107
|
+
pills: { radius: 'pill' },
|
|
108
|
+
folder: { radius: 6, borderWidth: 1, borderStyle: 'solid', borderColor: 'border' },
|
|
109
|
+
blocks: { radius: 0, borderWidth: 1, borderStyle: 'solid', borderColor: 'border' },
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
// ---------------------------------------------------------------------------------------------
|
|
113
|
+
// Sanitizing
|
|
114
|
+
const obj = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
115
|
+
const finite = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
116
|
+
const clamp = (value, [min, max]) => Math.min(max, Math.max(min, value));
|
|
117
|
+
const oneOf = (value, options) => options.includes(value) ? value : undefined;
|
|
118
|
+
const role = (value) => oneOf(value, COLOR_ROLES);
|
|
119
|
+
function sanitizeFill(value, def) {
|
|
120
|
+
if (value === 'transparent')
|
|
121
|
+
return 'transparent';
|
|
122
|
+
if (value === 'glass')
|
|
123
|
+
return def.glass ? 'glass' : undefined;
|
|
124
|
+
const named = role(value);
|
|
125
|
+
if (named)
|
|
126
|
+
return named;
|
|
127
|
+
const source = obj(value);
|
|
128
|
+
const from = role(source.from), to = role(source.to);
|
|
129
|
+
if (def.gradient && from && to)
|
|
130
|
+
return { from, to, angle: Math.round(clamp(finite(source.angle) ? source.angle : 180, TOKEN_LIMITS.angle)) };
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
function sanitizeState(value, def) {
|
|
134
|
+
const source = obj(value);
|
|
135
|
+
const out = {};
|
|
136
|
+
const fill = sanitizeFill(source.fill, def);
|
|
137
|
+
if (fill !== undefined)
|
|
138
|
+
out.fill = fill;
|
|
139
|
+
const text = role(source.text);
|
|
140
|
+
if (text)
|
|
141
|
+
out.text = text;
|
|
142
|
+
const borderColor = role(source.borderColor);
|
|
143
|
+
if (borderColor)
|
|
144
|
+
out.borderColor = borderColor;
|
|
145
|
+
const shadow = oneOf(source.shadow, SHADOWS);
|
|
146
|
+
if (shadow)
|
|
147
|
+
out.shadow = shadow;
|
|
148
|
+
if (finite(source.lift))
|
|
149
|
+
out.lift = +clamp(source.lift, TOKEN_LIMITS.lift).toFixed(1);
|
|
150
|
+
if (finite(source.scale))
|
|
151
|
+
out.scale = +clamp(source.scale, TOKEN_LIMITS.scale).toFixed(3);
|
|
152
|
+
if (typeof source.underline === 'boolean')
|
|
153
|
+
out.underline = source.underline;
|
|
154
|
+
return Object.keys(out).length ? out : undefined;
|
|
155
|
+
}
|
|
156
|
+
/** One component's tokens from JSON: clamped, unknown names and tokens the component does not take dropped. */
|
|
157
|
+
export function sanitizeComponentTokens(id, value) {
|
|
158
|
+
const def = COMPONENTS[id];
|
|
159
|
+
const source = obj(value);
|
|
160
|
+
const out = {};
|
|
161
|
+
if (def.presets && typeof source.preset === 'string' && Object.hasOwn(PRESETS[def.presets], source.preset))
|
|
162
|
+
out.preset = source.preset;
|
|
163
|
+
if (source.radius === 'pill')
|
|
164
|
+
out.radius = 'pill';
|
|
165
|
+
else if (finite(source.radius))
|
|
166
|
+
out.radius = Math.round(clamp(source.radius, TOKEN_LIMITS.radius));
|
|
167
|
+
if (finite(source.borderWidth))
|
|
168
|
+
out.borderWidth = +clamp(source.borderWidth, TOKEN_LIMITS.borderWidth).toFixed(1);
|
|
169
|
+
const borderStyle = oneOf(source.borderStyle, BORDER_STYLES);
|
|
170
|
+
if (borderStyle)
|
|
171
|
+
out.borderStyle = borderStyle;
|
|
172
|
+
const borderColor = role(source.borderColor);
|
|
173
|
+
if (borderColor)
|
|
174
|
+
out.borderColor = borderColor;
|
|
175
|
+
const fill = sanitizeFill(source.fill, def);
|
|
176
|
+
if (fill !== undefined)
|
|
177
|
+
out.fill = fill;
|
|
178
|
+
const text = role(source.text);
|
|
179
|
+
if (text)
|
|
180
|
+
out.text = text;
|
|
181
|
+
for (const key of ['padX', 'padY', 'gap'])
|
|
182
|
+
if (finite(source[key]))
|
|
183
|
+
out[key] = Math.round(clamp(source[key], TOKEN_LIMITS[key]));
|
|
184
|
+
for (const key of ['height', 'width', 'size', 'maxHeight', 'fontSize']) {
|
|
185
|
+
const range = def[key];
|
|
186
|
+
if (range && finite(source[key]))
|
|
187
|
+
out[key] = Math.round(clamp(source[key], range));
|
|
188
|
+
}
|
|
189
|
+
if (def.text || def.fontSize) {
|
|
190
|
+
const font = oneOf(source.font, FONT_ROLES);
|
|
191
|
+
if (font)
|
|
192
|
+
out.font = font;
|
|
193
|
+
if (finite(source.weight))
|
|
194
|
+
out.weight = Math.round(clamp(source.weight, TOKEN_LIMITS.weight) / 50) * 50;
|
|
195
|
+
const textCase = oneOf(source.case, CASES);
|
|
196
|
+
if (textCase && id !== 'postText')
|
|
197
|
+
out.case = textCase;
|
|
198
|
+
if (finite(source.tracking))
|
|
199
|
+
out.tracking = +clamp(source.tracking, TOKEN_LIMITS.tracking).toFixed(3);
|
|
200
|
+
if (finite(source.leading))
|
|
201
|
+
out.leading = +clamp(source.leading, TOKEN_LIMITS.leading).toFixed(2);
|
|
202
|
+
}
|
|
203
|
+
const shadow = oneOf(source.shadow, SHADOWS);
|
|
204
|
+
if (shadow)
|
|
205
|
+
out.shadow = shadow;
|
|
206
|
+
if (def.shape) {
|
|
207
|
+
const shape = oneOf(source.shape, AVATAR_SHAPES);
|
|
208
|
+
if (shape)
|
|
209
|
+
out.shape = shape;
|
|
210
|
+
}
|
|
211
|
+
if (def.corner) {
|
|
212
|
+
const corner = oneOf(source.corner, CORNERS);
|
|
213
|
+
if (corner)
|
|
214
|
+
out.corner = corner;
|
|
215
|
+
}
|
|
216
|
+
if (def.visible && typeof source.visible === 'boolean')
|
|
217
|
+
out.visible = source.visible;
|
|
218
|
+
for (const state of ['hover', 'active', 'focus']) {
|
|
219
|
+
const tokens = sanitizeState(source[state], def);
|
|
220
|
+
if (tokens)
|
|
221
|
+
out[state] = tokens;
|
|
222
|
+
}
|
|
223
|
+
return Object.keys(out).length ? out : undefined;
|
|
224
|
+
}
|
|
225
|
+
/** The `components` group from JSON. Null when nothing valid is left (the theme sets no component). */
|
|
226
|
+
export function sanitizeComponents(value) {
|
|
227
|
+
const source = obj(value);
|
|
228
|
+
const out = {};
|
|
229
|
+
for (const id of COMPONENT_IDS) {
|
|
230
|
+
if (!Object.hasOwn(source, id))
|
|
231
|
+
continue;
|
|
232
|
+
const tokens = sanitizeComponentTokens(id, source[id]);
|
|
233
|
+
if (tokens)
|
|
234
|
+
out[id] = tokens;
|
|
235
|
+
}
|
|
236
|
+
return Object.keys(out).length ? out : null;
|
|
237
|
+
}
|
|
238
|
+
/** Every component with its preset and its parent's tokens folded in (own tokens win, then the preset, then the parent). */
|
|
239
|
+
export function resolveComponents(components) {
|
|
240
|
+
const expand = (id, tokens) => {
|
|
241
|
+
if (!tokens)
|
|
242
|
+
return {};
|
|
243
|
+
const def = COMPONENTS[id];
|
|
244
|
+
const preset = tokens.preset && def.presets ? PRESETS[def.presets][tokens.preset] : undefined;
|
|
245
|
+
const { preset: _name, ...own } = tokens;
|
|
246
|
+
return { ...preset, ...own };
|
|
247
|
+
};
|
|
248
|
+
const out = {};
|
|
249
|
+
for (const id of COMPONENT_IDS) {
|
|
250
|
+
const def = COMPONENTS[id];
|
|
251
|
+
const parent = def.parent;
|
|
252
|
+
const inherited = parent ? expand(parent, components[parent]) : {};
|
|
253
|
+
const merged = { ...inherited, ...expand(id, components[id]) };
|
|
254
|
+
if (Object.keys(merged).length)
|
|
255
|
+
out[id] = merged;
|
|
256
|
+
}
|
|
257
|
+
return out;
|
|
258
|
+
}
|
|
259
|
+
const rgba = (hex, alpha) => `rgba(${hexToRgb(hex).join(', ')}, ${alpha})`;
|
|
260
|
+
const dark = (hex) => relativeLuminance(hex) < 0.18;
|
|
261
|
+
/** The most readable of the theme's text-capable roles on `fill`. */
|
|
262
|
+
export function readableRole(fill, colors, preferred) {
|
|
263
|
+
const candidates = ['text', 'onAccent', 'onInverse', 'bg', 'inverse'];
|
|
264
|
+
if (preferred && !candidates.includes(preferred))
|
|
265
|
+
candidates.unshift(preferred);
|
|
266
|
+
return candidates.reduce((best, candidate) => contrastRatio(colors[candidate], fill) > contrastRatio(colors[best], fill) ? candidate : best, preferred ?? 'text');
|
|
267
|
+
}
|
|
268
|
+
function fillCss(fill, colors) {
|
|
269
|
+
if (fill === 'transparent')
|
|
270
|
+
return { decl: [['background-color', 'transparent'], ['background-image', 'none']], solid: null };
|
|
271
|
+
if (fill === 'glass')
|
|
272
|
+
return { decl: [['background-color', rgba(colors.surface, 0.72)], ['backdrop-filter', 'blur(14px) saturate(1.4)'], ['-webkit-backdrop-filter', 'blur(14px) saturate(1.4)']], solid: colors.surface };
|
|
273
|
+
if (typeof fill === 'string')
|
|
274
|
+
return { decl: [['background-color', colors[fill]], ['background-image', 'none']], solid: colors[fill] };
|
|
275
|
+
// A gradient is judged at its less readable end: the midpoint stands in for both when choosing a label.
|
|
276
|
+
return { decl: [['background-color', colors[fill.to]], ['background-image', `linear-gradient(${fill.angle}deg, ${colors[fill.from]}, ${colors[fill.to]})`]], solid: mix(colors[fill.from], colors[fill.to], 0.5) };
|
|
277
|
+
}
|
|
278
|
+
/** Raised and sunken edges after 98.css: two light and two dark inset lines, from the part's own fill. */
|
|
279
|
+
function bevel(out, face) {
|
|
280
|
+
const light = mix(face, '#ffffff', 0.85), soft = mix(face, '#ffffff', 0.35), shade = mix(face, '#000000', 0.35), deep = mix(face, '#000000', 0.9);
|
|
281
|
+
return out
|
|
282
|
+
? `inset -1px -1px ${deep}, inset 1px 1px ${light}, inset -2px -2px ${shade}, inset 2px 2px ${soft}`
|
|
283
|
+
: `inset -1px -1px ${light}, inset 1px 1px ${shade}, inset -2px -2px ${soft}, inset 2px 2px ${deep}`;
|
|
284
|
+
}
|
|
285
|
+
function shadowCss(name, colors) {
|
|
286
|
+
const base = dark(colors.bg);
|
|
287
|
+
switch (name) {
|
|
288
|
+
case 'soft': return base ? `0 1px 2px ${rgba('#000000', 0.4)}, 0 8px 24px ${rgba('#000000', 0.35)}` : `0 1px 2px ${rgba('#000000', 0.06)}, 0 8px 24px ${rgba('#000000', 0.1)}`;
|
|
289
|
+
case 'deep': return `0 0 0 1px ${rgba(colors.border, 0.6)}, 0 24px 64px ${rgba('#000000', base ? 0.6 : 0.28)}`;
|
|
290
|
+
case 'hard': return `4px 4px 0 ${colors.accent}`;
|
|
291
|
+
case 'inset': return `inset 1px 1px 3px ${rgba('#000000', base ? 0.6 : 0.25)}`;
|
|
292
|
+
case 'glow': return `0 0 0 1px ${rgba(colors.accent, 0.5)}, 0 0 18px ${rgba(colors.accent, 0.35)}`;
|
|
293
|
+
default: return 'none';
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const SHAPES = {
|
|
297
|
+
circle: [['border-radius', '50%']],
|
|
298
|
+
rounded: [['border-radius', '26%']],
|
|
299
|
+
square: [['border-radius', '2px']],
|
|
300
|
+
squircle: [['border-radius', '34%']],
|
|
301
|
+
hexagon: [['border-radius', '0'], ['clip-path', 'polygon(25% 4%, 75% 4%, 100% 50%, 75% 96%, 25% 96%, 0 50%)']],
|
|
302
|
+
octagon: [['border-radius', '0'], ['clip-path', 'polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%)']],
|
|
303
|
+
diamond: [['border-radius', '0'], ['clip-path', 'polygon(50% 0, 100% 50%, 50% 100%, 0 50%)']],
|
|
304
|
+
};
|
|
305
|
+
const CASE_CSS = {
|
|
306
|
+
none: [['text-transform', 'none'], ['font-variant-caps', 'normal']],
|
|
307
|
+
upper: [['text-transform', 'uppercase']],
|
|
308
|
+
lower: [['text-transform', 'lowercase']],
|
|
309
|
+
capitalize: [['text-transform', 'capitalize']],
|
|
310
|
+
'small-caps': [['text-transform', 'none'], ['font-variant-caps', 'all-small-caps']],
|
|
311
|
+
};
|
|
312
|
+
/** A part rule's selector: two `:root`s lift it over the site's atomic classes and inline styles' non-important values. */
|
|
313
|
+
export const partRule = (selector) => selector.split(/,(?![^(]*\))/).map(one => `:root:root ${one.trim()}`).join(',');
|
|
314
|
+
/**
|
|
315
|
+
* CSS for a theme's components over a site's part map. A component without a part, and a token the
|
|
316
|
+
* part skips, emits nothing. Text on a fill the theme chose is held to the component's contrast
|
|
317
|
+
* (the text role is swapped for the most readable one); sizes stay at or above a 24px target.
|
|
318
|
+
*/
|
|
319
|
+
export function compileComponents(components, parts, ctx) {
|
|
320
|
+
const values = [], rules = [], notes = [];
|
|
321
|
+
const resolved = resolveComponents(components);
|
|
322
|
+
for (const id of COMPONENT_IDS) {
|
|
323
|
+
const tokens = resolved[id], part = parts[id];
|
|
324
|
+
if (!tokens || !part)
|
|
325
|
+
continue;
|
|
326
|
+
const def = COMPONENTS[id];
|
|
327
|
+
const skip = new Set(part.skip ?? []);
|
|
328
|
+
const has = (key) => tokens[key] !== undefined && !skip.has(key);
|
|
329
|
+
const box = [], type = [], fillRule = [];
|
|
330
|
+
const put = (list, token, property, value) => {
|
|
331
|
+
const name = `--wb-part-${id}-${token}`;
|
|
332
|
+
if (!values.some(item => item.startsWith(`${name}:`)))
|
|
333
|
+
values.push(`${name}:${value}`);
|
|
334
|
+
list.push(`${property}:var(${name}) !important`);
|
|
335
|
+
};
|
|
336
|
+
// Fill first: the text role depends on it.
|
|
337
|
+
let face = null;
|
|
338
|
+
if (has('fill')) {
|
|
339
|
+
const { decl, solid } = fillCss(tokens.fill, ctx.colors);
|
|
340
|
+
face = solid;
|
|
341
|
+
decl.forEach(([property, value], index) => put(part.fill ? fillRule : box, `fill${index ? `-${index}` : ''}`, property, value));
|
|
342
|
+
}
|
|
343
|
+
let textRole = has('text') ? tokens.text : undefined;
|
|
344
|
+
if (face && (def.text || textRole)) {
|
|
345
|
+
const need = def.contrast ?? 4.5;
|
|
346
|
+
if (!textRole || contrastRatio(ctx.colors[textRole], face) < need) {
|
|
347
|
+
const readable = readableRole(face, ctx.colors, textRole);
|
|
348
|
+
if (textRole && readable !== textRole)
|
|
349
|
+
notes.push(`${id}: text "${textRole}" on its fill is under ${need}:1, using "${readable}"`);
|
|
350
|
+
textRole = readable;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
if (textRole)
|
|
354
|
+
put(type, 'text', 'color', ctx.colors[textRole]);
|
|
355
|
+
if (has('radius'))
|
|
356
|
+
put(box, 'radius', 'border-radius', tokens.radius === 'pill' ? '9999px' : `${tokens.radius}px`);
|
|
357
|
+
const style = has('borderStyle') ? tokens.borderStyle : undefined;
|
|
358
|
+
if (style === 'bevel-out' || style === 'bevel-in') {
|
|
359
|
+
const base = face ?? ctx.colors.surface;
|
|
360
|
+
put(box, 'border-style', 'border-style', 'none');
|
|
361
|
+
put(box, 'bevel', 'box-shadow', bevel(style === 'bevel-out', base));
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
if (style)
|
|
365
|
+
put(box, 'border-style', 'border-style', style);
|
|
366
|
+
if (has('borderWidth'))
|
|
367
|
+
put(box, 'border-width', 'border-width', `${tokens.borderWidth}px`);
|
|
368
|
+
// A width without a style would draw nothing: X's boxes are `border: 0 solid`.
|
|
369
|
+
if (has('borderWidth') && !style && tokens.borderWidth > 0)
|
|
370
|
+
put(box, 'border-style', 'border-style', 'solid');
|
|
371
|
+
if (has('shadow'))
|
|
372
|
+
put(box, 'shadow', 'box-shadow', shadowCss(tokens.shadow, ctx.colors));
|
|
373
|
+
}
|
|
374
|
+
if (has('borderColor'))
|
|
375
|
+
put(box, 'border-color', 'border-color', ctx.colors[tokens.borderColor]);
|
|
376
|
+
if (has('padX'))
|
|
377
|
+
put(box, 'pad-x', 'padding-inline', `${tokens.padX}px`);
|
|
378
|
+
if (has('padY'))
|
|
379
|
+
put(box, 'pad-y', 'padding-block', `${tokens.padY}px`);
|
|
380
|
+
if (has('gap'))
|
|
381
|
+
put(box, 'gap', 'gap', `${tokens.gap}px`);
|
|
382
|
+
if (has('height'))
|
|
383
|
+
put(box, 'height', 'min-height', `${Math.max(24, tokens.height)}px`);
|
|
384
|
+
if (has('width'))
|
|
385
|
+
put(box, 'width', 'width', `${tokens.width}px`);
|
|
386
|
+
if (has('size')) {
|
|
387
|
+
put(box, 'size', 'width', `${tokens.size}px`);
|
|
388
|
+
box.push(`height:var(--wb-part-${id}-size) !important`);
|
|
389
|
+
}
|
|
390
|
+
if (has('maxHeight'))
|
|
391
|
+
put(box, 'max-height', 'max-height', `${tokens.maxHeight}px`);
|
|
392
|
+
if (has('shape'))
|
|
393
|
+
SHAPES[tokens.shape].forEach(([property, value], index) => put(box, `shape${index ? `-${index}` : ''}`, property, value));
|
|
394
|
+
if (has('corner') && tokens.corner === 'cut')
|
|
395
|
+
put(box, 'corner', 'clip-path', 'polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 12px 100%, 0 calc(100% - 12px))');
|
|
396
|
+
if (has('visible') && tokens.visible === false)
|
|
397
|
+
put(box, 'display', 'display', 'none');
|
|
398
|
+
if (has('font'))
|
|
399
|
+
put(type, 'font', 'font-family', ctx.fonts[tokens.font]);
|
|
400
|
+
if (has('fontSize')) {
|
|
401
|
+
put(type, 'font-size', 'font-size', `${tokens.fontSize}px`);
|
|
402
|
+
put(type, 'line-height', 'line-height', String(tokens.leading ?? 1.3));
|
|
403
|
+
}
|
|
404
|
+
else if (has('leading'))
|
|
405
|
+
put(type, 'line-height', 'line-height', String(tokens.leading));
|
|
406
|
+
if (has('weight'))
|
|
407
|
+
put(type, 'weight', 'font-weight', String(tokens.weight));
|
|
408
|
+
if (has('case'))
|
|
409
|
+
CASE_CSS[tokens.case].forEach(([property, value], index) => put(type, `case${index ? `-${index}` : ''}`, property, value));
|
|
410
|
+
if (has('tracking'))
|
|
411
|
+
put(type, 'tracking', 'letter-spacing', `${tokens.tracking}em`);
|
|
412
|
+
const textSel = part.text ?? part.sel;
|
|
413
|
+
if (box.length)
|
|
414
|
+
rules.push(`${partRule(part.sel)}{${box.join(';')}}`);
|
|
415
|
+
if (fillRule.length)
|
|
416
|
+
rules.push(`${partRule(part.fill)}{${fillRule.join(';')}}`);
|
|
417
|
+
if (type.length)
|
|
418
|
+
rules.push(`${partRule(textSel)}{${type.join(';')}}`);
|
|
419
|
+
for (const state of ['hover', 'active', 'focus']) {
|
|
420
|
+
const tokensOf = tokens[state];
|
|
421
|
+
if (!tokensOf || skip.has(state))
|
|
422
|
+
continue;
|
|
423
|
+
const pseudo = state === 'focus' ? ':focus-visible' : `:${state}`;
|
|
424
|
+
const still = [], moving = [], label = [];
|
|
425
|
+
let stateFace = face;
|
|
426
|
+
if (tokensOf.fill !== undefined) {
|
|
427
|
+
const { decl, solid } = fillCss(tokensOf.fill, ctx.colors);
|
|
428
|
+
stateFace = solid ?? face;
|
|
429
|
+
for (const [property, value] of decl)
|
|
430
|
+
still.push(`${property}:${value} !important`);
|
|
431
|
+
}
|
|
432
|
+
let stateText = tokensOf.text;
|
|
433
|
+
if (stateFace && (stateText || tokensOf.fill !== undefined) && (def.text || stateText)) {
|
|
434
|
+
if (!stateText || contrastRatio(ctx.colors[stateText], stateFace) < (def.contrast ?? 4.5))
|
|
435
|
+
stateText = readableRole(stateFace, ctx.colors, stateText);
|
|
436
|
+
}
|
|
437
|
+
if (stateText)
|
|
438
|
+
label.push(`color:${ctx.colors[stateText]} !important`);
|
|
439
|
+
if (tokensOf.underline !== undefined)
|
|
440
|
+
label.push(`text-decoration:${tokensOf.underline ? 'underline' : 'none'} !important`);
|
|
441
|
+
if (tokensOf.borderColor)
|
|
442
|
+
still.push(`border-color:${ctx.colors[tokensOf.borderColor]} !important`);
|
|
443
|
+
if (tokensOf.shadow)
|
|
444
|
+
still.push(`box-shadow:${tokensOf.shadow === 'inset' && (style === 'bevel-out' || style === 'bevel-in') ? bevel(false, face ?? ctx.colors.surface) : shadowCss(tokensOf.shadow, ctx.colors)} !important`);
|
|
445
|
+
const transforms = [tokensOf.lift ? `translateY(-${tokensOf.lift}px)` : '', tokensOf.scale && tokensOf.scale !== 1 ? `scale(${tokensOf.scale})` : ''].filter(Boolean);
|
|
446
|
+
if (transforms.length)
|
|
447
|
+
moving.push(`transform:${transforms.join(' ')} !important`);
|
|
448
|
+
const stateSel = (selector) => selector.split(/,(?![^(]*\))/).map(one => `${one.trim()}${pseudo}`).join(',');
|
|
449
|
+
if (still.length)
|
|
450
|
+
rules.push(`${partRule(stateSel(part.sel))}{${still.join(';')}}`);
|
|
451
|
+
// The label of a hovered or pressed part: the box and the text leaves under it.
|
|
452
|
+
if (label.length)
|
|
453
|
+
rules.push(`${partRule(`${stateSel(part.sel)},${part.sel.split(/,(?![^(]*\))/).map(one => `${one.trim()}${pseudo} :is(span,div,a)`).join(',')}`)}{${label.join(';')}}`);
|
|
454
|
+
// Movement only for people who have not asked for less of it.
|
|
455
|
+
if (moving.length)
|
|
456
|
+
rules.push(`@media (prefers-reduced-motion:no-preference){${partRule(stateSel(part.sel))}{${moving.join(';')}}}`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return { values, rules, notes };
|
|
460
|
+
}
|
|
461
|
+
/** The `colors.actions` group: the colors of an on state (liked, reposted, bookmarked) and of the reply hover. */
|
|
462
|
+
export const ACTION_NAMES = ['reply', 'repost', 'like', 'bookmark'];
|
|
463
|
+
//# sourceMappingURL=themeComponents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themeComponents.js","sourceRoot":"","sources":["../../../runtime/src/themeComponents.ts"],"names":[],"mappings":"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","sourcesContent":["// Component tokens: the part of a theme that says how each piece of the site is built (a button's\n// radius and border, a post's padding and fill, the size and case of a handle), instead of one radius\n// and one density for everything. A theme names generic components (`post`, `buttonPrimary`,\n// `navItem`); the site adapter says which selectors they are (its part map). Pure.\n//\n// Safety is the same as the rest of a theme document: every token is a clamped number, a fixed word\n// or a color role name. No token carries CSS text, a selector or a color literal, so one contrast\n// pass over the palette covers every component, and the CSS is built from the vocabulary below.\n//\n// How it lands in the page: values are custom properties at zero specificity\n// (`:where(:root){--wb-part-post-radius:0px}`), rules are rigid (`:root:root <part>{border-radius:\n// var(--wb-part-post-radius) !important}`). An owner's Custom CSS or a plugin overrides a value by\n// setting the variable, for the whole page or for one subtree, without fighting `!important`.\n//\n// The bevel borders (`bevel-out`, `bevel-in`) follow 98.css's raised and sunken edges (MIT, Jordan\n// Scales, https://github.com/jdan/98.css): four inset shadows, here computed from the theme's roles.\n\nimport { contrastRatio, hexToRgb, mix, relativeLuminance, type FontRoleName } from './themeApi.ts';\n\n// ---------------------------------------------------------------------------------------------\n// Vocabulary\n\n/** Color roles a component may name. `onAccent` is the readable label on the accent. */\nexport const COLOR_ROLES = ['bg', 'surface', 'elevated', 'page', 'border', 'text', 'muted', 'accent', 'onAccent', 'inverse', 'onInverse'] as const;\nexport type ColorRole = typeof COLOR_ROLES[number];\nexport type RoleColors = Record<ColorRole, string>;\n\nexport const BORDER_STYLES = ['none', 'solid', 'dashed', 'dotted', 'double', 'bevel-out', 'bevel-in'] as const;\nexport const SHADOWS = ['none', 'soft', 'deep', 'hard', 'inset', 'glow'] as const;\nexport const CASES = ['none', 'upper', 'lower', 'capitalize', 'small-caps'] as const;\nexport const AVATAR_SHAPES = ['circle', 'rounded', 'square', 'squircle', 'hexagon', 'octagon', 'diamond'] as const;\nexport const CORNERS = ['round', 'cut'] as const;\nconst FONT_ROLES: readonly FontRoleName[] = ['interface', 'post', 'heading', 'numbers', 'mono', 'chrome', 'dialog'];\n\nexport type Gradient = { from: ColorRole; to: ColorRole; angle: number };\nexport type Fill = ColorRole | 'transparent' | 'glass' | Gradient;\nexport type StateTokens = { fill?: Fill; text?: ColorRole; borderColor?: ColorRole; shadow?: typeof SHADOWS[number]; lift?: number; scale?: number; underline?: boolean };\nexport type ComponentTokens = {\n preset?: string;\n radius?: number | 'pill';\n borderWidth?: number;\n borderStyle?: typeof BORDER_STYLES[number];\n borderColor?: ColorRole;\n fill?: Fill;\n text?: ColorRole;\n padX?: number;\n padY?: number;\n gap?: number;\n height?: number;\n width?: number;\n size?: number;\n maxHeight?: number;\n font?: FontRoleName;\n fontSize?: number;\n weight?: number;\n case?: typeof CASES[number];\n tracking?: number;\n leading?: number;\n shadow?: typeof SHADOWS[number];\n shape?: typeof AVATAR_SHAPES[number];\n corner?: typeof CORNERS[number];\n visible?: boolean;\n hover?: StateTokens;\n active?: StateTokens;\n focus?: StateTokens;\n};\n\ntype ComponentDef = {\n /** Tokens set on the parent apply to this component too. */\n parent?: string;\n /** A text part: type tokens land on its leaves. */\n text?: boolean;\n /** Size ranges in px (absent: the token is not accepted on this component). */\n height?: [number, number]; width?: [number, number]; size?: [number, number]; maxHeight?: [number, number]; fontSize?: [number, number];\n /** Tokens only some components take. */\n shape?: boolean; corner?: boolean; visible?: boolean;\n /** Glass fills (a blur) are allowed here; never on parts that repeat down a timeline. */\n glass?: boolean;\n /** Gradient fills are allowed here (bars and buttons). */\n gradient?: boolean;\n /** Presets of this component's family. */\n presets?: keyof typeof PRESETS;\n /** Contrast its text must reach on its own fill. */\n contrast?: number;\n};\n\nconst LABEL: [number, number] = [12, 20];\nconst SMALL: [number, number] = [11, 18];\n/** Every component a theme can name. Sites map them to selectors; a component a site does not have is ignored. */\nexport const COMPONENTS = {\n nav: { width: [56, 320], glass: true, gradient: true },\n navItem: { height: [36, 64], fontSize: LABEL, text: true },\n topBar: { height: [40, 64], glass: true, gradient: true, fontSize: LABEL },\n tabs: { presets: 'tabs', gradient: true },\n tab: { height: [32, 56], fontSize: LABEL, text: true, presets: 'tabs' },\n post: { corner: true, presets: 'post', contrast: 7 },\n avatar: { size: [20, 64], shape: true, visible: true },\n displayName: { text: true, fontSize: LABEL, visible: true },\n handle: { text: true, fontSize: SMALL, visible: true },\n postText: { text: true, fontSize: [13, 24], contrast: 7 },\n meta: { text: true, fontSize: SMALL },\n actionBar: {},\n action: { size: [28, 44] },\n count: { text: true, fontSize: SMALL, visible: true },\n media: { corner: true, maxHeight: [200, 700] },\n linkCard: { corner: true },\n quote: {},\n button: { height: [24, 56], fontSize: LABEL, text: true, gradient: true, presets: 'button' },\n buttonPrimary: { parent: 'button', height: [24, 56], fontSize: LABEL, text: true, gradient: true, presets: 'button' },\n buttonSecondary: { parent: 'button', height: [24, 56], fontSize: LABEL, text: true, gradient: true, presets: 'button' },\n buttonGhost: { parent: 'button', height: [24, 56], fontSize: LABEL, text: true, gradient: true, presets: 'button' },\n input: { height: [32, 56], fontSize: LABEL, text: true, presets: 'input' },\n search: { height: [32, 56], fontSize: LABEL, text: true, presets: 'input' },\n composer: { fontSize: [13, 24], text: true },\n /** The tool icons under a composer (media, poll, emoji); `text` is their color. */\n composerTool: { size: [28, 44] },\n panel: { glass: true, presets: 'panel' },\n menu: { parent: 'panel', glass: true, presets: 'panel' },\n dialog: { parent: 'panel', glass: true, presets: 'panel' },\n toast: { parent: 'panel', glass: true, presets: 'panel' },\n hoverCard: { parent: 'panel', glass: true, presets: 'panel' },\n sidebarCard: { parent: 'panel', glass: true, corner: true, presets: 'panel' },\n badge: { size: [14, 24], corner: true, fontSize: SMALL, text: true },\n pill: { fontSize: SMALL, text: true },\n divider: {},\n scrollbar: {},\n profileHeader: {},\n} as const satisfies Record<string, ComponentDef>;\nexport type ComponentId = keyof typeof COMPONENTS;\nexport const COMPONENT_IDS = Object.keys(COMPONENTS) as ComponentId[];\nexport type ThemeComponents = Partial<Record<ComponentId, ComponentTokens>>;\n\n/** Clamp ranges of the tokens every component shares (the JSON Schema says the same; tested). */\nexport const TOKEN_LIMITS = {\n radius: [0, 32], borderWidth: [0, 4], padX: [0, 32], padY: [0, 32], gap: [0, 24], weight: [100, 900],\n tracking: [-0.05, 0.2], leading: [1.1, 2], angle: [0, 360], lift: [0, 4], scale: [0.96, 1.04],\n} as const;\n\n/** Named token bundles per family; a theme's own tokens win over its preset's. Frozen once shipped. */\nexport const PRESETS = {\n button: {\n pill: { radius: 'pill', borderWidth: 0 },\n soft: { radius: 8, borderWidth: 0 },\n square: { radius: 0, borderWidth: 1, borderStyle: 'solid' },\n outline: { radius: 6, borderWidth: 1, borderStyle: 'solid', fill: 'transparent', text: 'text', borderColor: 'border' },\n bevel: { radius: 0, borderStyle: 'bevel-out', fill: 'surface', text: 'text', active: { shadow: 'inset' } },\n gloss: { radius: 'pill', borderWidth: 1, borderStyle: 'solid', shadow: 'soft' },\n 'flat-link': { radius: 0, borderWidth: 0, fill: 'transparent', text: 'accent', hover: { underline: true } },\n },\n post: {\n flat: { radius: 0, borderWidth: 0, fill: 'transparent', shadow: 'none' },\n card: { radius: 14, borderWidth: 1, borderStyle: 'solid', borderColor: 'border', fill: 'surface' },\n bubble: { radius: 20, borderWidth: 0, fill: 'surface' },\n window: { radius: 0, borderStyle: 'bevel-out', fill: 'surface' },\n ruled: { radius: 0, borderWidth: 0, fill: 'transparent' },\n },\n input: {\n pill: { radius: 'pill', borderWidth: 1, borderStyle: 'solid', borderColor: 'border' },\n underline: { radius: 0, borderWidth: 0, fill: 'transparent' },\n sunken: { radius: 0, borderStyle: 'bevel-in', fill: 'bg', text: 'text' },\n boxed: { radius: 4, borderWidth: 1, borderStyle: 'solid', borderColor: 'border', fill: 'bg' },\n },\n panel: {\n sheet: { radius: 12, borderWidth: 1, borderStyle: 'solid', borderColor: 'border', fill: 'surface', shadow: 'soft' },\n window: { radius: 0, borderStyle: 'bevel-out', fill: 'surface', shadow: 'none' },\n glass: { radius: 16, borderWidth: 1, borderStyle: 'solid', borderColor: 'border', fill: 'glass', shadow: 'soft' },\n },\n tabs: {\n underline: { radius: 0 },\n pills: { radius: 'pill' },\n folder: { radius: 6, borderWidth: 1, borderStyle: 'solid', borderColor: 'border' },\n blocks: { radius: 0, borderWidth: 1, borderStyle: 'solid', borderColor: 'border' },\n },\n} as const satisfies Record<string, Record<string, ComponentTokens>>;\n\n// ---------------------------------------------------------------------------------------------\n// Sanitizing\n\nconst obj = (value: unknown): Record<string, unknown> => value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};\nconst finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\nconst clamp = (value: number, [min, max]: readonly [number, number]) => Math.min(max, Math.max(min, value));\nconst oneOf = <T extends string>(value: unknown, options: readonly T[]): T | undefined => options.includes(value as T) ? value as T : undefined;\nconst role = (value: unknown) => oneOf(value, COLOR_ROLES);\n\nfunction sanitizeFill(value: unknown, def: ComponentDef): Fill | undefined {\n if (value === 'transparent') return 'transparent';\n if (value === 'glass') return def.glass ? 'glass' : undefined;\n const named = role(value);\n if (named) return named;\n const source = obj(value);\n const from = role(source.from), to = role(source.to);\n if (def.gradient && from && to) return { from, to, angle: Math.round(clamp(finite(source.angle) ? source.angle : 180, TOKEN_LIMITS.angle)) };\n return undefined;\n}\n\nfunction sanitizeState(value: unknown, def: ComponentDef): StateTokens | undefined {\n const source = obj(value);\n const out: StateTokens = {};\n const fill = sanitizeFill(source.fill, def); if (fill !== undefined) out.fill = fill;\n const text = role(source.text); if (text) out.text = text;\n const borderColor = role(source.borderColor); if (borderColor) out.borderColor = borderColor;\n const shadow = oneOf(source.shadow, SHADOWS); if (shadow) out.shadow = shadow;\n if (finite(source.lift)) out.lift = +clamp(source.lift, TOKEN_LIMITS.lift).toFixed(1);\n if (finite(source.scale)) out.scale = +clamp(source.scale, TOKEN_LIMITS.scale).toFixed(3);\n if (typeof source.underline === 'boolean') out.underline = source.underline;\n return Object.keys(out).length ? out : undefined;\n}\n\n/** One component's tokens from JSON: clamped, unknown names and tokens the component does not take dropped. */\nexport function sanitizeComponentTokens(id: ComponentId, value: unknown): ComponentTokens | undefined {\n const def: ComponentDef = COMPONENTS[id];\n const source = obj(value);\n const out: ComponentTokens = {};\n if (def.presets && typeof source.preset === 'string' && Object.hasOwn(PRESETS[def.presets], source.preset)) out.preset = source.preset;\n if (source.radius === 'pill') out.radius = 'pill';\n else if (finite(source.radius)) out.radius = Math.round(clamp(source.radius, TOKEN_LIMITS.radius));\n if (finite(source.borderWidth)) out.borderWidth = +clamp(source.borderWidth, TOKEN_LIMITS.borderWidth).toFixed(1);\n const borderStyle = oneOf(source.borderStyle, BORDER_STYLES); if (borderStyle) out.borderStyle = borderStyle;\n const borderColor = role(source.borderColor); if (borderColor) out.borderColor = borderColor;\n const fill = sanitizeFill(source.fill, def); if (fill !== undefined) out.fill = fill;\n const text = role(source.text); if (text) out.text = text;\n for (const key of ['padX', 'padY', 'gap'] as const) if (finite(source[key])) out[key] = Math.round(clamp(source[key] as number, TOKEN_LIMITS[key]));\n for (const key of ['height', 'width', 'size', 'maxHeight', 'fontSize'] as const) {\n const range = def[key];\n if (range && finite(source[key])) out[key] = Math.round(clamp(source[key] as number, range));\n }\n if (def.text || def.fontSize) {\n const font = oneOf(source.font, FONT_ROLES); if (font) out.font = font;\n if (finite(source.weight)) out.weight = Math.round(clamp(source.weight, TOKEN_LIMITS.weight) / 50) * 50;\n const textCase = oneOf(source.case, CASES); if (textCase && id !== 'postText') out.case = textCase;\n if (finite(source.tracking)) out.tracking = +clamp(source.tracking, TOKEN_LIMITS.tracking).toFixed(3);\n if (finite(source.leading)) out.leading = +clamp(source.leading, TOKEN_LIMITS.leading).toFixed(2);\n }\n const shadow = oneOf(source.shadow, SHADOWS); if (shadow) out.shadow = shadow;\n if (def.shape) { const shape = oneOf(source.shape, AVATAR_SHAPES); if (shape) out.shape = shape; }\n if (def.corner) { const corner = oneOf(source.corner, CORNERS); if (corner) out.corner = corner; }\n if (def.visible && typeof source.visible === 'boolean') out.visible = source.visible;\n for (const state of ['hover', 'active', 'focus'] as const) { const tokens = sanitizeState(source[state], def); if (tokens) out[state] = tokens; }\n return Object.keys(out).length ? out : undefined;\n}\n\n/** The `components` group from JSON. Null when nothing valid is left (the theme sets no component). */\nexport function sanitizeComponents(value: unknown): ThemeComponents | null {\n const source = obj(value);\n const out: ThemeComponents = {};\n for (const id of COMPONENT_IDS) {\n if (!Object.hasOwn(source, id)) continue;\n const tokens = sanitizeComponentTokens(id, source[id]);\n if (tokens) out[id] = tokens;\n }\n return Object.keys(out).length ? out : null;\n}\n\n/** Every component with its preset and its parent's tokens folded in (own tokens win, then the preset, then the parent). */\nexport function resolveComponents(components: ThemeComponents): ThemeComponents {\n const expand = (id: ComponentId, tokens: ComponentTokens | undefined): ComponentTokens => {\n if (!tokens) return {};\n const def: ComponentDef = COMPONENTS[id];\n const preset = tokens.preset && def.presets ? (PRESETS[def.presets] as Record<string, ComponentTokens>)[tokens.preset] : undefined;\n const { preset: _name, ...own } = tokens;\n return { ...preset, ...own };\n };\n const out: ThemeComponents = {};\n for (const id of COMPONENT_IDS) {\n const def: ComponentDef = COMPONENTS[id];\n const parent = def.parent as ComponentId | undefined;\n const inherited = parent ? expand(parent, components[parent]) : {};\n const merged = { ...inherited, ...expand(id, components[id]) };\n if (Object.keys(merged).length) out[id] = merged;\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Compiling\n\n/** A site's selectors for one component. */\nexport type PartDef = {\n /** The component's box. */\n sel: string;\n /** Its text leaves (sites often put type on leaf spans); defaults to the box. */\n text?: string;\n /** Where a fill is painted when it is not the box itself. */\n fill?: string;\n /** Tokens the site cannot honor on this part (left out of the CSS). */\n skip?: ReadonlyArray<keyof ComponentTokens>;\n};\nexport type PartMap = Partial<Record<ComponentId, PartDef>>;\n\nexport type ComponentContext = {\n /** Every role as `#rrggbb` (the theme's palette, legible). */\n colors: RoleColors;\n /** `font-family` per font role. */\n fonts: Record<FontRoleName, string>;\n};\n\nconst rgba = (hex: string, alpha: number) => `rgba(${hexToRgb(hex).join(', ')}, ${alpha})`;\nconst dark = (hex: string) => relativeLuminance(hex) < 0.18;\n\n/** The most readable of the theme's text-capable roles on `fill`. */\nexport function readableRole(fill: string, colors: RoleColors, preferred?: ColorRole): ColorRole {\n const candidates: ColorRole[] = ['text', 'onAccent', 'onInverse', 'bg', 'inverse'];\n if (preferred && !candidates.includes(preferred)) candidates.unshift(preferred);\n return candidates.reduce((best, candidate) => contrastRatio(colors[candidate], fill) > contrastRatio(colors[best], fill) ? candidate : best, preferred ?? 'text');\n}\n\nfunction fillCss(fill: Fill, colors: RoleColors): { decl: Array<[string, string]>; solid: string | null } {\n if (fill === 'transparent') return { decl: [['background-color', 'transparent'], ['background-image', 'none']], solid: null };\n if (fill === 'glass') return { decl: [['background-color', rgba(colors.surface, 0.72)], ['backdrop-filter', 'blur(14px) saturate(1.4)'], ['-webkit-backdrop-filter', 'blur(14px) saturate(1.4)']], solid: colors.surface };\n if (typeof fill === 'string') return { decl: [['background-color', colors[fill]], ['background-image', 'none']], solid: colors[fill] };\n // A gradient is judged at its less readable end: the midpoint stands in for both when choosing a label.\n return { decl: [['background-color', colors[fill.to]], ['background-image', `linear-gradient(${fill.angle}deg, ${colors[fill.from]}, ${colors[fill.to]})`]], solid: mix(colors[fill.from], colors[fill.to], 0.5) };\n}\n\n/** Raised and sunken edges after 98.css: two light and two dark inset lines, from the part's own fill. */\nfunction bevel(out: boolean, face: string): string {\n const light = mix(face, '#ffffff', 0.85), soft = mix(face, '#ffffff', 0.35), shade = mix(face, '#000000', 0.35), deep = mix(face, '#000000', 0.9);\n return out\n ? `inset -1px -1px ${deep}, inset 1px 1px ${light}, inset -2px -2px ${shade}, inset 2px 2px ${soft}`\n : `inset -1px -1px ${light}, inset 1px 1px ${shade}, inset -2px -2px ${soft}, inset 2px 2px ${deep}`;\n}\n\nfunction shadowCss(name: typeof SHADOWS[number], colors: RoleColors): string {\n const base = dark(colors.bg);\n switch (name) {\n case 'soft': return base ? `0 1px 2px ${rgba('#000000', 0.4)}, 0 8px 24px ${rgba('#000000', 0.35)}` : `0 1px 2px ${rgba('#000000', 0.06)}, 0 8px 24px ${rgba('#000000', 0.1)}`;\n case 'deep': return `0 0 0 1px ${rgba(colors.border, 0.6)}, 0 24px 64px ${rgba('#000000', base ? 0.6 : 0.28)}`;\n case 'hard': return `4px 4px 0 ${colors.accent}`;\n case 'inset': return `inset 1px 1px 3px ${rgba('#000000', base ? 0.6 : 0.25)}`;\n case 'glow': return `0 0 0 1px ${rgba(colors.accent, 0.5)}, 0 0 18px ${rgba(colors.accent, 0.35)}`;\n default: return 'none';\n }\n}\n\nconst SHAPES: Record<typeof AVATAR_SHAPES[number], Array<[string, string]>> = {\n circle: [['border-radius', '50%']],\n rounded: [['border-radius', '26%']],\n square: [['border-radius', '2px']],\n squircle: [['border-radius', '34%']],\n hexagon: [['border-radius', '0'], ['clip-path', 'polygon(25% 4%, 75% 4%, 100% 50%, 75% 96%, 25% 96%, 0 50%)']],\n octagon: [['border-radius', '0'], ['clip-path', 'polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%)']],\n diamond: [['border-radius', '0'], ['clip-path', 'polygon(50% 0, 100% 50%, 50% 100%, 0 50%)']],\n};\nconst CASE_CSS: Record<typeof CASES[number], Array<[string, string]>> = {\n none: [['text-transform', 'none'], ['font-variant-caps', 'normal']],\n upper: [['text-transform', 'uppercase']],\n lower: [['text-transform', 'lowercase']],\n capitalize: [['text-transform', 'capitalize']],\n 'small-caps': [['text-transform', 'none'], ['font-variant-caps', 'all-small-caps']],\n};\n\n/** A part rule's selector: two `:root`s lift it over the site's atomic classes and inline styles' non-important values. */\nexport const partRule = (selector: string) => selector.split(/,(?![^(]*\\))/).map(one => `:root:root ${one.trim()}`).join(',');\n\nexport type CompiledComponents = {\n /** `--wb-part-*` declarations (for `:where(:root)`). */\n values: string[];\n /** Rules that read them. */\n rules: string[];\n /** What the contrast pass changed, for import notes and the builder's report. */\n notes: string[];\n};\n\n/**\n * CSS for a theme's components over a site's part map. A component without a part, and a token the\n * part skips, emits nothing. Text on a fill the theme chose is held to the component's contrast\n * (the text role is swapped for the most readable one); sizes stay at or above a 24px target.\n */\nexport function compileComponents(components: ThemeComponents, parts: PartMap, ctx: ComponentContext): CompiledComponents {\n const values: string[] = [], rules: string[] = [], notes: string[] = [];\n const resolved = resolveComponents(components);\n for (const id of COMPONENT_IDS) {\n const tokens = resolved[id], part = parts[id];\n if (!tokens || !part) continue;\n const def: ComponentDef = COMPONENTS[id];\n const skip = new Set<string>(part.skip ?? []);\n const has = <K extends keyof ComponentTokens>(key: K): boolean => tokens[key] !== undefined && !skip.has(key);\n const box: string[] = [], type: string[] = [], fillRule: string[] = [];\n const put = (list: string[], token: string, property: string, value: string) => {\n const name = `--wb-part-${id}-${token}`;\n if (!values.some(item => item.startsWith(`${name}:`))) values.push(`${name}:${value}`);\n list.push(`${property}:var(${name}) !important`);\n };\n\n // Fill first: the text role depends on it.\n let face: string | null = null;\n if (has('fill')) {\n const { decl, solid } = fillCss(tokens.fill!, ctx.colors);\n face = solid;\n decl.forEach(([property, value], index) => put(part.fill ? fillRule : box, `fill${index ? `-${index}` : ''}`, property, value));\n }\n let textRole = has('text') ? tokens.text! : undefined;\n if (face && (def.text || textRole)) {\n const need = def.contrast ?? 4.5;\n if (!textRole || contrastRatio(ctx.colors[textRole], face) < need) {\n const readable = readableRole(face, ctx.colors, textRole);\n if (textRole && readable !== textRole) notes.push(`${id}: text \"${textRole}\" on its fill is under ${need}:1, using \"${readable}\"`);\n textRole = readable;\n }\n }\n if (textRole) put(type, 'text', 'color', ctx.colors[textRole]);\n\n if (has('radius')) put(box, 'radius', 'border-radius', tokens.radius === 'pill' ? '9999px' : `${tokens.radius}px`);\n const style = has('borderStyle') ? tokens.borderStyle! : undefined;\n if (style === 'bevel-out' || style === 'bevel-in') {\n const base = face ?? ctx.colors.surface;\n put(box, 'border-style', 'border-style', 'none');\n put(box, 'bevel', 'box-shadow', bevel(style === 'bevel-out', base));\n } else {\n if (style) put(box, 'border-style', 'border-style', style);\n if (has('borderWidth')) put(box, 'border-width', 'border-width', `${tokens.borderWidth}px`);\n // A width without a style would draw nothing: X's boxes are `border: 0 solid`.\n if (has('borderWidth') && !style && tokens.borderWidth! > 0) put(box, 'border-style', 'border-style', 'solid');\n if (has('shadow')) put(box, 'shadow', 'box-shadow', shadowCss(tokens.shadow!, ctx.colors));\n }\n if (has('borderColor')) put(box, 'border-color', 'border-color', ctx.colors[tokens.borderColor!]);\n if (has('padX')) put(box, 'pad-x', 'padding-inline', `${tokens.padX}px`);\n if (has('padY')) put(box, 'pad-y', 'padding-block', `${tokens.padY}px`);\n if (has('gap')) put(box, 'gap', 'gap', `${tokens.gap}px`);\n if (has('height')) put(box, 'height', 'min-height', `${Math.max(24, tokens.height!)}px`);\n if (has('width')) put(box, 'width', 'width', `${tokens.width}px`);\n if (has('size')) { put(box, 'size', 'width', `${tokens.size}px`); box.push(`height:var(--wb-part-${id}-size) !important`); }\n if (has('maxHeight')) put(box, 'max-height', 'max-height', `${tokens.maxHeight}px`);\n if (has('shape')) SHAPES[tokens.shape!].forEach(([property, value], index) => put(box, `shape${index ? `-${index}` : ''}`, property, value));\n if (has('corner') && tokens.corner === 'cut') put(box, 'corner', 'clip-path', 'polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 12px 100%, 0 calc(100% - 12px))');\n if (has('visible') && tokens.visible === false) put(box, 'display', 'display', 'none');\n\n if (has('font')) put(type, 'font', 'font-family', ctx.fonts[tokens.font!]);\n if (has('fontSize')) {\n put(type, 'font-size', 'font-size', `${tokens.fontSize}px`);\n put(type, 'line-height', 'line-height', String(tokens.leading ?? 1.3));\n } else if (has('leading')) put(type, 'line-height', 'line-height', String(tokens.leading));\n if (has('weight')) put(type, 'weight', 'font-weight', String(tokens.weight));\n if (has('case')) CASE_CSS[tokens.case!].forEach(([property, value], index) => put(type, `case${index ? `-${index}` : ''}`, property, value));\n if (has('tracking')) put(type, 'tracking', 'letter-spacing', `${tokens.tracking}em`);\n\n const textSel = part.text ?? part.sel;\n if (box.length) rules.push(`${partRule(part.sel)}{${box.join(';')}}`);\n if (fillRule.length) rules.push(`${partRule(part.fill!)}{${fillRule.join(';')}}`);\n if (type.length) rules.push(`${partRule(textSel)}{${type.join(';')}}`);\n\n for (const state of ['hover', 'active', 'focus'] as const) {\n const tokensOf = tokens[state];\n if (!tokensOf || skip.has(state)) continue;\n const pseudo = state === 'focus' ? ':focus-visible' : `:${state}`;\n const still: string[] = [], moving: string[] = [], label: string[] = [];\n let stateFace = face;\n if (tokensOf.fill !== undefined) { const { decl, solid } = fillCss(tokensOf.fill, ctx.colors); stateFace = solid ?? face; for (const [property, value] of decl) still.push(`${property}:${value} !important`); }\n let stateText = tokensOf.text;\n if (stateFace && (stateText || tokensOf.fill !== undefined) && (def.text || stateText)) {\n if (!stateText || contrastRatio(ctx.colors[stateText], stateFace) < (def.contrast ?? 4.5)) stateText = readableRole(stateFace, ctx.colors, stateText);\n }\n if (stateText) label.push(`color:${ctx.colors[stateText]} !important`);\n if (tokensOf.underline !== undefined) label.push(`text-decoration:${tokensOf.underline ? 'underline' : 'none'} !important`);\n if (tokensOf.borderColor) still.push(`border-color:${ctx.colors[tokensOf.borderColor]} !important`);\n if (tokensOf.shadow) still.push(`box-shadow:${tokensOf.shadow === 'inset' && (style === 'bevel-out' || style === 'bevel-in') ? bevel(false, face ?? ctx.colors.surface) : shadowCss(tokensOf.shadow, ctx.colors)} !important`);\n const transforms = [tokensOf.lift ? `translateY(-${tokensOf.lift}px)` : '', tokensOf.scale && tokensOf.scale !== 1 ? `scale(${tokensOf.scale})` : ''].filter(Boolean);\n if (transforms.length) moving.push(`transform:${transforms.join(' ')} !important`);\n const stateSel = (selector: string) => selector.split(/,(?![^(]*\\))/).map(one => `${one.trim()}${pseudo}`).join(',');\n if (still.length) rules.push(`${partRule(stateSel(part.sel))}{${still.join(';')}}`);\n // The label of a hovered or pressed part: the box and the text leaves under it.\n if (label.length) rules.push(`${partRule(`${stateSel(part.sel)},${part.sel.split(/,(?![^(]*\\))/).map(one => `${one.trim()}${pseudo} :is(span,div,a)`).join(',')}`)}{${label.join(';')}}`);\n // Movement only for people who have not asked for less of it.\n if (moving.length) rules.push(`@media (prefers-reduced-motion:no-preference){${partRule(stateSel(part.sel))}{${moving.join(';')}}}`);\n }\n }\n return { values, rules, notes };\n}\n\n/** The `colors.actions` group: the colors of an on state (liked, reposted, bookmarked) and of the reply hover. */\nexport const ACTION_NAMES = ['reply', 'repost', 'like', 'bookmark'] as const;\nexport type ActionColors = Partial<Record<typeof ACTION_NAMES[number], string>>;\n"]}
|