waybetter 0.6.0 → 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.
Files changed (190) hide show
  1. package/README.md +1 -2
  2. package/bin/waybetter.mjs +2 -5
  3. package/cli/buildenv.mjs +1 -1
  4. package/cli/release.mjs +11 -18
  5. package/cli/releasecheck.mjs +15 -0
  6. package/cli/remote.mjs +4 -4
  7. package/cli/store.mjs +80 -28
  8. package/cli/strings.mjs +2 -0
  9. package/dist/runtime/stringPackHook.js +2 -2
  10. package/dist/runtime/stringPackHook.js.map +1 -1
  11. package/dist/runtime/stringPackTranslate.d.ts +3 -1
  12. package/dist/runtime/stringPackTranslate.js +6 -3
  13. package/dist/runtime/stringPackTranslate.js.map +1 -1
  14. package/dist/runtime/stringPacks.d.ts +53 -5
  15. package/dist/runtime/stringPacks.js +161 -25
  16. package/dist/runtime/stringPacks.js.map +1 -1
  17. package/dist/runtime/themeBar.d.ts +28 -0
  18. package/dist/runtime/themeBar.js +82 -0
  19. package/dist/runtime/themeBar.js.map +1 -0
  20. package/dist/runtime/themeComponents.js +16 -3
  21. package/dist/runtime/themeComponents.js.map +1 -1
  22. package/dist/runtime/themeDecor.js +3 -1
  23. package/dist/runtime/themeDecor.js.map +1 -1
  24. package/dist/runtime/themeDerive.d.ts +69 -0
  25. package/dist/runtime/themeDerive.js +117 -0
  26. package/dist/runtime/themeDerive.js.map +1 -0
  27. package/dist/runtime/themeDoctor.d.ts +44 -3
  28. package/dist/runtime/themeDoctor.js +86 -25
  29. package/dist/runtime/themeDoctor.js.map +1 -1
  30. package/dist/runtime/themeGuards.d.ts +60 -0
  31. package/dist/runtime/themeGuards.js +235 -0
  32. package/dist/runtime/themeGuards.js.map +1 -0
  33. package/dist/runtime/themeIcons.d.ts +1 -1
  34. package/dist/runtime/themeIcons.js +13 -5
  35. package/dist/runtime/themeIcons.js.map +1 -1
  36. package/dist/runtime/themeInk.d.ts +37 -0
  37. package/dist/runtime/themeInk.js +111 -0
  38. package/dist/runtime/themeInk.js.map +1 -0
  39. package/dist/runtime/themeInvariants.d.ts +39 -0
  40. package/dist/runtime/themeInvariants.js +273 -0
  41. package/dist/runtime/themeInvariants.js.map +1 -0
  42. package/dist/runtime/themeRuntime.d.ts +15 -1
  43. package/dist/runtime/themeRuntime.js +78 -5
  44. package/dist/runtime/themeRuntime.js.map +1 -1
  45. package/dist/runtime/themeSpec.d.ts +5 -1
  46. package/dist/runtime/themeSpec.js +9 -13
  47. package/dist/runtime/themeSpec.js.map +1 -1
  48. package/dist/shell/InstallDialog.js +14 -8
  49. package/dist/shell/InstallDialog.js.map +1 -1
  50. package/dist/shell/StoreView.d.ts +12 -0
  51. package/dist/shell/StoreView.js +9 -4
  52. package/dist/shell/StoreView.js.map +1 -1
  53. package/dist/shell/frame/AppMenu.d.ts +26 -3
  54. package/dist/shell/frame/AppMenu.js +106 -27
  55. package/dist/shell/frame/AppMenu.js.map +1 -1
  56. package/dist/shell/frame/FindBar.js +1 -1
  57. package/dist/shell/frame/FindBar.js.map +1 -1
  58. package/dist/shell/frame/Shell.d.ts +1 -0
  59. package/dist/shell/frame/Shell.js +10 -2
  60. package/dist/shell/frame/Shell.js.map +1 -1
  61. package/dist/shell/frame/Titlebar.d.ts +2 -1
  62. package/dist/shell/frame/Titlebar.js +5 -3
  63. package/dist/shell/frame/Titlebar.js.map +1 -1
  64. package/dist/shell/frame/WebPanel.js +4 -1
  65. package/dist/shell/frame/WebPanel.js.map +1 -1
  66. package/dist/shell/frame/accountSwitcher.css +10 -10
  67. package/dist/shell/frame/appMenu.css +19 -13
  68. package/dist/shell/frame/boot.js +2 -0
  69. package/dist/shell/frame/boot.js.map +1 -1
  70. package/dist/shell/frame/chromeTheme.d.ts +19 -1
  71. package/dist/shell/frame/chromeTheme.js +51 -14
  72. package/dist/shell/frame/chromeTheme.js.map +1 -1
  73. package/dist/shell/frame/deck.css +30 -30
  74. package/dist/shell/frame/edges.css +159 -0
  75. package/dist/shell/frame/index.d.ts +2 -2
  76. package/dist/shell/frame/index.js +1 -1
  77. package/dist/shell/frame/index.js.map +1 -1
  78. package/dist/shell/frame/mediaModel.d.ts +13 -0
  79. package/dist/shell/frame/mediaModel.js +14 -0
  80. package/dist/shell/frame/mediaModel.js.map +1 -1
  81. package/dist/shell/frame/menuMessages.en.json +43 -1
  82. package/dist/shell/frame/menuModel.d.ts +42 -0
  83. package/dist/shell/frame/menuModel.js +8 -0
  84. package/dist/shell/frame/menuModel.js.map +1 -1
  85. package/dist/shell/frame/nativeMenu.d.ts +5 -0
  86. package/dist/shell/frame/nativeMenu.js +178 -0
  87. package/dist/shell/frame/nativeMenu.js.map +1 -0
  88. package/dist/shell/frame/nativeMenuModel.d.ts +102 -0
  89. package/dist/shell/frame/nativeMenuModel.js +186 -0
  90. package/dist/shell/frame/nativeMenuModel.js.map +1 -0
  91. package/dist/shell/frame/paletteModel.js +3 -1
  92. package/dist/shell/frame/paletteModel.js.map +1 -1
  93. package/dist/shell/frame/paneTheme.css +1 -1
  94. package/dist/shell/frame/reportModel.d.ts +1 -1
  95. package/dist/shell/frame/reportModel.js +1 -1
  96. package/dist/shell/frame/reportModel.js.map +1 -1
  97. package/dist/shell/frame/shell.css +56 -51
  98. package/dist/shell/frame/state.d.ts +2 -0
  99. package/dist/shell/frame/state.js +3 -1
  100. package/dist/shell/frame/state.js.map +1 -1
  101. package/dist/shell/frame/themeStore.js +21 -6
  102. package/dist/shell/frame/themeStore.js.map +1 -1
  103. package/dist/shell/frame/workspaces.css +12 -12
  104. package/dist/shell/installController.d.ts +16 -1
  105. package/dist/shell/installController.js +31 -5
  106. package/dist/shell/installController.js.map +1 -1
  107. package/dist/shell/panel/Appearance.js +12 -3
  108. package/dist/shell/panel/Appearance.js.map +1 -1
  109. package/dist/shell/panel/Settings.d.ts +1 -1
  110. package/dist/shell/panel/Settings.js +4 -3
  111. package/dist/shell/panel/Settings.js.map +1 -1
  112. package/dist/shell/panel/StoreSection.d.ts +2 -1
  113. package/dist/shell/panel/StoreSection.js +31 -1
  114. package/dist/shell/panel/StoreSection.js.map +1 -1
  115. package/dist/shell/panel/StringPacks.d.ts +12 -3
  116. package/dist/shell/panel/StringPacks.js +33 -8
  117. package/dist/shell/panel/StringPacks.js.map +1 -1
  118. package/dist/shell/panel/backup.css +1 -1
  119. package/dist/shell/panel/builder.css +48 -40
  120. package/dist/shell/panel/make.css +8 -7
  121. package/dist/shell/panel/panel.css +401 -401
  122. package/dist/shell/panel/panelMessages.d.ts +41 -1
  123. package/dist/shell/panel/panelMessages.js +13 -1
  124. package/dist/shell/panel/panelMessages.js.map +1 -1
  125. package/dist/shell/panel/plugins.css +5 -5
  126. package/dist/shell/panel/strings.css +1 -1
  127. package/dist/shell/store.css +34 -14
  128. package/dist/shell/storeMessages.d.ts +24 -0
  129. package/dist/shell/storeMessages.js +24 -0
  130. package/dist/shell/storeMessages.js.map +1 -1
  131. package/dist/shell/storeModel.d.ts +31 -7
  132. package/dist/shell/storeModel.js +15 -2
  133. package/dist/shell/storeModel.js.map +1 -1
  134. package/dist/shell/stringPacksModel.js +7 -2
  135. package/dist/shell/stringPacksModel.js.map +1 -1
  136. package/icons.schema.json +9 -0
  137. package/locales/ar.json +109 -2
  138. package/locales/bg.json +109 -2
  139. package/locales/bn.json +109 -2
  140. package/locales/ca.json +109 -2
  141. package/locales/cs.json +109 -2
  142. package/locales/da.json +109 -2
  143. package/locales/de.json +109 -2
  144. package/locales/el.json +109 -2
  145. package/locales/en.json +108 -2
  146. package/locales/es.json +109 -2
  147. package/locales/eu.json +109 -2
  148. package/locales/fa.json +109 -2
  149. package/locales/fi.json +109 -2
  150. package/locales/fil.json +109 -2
  151. package/locales/fr.json +109 -2
  152. package/locales/ga.json +109 -2
  153. package/locales/gl.json +109 -2
  154. package/locales/gu.json +109 -2
  155. package/locales/ha.json +109 -2
  156. package/locales/he.json +109 -2
  157. package/locales/hi.json +109 -2
  158. package/locales/hr.json +109 -2
  159. package/locales/hu.json +110 -2
  160. package/locales/id.json +109 -2
  161. package/locales/ig.json +109 -2
  162. package/locales/it.json +109 -2
  163. package/locales/ja.json +109 -2
  164. package/locales/kn.json +109 -2
  165. package/locales/ko.json +109 -2
  166. package/locales/mr.json +109 -2
  167. package/locales/ms.json +109 -2
  168. package/locales/nb.json +109 -2
  169. package/locales/nl.json +109 -2
  170. package/locales/pl.json +109 -2
  171. package/locales/pt.json +109 -2
  172. package/locales/ro.json +109 -2
  173. package/locales/ru.json +109 -2
  174. package/locales/sk.json +109 -2
  175. package/locales/sr.json +109 -2
  176. package/locales/sv.json +109 -2
  177. package/locales/ta.json +109 -2
  178. package/locales/th.json +109 -2
  179. package/locales/tr.json +109 -2
  180. package/locales/uk.json +109 -2
  181. package/locales/ur.json +109 -2
  182. package/locales/vi.json +109 -2
  183. package/locales/yo.json +109 -2
  184. package/locales/zh-Hans.json +109 -2
  185. package/locales/zh-Hant.json +109 -2
  186. package/package.json +2 -3
  187. package/store-catalog.schema.json +18 -5
  188. package/theme.schema.json +9 -0
  189. package/windows/installer.nsi +22 -2
  190. package/cli/privacy.mjs +0 -768
@@ -998,7 +998,7 @@
998
998
  "wb.settings.media.folderRemoved": "已移除資料夾。",
999
999
  "wb.settings.media.folders": "圖庫資料夾",
1000
1000
  "wb.settings.media.foldersHint": "顯示這些資料夾中最新的圖片。只會讀取資料夾內直接存放的檔案。",
1001
- "wb.settings.media.hint": "{site} 旁邊的媒體面板(Ctrl+Shift+G)。",
1001
+ "wb.settings.media.hint": "{site} 旁邊的媒體面板({shortcut})。",
1002
1002
  "wb.settings.media.keep": "保留的項目數",
1003
1003
  "wb.settings.media.keepHint": "較舊的項目會從尾端移除。",
1004
1004
  "wb.settings.media.noFolders": "還沒有資料夾。新增一個,即可在媒體面板中看到其中的圖片。",
@@ -1243,6 +1243,46 @@
1243
1243
  "wb.appearance.icons.remove": "移除 {name}",
1244
1244
  "wb.appearance.icons.removed": "已移除圖示包「{name}」。",
1245
1245
  "wb.appearance.icons.imported": "已匯入的圖示包",
1246
+ "wb.doctor.title": "主題醫生",
1247
+ "wb.doctor.hint": "關於此主題的建議:用更輕量的方式達到相同效果、成本與對比度。它只提供建議,不會封鎖或更改任何內容。",
1248
+ "wb.doctor.empty": "沒有需要回報的項目:此主題使用了 token 與元件設定,也沒有任何高成本的內容。",
1249
+ "wb.doctor.count": "{count, plural, other {# 項發現}}",
1250
+ "wb.doctor.kind.lighter": "更輕量的做法",
1251
+ "wb.doctor.kind.performance": "效能",
1252
+ "wb.doctor.kind.accessibility": "無障礙",
1253
+ "wb.doctor.kind.contrast": "對比度",
1254
+ "wb.doctor.where": "位置",
1255
+ "wb.doctor.fix": "修正",
1256
+ "wb.doctor.css-radius.found": "此規則以 CSS 設定圓角半徑。",
1257
+ "wb.doctor.css-radius.fix": "請用 components 下某個部件的 radius 來設定,或用 shape.radius 一次套用到全部:不需要 CSS,網站更改類別名稱後也能繼續運作。",
1258
+ "wb.doctor.css-bevel.found": "此規則以多層內陰影繪製斜角邊緣。",
1259
+ "wb.doctor.css-bevel.fix": "請在 components 下的部件使用 borderStyle \"bevel-out\" 或 \"bevel-in\":它會依主題的顏色繪製斜角。",
1260
+ "wb.doctor.css-hide.found": "此規則用 display: none 隱藏了某些內容。",
1261
+ "wb.doctor.css-hide.fix": "請在 components 下的部件(頭像、數量、名稱)使用 visible,或使用 sidebar: hidden 這類版面變體;擁有者之後可以再把它開啟。",
1262
+ "wb.doctor.css-color.found": "此規則使用了寫死的顏色。",
1263
+ "wb.doctor.css-color.fix": "請在 colors 或元件中指定一個角色(text、muted、accent、surface…),讓對比度檢查涵蓋到它。",
1264
+ "wb.doctor.css-font.found": "此規則設定了字型家族。",
1265
+ "wb.doctor.css-font.fix": "請使用 font.roles:它不需要 CSS 就能設定貼文、標題、數字與等寬字型。",
1266
+ "wb.doctor.css-has.found": "此規則使用了 :has(),頁面每次變動都會重新比對。",
1267
+ "wb.doctor.css-has.fix": "請避免在時間軸中重複出現的規則裡使用 :has(),或將規則錨定在某個部件上。",
1268
+ "wb.doctor.css-universal.found": "此規則使用了萬用選擇器 (*),會與每個元素進行比對。",
1269
+ "wb.doctor.css-universal.fix": "請改為將規則錨定在某個部件上。",
1270
+ "wb.doctor.css-blur.found": "此規則會模糊後方內容 (backdrop-filter),在重複出現的部件上成本很高。",
1271
+ "wb.doctor.css-blur.fix": "請使用列與面板的玻璃填色:那裡是成本較低的模糊位置。",
1272
+ "wb.doctor.css-outline-none.found": "此規則移除了焦點外框,使鍵盤焦點不再可見。",
1273
+ "wb.doctor.css-outline-none.fix": "請改用 decor.focusRing 繪製清楚可見的焦點環。",
1274
+ "wb.doctor.css-motion.found": "此規則在未檢查「減少動態效果」設定的情況下執行動畫。",
1275
+ "wb.doctor.css-motion.fix": "請將動態效果放在 @media (prefers-reduced-motion: no-preference) 內,或交給 decor.motion 處理。",
1276
+ "wb.doctor.css-size.found": "CSS 超過 20,000 個字元。",
1277
+ "wb.doctor.css-size.fix": "網站會針對每條規則重新計算樣式;token 與元件設定編譯後的規則較少。",
1278
+ "wb.doctor.contrast.found": "{token} 顏色已經過調整以維持可讀性(與背景的對比為 {ratio}:1)。",
1279
+ "wb.doctor.contrast.fix": "請選擇較亮或較暗的 {token} 顏色;在此之前,主題會以調整後的顏色顯示。",
1280
+ "wb.doctor.glass-post.found": "貼文已設定玻璃效果,但不會繪製:對時間軸上每則貼文都做模糊,成本太高。",
1281
+ "wb.doctor.glass-post.fix": "貼文請使用純色或帶色調的填色,並把玻璃效果留給列與面板。",
1282
+ "wb.doctor.small-post-text.found": "貼文文字為 {size}px,對許多人來說難以閱讀。",
1283
+ "wb.doctor.small-post-text.fix": "貼文文字大小請使用 14px 以上,或調大整個主題的文字大小。",
1284
+ "wb.doctor.nav-moved.found": "導覽列已移到{position},這會改變人們尋找它的位置。",
1285
+ "wb.doctor.nav-moved.fix": "這只會套用在寬窗格,且擁有者可以關閉版面變更。除非版面需要,否則請保留預設位置。",
1246
1286
  "wb.setup.title": "分享我的設定",
1247
1287
  "wb.setup.hint": "你的主題、圖示、模式以及開啟了哪些功能,做成一個連結或一個小檔案。任何人都能用它從你的設定開始。",
1248
1288
  "wb.setup.shareLabel": "你的設定",
@@ -1275,6 +1315,73 @@
1275
1315
  "wb.setup.err.size": "內容過大,不像是設定。",
1276
1316
  "wb.strings.translate": "翻譯模式",
1277
1317
  "wb.strings.translateHint": "每個 {site} 分頁都會顯示一列:點一下某個字即可修改。你的修改在重新載入後於該分頁生效,「複製字串包檔案」會給你一個可分享的字串包。開啟時,文字會帶有看不見的標記。",
1278
- "wb.menu.strings": "語言"
1318
+ "wb.menu.strings": "語言",
1319
+ "wb.menu.barFile": "檔案",
1320
+ "wb.menu.barEdit": "編輯",
1321
+ "wb.menu.barView": "顯示方式",
1322
+ "wb.menu.barAccount": "帳號",
1323
+ "wb.menu.barPlugins": "外掛程式",
1324
+ "wb.menu.barWindow": "視窗",
1325
+ "wb.menu.barHelp": "輔助說明",
1326
+ "wb.menu.appHide": "隱藏{product}",
1327
+ "wb.menu.appHideOthers": "隱藏其他",
1328
+ "wb.menu.appShowAll": "全部顯示",
1329
+ "wb.menu.appQuit": "結束{product}",
1330
+ "wb.menu.appServices": "服務",
1331
+ "wb.menu.appUpdates": "檢查更新…",
1332
+ "wb.menu.appSettings": "設定…",
1333
+ "wb.menu.appSafe": "安全模式",
1334
+ "wb.menu.fileClose": "關閉分頁",
1335
+ "wb.menu.fileInstall": "從檔案安裝…",
1336
+ "wb.menu.fileShare": "分享我的設定…",
1337
+ "wb.menu.editUndo": "還原",
1338
+ "wb.menu.editRedo": "重做",
1339
+ "wb.menu.editCut": "剪下",
1340
+ "wb.menu.editCopy": "拷貝",
1341
+ "wb.menu.editPaste": "貼上",
1342
+ "wb.menu.editSelectAll": "全選",
1343
+ "wb.menu.editFind": "尋找…",
1344
+ "wb.menu.editFindNext": "尋找下一個",
1345
+ "wb.menu.editFindPrevious": "尋找上一個",
1346
+ "wb.menu.viewZoomIn": "放大",
1347
+ "wb.menu.viewZoomOut": "縮小",
1348
+ "wb.menu.viewActual": "實際大小",
1349
+ "wb.menu.viewIconPack": "圖示包",
1350
+ "wb.menu.viewDeck": "看板",
1351
+ "wb.menu.viewFullScreen": "進入全螢幕",
1352
+ "wb.menu.acctNone": "尚無帳號",
1353
+ "wb.menu.acctAdd": "加入帳號…",
1354
+ "wb.menu.plugStore": "商店…",
1355
+ "wb.menu.plugFolder": "打開外掛程式檔案夾…",
1356
+ "wb.menu.winMinimize": "最小化",
1357
+ "wb.menu.winZoom": "縮放",
1358
+ "wb.menu.winWorkspaces": "工作區",
1359
+ "wb.menu.helpDocs": "說明文件",
1360
+ "wb.menu.helpReport": "回報問題…",
1361
+ "wb.store.category.icons": "圖示",
1362
+ "wb.appearance.doctorHints": "{count, plural, other {主題醫生有 # 則提示,第一則:}} {hint}",
1363
+ "wb.install.eyebrow.icons.install": "安裝圖示包",
1364
+ "wb.install.eyebrow.icons.update": "更新圖示包",
1365
+ "wb.install.eyebrow.icons.reinstall": "重新安裝圖示包",
1366
+ "wb.install.err.icons": "無法安裝此圖示包",
1367
+ "wb.install.err.iconsNone": "{site} 在此無法安裝圖示包。",
1368
+ "wb.install.err.iconsLarge": "圖示包大小上限為 120 KB。",
1369
+ "wb.install.err.iconsNotInstalled": "圖示包未安裝",
1370
+ "wb.install.err.opened": "無法安裝此檔案",
1371
+ "wb.install.icons.dataOnly": "僅含資料:以路徑資料呈現的圖形與小圖片。沒有程式碼,也沒有樣式;裡面沒有任何內容會執行。",
1372
+ "wb.install.icons.license": "授權",
1373
+ "wb.install.icons.source": "圖形來源",
1374
+ "wb.install.icons.count": "圖示",
1375
+ "wb.install.icons.countValue": "{count, plural, other {# 個圖示}}",
1376
+ "wb.install.icons.file": "圖示包檔案",
1377
+ "wb.install.done.iconsOn": "它現在是你的圖示包。你隨時可以在「外觀」中切換回去。",
1378
+ "wb.install.done.iconsOff": "它已加入「外觀」中的圖示包。",
1379
+ "wb.store.icons": "圖示",
1380
+ "wb.store.iconsItem": "圖示包",
1381
+ "wb.store.builtinTab": "內建",
1382
+ "wb.store.builtinItem": "內建",
1383
+ "wb.store.areaSwitch": "開啟或關閉 {name}",
1384
+ "wb.store.areaOn": "開啟",
1385
+ "wb.store.areaOff": "關閉"
1279
1386
  }
1280
1387
  }
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "waybetter",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "license": "GPL-3.0-or-later",
5
5
  "type": "module",
6
- "description": "wayBetter: the framework for apps that run the apps you already use in a light native (Tauri) window and extend them in place. Page runtime (DOM/request hubs, plugins, plugin UI kit with themed dialogs and toasts, theme API and theme JSON Schema, theme color model, link routing, account reporting, deck columns, i18n: ICU-lite messages, locale fallback, plugin strings, catalog checks and JSON Schemas), shell models (address bar, panes, decks, profiles, palette, updates), the shell frame (createShell: tabs, splits, address bar, titlebar, palette, account switcher, decks, workspaces, overlays, the language state; React + dockview peers), the panel (createPanel: an app's own tab with Appearance and the Theme Builder, plugins and custom CSS, the Store, Make, accounts, settings, backup and sync, developer mode, updates; the app adds its sections) and the Store: install screen and Store view React components (optional React peer), their state and catalog models, the store catalog JSON Schema and the `waybetter store build|sign|verify` command, `waybetter release windows|macos` (signed native releases and the update manifest, configured by waybetter.release.json; path-free builds and a privacy gate), `waybetter privacy-scan` (forbidden names in files, binaries, archives and git history), `waybetter build-env` (a build without the machine's paths) and `waybetter/build` (the page runtime bundle, with an optional esbuild peer). No dependencies.",
6
+ "description": "wayBetter: the framework for apps that run the apps you already use in a light native (Tauri) window and extend them in place. Page runtime (DOM/request hubs, plugins, plugin UI kit with themed dialogs and toasts, theme API and theme JSON Schema, theme color model, link routing, account reporting, deck columns, i18n: ICU-lite messages, locale fallback, plugin strings, catalog checks and JSON Schemas), shell models (address bar, panes, decks, profiles, palette, updates), the shell frame (createShell: tabs, splits, address bar, titlebar, palette, account switcher, decks, workspaces, overlays, the language state; React + dockview peers), the panel (createPanel: an app's own tab with Appearance and the Theme Builder, plugins and custom CSS, the Store, Make, accounts, settings, backup and sync, developer mode, updates; the app adds its sections) and the Store: install screen and Store view React components (optional React peer), their state and catalog models, the store catalog JSON Schema and the `waybetter store build|sign|verify` command, `waybetter release windows|macos` (signed native releases and the update manifest, configured by waybetter.release.json; path-free builds), `waybetter build-env` (a build without the machine's paths) and `waybetter/build` (the page runtime bundle, with an optional esbuild peer). No dependencies.",
7
7
  "keywords": [
8
8
  "waybetter",
9
9
  "tauri",
@@ -190,7 +190,6 @@
190
190
  "./cli/store": "./cli/store.mjs",
191
191
  "./cli/release": "./cli/release.mjs",
192
192
  "./cli/i18n": "./cli/i18n.mjs",
193
- "./cli/privacy": "./cli/privacy.mjs",
194
193
  "./cli/buildenv": "./cli/buildenv.mjs",
195
194
  "./build": "./build/runtime.mjs",
196
195
  "./package.json": "./package.json"
@@ -2,12 +2,14 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://unpkg.com/waybetter/store-catalog.schema.json",
4
4
  "title": "wayBetter Store catalog",
5
- "description": "The shared, signed catalog of the wayBetter Store (format 2). Every wayBetter app reads the same file (catalog.json, signed by catalog.json.sig) and keeps only the items whose `apps` list its id. Apps verify the Ed25519 signature over the exact bytes first, then these rules (waybetter-host store::catalog), then each download's sha256 and size. Build it with `waybetter store build`, sign it with `waybetter store sign`.",
5
+ "description": "The shared, signed catalog of the wayBetter Store, in two files built from one source: catalog.json (format 2: only theme, plugin and strings items, which every app knows) and catalog.v3.json (format 3: every kind, read first by apps that know the newer kinds; they fall back to catalog.json). Each is signed by its own .sig. Every wayBetter app reads the same files and keeps only the items whose `apps` list its id. Apps verify the Ed25519 signature over the exact bytes first, then these rules (waybetter-host store::catalog), then each download's sha256 and size. Build it with `waybetter store build`, sign it with `waybetter store sign`.",
6
6
  "type": "object",
7
7
  "required": ["format", "name", "generatedAt", "items"],
8
8
  "additionalProperties": false,
9
+ "if": { "properties": { "format": { "const": 2 } } },
10
+ "then": { "properties": { "items": { "items": { "properties": { "kind": { "enum": ["theme", "plugin", "strings"] } } } } } },
9
11
  "properties": {
10
- "format": { "const": 2 },
12
+ "format": { "enum": [2, 3], "description": "2: only theme, plugin and strings items (an app from before a kind existed refuses a whole catalog that lists it). 3: every kind." },
11
13
  "name": { "type": "string" },
12
14
  "generatedAt": { "type": "string", "description": "When the catalog was built (RFC 3339, UTC)." },
13
15
  "items": { "type": "array", "maxItems": 500, "items": { "$ref": "#/$defs/item" } }
@@ -18,15 +20,26 @@
18
20
  "color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
19
21
  "item": {
20
22
  "type": "object",
21
- "required": ["apps", "kind", "id", "name", "version", "url", "sha256", "size"],
23
+ "required": ["apps", "kind", "id", "name", "version"],
22
24
  "additionalProperties": false,
25
+ "allOf": [
26
+ {
27
+ "if": { "properties": { "kind": { "const": "builtin" } } },
28
+ "then": { "not": { "anyOf": [{ "required": ["url"] }, { "required": ["sha256"] }, { "required": ["size"] }, { "required": ["file"] }, { "required": ["permissions"] }, { "required": ["colors"] }, { "required": ["language"] }] } },
29
+ "else": { "required": ["url", "sha256", "size"] }
30
+ },
31
+ {
32
+ "if": { "properties": { "kind": { "const": "icons" } } },
33
+ "then": { "not": { "anyOf": [{ "required": ["file"] }, { "required": ["permissions"] }, { "required": ["colors"] }, { "required": ["language"] }] }, "properties": { "size": { "maximum": 120000 } } }
34
+ }
35
+ ],
23
36
  "properties": {
24
37
  "apps": {
25
38
  "type": "array", "minItems": 1, "maxItems": 16, "uniqueItems": true,
26
39
  "description": "The wayBetter apps this item is for (app ids such as \"x\"). An app never shows, stages or installs another app's items.",
27
40
  "items": { "type": "string", "pattern": "^[a-z0-9-]{1,32}$" }
28
41
  },
29
- "kind": { "enum": ["theme", "plugin", "strings"], "description": "strings: a string pack (data that replaces the site's own UI strings; waybetter docs/STRING-PACKS.md)." },
42
+ "kind": { "enum": ["theme", "plugin", "strings", "icons", "builtin"], "description": "strings: a string pack (data that replaces the site's own UI strings; waybetter docs/STRING-PACKS.md). icons: an icon pack (`*.icons.json`, data only, at most 120 KB). builtin: a feature that ships inside the app (an area plugin), listed in the Store as built in with its switch; it has no url, sha256 or size because there is nothing to download." },
30
43
  "id": { "type": "string", "pattern": "^[a-z0-9-]{1,40}$", "description": "Unique per app and kind." },
31
44
  "name": { "allOf": [{ "$ref": "#/$defs/text" }], "type": "string", "minLength": 1, "maxLength": 60 },
32
45
  "author": { "allOf": [{ "$ref": "#/$defs/text" }], "type": "string", "maxLength": 60 },
@@ -34,7 +47,7 @@
34
47
  "description": { "allOf": [{ "$ref": "#/$defs/text" }], "type": "string", "maxLength": 600 },
35
48
  "category": { "allOf": [{ "$ref": "#/$defs/text" }], "type": "string", "maxLength": 32, "description": "Shown as `wb.store.category.<id>` when the framework catalogs name it (reading, writing, filters, focus, tools, dark, light), else as is." },
36
49
  "tags": { "type": "array", "maxItems": 12, "items": { "allOf": [{ "$ref": "#/$defs/text" }], "type": "string", "maxLength": 32 } },
37
- "url": { "$ref": "#/$defs/https", "description": "The file. It must be on the reading app's download hosts (waybetter.fyi, cdn1.crt.fyi, git.crt.fyi raw files by default): https, default port, no credentials, no fragment." },
50
+ "url": { "$ref": "#/$defs/https", "description": "The file (not on a `builtin` item). It must be on the reading app's download hosts (waybetter.fyi, cdn1.crt.fyi, git.crt.fyi raw files by default): https, default port, no credentials, no fragment." },
38
51
  "file": { "type": "string", "pattern": "^[A-Za-z0-9_\\-. ]+\\.plugin\\.js$", "maxLength": 128, "description": "Plugins only: the file name it is installed under (unique per app, ignoring case)." },
39
52
  "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
40
53
  "size": { "type": "integer", "minimum": 1, "maximum": 2097152 },
package/theme.schema.json CHANGED
@@ -4126,6 +4126,15 @@
4126
4126
  },
4127
4127
  "lock": {
4128
4128
  "$ref": "#/$defs/glyph"
4129
+ },
4130
+ "history": {
4131
+ "$ref": "#/$defs/glyph"
4132
+ },
4133
+ "studio": {
4134
+ "$ref": "#/$defs/glyph"
4135
+ },
4136
+ "articles": {
4137
+ "$ref": "#/$defs/glyph"
4129
4138
  }
4130
4139
  },
4131
4140
  "maxProperties": 8
@@ -58,6 +58,26 @@ ManifestDPIAwareness PerMonitorV2
58
58
  ${StrCase}
59
59
  ${StrLoc}
60
60
 
61
+ ; wayBetter: file associations that never take a file type over. Tauri's APP_ASSOCIATE makes the
62
+ ; app the default program for the extension, which for `.js` and `.json` (a wayBetter plugin is
63
+ ; `name.plugin.js`, a theme `name.json`; Windows only knows the last part) would claim every
64
+ ; script and JSON file on the machine. These two only list the app under "Open with" for the
65
+ ; extension (OpenWithProgids) and register what that entry runs; the owner's default stays as it
66
+ ; is. The app then shows its own install screen for the file (nothing installs without it).
67
+ !macro WaybetterOpenWith EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
68
+ WriteRegStr SHCTX "Software\Classes\.${EXT}\OpenWithProgids" "${FILECLASS}" ""
69
+ WriteRegStr SHCTX "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
70
+ WriteRegStr SHCTX "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
71
+ WriteRegStr SHCTX "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
72
+ WriteRegStr SHCTX "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
73
+ System::Call 'Shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'
74
+ !macroend
75
+ !macro WaybetterNoOpenWith EXT FILECLASS
76
+ DeleteRegValue SHCTX "Software\Classes\.${EXT}\OpenWithProgids" "${FILECLASS}"
77
+ DeleteRegKey SHCTX "Software\Classes\${FILECLASS}"
78
+ System::Call 'Shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'
79
+ !macroend
80
+
61
81
  {{#if installer_hooks}}
62
82
  !include "{{installer_hooks}}"
63
83
  {{/if}}
@@ -556,7 +576,7 @@ Section Install
556
576
  ; Create file associations
557
577
  {{#each file_associations as |association| ~}}
558
578
  {{#each association.ext as |ext| ~}}
559
- !insertmacro APP_ASSOCIATE "{{ext}}" "{{or association.name ext}}" "{{association-description association.description ext}}" "$INSTDIR\${MAINBINARYNAME}.exe,0" "Open with ${PRODUCTNAME}" "$INSTDIR\${MAINBINARYNAME}.exe $\"%1$\""
579
+ !insertmacro WaybetterOpenWith "{{ext}}" "{{or association.name ext}}" "{{association-description association.description ext}}" "$INSTDIR\${MAINBINARYNAME}.exe,0" "Open with ${PRODUCTNAME}" "$INSTDIR\${MAINBINARYNAME}.exe $\"%1$\""
560
580
  {{/each}}
561
581
  {{/each}}
562
582
 
@@ -699,7 +719,7 @@ Section Uninstall
699
719
  ; Delete app associations
700
720
  {{#each file_associations as |association| ~}}
701
721
  {{#each association.ext as |ext| ~}}
702
- !insertmacro APP_UNASSOCIATE "{{ext}}" "{{or association.name ext}}"
722
+ !insertmacro WaybetterNoOpenWith "{{ext}}" "{{or association.name ext}}"
703
723
  {{/each}}
704
724
  {{/each}}
705
725