From ebc794a36414451476ff032d64ad71a581bb7821 Mon Sep 17 00:00:00 2001 From: Leandro Menezes Date: Wed, 18 Dec 2024 00:57:34 -0300 Subject: [PATCH 1/8] Retrying plugins --- .eslintrc.js | 1 + packages/desktop-client/public/index.es.js | 835 ++++++++++++++++++ .../src/components/ActualPluginsProvider.tsx | 151 ++++ .../desktop-client/src/components/App.tsx | 75 +- .../src/components/ThemeSelector.tsx | 130 ++- .../src/components/settings/Themes.tsx | 77 +- packages/desktop-client/src/style/theme.tsx | 68 +- packages/loot-core/src/server/main.ts | 9 +- packages/loot-core/src/types/prefs.d.ts | 9 +- packages/plugins-shared/.gitignore | 24 + packages/plugins-shared/README.md | 1 + packages/plugins-shared/package.json | 20 + packages/plugins-shared/src/globals.d.ts | 8 + packages/plugins-shared/src/index.ts | 3 + .../src/interfaces/actualPlugin.ts | 23 + .../src/interfaces/actualPluginEntry.ts | 5 + .../src/interfaces/themeDefinition.ts | 196 ++++ packages/plugins-shared/tsconfig.json | 41 + packages/plugins-shared/vite.config.mts | 29 + yarn.lock | 578 +++++++++++- 20 files changed, 2207 insertions(+), 76 deletions(-) create mode 100644 packages/desktop-client/public/index.es.js create mode 100644 packages/desktop-client/src/components/ActualPluginsProvider.tsx create mode 100644 packages/plugins-shared/.gitignore create mode 100644 packages/plugins-shared/README.md create mode 100644 packages/plugins-shared/package.json create mode 100644 packages/plugins-shared/src/globals.d.ts create mode 100644 packages/plugins-shared/src/index.ts create mode 100644 packages/plugins-shared/src/interfaces/actualPlugin.ts create mode 100644 packages/plugins-shared/src/interfaces/actualPluginEntry.ts create mode 100644 packages/plugins-shared/src/interfaces/themeDefinition.ts create mode 100644 packages/plugins-shared/tsconfig.json create mode 100644 packages/plugins-shared/vite.config.mts diff --git a/.eslintrc.js b/.eslintrc.js index 71946ca6b8d..27bfe6de838 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -63,6 +63,7 @@ module.exports = { globalThis: false, vi: true, }, + ignorePatterns: ['**/public/*.js'], rules: { // http://eslint.org/docs/rules/ 'array-callback-return': 'warn', diff --git a/packages/desktop-client/public/index.es.js b/packages/desktop-client/public/index.es.js new file mode 100644 index 00000000000..40f4a6f0c99 --- /dev/null +++ b/packages/desktop-client/public/index.es.js @@ -0,0 +1,835 @@ +const c = e => t => + /* @__PURE__ */ e.createElement( + 'svg', + { + ...t, + xmlns: 'http://www.w3.org/2000/svg', + viewBox: '0 0 20 20', + style: { + color: 'inherit', + ...t.style, + }, + }, + /* @__PURE__ */ e.createElement('path', { + d: 'M11 9.27V0l6 11-4 6H7l-4-6L9 0v9.27a2 2 0 1 0 2 0zM6 18h8v2H6v-2z', + fill: 'currentColor', + }), + ), + u = e => { + const o = c(e); + return ({ themeName: d, darkMode: a, style: r }) => { + switch (d) { + case 'dracula': + return /* @__PURE__ */ e.createElement(o, { style: r }); + } + return /* @__PURE__ */ e.createElement('div', { style: r }); + }; + }, + b = { + // Page + pageBackground: '#282a36', + // Dark background + pageBackgroundModalActive: '#44475a', + // Slightly lighter modal background + pageBackgroundTopLeft: '#44475a', + pageBackgroundBottomRight: '#6272a4', + // Muted blue for a gradient + pageBackgroundLineTop: '#bd93f9', + // Purple + pageBackgroundLineMid: '#6272a4', + // Muted blue + pageBackgroundLineBottom: '#ff79c6', + // Pink + pageText: '#f8f8f2', + // Light text + pageTextLight: '#bd93f9', + // Purple for lighter tone + pageTextSubdued: '#6272a4', + // Comments + pageTextDark: '#ff79c6', + // Pink for emphasis + pageTextPositive: '#50fa7b', + // Green for positivity + pageTextLink: '#8be9fd', + // Cyan for links + pageTextLinkLight: '#50fa7b', + // Light green for hover links + // Card + cardBackground: '#44475a', + // Current line background + cardBorder: '#bd93f9', + // Purple border + cardShadow: 'rgba(0, 0, 0, 0.5)', + // Slight shadow + // Table + tableBackground: '#282a36', + tableRowBackgroundHover: '#44475a', + tableRowBackgroundHighlight: '#ff79c6', + // Pink highlight + tableRowBackgroundHighlightText: '#282a36', + tableText: '#f8f8f2', + tableTextLight: '#bd93f9', + tableTextSubdued: '#6272a4', + tableTextSelected: '#50fa7b', + // Green selection + tableTextHover: '#ff79c6', + tableTextInactive: '#6272a4', + tableHeaderText: '#8be9fd', + // Cyan header text + tableHeaderBackground: '#44475a', + tableBorder: '#6272a4', + tableBorderSelected: '#bd93f9', + tableBorderHover: '#50fa7b', + tableBorderSeparator: '#44475a', + // Sidebar + sidebarBackground: '#282a36', + sidebarItemBackgroundPending: '#ffb86c', + // Orange pending + sidebarItemBackgroundPositive: '#50fa7b', + // Green for success + sidebarItemBackgroundFailed: '#ff5555', + // Red for failure + sidebarItemBackgroundHover: '#44475a', + sidebarItemAccentSelected: '#ff79c6', + sidebarItemText: '#f8f8f2', + sidebarItemTextSelected: '#ff79c6', + // Menu + menuBackground: '#44475a', + menuItemBackground: '#282a36', + menuItemBackgroundHover: '#6272a4', + menuItemText: '#f8f8f2', + menuItemTextHover: '#ff79c6', + menuItemTextSelected: '#50fa7b', + menuItemTextHeader: '#bd93f9', + menuBorder: '#6272a4', + menuBorderHover: '#ff79c6', + menuKeybindingText: '#8be9fd', + // Cyan for keybindings + menuAutoCompleteBackground: '#282a36', + menuAutoCompleteBackgroundHover: '#44475a', + menuAutoCompleteText: '#f8f8f2', + menuAutoCompleteTextHover: '#50fa7b', + menuAutoCompleteTextHeader: '#ffb86c', + menuAutoCompleteItemTextHover: '#ff79c6', + menuAutoCompleteItemText: '#f8f8f2', + // Modal + modalBackground: '#44475a', + modalBorder: '#6272a4', + // Mobile + mobileHeaderBackground: '#44475a', + mobileHeaderText: '#ff79c6', + mobileHeaderTextSubdued: '#6272a4', + mobileHeaderTextHover: 'rgba(255, 121, 198, 0.15)', + mobilePageBackground: '#282a36', + mobileNavBackground: '#44475a', + mobileNavItem: '#6272a4', + mobileNavItemSelected: '#ff79c6', + mobileAccountShadow: 'rgba(0, 0, 0, 0.6)', + mobileAccountText: '#8be9fd', + mobileTransactionSelected: '#50fa7b', + // Mobile Themes + mobileViewTheme: '#44475a', + mobileConfigServerViewTheme: '#ff79c6', + // Markdown + markdownNormal: '#ff79c6', + markdownDark: '#bd93f9', + markdownLight: '#50fa7b', + // Buttons + buttonMenuText: '#f8f8f2', + buttonMenuTextHover: '#ff79c6', + buttonMenuBackground: 'transparent', + buttonMenuBackgroundHover: 'rgba(255, 121, 198, 0.2)', + buttonMenuBorder: '#bd93f9', + buttonMenuSelectedText: '#282a36', + buttonMenuSelectedTextHover: '#282a36', + buttonMenuSelectedBackground: '#50fa7b', + buttonMenuSelectedBackgroundHover: '#6272a4', + buttonMenuSelectedBorder: '#50fa7b', + buttonPrimaryText: '#282a36', + buttonPrimaryTextHover: '#282a36', + buttonPrimaryBackground: '#50fa7b', + buttonPrimaryBackgroundHover: '#8be9fd', + buttonPrimaryBorder: '#50fa7b', + buttonPrimaryShadow: 'rgba(0, 0, 0, 0.6)', + buttonPrimaryDisabledText: '#6272a4', + buttonPrimaryDisabledBackground: '#44475a', + buttonPrimaryDisabledBorder: '#6272a4', + buttonNormalText: '#f8f8f2', + buttonNormalTextHover: '#ff79c6', + buttonNormalBackground: '#44475a', + buttonNormalBackgroundHover: '#6272a4', + buttonNormalBorder: '#6272a4', + buttonNormalShadow: 'rgba(0, 0, 0, 0.3)', + buttonNormalDisabledText: '#6272a4', + buttonNormalDisabledBackground: '#282a36', + buttonNormalDisabledBorder: '#6272a4', + buttonBareText: '#f8f8f2', + buttonBareTextHover: '#ff79c6', + buttonBareBackground: 'transparent', + buttonBareBackgroundHover: 'rgba(255, 121, 198, 0.2)', + buttonBareBackgroundActive: 'rgba(255, 121, 198, 0.3)', + buttonBareDisabledText: '#6272a4', + buttonBareDisabledBackground: 'transparent', + // Calendar + calendarText: '#f8f8f2', + calendarBackground: '#282a36', + calendarItemText: '#f8f8f2', + calendarItemBackground: '#44475a', + calendarSelectedBackground: '#bd93f9', + // Notices + noticeBackground: '#50fa7b', + noticeText: '#282a36', + noticeBorder: '#6272a4', + warningBackground: '#ffb86c', + warningText: '#282a36', + warningBorder: '#bd93f9', + errorBackground: '#ff5555', + errorText: '#282a36', + errorBorder: '#ff79c6', + upcomingBackground: '#bd93f9', + upcomingText: '#282a36', + upcomingBorder: '#ff79c6', + // Form + formLabelText: '#8be9fd', + formLabelBackground: '#44475a', + formInputBackground: '#44475a', + formInputBackgroundSelected: '#6272a4', + formInputBackgroundSelection: '#50fa7b', + formInputBorder: '#bd93f9', + formInputText: '#f8f8f2', + formInputTextSelected: '#50fa7b', + formInputTextPlaceholder: '#6272a4', + formInputTextHighlight: '#ff79c6', + formInputShadowSelected: 'rgba(189, 147, 249, 0.5)', + // Miscellaneous + pillBackground: '#44475a', + pillBackgroundLight: '#6272a4', + pillText: '#f8f8f2', + pillTextHighlighted: '#ff79c6', + pillBorder: '#bd93f9', + pillBackgroundSelected: '#50fa7b', + pillTextSelected: '#282a36', + pillBorderSelected: '#50fa7b', + pillTextSubdued: '#6272a4', + reportsRed: '#ff5555', + reportsBlue: '#8be9fd', + reportsGreen: '#50fa7b', + reportsGray: '#6272a4', + reportsLabel: '#f8f8f2', + reportsInnerLabel: '#bd93f9', + noteTagBackground: '#44475a', + noteTagBackgroundHover: '#6272a4', + noteTagText: '#8be9fd', + floatingActionBarBackground: '#44475a', + floatingActionBarBorder: '#bd93f9', + floatingActionBarText: '#f8f8f2', + tooltipText: '#f8f8f2', + tooltipBackground: '#44475a', + tooltipBorder: '#bd93f9', + }, + l = { + // Page + pageBackground: '#f4ecd8', + // Light sepia background + pageBackgroundModalActive: '#e8dcc0', + // Slightly darker modal + pageBackgroundTopLeft: '#f3e4c8', + pageBackgroundBottomRight: '#d9c7a5', + pageBackgroundLineTop: '#bfa786', + pageBackgroundLineMid: '#a39077', + pageBackgroundLineBottom: '#8c7b65', + pageText: '#5c4b3b', + // Dark brown for text + pageTextLight: '#7d6c5b', + pageTextSubdued: '#a08e7b', + pageTextDark: '#3d2f25', + pageTextPositive: '#9b7e5a', + // Muted warm sepia + pageTextLink: '#8c6f4d', + pageTextLinkLight: '#af8b67', + // Card + cardBackground: '#ede1c8', + cardBorder: '#d3b997', + cardShadow: 'rgba(75, 60, 45, 0.3)', + // Table + tableBackground: '#f4ecd8', + tableRowBackgroundHover: '#e2d4b7', + tableRowBackgroundHighlight: '#d9c7a5', + tableRowBackgroundHighlightText: '#5c4b3b', + tableText: '#5c4b3b', + tableTextLight: '#8c7b65', + tableTextSubdued: '#a08e7b', + tableTextSelected: '#9b7e5a', + tableTextHover: '#7d6c5b', + tableTextInactive: '#bfa786', + tableHeaderText: '#7c6a53', + tableHeaderBackground: '#ede1c8', + tableBorder: '#d3b997', + tableBorderSelected: '#b89d7d', + tableBorderHover: '#a89072', + tableBorderSeparator: '#c5b299', + // Sidebar + sidebarBackground: '#f4ecd8', + sidebarItemBackgroundPending: '#bfa786', + sidebarItemBackgroundPositive: '#9b7e5a', + sidebarItemBackgroundFailed: '#a67c52', + sidebarItemBackgroundHover: '#e2d4b7', + sidebarItemAccentSelected: '#8c6f4d', + sidebarItemText: '#5c4b3b', + sidebarItemTextSelected: '#7c6a53', + // Menu + menuBackground: '#e8dcc0', + menuItemBackground: '#ede1c8', + menuItemBackgroundHover: '#d9c7a5', + menuItemText: '#5c4b3b', + menuItemTextHover: '#7d6c5b', + menuItemTextSelected: '#9b7e5a', + menuItemTextHeader: '#8c6f4d', + menuBorder: '#d3b997', + menuBorderHover: '#bfa786', + menuKeybindingText: '#a08e7b', + menuAutoCompleteBackground: '#f3e4c8', + menuAutoCompleteBackgroundHover: '#e2d4b7', + menuAutoCompleteText: '#5c4b3b', + menuAutoCompleteTextHover: '#9b7e5a', + menuAutoCompleteTextHeader: '#bfa786', + menuAutoCompleteItemTextHover: '#7d6c5b', + menuAutoCompleteItemText: '#5c4b3b', + // Modal + modalBackground: '#ede1c8', + modalBorder: '#d3b997', + // Mobile + mobileHeaderBackground: '#d9c7a5', + mobileHeaderText: '#5c4b3b', + mobileHeaderTextSubdued: '#7c6a53', + mobileHeaderTextHover: 'rgba(140, 111, 77, 0.2)', + mobilePageBackground: '#f4ecd8', + mobileNavBackground: '#e8dcc0', + mobileNavItem: '#a08e7b', + mobileNavItemSelected: '#9b7e5a', + mobileAccountShadow: 'rgba(75, 60, 45, 0.2)', + mobileAccountText: '#8c6f4d', + mobileTransactionSelected: '#b89d7d', + // Mobile Themes + mobileViewTheme: '#e2d4b7', + mobileConfigServerViewTheme: '#a67c52', + // Markdown + markdownNormal: '#8c6f4d', + markdownDark: '#5c4b3b', + markdownLight: '#bfa786', + // Buttons + buttonMenuText: '#5c4b3b', + buttonMenuTextHover: '#7d6c5b', + buttonMenuBackground: 'transparent', + buttonMenuBackgroundHover: 'rgba(140, 111, 77, 0.2)', + buttonMenuBorder: '#9b7e5a', + buttonMenuSelectedText: '#f4ecd8', + buttonMenuSelectedTextHover: '#f4ecd8', + buttonMenuSelectedBackground: '#8c6f4d', + buttonMenuSelectedBackgroundHover: '#9b7e5a', + buttonMenuSelectedBorder: '#9b7e5a', + buttonPrimaryText: '#f4ecd8', + buttonPrimaryTextHover: '#f4ecd8', + buttonPrimaryBackground: '#8c6f4d', + buttonPrimaryBackgroundHover: '#7d6c5b', + buttonPrimaryBorder: '#9b7e5a', + buttonPrimaryShadow: 'rgba(75, 60, 45, 0.4)', + buttonPrimaryDisabledText: '#bfa786', + buttonPrimaryDisabledBackground: '#d9c7a5', + buttonPrimaryDisabledBorder: '#c5b299', + buttonNormalText: '#5c4b3b', + buttonNormalTextHover: '#7d6c5b', + buttonNormalBackground: '#ede1c8', + buttonNormalBackgroundHover: '#e2d4b7', + buttonNormalBorder: '#d3b997', + buttonNormalShadow: 'rgba(75, 60, 45, 0.3)', + buttonNormalDisabledText: '#bfa786', + buttonNormalDisabledBackground: '#e8dcc0', + buttonNormalDisabledBorder: '#c5b299', + buttonBareText: '#5c4b3b', + buttonBareTextHover: '#7d6c5b', + buttonBareBackground: 'transparent', + buttonBareBackgroundHover: 'rgba(140, 111, 77, 0.2)', + buttonBareBackgroundActive: 'rgba(140, 111, 77, 0.3)', + buttonBareDisabledText: '#a08e7b', + buttonBareDisabledBackground: 'transparent', + // Calendar + calendarText: '#5c4b3b', + calendarBackground: '#f4ecd8', + calendarItemText: '#7d6c5b', + calendarItemBackground: '#d9c7a5', + calendarSelectedBackground: '#bfa786', + // Notices + noticeBackground: '#d9c7a5', + noticeText: '#5c4b3b', + noticeBorder: '#bfa786', + warningBackground: '#b89d7d', + warningText: '#5c4b3b', + warningBorder: '#a67c52', + errorBackground: '#a67c52', + errorText: '#f4ecd8', + errorBorder: '#8c6f4d', + upcomingBackground: '#c5b299', + upcomingText: '#5c4b3b', + upcomingBorder: '#9b7e5a', + // Form + formLabelText: '#8c6f4d', + formLabelBackground: '#ede1c8', + formInputBackground: '#e8dcc0', + formInputBackgroundSelected: '#d3b997', + formInputBackgroundSelection: '#bfa786', + formInputBorder: '#c5b299', + formInputText: '#5c4b3b', + formInputTextSelected: '#3d2f25', + formInputTextPlaceholder: '#a08e7b', + formInputTextHighlight: '#8c6f4d', + formInputShadowSelected: 'rgba(140, 111, 77, 0.3)', + // Miscellaneous + pillBackground: '#e2d4b7', + pillBackgroundLight: '#ede1c8', + pillText: '#5c4b3b', + pillTextHighlighted: '#7d6c5b', + pillBorder: '#bfa786', + pillBackgroundSelected: '#c5b299', + pillTextSelected: '#3d2f25', + pillBorderSelected: '#9b7e5a', + pillTextSubdued: '#a08e7b', + reportsRed: '#a67c52', + reportsBlue: '#9b7e5a', + reportsGreen: '#8c6f4d', + reportsGray: '#bfa786', + reportsLabel: '#5c4b3b', + reportsInnerLabel: '#7d6c5b', + noteTagBackground: '#e2d4b7', + noteTagBackgroundHover: '#d3b997', + noteTagText: '#5c4b3b', + floatingActionBarBackground: '#ede1c8', + floatingActionBarBorder: '#bfa786', + floatingActionBarText: '#5c4b3b', + tooltipText: '#5c4b3b', + tooltipBackground: '#d9c7a5', + tooltipBorder: '#bfa786', + }, + g = { + // Page + pageBackground: '#191724', + // Base background + pageBackgroundModalActive: '#1f1d2e', + // Surface + pageBackgroundTopLeft: '#191724', + pageBackgroundBottomRight: '#26233a', + pageBackgroundLineTop: '#eb6f92', + // Rose + pageBackgroundLineMid: '#9ccfd8', + // Foam + pageBackgroundLineBottom: '#c4a7e7', + // Iris + pageText: '#e0def4', + pageTextLight: '#908caa', + // Subtle + pageTextSubdued: '#6e6a86', + // Muted + pageTextDark: '#f6c177', + // Gold + pageTextPositive: '#31748f', + // Pine + pageTextLink: '#ebbcba', + // Love + pageTextLinkLight: '#9ccfd8', + // Foam + // Card + cardBackground: '#1f1d2e', + cardBorder: '#c4a7e7', + cardShadow: 'rgba(0, 0, 0, 0.5)', + // Table + tableBackground: '#1f1d2e', + tableRowBackgroundHover: '#26233a', + tableText: '#e0def4', + tableTextLight: '#908caa', + tableTextSubdued: '#6e6a86', + tableTextSelected: '#c4a7e7', + tableTextHover: '#f6c177', + tableTextInactive: '#6e6a86', + tableHeaderText: '#9ccfd8', + tableHeaderBackground: '#191724', + tableBorder: '#6e6a86', + tableBorderSelected: '#c4a7e7', + tableBorderHover: '#f6c177', + tableBorderSeparator: '#6e6a86', + tableRowBackgroundHighlight: '#31748f', + tableRowBackgroundHighlightText: '#e0def4', + tableRowHeaderBackground: '#26233a', + tableRowHeaderText: '#f6c177', + // Sidebar + sidebarBackground: '#191724', + sidebarItemBackgroundPending: '#f6c177', + sidebarItemBackgroundPositive: '#31748f', + sidebarItemBackgroundFailed: '#eb6f92', + sidebarItemAccentSelected: '#c4a7e7', + sidebarItemBackgroundHover: '#26233a', + sidebarItemText: '#e0def4', + sidebarItemTextSelected: '#ebbcba', + // Menu + menuBackground: '#26233a', + menuItemBackground: '#1f1d2e', + menuItemBackgroundHover: '#31748f', + menuItemText: '#e0def4', + menuItemTextHover: '#f6c177', + menuItemTextSelected: '#c4a7e7', + menuItemTextHeader: '#9ccfd8', + menuBorder: '#6e6a86', + menuBorderHover: '#c4a7e7', + menuKeybindingText: '#9ccfd8', + menuAutoCompleteBackground: '#1f1d2e', + menuAutoCompleteBackgroundHover: '#26233a', + menuAutoCompleteText: '#e0def4', + menuAutoCompleteTextHover: '#c4a7e7', + menuAutoCompleteTextHeader: '#f6c177', + menuAutoCompleteItemTextHover: '#f6c177', + menuAutoCompleteItemText: '#e0def4', + // Modal + modalBackground: '#1f1d2e', + modalBorder: '#c4a7e7', + // Mobile + mobileHeaderBackground: '#26233a', + mobileHeaderText: '#f6c177', + mobileHeaderTextSubdued: '#6e6a86', + mobileHeaderTextHover: 'rgba(246, 193, 119, 0.2)', + mobilePageBackground: '#191724', + mobileNavBackground: '#1f1d2e', + mobileNavItem: '#6e6a86', + mobileNavItemSelected: '#c4a7e7', + mobileAccountShadow: 'rgba(0, 0, 0, 0.5)', + mobileAccountText: '#9ccfd8', + mobileTransactionSelected: '#ebbcba', + // Mobile Themes + mobileViewTheme: '#26233a', + mobileConfigServerViewTheme: '#c4a7e7', + // Markdown + markdownNormal: '#ebbcba', + markdownDark: '#eb6f92', + markdownLight: '#c4a7e7', + // Buttons + buttonMenuText: '#e0def4', + buttonMenuTextHover: '#f6c177', + buttonMenuBackground: 'transparent', + buttonMenuBackgroundHover: 'rgba(246, 193, 119, 0.2)', + buttonMenuBorder: '#9ccfd8', + buttonMenuSelectedText: '#191724', + buttonMenuSelectedTextHover: '#191724', + buttonMenuSelectedBackground: '#f6c177', + buttonMenuSelectedBackgroundHover: '#ebbcba', + buttonMenuSelectedBorder: '#f6c177', + buttonPrimaryText: '#191724', + buttonPrimaryTextHover: '#191724', + buttonPrimaryBackground: '#f6c177', + buttonPrimaryBackgroundHover: '#ebbcba', + buttonPrimaryBorder: '#f6c177', + buttonPrimaryShadow: 'rgba(0, 0, 0, 0.5)', + buttonPrimaryDisabledText: '#6e6a86', + buttonPrimaryDisabledBackground: '#26233a', + buttonPrimaryDisabledBorder: '#6e6a86', + buttonNormalText: '#e0def4', + buttonNormalTextHover: '#f6c177', + buttonNormalBackground: '#26233a', + buttonNormalBackgroundHover: '#31748f', + buttonNormalBorder: '#9ccfd8', + buttonNormalShadow: 'rgba(0, 0, 0, 0.3)', + buttonNormalSelectedText: '#191724', + buttonNormalSelectedBackground: '#c4a7e7', + buttonNormalDisabledText: '#6e6a86', + buttonNormalDisabledBackground: '#1f1d2e', + buttonNormalDisabledBorder: '#6e6a86', + buttonBareText: '#e0def4', + buttonBareTextHover: '#f6c177', + buttonBareBackground: 'transparent', + buttonBareBackgroundHover: 'rgba(246, 193, 119, 0.2)', + buttonBareBackgroundActive: 'rgba(246, 193, 119, 0.3)', + buttonBareDisabledText: '#6e6a86', + buttonBareDisabledBackground: 'transparent', + // Calendar + calendarText: '#e0def4', + calendarBackground: '#191724', + calendarItemText: '#e0def4', + calendarItemBackground: '#1f1d2e', + calendarSelectedBackground: '#c4a7e7', + // Notices + noticeBackground: '#f6c177', + noticeBackgroundLight: '#f4a261', + noticeBackgroundDark: '#ebbcba', + noticeText: '#191724', + noticeTextLight: '#6e6a86', + noticeTextDark: '#9ccfd8', + noticeTextMenu: '#eb6f92', + noticeTextMenuHover: '#f6c177', + noticeBorder: '#c4a7e7', + warningBackground: '#ebbcba', + warningText: '#191724', + warningTextLight: '#f6c177', + warningTextDark: '#c4a7e7', + warningBorder: '#eb6f92', + errorBackground: '#eb6f92', + errorText: '#191724', + errorTextDark: '#c4a7e7', + errorTextDarker: '#c4a7e7', + errorTextMenu: '#f6c177', + errorBorder: '#ebbcba', + upcomingBackground: '#c4a7e7', + upcomingText: '#191724', + upcomingBorder: '#9ccfd8', + // Form + formLabelText: '#9ccfd8', + formLabelBackground: '#26233a', + formInputBackground: '#1f1d2e', + formInputBackgroundSelected: '#26233a', + formInputBackgroundSelection: '#c4a7e7', + formInputBorder: '#9ccfd8', + formInputTextReadOnlySelection: '#6e6a86', + formInputBorderSelected: '#f6c177', + formInputText: '#e0def4', + formInputTextSelected: '#ebbcba', + formInputTextPlaceholder: '#6e6a86', + formInputTextPlaceholderSelected: '#9ccfd8', + formInputTextSelection: '#c4a7e7', + formInputShadowSelected: 'rgba(189, 147, 249, 0.5)', + formInputTextHighlight: '#f6c177', + // Checkbox + checkboxText: '#e0def4', + checkboxBackgroundSelected: '#9ccfd8', + checkboxBorderSelected: '#c4a7e7', + checkboxShadowSelected: 'rgba(0, 0, 0, 0.4)', + checkboxToggleBackground: '#6e6a86', + checkboxToggleBackgroundSelected: '#c4a7e7', + checkboxToggleDisabled: '#26233a', + // Pill + pillBackground: '#26233a', + pillBackgroundLight: '#1f1d2e', + pillText: '#e0def4', + pillTextHighlighted: '#f6c177', + pillBorder: '#9ccfd8', + pillBorderDark: '#6e6a86', + pillBackgroundSelected: '#c4a7e7', + pillTextSelected: '#191724', + pillBorderSelected: '#f6c177', + pillTextSubdued: '#6e6a86', + // Reports + reportsRed: '#eb6f92', + reportsBlue: '#9ccfd8', + reportsGreen: '#31748f', + reportsGray: '#6e6a86', + reportsLabel: '#e0def4', + reportsInnerLabel: '#908caa', + // Misc + noteTagBackground: '#26233a', + noteTagBackgroundHover: '#1f1d2e', + noteTagText: '#f6c177', + floatingActionBarBackground: '#26233a', + floatingActionBarBorder: '#c4a7e7', + floatingActionBarText: '#e0def4', + tooltipText: '#e0def4', + tooltipBackground: '#1f1d2e', + tooltipBorder: '#c4a7e7', + // Budget + budgetOtherMonth: '#1f1d2e', + budgetCurrentMonth: '#26233a', + budgetHeaderOtherMonth: '#6e6a86', + budgetHeaderCurrentMonth: '#c4a7e7', + }, + f = { + // Page + pageBackground: '#1a1b26', + // Dark navy blue + pageBackgroundModalActive: '#16161e', + // Deeper navy for modal + pageBackgroundTopLeft: '#1f2335', + // Slightly lighter navy + pageBackgroundBottomRight: '#16161e', + // Dark navy + pageBackgroundLineTop: '#7aa2f7', + // Light blue + pageBackgroundLineMid: '#565f89', + // Grayish blue + pageBackgroundLineBottom: '#9ece6a', + // Soft green + pageText: '#c0caf5', + // Light gray-blue + pageTextLight: '#a9b1d6', + // Subtle light gray + pageTextSubdued: '#565f89', + // Muted gray-blue + pageTextDark: '#f7768e', + // Rose red + pageTextPositive: '#9ece6a', + // Green + pageTextLink: '#7aa2f7', + // Light blue + pageTextLinkLight: '#bb9af7', + // Purple + // Card + cardBackground: '#1f2335', + // Surface color + cardBorder: '#565f89', + cardShadow: 'rgba(0, 0, 0, 0.5)', + // Table + tableBackground: '#1a1b26', + tableRowBackgroundHover: '#1f2335', + tableRowBackgroundHighlight: '#7aa2f7', + tableRowBackgroundHighlightText: '#c0caf5', + tableText: '#c0caf5', + tableTextLight: '#a9b1d6', + tableTextSubdued: '#565f89', + tableTextSelected: '#bb9af7', + // Purple + tableTextHover: '#7dcfff', + // Cyan + tableTextInactive: '#414868', + tableHeaderText: '#7aa2f7', + tableHeaderBackground: '#1f2335', + tableBorder: '#565f89', + tableBorderSelected: '#7aa2f7', + tableBorderHover: '#9ece6a', + tableBorderSeparator: '#414868', + tableRowHeaderBackground: '#1a1b26', + tableRowHeaderText: '#c0caf5', + // Sidebar + sidebarBackground: '#1a1b26', + sidebarItemBackgroundPending: '#f7768e', + sidebarItemBackgroundPositive: '#9ece6a', + sidebarItemBackgroundFailed: '#f7768e', + sidebarItemAccentSelected: '#bb9af7', + sidebarItemBackgroundHover: '#26233a', + sidebarItemText: '#c0caf5', + sidebarItemTextSelected: '#7aa2f7', + // Menu + menuBackground: '#1f2335', + menuItemBackground: '#1a1b26', + menuItemBackgroundHover: '#7dcfff', + menuItemText: '#c0caf5', + menuItemTextHover: '#9ece6a', + menuItemTextSelected: '#bb9af7', + menuItemTextHeader: '#7dcfff', + menuBorder: '#414868', + menuBorderHover: '#7aa2f7', + menuKeybindingText: '#565f89', + menuAutoCompleteBackground: '#1f2335', + menuAutoCompleteBackgroundHover: '#26233a', + menuAutoCompleteText: '#c0caf5', + menuAutoCompleteTextHover: '#7dcfff', + menuAutoCompleteTextHeader: '#f7768e', + menuAutoCompleteItemTextHover: '#9ece6a', + menuAutoCompleteItemText: '#c0caf5', + // Modal + modalBackground: '#1f2335', + modalBorder: '#565f89', + // Mobile + mobileHeaderBackground: '#16161e', + mobileHeaderText: '#7aa2f7', + mobileHeaderTextSubdued: '#565f89', + mobileHeaderTextHover: 'rgba(122, 162, 247, 0.2)', + mobilePageBackground: '#1a1b26', + mobileNavBackground: '#1f2335', + mobileNavItem: '#565f89', + mobileNavItemSelected: '#7aa2f7', + mobileAccountShadow: 'rgba(0, 0, 0, 0.5)', + mobileAccountText: '#bb9af7', + mobileTransactionSelected: '#f7768e', + // Buttons + buttonMenuText: '#c0caf5', + buttonMenuTextHover: '#7aa2f7', + buttonMenuBackground: 'transparent', + buttonMenuBackgroundHover: 'rgba(122, 162, 247, 0.2)', + buttonMenuBorder: '#414868', + buttonMenuSelectedText: '#1a1b26', + buttonMenuSelectedTextHover: '#1a1b26', + buttonMenuSelectedBackground: '#7aa2f7', + buttonMenuSelectedBackgroundHover: '#7dcfff', + buttonMenuSelectedBorder: '#7aa2f7', + buttonPrimaryText: '#1a1b26', + buttonPrimaryTextHover: '#1a1b26', + buttonPrimaryBackground: '#7aa2f7', + buttonPrimaryBackgroundHover: '#7dcfff', + buttonPrimaryBorder: '#7aa2f7', + buttonPrimaryShadow: 'rgba(0, 0, 0, 0.5)', + buttonPrimaryDisabledText: '#565f89', + buttonPrimaryDisabledBackground: '#16161e', + buttonPrimaryDisabledBorder: '#414868', + buttonNormalText: '#c0caf5', + buttonNormalTextHover: '#7aa2f7', + buttonNormalBackground: '#1f2335', + buttonNormalBackgroundHover: '#26233a', + buttonNormalBorder: '#565f89', + buttonNormalShadow: 'rgba(0, 0, 0, 0.3)', + buttonNormalSelectedText: '#1a1b26', + buttonNormalSelectedBackground: '#bb9af7', + buttonNormalDisabledText: '#565f89', + buttonNormalDisabledBackground: '#16161e', + buttonNormalDisabledBorder: '#414868', + buttonBareText: '#c0caf5', + buttonBareTextHover: '#7aa2f7', + buttonBareBackground: 'transparent', + buttonBareBackgroundHover: 'rgba(122, 162, 247, 0.2)', + buttonBareBackgroundActive: 'rgba(122, 162, 247, 0.3)', + buttonBareDisabledText: '#565f89', + buttonBareDisabledBackground: 'transparent', + // Calendar + calendarText: '#c0caf5', + calendarBackground: '#1a1b26', + calendarItemText: '#c0caf5', + calendarItemBackground: '#1f2335', + calendarSelectedBackground: '#7aa2f7', + // Notices + noticeBackground: '#7aa2f7', + noticeBackgroundLight: '#9ece6a', + noticeBackgroundDark: '#414868', + noticeText: '#1a1b26', + noticeTextLight: '#c0caf5', + noticeTextDark: '#f7768e', + noticeTextMenu: '#7aa2f7', + noticeTextMenuHover: '#9ece6a', + noticeBorder: '#565f89', + // Form + formLabelText: '#7aa2f7', + formLabelBackground: '#1f2335', + formInputBackground: '#1a1b26', + formInputBackgroundSelected: '#26233a', + formInputBackgroundSelection: '#7aa2f7', + formInputBorder: '#565f89', + formInputTextReadOnlySelection: '#414868', + formInputBorderSelected: '#7aa2f7', + formInputText: '#c0caf5', + formInputTextSelected: '#9ece6a', + formInputTextPlaceholder: '#565f89', + formInputTextPlaceholderSelected: '#7dcfff', + formInputShadowSelected: 'rgba(122, 162, 247, 0.5)', + // Miscellaneous + tooltipText: '#c0caf5', + tooltipBackground: '#1a1b26', + tooltipBorder: '#7aa2f7', + }, + i = e => { + const o = u(e), + t = { + name: 'Example', + version: '0.0.1', + availableThemes: a => + a ? ['Dracula'] : ['Sepia', 'Rose Pine', 'Tokyo Night'], + getThemeIcon: (a, r, n) => + /* @__PURE__ */ e.createElement(o, { + themeName: a, + darkMode: r, + style: n, + }), + getThemeSchema: d, + }; + function d(a, r) { + return a === 'Dracula' + ? b + : a === 'Rose Pine' + ? g + : a === 'Tokyo Night' + ? f + : l; + } + return t; + }; +export { i as default }; diff --git a/packages/desktop-client/src/components/ActualPluginsProvider.tsx b/packages/desktop-client/src/components/ActualPluginsProvider.tsx new file mode 100644 index 00000000000..0d172969d4d --- /dev/null +++ b/packages/desktop-client/src/components/ActualPluginsProvider.tsx @@ -0,0 +1,151 @@ +import React, { + createContext, + type ReactNode, + useContext, + useEffect, + useState, +} from 'react'; + +import { + type ActualPlugin, + type ActualPluginEntry, +} from '../../../plugins-shared/src'; + +// Context and Provider +type ActualPluginsContextType = { + plugins: ActualPlugin[] | null; + loadPlugins: () => Promise; +}; + +const ActualPluginsContext = createContext< + ActualPluginsContextType | undefined +>(undefined); + +type ActualPluginsProviderProps = { + children: ReactNode; +}; +export function ActualPluginsProvider({ + children, +}: ActualPluginsProviderProps) { + const [plugins, setPlugins] = useState(null); + + const loadPlugins = async () => { + try { + const loaded = await Promise.all([ + loadPluginFromRepo('https://github.com/actual-plugins/example'), + ]); + setPlugins(loaded.filter(Boolean) as ActualPlugin[]); + } catch (error) { + console.error('Failed to load plugins:', error); + } + }; + + useEffect(() => { + loadPlugins(); + }, []); + + return ( + + {children} + + ); +} + +// Hook +export const useActualPlugins = () => { + const context = useContext(ActualPluginsContext); + if (!context) { + throw new Error( + 'useActualPlugins must be used within an ActualPluginsProvider', + ); + } + return context; +}; + +// Utility Functions +async function loadPluginScript(scriptBlob: Blob): Promise { + window.React = React; + + const scriptURL = URL.createObjectURL(scriptBlob); + const pluginModule = await import(/* @vite-ignore */ scriptURL); + + if (pluginModule?.default) { + const pluginEntry: ActualPluginEntry = pluginModule.default; + const plugin = pluginEntry(React); + console.log( + `Plugin “${plugin.name}” v${plugin.version} loaded successfully.`, + ); + return plugin; + } + throw new Error('Plugin script does not export a default object.'); +} + +// async function fetchLatestRelease( +// owner: string, +// repo: string, +// ): Promise<{ version: string; zipUrl: string }> { +// const apiUrl = `https://api.github.com/repos/${owner}/${repo}/releases/latest`; +// const response = await fetch(apiUrl); +// if (!response.ok) { +// throw new Error(`Failed to fetch release metadata for ${repo}`); +// } + +// const releaseData = await response.json(); +// const version = releaseData.tag_name; +// const zipUrl = releaseData.assets.filter(f => f.name.includes('.zip'))[0] +// ?.browser_download_url; + +// return { version, zipUrl }; +// } + +// function parseGitHubRepoUrl( +// url: string, +// ): { owner: string; repo: string } | null { +// try { +// const parsedUrl = new URL(url); + +// if (!parsedUrl.hostname.includes('github.com')) { +// throw new Error('Not a valid GitHub URL'); +// } + +// const pathParts = parsedUrl.pathname.split('/').filter(Boolean); +// if (pathParts.length >= 2) { +// const owner = pathParts[0]; +// const repo = pathParts[1]; +// return { owner, repo }; +// } +// throw new Error('URL does not contain owner and repository name'); +// } catch (error) { +// console.error(`Error parsing GitHub URL: ${url}`, error.message); +// return null; +// } +// } + +async function loadPluginFromRepo(repo: string): Promise { + try { + // const parsedRepo = parseGitHubRepoUrl(repo); + // if (parsedRepo == null) throw new Error(`Invalid repo ${repo}`); + + // console.log(`Checking for updates for plugin ${repo}...`); + + // const { version: latestVersion } = await fetchLatestRelease( + // parsedRepo.owner, + // parsedRepo.repo, + // ); + + // console.log(`Downloading plugin “${repo}” v${latestVersion}...`); + const response = await fetch('http://localhost:3001/index.es.js'); + + if (!response.ok) { + throw new Error(`Failed to download plugin script for ${repo}`); + } + + const indexJsBlob = await response.blob(); + + console.log(`Plugin “${repo}” loaded successfully.`); + return await loadPluginScript(indexJsBlob); + } catch (error) { + console.error(`Error loading plugin “repo}”:`, error); + return null; + } +} diff --git a/packages/desktop-client/src/components/App.tsx b/packages/desktop-client/src/components/App.tsx index 4c5895c52eb..884ca000d21 100644 --- a/packages/desktop-client/src/components/App.tsx +++ b/packages/desktop-client/src/components/App.tsx @@ -31,6 +31,7 @@ import { installPolyfills } from '../polyfills'; import { styles, hasHiddenScrollbars, ThemeStyle, useTheme } from '../style'; import { ExposeNavigate } from '../util/router-tools'; +import { ActualPluginsProvider } from './ActualPluginsProvider'; import { AppBackground } from './AppBackground'; import { BudgetMonthCountProvider } from './budget/BudgetMonthCountContext'; import { View } from './common/View'; @@ -172,47 +173,49 @@ export function App() { return ( - - - - - - - - + + + + + + + + - - {process.env.REACT_APP_REVIEW_ID && - !Platform.isPlaywright && } - - - - - + + + {process.env.REACT_APP_REVIEW_ID && + !Platform.isPlaywright && } + + + + + + - - - - - - - + + + + + + + ); } diff --git a/packages/desktop-client/src/components/ThemeSelector.tsx b/packages/desktop-client/src/components/ThemeSelector.tsx index 7e1c8600c96..31447b36dbd 100644 --- a/packages/desktop-client/src/components/ThemeSelector.tsx +++ b/packages/desktop-client/src/components/ThemeSelector.tsx @@ -1,35 +1,145 @@ -import React, { useRef, useState, type CSSProperties } from 'react'; +import { + type CSSProperties, + type SVGProps, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; import { useTranslation } from 'react-i18next'; import type { Theme } from 'loot-core/src/types/prefs'; +import { type ThemeDefinition } from '../../../plugins-shared/src'; import { SvgMoonStars, SvgSun, SvgSystem } from '../icons/v2'; -import { themeOptions, useTheme } from '../style'; +import { themeOptions, themes, useTheme } from '../style'; +import { useActualPlugins } from './ActualPluginsProvider'; import { Button } from './common/Button2'; import { Menu } from './common/Menu'; import { Popover } from './common/Popover'; +import { View } from './common/View'; import { useResponsive } from './responsive/ResponsiveProvider'; type ThemeSelectorProps = { style?: CSSProperties; }; +type ThemesExtendedType = { + [key: string]: { + name: string; + colors: ThemeDefinition; + }; +}; + +type ThemesIconsType = { + [key: string]: (props: SVGProps) => JSX.Element; +}; + export function ThemeSelector({ style }: ThemeSelectorProps) { const [theme, switchTheme] = useTheme(); const [menuOpen, setMenuOpen] = useState(false); const triggerRef = useRef(null); + const [themesExtended, setThemesExtended] = + useState(themes); + const [themeOptionsExtended, setThemeOptionsExtended] = + useState(themeOptions); const { isNarrowWidth } = useResponsive(); const { t } = useTranslation(); - const themeIcons = { - light: SvgSun, - dark: SvgMoonStars, - auto: SvgSystem, - midnight: SvgMoonStars, - development: SvgMoonStars, - } as const; + const baseIcons = useMemo( + () => ({ + light: SvgSun, + dark: SvgMoonStars, + auto: SvgSystem, + midnight: SvgMoonStars, + development: SvgMoonStars, + }), + [], + ); + const [themeIcons, setThemeIcons] = useState(baseIcons); + const { plugins: loadedPlugins } = useActualPlugins(); + + useEffect(() => { + const pluginIconsLight = + loadedPlugins?.reduce((acc, plugin) => { + if (plugin.availableThemes?.length) { + plugin.availableThemes(false).forEach(theme => { + acc = { + ...acc, + [theme]: (props: SVGProps) => + plugin?.getThemeIcon?.(theme, false, props.style) ?? , + }; + }); + } + return acc; + }, {} as ThemesIconsType) ?? ({} as ThemesIconsType); + + const pluginIconsDark = + loadedPlugins?.reduce((acc, plugin) => { + if (plugin.availableThemes?.length) { + plugin.availableThemes(true).forEach(theme => { + acc = { + ...acc, + [theme]: (props: SVGProps) => + plugin?.getThemeIcon?.(theme, true, props.style) ?? , + }; + }); + } + return acc; + }, {} as ThemesIconsType) ?? ({} as ThemesIconsType); + + const themesLight = + loadedPlugins?.reduce((acc, plugin) => { + if (plugin.availableThemes?.length) { + plugin + .availableThemes(false) + .filter(theme => theme !== undefined) + .forEach(theme => { + acc = { + ...acc, + [theme]: { + name: theme, + colors: plugin?.getThemeSchema?.(theme, false) ?? {}, + }, + }; + }); + } + return acc; + }, {} as ThemesExtendedType) ?? ({} as ThemesExtendedType); + + const themesDark = + loadedPlugins?.reduce((acc, plugin) => { + if (plugin.availableThemes?.length) { + plugin + .availableThemes(true) + .filter(theme => theme !== undefined) + .forEach(theme => { + acc = { + ...acc, + [theme]: { + name: theme, + colors: plugin?.getThemeSchema?.(theme, true) ?? {}, + }, + }; + }); + } + return acc; + }, {} as ThemesExtendedType) ?? ({} as ThemesExtendedType); + + setThemeIcons({ ...baseIcons, ...pluginIconsLight, ...pluginIconsDark }); + + setThemesExtended({ ...themes, ...themesLight, ...themesDark }); + }, [loadedPlugins, baseIcons]); + + useEffect(() => { + setThemeOptionsExtended( + Object.entries(themesExtended).map( + ([key, { name }]) => [key, name] as [Theme, string], + ), + ); + }, [themesExtended]); function onMenuSelect(newTheme: Theme) { setMenuOpen(false); @@ -62,7 +172,7 @@ export function ThemeSelector({ style }: ThemeSelectorProps) { > ({ name, text }))} + items={themeOptionsExtended.map(([name, text]) => ({ name, text }))} /> diff --git a/packages/desktop-client/src/components/settings/Themes.tsx b/packages/desktop-client/src/components/settings/Themes.tsx index 2bf5da6a3a2..37e865f3f03 100644 --- a/packages/desktop-client/src/components/settings/Themes.tsx +++ b/packages/desktop-client/src/components/settings/Themes.tsx @@ -1,18 +1,21 @@ -import React, { type ReactNode } from 'react'; +import React, { useEffect, useState, type ReactNode } from 'react'; import { useTranslation } from 'react-i18next'; import { css } from '@emotion/css'; import { type DarkTheme, type Theme } from 'loot-core/types/prefs'; +import { type ThemeDefinition } from '../../../../plugins-shared/src'; import { themeOptions, useTheme, theme as themeStyle, usePreferredDarkTheme, darkThemeOptions, + themes, } from '../../style'; import { tokens } from '../../tokens'; +import { useActualPlugins } from '../ActualPluginsProvider'; import { Select } from '../common/Select'; import { Text } from '../common/Text'; import { View } from '../common/View'; @@ -36,11 +39,73 @@ function Column({ title, children }: { title: string; children: ReactNode }) { ); } +type ThemesExtendedType = { + [key: string]: { + name: string; + colors: ThemeDefinition; + }; +}; + export function ThemeSettings() { const { t } = useTranslation(); const sidebar = useSidebar(); - const [theme, switchTheme] = useTheme(); + const [theme, switchTheme, , setThemeObject] = useTheme(); const [darkTheme, switchDarkTheme] = usePreferredDarkTheme(); + const [themesExtended, setThemesExtended] = + useState(themes); + const [themeOptionsExtended, setThemeOptionsExtended] = + useState(themeOptions); + const { plugins: loadedPlugins } = useActualPlugins(); + + useEffect(() => { + const themesLight = + loadedPlugins?.reduce((acc, plugin) => { + if (plugin.availableThemes?.length) { + plugin + .availableThemes(false) + .filter(theme => theme !== undefined) + .forEach(theme => { + acc = { + ...acc, + [theme]: { + name: theme, + colors: plugin?.getThemeSchema?.(theme, false) ?? {}, + }, + }; + }); + } + return acc; + }, {} as ThemesExtendedType) ?? ({} as ThemesExtendedType); + + const themesDark = + loadedPlugins?.reduce((acc, plugin) => { + if (plugin.availableThemes?.length) { + plugin + .availableThemes(true) + .filter(theme => theme !== undefined) + .forEach(theme => { + acc = { + ...acc, + [theme]: { + name: theme, + colors: plugin?.getThemeSchema?.(theme, true) ?? {}, + }, + }; + }); + } + return acc; + }, {} as ThemesExtendedType) ?? ({} as ThemesExtendedType); + + setThemesExtended({ ...themes, ...themesLight, ...themesDark }); + }, [loadedPlugins]); + + useEffect(() => { + setThemeOptionsExtended( + Object.entries(themesExtended).map( + ([key, { name }]) => [key, name] as [Theme, string], + ), + ); + }, [themesExtended]); return ( onChange={value => { switchTheme(value); + if ( + !Object.keys(themes).some(t => t === value) && + typeof themesExtended === 'object' + ) { + setThemeObject(JSON.stringify(themesExtended?.[value] ?? '')); + } }} value={theme} - options={themeOptions} + options={themeOptionsExtended} className={css({ '&[data-hovered]': { backgroundColor: themeStyle.buttonNormalBackgroundHover, diff --git a/packages/desktop-client/src/style/theme.tsx b/packages/desktop-client/src/style/theme.tsx index ad29777e430..dcf4d43ff2f 100644 --- a/packages/desktop-client/src/style/theme.tsx +++ b/packages/desktop-client/src/style/theme.tsx @@ -4,6 +4,8 @@ import { useEffect, useState } from 'react'; import { isNonProductionEnvironment } from 'loot-core/src/shared/environment'; import type { DarkTheme, Theme } from 'loot-core/src/types/prefs'; +import { type ThemeDefinition } from '../../../plugins-shared/src'; +import { useActualPlugins } from '../components/ActualPluginsProvider'; import { useGlobalPref } from '../hooks/useGlobalPref'; import * as darkTheme from './themes/dark'; @@ -11,7 +13,7 @@ import * as developmentTheme from './themes/development'; import * as lightTheme from './themes/light'; import * as midnightTheme from './themes/midnight'; -const themes = { +export const themes = { light: { name: 'Light', colors: lightTheme }, dark: { name: 'Dark', colors: darkTheme }, midnight: { name: 'Midnight', colors: midnightTheme }, @@ -32,7 +34,8 @@ export const darkThemeOptions = Object.entries({ export function useTheme() { const [theme = 'auto', setThemePref] = useGlobalPref('theme'); - return [theme, setThemePref] as const; + const [customTheme, setCustomTheme] = useGlobalPref('customTheme'); + return [theme, setThemePref, customTheme, setCustomTheme] as const; } export function usePreferredDarkTheme() { @@ -42,25 +45,60 @@ export function usePreferredDarkTheme() { } export function ThemeStyle() { - const [theme] = useTheme(); + const [theme, , customTheme] = useTheme(); + const [themesExtended, setThemesExtended] = useState(themes); + const [darkThemePreference] = usePreferredDarkTheme(); - const [themeColors, setThemeColors] = useState< - | typeof lightTheme - | typeof darkTheme - | typeof midnightTheme - | typeof developmentTheme - | undefined - >(undefined); + const [themeColors, setThemeColors] = useState( + undefined, + ); + + const { plugins: loadedPlugins } = useActualPlugins(); useEffect(() => { + const themesLight = + loadedPlugins?.reduce((acc, plugin) => { + if (plugin.availableThemes?.length) { + plugin.availableThemes(false).forEach(theme => { + acc[theme] = { + name: theme, + colors: plugin.getThemeSchema(theme, false), + }; + }); + } + return acc; + }, {}) ?? {}; + + const themesDark = + loadedPlugins?.reduce((acc, plugin) => { + if (plugin.availableThemes?.length) { + plugin.availableThemes(true).forEach(theme => { + acc[theme] = { + name: theme, + colors: plugin.getThemeSchema(theme, true), + }; + }); + } + return acc; + }, {}) ?? {}; + + setThemesExtended({ ...themes, ...themesLight, ...themesDark }); + }, [loadedPlugins]); + + useEffect(() => { + if (customTheme) { + setThemeColors(JSON.parse(customTheme).colors); + return; + } + if (theme === 'auto') { - const darkTheme = themes[darkThemePreference]; + const darkTheme = themesExtended[darkThemePreference]; function darkThemeMediaQueryListener(event: MediaQueryListEvent) { if (event.matches) { setThemeColors(darkTheme.colors); } else { - setThemeColors(themes['light'].colors); + setThemeColors(themesExtended['light'].colors); } } const darkThemeMediaQuery = window.matchMedia( @@ -75,7 +113,7 @@ export function ThemeStyle() { if (darkThemeMediaQuery.matches) { setThemeColors(darkTheme.colors); } else { - setThemeColors(themes['light'].colors); + setThemeColors(themesExtended['light'].colors); } return () => { @@ -85,9 +123,9 @@ export function ThemeStyle() { ); }; } else { - setThemeColors(themes[theme].colors); + setThemeColors(themesExtended[theme].colors); } - }, [theme, darkThemePreference]); + }, [theme, darkThemePreference, themesExtended, customTheme]); if (!themeColors) return null; diff --git a/packages/loot-core/src/server/main.ts b/packages/loot-core/src/server/main.ts index 89a29484f7a..4b45bf51a0a 100644 --- a/packages/loot-core/src/server/main.ts +++ b/packages/loot-core/src/server/main.ts @@ -1332,6 +1332,9 @@ handlers['save-global-prefs'] = async function (prefs) { if ('theme' in prefs) { await asyncStorage.setItem('theme', prefs.theme); } + if ('customTheme' in prefs) { + await asyncStorage.setItem('customTheme', prefs.customTheme); + } if ('preferredDarkTheme' in prefs) { await asyncStorage.setItem( 'preferred-dark-theme', @@ -1354,6 +1357,7 @@ handlers['load-global-prefs'] = async function () { [, documentDir], [, encryptKey], [, theme], + [, customTheme], [, preferredDarkTheme], [, serverSelfSignedCert], ] = await asyncStorage.multiGet([ @@ -1362,6 +1366,7 @@ handlers['load-global-prefs'] = async function () { 'document-dir', 'encrypt-key', 'theme', + 'customTheme', 'preferred-dark-theme', 'server-self-signed-cert', ]); @@ -1375,9 +1380,11 @@ handlers['load-global-prefs'] = async function () { theme === 'dark' || theme === 'auto' || theme === 'development' || - theme === 'midnight' + theme === 'midnight' || + customTheme ? theme : 'auto', + customTheme, preferredDarkTheme: preferredDarkTheme === 'dark' || preferredDarkTheme === 'midnight' ? preferredDarkTheme diff --git a/packages/loot-core/src/types/prefs.d.ts b/packages/loot-core/src/types/prefs.d.ts index 6c54362a90d..c6ab9de6dd5 100644 --- a/packages/loot-core/src/types/prefs.d.ts +++ b/packages/loot-core/src/types/prefs.d.ts @@ -70,7 +70,13 @@ export type LocalPrefs = Partial<{ 'mobile.showSpentColumn': boolean; }>; -export type Theme = 'light' | 'dark' | 'auto' | 'midnight' | 'development'; +export type Theme = + | 'light' + | 'dark' + | 'auto' + | 'midnight' + | 'development' + | string; export type DarkTheme = 'dark' | 'midnight'; export type GlobalPrefs = Partial<{ floatingSidebar: boolean; @@ -80,4 +86,5 @@ export type GlobalPrefs = Partial<{ preferredDarkTheme: DarkTheme; documentDir: string; // Electron only serverSelfSignedCert: string; // Electron only + customTheme: string; }>; diff --git a/packages/plugins-shared/.gitignore b/packages/plugins-shared/.gitignore new file mode 100644 index 00000000000..a547bf36d8d --- /dev/null +++ b/packages/plugins-shared/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/packages/plugins-shared/README.md b/packages/plugins-shared/README.md new file mode 100644 index 00000000000..3d2092114bc --- /dev/null +++ b/packages/plugins-shared/README.md @@ -0,0 +1 @@ +# plugins-shared diff --git a/packages/plugins-shared/package.json b/packages/plugins-shared/package.json new file mode 100644 index 00000000000..61a06db3ef8 --- /dev/null +++ b/packages/plugins-shared/package.json @@ -0,0 +1,20 @@ +{ + "name": "plugins-shared", + "packageManager": "yarn@4.3.1", + "main": "dist/index.cjs.js", + "module": "dist/index.es.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "vite build" + }, + "devDependencies": { + "@emotion/css": "^11.13.4", + "@types/react": "^18.2.0", + "i18next": "^23.11.5", + "react": "18.2.0", + "throttleit": "^1.0.1", + "typescript": "^5.0.0", + "vite": "^5.2.14", + "vite-plugin-dts": "4.3.0" + } +} diff --git a/packages/plugins-shared/src/globals.d.ts b/packages/plugins-shared/src/globals.d.ts new file mode 100644 index 00000000000..f9aba659ca9 --- /dev/null +++ b/packages/plugins-shared/src/globals.d.ts @@ -0,0 +1,8 @@ +import { type CSSObject } from '@emotion/css/dist/declarations/src/create-instance'; + +declare module 'react' { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + interface CSSProperties extends CSSObject {} +} + +export {}; diff --git a/packages/plugins-shared/src/index.ts b/packages/plugins-shared/src/index.ts new file mode 100644 index 00000000000..afd9c9398a7 --- /dev/null +++ b/packages/plugins-shared/src/index.ts @@ -0,0 +1,3 @@ +export type { ActualPlugin } from './interfaces/actualPlugin'; +export type { ThemeDefinition } from './interfaces/themeDefinition'; +export type { ActualPluginEntry } from './interfaces/actualPluginEntry'; diff --git a/packages/plugins-shared/src/interfaces/actualPlugin.ts b/packages/plugins-shared/src/interfaces/actualPlugin.ts new file mode 100644 index 00000000000..e29f62717ed --- /dev/null +++ b/packages/plugins-shared/src/interfaces/actualPlugin.ts @@ -0,0 +1,23 @@ +import React, { CSSProperties, ReactNode } from 'react'; + +import { ThemeDefinition } from './themeDefinition'; + +export interface ActualPlugin { + name: string; + version: string; + availableThemes?: (darkMode: boolean) => string[]; + getThemeIcon?: ( + themeName: string, + darkMode: boolean, + properties?: CSSProperties, + ) => JSX.Element; + getThemeSchema?: (themeName: string, darkMode: boolean) => ThemeDefinition; + // hooks: { + // menuItems?: () => React.ReactNode[]; + // dropdownItems?: () => React.ReactNode[]; + // pages?: () => { path: string; component: React.FC }[]; + // beforeMethod?: (methodName: string, ...args: any[]) => void; + // afterMethod?: (methodName: string, result: any, ...args: any[]) => void; + // overrideTheme?: () => string; + // }; +} diff --git a/packages/plugins-shared/src/interfaces/actualPluginEntry.ts b/packages/plugins-shared/src/interfaces/actualPluginEntry.ts new file mode 100644 index 00000000000..b8f93a0c5fa --- /dev/null +++ b/packages/plugins-shared/src/interfaces/actualPluginEntry.ts @@ -0,0 +1,5 @@ +import React from 'react'; + +import { ActualPlugin } from './actualPlugin'; + +export type ActualPluginEntry = (react: typeof React) => ActualPlugin; diff --git a/packages/plugins-shared/src/interfaces/themeDefinition.ts b/packages/plugins-shared/src/interfaces/themeDefinition.ts new file mode 100644 index 00000000000..1f41f64f4c1 --- /dev/null +++ b/packages/plugins-shared/src/interfaces/themeDefinition.ts @@ -0,0 +1,196 @@ +export interface ThemeDefinition { + pageBackground?: string; + pageBackgroundModalActive?: string; + pageBackgroundTopLeft?: string; + pageBackgroundBottomRight?: string; + pageBackgroundLineTop?: string; + pageBackgroundLineMid?: string; + pageBackgroundLineBottom?: string; + pageText?: string; + pageTextLight?: string; + pageTextSubdued?: string; + pageTextDark?: string; + pageTextPositive?: string; + pageTextLink?: string; + pageTextLinkLight?: string; + cardBackground?: string; + cardBorder?: string; + cardShadow?: string; + tableBackground?: string; + tableRowBackgroundHover?: string; + tableText?: string; + tableTextLight?: string; + tableTextSubdued?: string; + tableTextSelected?: string; + tableTextHover?: string; + tableTextInactive?: string; + tableHeaderText?: string; + tableHeaderBackground?: string; + tableBorder?: string; + tableBorderSelected?: string; + tableBorderHover?: string; + tableBorderSeparator?: string; + tableRowBackgroundHighlight?: string; + tableRowBackgroundHighlightText?: string; + tableRowHeaderBackground?: string; + tableRowHeaderText?: string; + sidebarBackground?: string; + sidebarItemBackgroundPending?: string; + sidebarItemBackgroundPositive?: string; + sidebarItemBackgroundFailed?: string; + sidebarItemAccentSelected?: string; + sidebarItemBackgroundHover?: string; + sidebarItemText?: string; + sidebarItemTextSelected?: string; + menuBackground?: string; + menuItemBackground?: string; + menuItemBackgroundHover?: string; + menuItemText?: string; + menuItemTextHover?: string; + menuItemTextSelected?: string; + menuItemTextHeader?: string; + menuBorder?: string; + menuBorderHover?: string; + menuKeybindingText?: string; + menuAutoCompleteBackground?: string; + menuAutoCompleteBackgroundHover?: string; + menuAutoCompleteText?: string; + menuAutoCompleteTextHover?: string; + menuAutoCompleteTextHeader?: string; + menuAutoCompleteItemTextHover?: string; + menuAutoCompleteItemText?: string; + modalBackground?: string; + modalBorder?: string; + mobileHeaderBackground?: string; + mobileHeaderText?: string; + mobileHeaderTextSubdued?: string; + mobileHeaderTextHover?: string; + mobilePageBackground?: string; + mobileNavBackground?: string; + mobileNavItem?: string; + mobileNavItemSelected?: string; + mobileAccountShadow?: string; + mobileAccountText?: string; + mobileTransactionSelected?: string; + mobileViewTheme?: string; + mobileConfigServerViewTheme?: string; + markdownNormal?: string; + markdownDark?: string; + markdownLight?: string; + buttonMenuText?: string; + buttonMenuTextHover?: string; + buttonMenuBackground?: string; + buttonMenuBackgroundHover?: string; + buttonMenuBorder?: string; + buttonMenuSelectedText?: string; + buttonMenuSelectedTextHover?: string; + buttonMenuSelectedBackground?: string; + buttonMenuSelectedBackgroundHover?: string; + buttonMenuSelectedBorder?: string; + buttonPrimaryText?: string; + buttonPrimaryTextHover?: string; + buttonPrimaryBackground?: string; + buttonPrimaryBackgroundHover?: string; + buttonPrimaryBorder?: string; + buttonPrimaryShadow?: string; + buttonPrimaryDisabledText?: string; + buttonPrimaryDisabledBackground?: string; + buttonPrimaryDisabledBorder?: string; + buttonNormalText?: string; + buttonNormalTextHover?: string; + buttonNormalBackground?: string; + buttonNormalBackgroundHover?: string; + buttonNormalBorder?: string; + buttonNormalShadow?: string; + buttonNormalSelectedText?: string; + buttonNormalSelectedBackground?: string; + buttonNormalDisabledText?: string; + buttonNormalDisabledBackground?: string; + buttonNormalDisabledBorder?: string; + buttonBareText?: string; + buttonBareTextHover?: string; + buttonBareBackground?: string; + buttonBareBackgroundHover?: string; + buttonBareBackgroundActive?: string; + buttonBareDisabledText?: string; + buttonBareDisabledBackground?: string; + calendarText?: string; + calendarBackground?: string; + calendarItemText?: string; + calendarItemBackground?: string; + calendarSelectedBackground?: string; + noticeBackground?: string; + noticeBackgroundLight?: string; + noticeBackgroundDark?: string; + noticeText?: string; + noticeTextLight?: string; + noticeTextDark?: string; + noticeTextMenu?: string; + noticeTextMenuHover?: string; + noticeBorder?: string; + warningBackground?: string; + warningText?: string; + warningTextLight?: string; + warningTextDark?: string; + warningBorder?: string; + errorBackground?: string; + errorText?: string; + errorTextDark?: string; + errorTextDarker?: string; + errorTextMenu?: string; + errorBorder?: string; + upcomingBackground?: string; + upcomingText?: string; + upcomingBorder?: string; + formLabelText?: string; + formLabelBackground?: string; + formInputBackground?: string; + formInputBackgroundSelected?: string; + formInputBackgroundSelection?: string; + formInputBorder?: string; + formInputTextReadOnlySelection?: string; + formInputBorderSelected?: string; + formInputText?: string; + formInputTextSelected?: string; + formInputTextPlaceholder?: string; + formInputTextPlaceholderSelected?: string; + formInputTextSelection?: string; + formInputShadowSelected?: string; + formInputTextHighlight?: string; + checkboxText?: string; + checkboxBackgroundSelected?: string; + checkboxBorderSelected?: string; + checkboxShadowSelected?: string; + checkboxToggleBackground?: string; + checkboxToggleBackgroundSelected?: string; + checkboxToggleDisabled?: string; + pillBackground?: string; + pillBackgroundLight?: string; + pillText?: string; + pillTextHighlighted?: string; + pillBorder?: string; + pillBorderDark?: string; + pillBackgroundSelected?: string; + pillTextSelected?: string; + pillBorderSelected?: string; + pillTextSubdued?: string; + reportsRed?: string; + reportsBlue?: string; + reportsGreen?: string; + reportsGray?: string; + reportsLabel?: string; + reportsInnerLabel?: string; + noteTagBackground?: string; + noteTagBackgroundHover?: string; + noteTagText?: string; + budgetOtherMonth?: string; + budgetCurrentMonth?: string; + budgetHeaderOtherMonth?: string; + budgetHeaderCurrentMonth?: string; + floatingActionBarBackground?: string; + floatingActionBarBorder?: string; + floatingActionBarText?: string; + tooltipText?: string; + tooltipBackground?: string; + tooltipBorder?: string; +} diff --git a/packages/plugins-shared/tsconfig.json b/packages/plugins-shared/tsconfig.json new file mode 100644 index 00000000000..45a4c256942 --- /dev/null +++ b/packages/plugins-shared/tsconfig.json @@ -0,0 +1,41 @@ +{ + "references": [ + ], + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "strictFunctionTypes": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "jsx": "preserve", + "types": ["vite/client", "jest"], + "allowJs": true, + "checkJs": false, + "outDir": "dist", + "moduleResolution": "Node10", + "module": "ES2022", + "noEmit": true, + "plugins": [ + { + "name": "typescript-strict-plugin", + "path": ["./packages"] + } + ] + }, + "include": ["packages/**/*"], + "exclude": [ + "node_modules", + "**/node_modules/*", + "**/dist/*", + ], + "ts-node": { + "compilerOptions": { + "module": "CommonJS" + } + } +} diff --git a/packages/plugins-shared/vite.config.mts b/packages/plugins-shared/vite.config.mts new file mode 100644 index 00000000000..5d6741802c5 --- /dev/null +++ b/packages/plugins-shared/vite.config.mts @@ -0,0 +1,29 @@ +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; + +export default defineConfig({ + plugins: [dts({ insertTypesEntry: true, include: ['src'] })], + build: { + lib: { + entry: path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + 'src/index.ts', + ), + name: 'Shared', + formats: ['es', 'cjs'], + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: ['react', 'react-dom', '@emotion/css'], + output: { + globals: { + react: 'React', + 'react-dom': 'ReactDOM', + }, + }, + }, + }, +}); diff --git a/yarn.lock b/yarn.lock index e39f9406bc8..f24309cef18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -428,6 +428,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.24.5, @babel/helper-validator-identifier@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-validator-identifier@npm:7.24.7" @@ -435,6 +442,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" @@ -487,6 +501,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.25.3": + version: 7.26.3 + resolution: "@babel/parser@npm:7.26.3" + dependencies: + "@babel/types": "npm:^7.26.3" + bin: + parser: ./bin/babel-parser.js + checksum: 10/e7e3814b2dc9ee3ed605d38223471fa7d3a84cbe9474d2b5fa7ac57dc1ddf75577b1fd3a93bf7db8f41f28869bda795cddd80223f980be23623b6434bf4c88a8 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" @@ -1500,6 +1525,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/types@npm:7.26.3" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/c31d0549630a89abfa11410bf82a318b0c87aa846fbf5f9905e47ba5e2aa44f41cc746442f105d622c519e4dc532d35a8d8080460ff4692f9fc7485fbf3a00eb + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -2632,6 +2667,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:0.3.9": version: 0.3.9 resolution: "@jridgewell/trace-mapping@npm:0.3.9" @@ -2689,6 +2731,59 @@ __metadata: languageName: node linkType: hard +"@microsoft/api-extractor-model@npm:7.30.1": + version: 7.30.1 + resolution: "@microsoft/api-extractor-model@npm:7.30.1" + dependencies: + "@microsoft/tsdoc": "npm:~0.15.1" + "@microsoft/tsdoc-config": "npm:~0.17.1" + "@rushstack/node-core-library": "npm:5.10.1" + checksum: 10/c805be8aa4e1023da06caab5af5a931ab9b7d69522a7547df05dcb9c66083af1f68866b0bb2b734778801b0b6d342e2b64e24fe4bfae39137a29538cd4601dcc + languageName: node + linkType: hard + +"@microsoft/api-extractor@npm:^7.47.11": + version: 7.48.1 + resolution: "@microsoft/api-extractor@npm:7.48.1" + dependencies: + "@microsoft/api-extractor-model": "npm:7.30.1" + "@microsoft/tsdoc": "npm:~0.15.1" + "@microsoft/tsdoc-config": "npm:~0.17.1" + "@rushstack/node-core-library": "npm:5.10.1" + "@rushstack/rig-package": "npm:0.5.3" + "@rushstack/terminal": "npm:0.14.4" + "@rushstack/ts-command-line": "npm:4.23.2" + lodash: "npm:~4.17.15" + minimatch: "npm:~3.0.3" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + source-map: "npm:~0.6.1" + typescript: "npm:5.4.2" + bin: + api-extractor: bin/api-extractor + checksum: 10/18b9dc1820d6489049d9e6db48f3eeee6028521ee90e067b155b42e38fe03e1048e914279fab0d0993e6f07f0c257579afa0b04a1145ec50b54e44f21ae9736a + languageName: node + linkType: hard + +"@microsoft/tsdoc-config@npm:~0.17.1": + version: 0.17.1 + resolution: "@microsoft/tsdoc-config@npm:0.17.1" + dependencies: + "@microsoft/tsdoc": "npm:0.15.1" + ajv: "npm:~8.12.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.2" + checksum: 10/19f57b752413916c7ad14466650f48ba1acaf674411b6a44065e93f762d391e501cb553eeb8ae3834f1f1f064ddc83a26bdbd8026c9b2c0c194fe90818078eb9 + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.15.1, @microsoft/tsdoc@npm:~0.15.1": + version: 0.15.1 + resolution: "@microsoft/tsdoc@npm:0.15.1" + checksum: 10/1a92612883088fe184dba596e7ba7a0daef0e6981caeca22bad6ad551d2247294f12e368537d0d8192525cf5743f7f15fcc2ad7b3b849f26a09a15ffdd89fd0c + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -4636,6 +4731,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.1.0": + version: 5.1.4 + resolution: "@rollup/pluginutils@npm:5.1.4" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10/598f628988af25541a9a6c6ef154aaf350f8be3238884e500cc0e47138684071abe490563c953f9bda9e8b113ecb1f99c11abfb9dbaf4f72cdd62e257a673fa3 + languageName: node + linkType: hard + "@rollup/rollup-android-arm-eabi@npm:4.9.4": version: 4.9.4 resolution: "@rollup/rollup-android-arm-eabi@npm:4.9.4" @@ -4752,6 +4863,64 @@ __metadata: languageName: node linkType: hard +"@rushstack/node-core-library@npm:5.10.1": + version: 5.10.1 + resolution: "@rushstack/node-core-library@npm:5.10.1" + dependencies: + ajv: "npm:~8.13.0" + ajv-draft-04: "npm:~1.0.0" + ajv-formats: "npm:~3.0.1" + fs-extra: "npm:~7.0.1" + import-lazy: "npm:~4.0.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/440aade872d13c4b39eeaa762bdfca713fea60d34c72f7b869db345ef9e9aed62c7f9fb175bc90684cf0d1f46e1e5cd778941baf43b01f2ee576a51f2ba2cce7 + languageName: node + linkType: hard + +"@rushstack/rig-package@npm:0.5.3": + version: 0.5.3 + resolution: "@rushstack/rig-package@npm:0.5.3" + dependencies: + resolve: "npm:~1.22.1" + strip-json-comments: "npm:~3.1.1" + checksum: 10/b58a3925a41d7a0e79f4fde7c400a379683cc7b0073c447aba6d36231529a37e7d2f4559f459be785ad862ecb01b618b2d0ff60661046e5223437356155ccb14 + languageName: node + linkType: hard + +"@rushstack/terminal@npm:0.14.4": + version: 0.14.4 + resolution: "@rushstack/terminal@npm:0.14.4" + dependencies: + "@rushstack/node-core-library": "npm:5.10.1" + supports-color: "npm:~8.1.1" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/aede44b4255225777acd7887b1adba7b8cca578fe9adf4283c5591a0f28dbd45fb38f6b5f04a56973828e28da6a9d951da046bcb4f576d5fa360c8893cac6861 + languageName: node + linkType: hard + +"@rushstack/ts-command-line@npm:4.23.2": + version: 4.23.2 + resolution: "@rushstack/ts-command-line@npm:4.23.2" + dependencies: + "@rushstack/terminal": "npm:0.14.4" + "@types/argparse": "npm:1.0.38" + argparse: "npm:~1.0.9" + string-argv: "npm:~0.3.1" + checksum: 10/583cd23d2d3e3e9772184764a1a7e50dcb863fe1c6affefe196a935a69c64aaaa32cc71aa3fb55fb2dfbd353cc25db3f0b9999b79bbe13b75ee476a51cb48717 + languageName: node + linkType: hard + "@sideway/address@npm:^4.1.3": version: 4.1.4 resolution: "@sideway/address@npm:4.1.4" @@ -5258,6 +5427,13 @@ __metadata: languageName: node linkType: hard +"@types/argparse@npm:1.0.38": + version: 1.0.38 + resolution: "@types/argparse@npm:1.0.38" + checksum: 10/26ed7e3f1e3595efdb883a852f5205f971b798e4c28b7e30a32c5298eee596e8b45834ce831f014d250b9730819ab05acff5b31229666d3af4ba465b4697d0eb + languageName: node + linkType: hard + "@types/aria-query@npm:^5.0.1": version: 5.0.1 resolution: "@types/aria-query@npm:5.0.1" @@ -6066,6 +6242,94 @@ __metadata: languageName: node linkType: hard +"@volar/language-core@npm:2.4.11, @volar/language-core@npm:~2.4.1": + version: 2.4.11 + resolution: "@volar/language-core@npm:2.4.11" + dependencies: + "@volar/source-map": "npm:2.4.11" + checksum: 10/cda5959642eb469ad6c57c3d7ad731503fc3b1f82bc57c3511cc6c925138fe1f6f3ef253ddf1cc6bd3bdd63d8a5943396b337e97ecd8afec8f486ac79db5f258 + languageName: node + linkType: hard + +"@volar/source-map@npm:2.4.11": + version: 2.4.11 + resolution: "@volar/source-map@npm:2.4.11" + checksum: 10/689803b2e788bdfda45a7994605798e8ed5ae7bb1116912db5e8f8c8a18000c0c66ebfae5ce33d3ac4cd3a7e171819253511232ed1eb20b1781b4aaed806d100 + languageName: node + linkType: hard + +"@volar/typescript@npm:^2.4.4": + version: 2.4.11 + resolution: "@volar/typescript@npm:2.4.11" + dependencies: + "@volar/language-core": "npm:2.4.11" + path-browserify: "npm:^1.0.1" + vscode-uri: "npm:^3.0.8" + checksum: 10/fe4be5497a8c12ddf25ee681cb47a3acc78cff4190ed6da7763c6a42f4fb5497cd99fb276ac0e849a70e49c05f9fea73127b10ca3b1a62ed3a33a67c4297215c + languageName: node + linkType: hard + +"@vue/compiler-core@npm:3.5.13": + version: 3.5.13 + resolution: "@vue/compiler-core@npm:3.5.13" + dependencies: + "@babel/parser": "npm:^7.25.3" + "@vue/shared": "npm:3.5.13" + entities: "npm:^4.5.0" + estree-walker: "npm:^2.0.2" + source-map-js: "npm:^1.2.0" + checksum: 10/22f042bb47c8a1edb9d602e24da8092ab542d5640f0459a9b99ecf35f90e96678f870209dd30f774f5340c6d817d3c5a46ca49cefb9659ee5b228bd42d1f076a + languageName: node + linkType: hard + +"@vue/compiler-dom@npm:^3.4.0": + version: 3.5.13 + resolution: "@vue/compiler-dom@npm:3.5.13" + dependencies: + "@vue/compiler-core": "npm:3.5.13" + "@vue/shared": "npm:3.5.13" + checksum: 10/5dc628c52091264a443c2d7326b759d7d3999c7e9c00078c2eb370b778e60b9f2ef258a8decf2fd97c8fa0923f895d449eabc1e5bc3d8a45d3ef99c9eb0599d7 + languageName: node + linkType: hard + +"@vue/compiler-vue2@npm:^2.7.16": + version: 2.7.16 + resolution: "@vue/compiler-vue2@npm:2.7.16" + dependencies: + de-indent: "npm:^1.0.2" + he: "npm:^1.2.0" + checksum: 10/739ad06be19206b2715707c226a070509bcf28c31b539a6fc932d220eb7b0c09109d71fded573ed0c4073429793a3513ca4a4e69ad4f7afc0c5bc3c28639e871 + languageName: node + linkType: hard + +"@vue/language-core@npm:2.1.6": + version: 2.1.6 + resolution: "@vue/language-core@npm:2.1.6" + dependencies: + "@volar/language-core": "npm:~2.4.1" + "@vue/compiler-dom": "npm:^3.4.0" + "@vue/compiler-vue2": "npm:^2.7.16" + "@vue/shared": "npm:^3.4.0" + computeds: "npm:^0.0.1" + minimatch: "npm:^9.0.3" + muggle-string: "npm:^0.4.1" + path-browserify: "npm:^1.0.1" + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/640d4af0031975620cd3a8050bb4b0f4ed333f241ded195e3bf8c4e571c720b4e3bec3947caf2b10e4e2de19deb7621982d15439de3732d510cd43e325c74a50 + languageName: node + linkType: hard + +"@vue/shared@npm:3.5.13, @vue/shared@npm:^3.4.0": + version: 3.5.13 + resolution: "@vue/shared@npm:3.5.13" + checksum: 10/5c0c24f443533392dde08c3e4272ff2e19af9762f90baeaa808850e05106537bbd9e2d2ad2081d979b8c4bc89902395b46036b67f74c60b76025924de37833b1 + languageName: node + linkType: hard + "@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": version: 1.12.1 resolution: "@webassemblyjs/ast@npm:1.12.1" @@ -6419,6 +6683,32 @@ __metadata: languageName: node linkType: hard +"ajv-draft-04@npm:~1.0.0": + version: 1.0.0 + resolution: "ajv-draft-04@npm:1.0.0" + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10/3f11fa0e7f7359bef6608657f02ab78e9cc62b1fb7bdd860db0d00351b3863a1189c1a23b72466d2d82726cab4eb20725c76f5e7c134a89865e2bfd0e6828137 + languageName: node + linkType: hard + +"ajv-formats@npm:~3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10/5679b9f9ced9d0213a202a37f3aa91efcffe59a6de1a6e3da5c873344d3c161820a1f11cc29899661fee36271fd2895dd3851b6461c902a752ad661d1c1e8722 + languageName: node + linkType: hard + "ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" @@ -6440,7 +6730,19 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.6.0": +"ajv@npm:^8.0.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10/ee3c62162c953e91986c838f004132b6a253d700f1e51253b99791e2dbfdb39161bc950ebdc2f156f8568035bb5ed8be7bd78289cd9ecbf3381fe8f5b82e3f33 + languageName: node + linkType: hard + +"ajv@npm:^8.6.0, ajv@npm:~8.12.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -6452,6 +6754,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:~8.13.0": + version: 8.13.0 + resolution: "ajv@npm:8.13.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.4.1" + checksum: 10/4ada268c9a6e44be87fd295df0f0a91267a7bae8dbc8a67a2d5799c3cb459232839c99d18b035597bb6e3ffe88af6979f7daece854f590a81ebbbc2dfa80002c + languageName: node + linkType: hard + "ansi-escapes@npm:^4.2.1": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -6604,7 +6918,7 @@ __metadata: languageName: node linkType: hard -"argparse@npm:^1.0.7": +"argparse@npm:^1.0.7, argparse@npm:~1.0.9": version: 1.0.10 resolution: "argparse@npm:1.0.10" dependencies: @@ -7924,6 +8238,13 @@ __metadata: languageName: node linkType: hard +"compare-versions@npm:^6.1.1": + version: 6.1.1 + resolution: "compare-versions@npm:6.1.1" + checksum: 10/9325c0fadfba81afa0ec17e6fc2ef823ba785c693089698b8d9374e5460509f1916a88591644d4cb4045c9a58e47fafbcc0724fe8bf446d2a875a3d6eeddf165 + languageName: node + linkType: hard + "compute-scroll-into-view@npm:^2.0.4": version: 2.0.4 resolution: "compute-scroll-into-view@npm:2.0.4" @@ -7931,6 +8252,13 @@ __metadata: languageName: node linkType: hard +"computeds@npm:^0.0.1": + version: 0.0.1 + resolution: "computeds@npm:0.0.1" + checksum: 10/738625ccec6e483124d0ac79ec5474ab5c9df103ea05afc1fd840eed7d9004e3d6009b7bc806df564d66ad915c1ee1fb017bd91b2b32606a252ea9870b6a4026 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -8405,6 +8733,13 @@ __metadata: languageName: node linkType: hard +"de-indent@npm:^1.0.2": + version: 1.0.2 + resolution: "de-indent@npm:1.0.2" + checksum: 10/30bf43744dca005f9252dbb34ed95dcb3c30dfe52bfed84973b89c29eccff04e27769f222a34c61a93354acf47457785e9032e6184be390ed1d324fb9ab3f427 + languageName: node + linkType: hard + "debounce@npm:^1.2.1": version: 1.2.1 resolution: "debounce@npm:1.2.1" @@ -8442,6 +8777,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.6": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 + languageName: node + linkType: hard + "decimal.js-light@npm:^2.4.1": version: 2.5.1 resolution: "decimal.js-light@npm:2.5.1" @@ -9123,7 +9470,7 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.2.0, entities@npm:^4.4.0": +"entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 10/ede2a35c9bce1aeccd055a1b445d41c75a14a2bb1cd22e242f20cf04d236cdcd7f9c859eb83f76885327bfae0c25bf03303665ee1ce3d47c5927b98b0e3e3d48 @@ -10238,6 +10585,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 10/92487c75848b03edc45517fca0148287d342c30818ce43d556391db774d8e01644fb6964315a3336eec5a90f301b218b21f71fb9b2528ba25757435a20392c95 + languageName: node + linkType: hard + "fastest-levenshtein@npm:^1.0.12": version: 1.0.16 resolution: "fastest-levenshtein@npm:1.0.16" @@ -10508,6 +10862,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:~7.0.1": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 10/3fc6e56ba2f07c00d452163f27f21a7076b72ef7da8a50fef004336d59ef4c34deda11d10ecd73fd8fbcf20e4f575f52857293090b3c9f8741d4e0598be30fea + languageName: node + linkType: hard + "fs-merger@npm:^3.2.1": version: 3.2.1 resolution: "fs-merger@npm:3.2.1" @@ -11129,6 +11494,15 @@ __metadata: languageName: node linkType: hard +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 10/d09b2243da4e23f53336e8de3093e5c43d2c39f8d0d18817abfa32ce3e9355391b2edb4bb5edc376aea5d4b0b59d6a0482aab4c52bc02ef95751e4b818e847f1 + languageName: node + linkType: hard + "heimdalljs-logger@npm:^0.1.10, heimdalljs-logger@npm:^0.1.7": version: 0.1.10 resolution: "heimdalljs-logger@npm:0.1.10" @@ -11409,6 +11783,13 @@ __metadata: languageName: node linkType: hard +"import-lazy@npm:~4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 10/943309cc8eb01ada12700448c288b0384f77a1bc33c7e00fa4cb223c665f467a13ce9aaceb8d2e4cf586b07c1d2828040263dcc069873ce63cfc2ac6fd087971 + languageName: node + linkType: hard + "import-local@npm:^3.0.2": version: 3.1.0 resolution: "import-local@npm:3.1.0" @@ -11638,6 +12019,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.16.0": + version: 2.16.0 + resolution: "is-core-module@npm:2.16.0" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10/064442b9eefb7162376a4a414aa98b1e0c6cbb471507e66966b7d6d607a3f60eb09c7da4ee401648640a389e4af0f5a770bd5b3cd9c1084853e4a57f472408f8 + languageName: node + linkType: hard + "is-data-view@npm:^1.0.1": version: 1.0.1 resolution: "is-data-view@npm:1.0.1" @@ -12848,6 +13238,13 @@ __metadata: languageName: node linkType: hard +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 10/1067ff8ce02221faac5a842116ed0ec79a53312a111d0bf8342a80bd02c0a3fdf0b8449694a65947db0a3e8420e8b326dffb489c7dd5866efc380c0d1708a707 + languageName: node + linkType: hard + "joi@npm:^17.4.0": version: 17.9.2 resolution: "joi@npm:17.9.2" @@ -13125,6 +13522,13 @@ __metadata: languageName: node linkType: hard +"kolorist@npm:^1.8.0": + version: 1.8.0 + resolution: "kolorist@npm:1.8.0" + checksum: 10/71d5d122951cc65f2f14c3e1d7f8fd91694b374647d4f6deec3816d018cd04a44edd9578d93e00c82c2053b925e5d30a0565746c4171f4ca9fce1a13bd5f3315 + languageName: node + linkType: hard + "language-subtag-registry@npm:^0.3.20": version: 0.3.23 resolution: "language-subtag-registry@npm:0.3.23" @@ -13305,7 +13709,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.7.0": +"lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.7.0, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 @@ -13512,6 +13916,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.11": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10/2f71af2b0afd78c2e9012a29b066d2c8ba45a9cd0c8070f7fd72de982fb1c403b4e3afdb1dae00691d56885ede66b772ef6bedf765e02e3a7066208fe2fec4aa + languageName: node + linkType: hard + "magic-string@npm:^0.30.3, magic-string@npm:^0.30.5": version: 0.30.5 resolution: "magic-string@npm:0.30.5" @@ -14302,6 +14715,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:~3.0.3": + version: 3.0.8 + resolution: "minimatch@npm:3.0.8" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10/6df5373cb1ea79020beb6887ff5576c58cfabcfd32c5a65c2cf58f326e4ee8eae84f129e5fa50b8a4347fa1d1e583f931285c9fb3040d984bdfb5109ef6607ec + languageName: node + linkType: hard + "minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -14485,13 +14907,20 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d languageName: node linkType: hard +"muggle-string@npm:^0.4.1": + version: 0.4.1 + resolution: "muggle-string@npm:0.4.1" + checksum: 10/8fa2ea08f497c04069718bd3fd1909b382114dacbad832d10967ca72690de43f5f8492d8ccfbf827d6be63868ed5fc10395e7b7c082aa95997eea498586c6620 + languageName: node + linkType: hard + "murmurhash@npm:^2.0.1": version: 2.0.1 resolution: "murmurhash@npm:2.0.1" @@ -15323,6 +15752,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10/ce617b8da36797d09c0baacb96ca8a44460452c89362d7cb8f70ca46b4158ba8bc3606912de7c818eb4a939f7f9015cef3c766ec8a0c6bfc725fdc078e39c717 + languageName: node + linkType: hard + "pidtree@npm:^0.3.0": version: 0.3.1 resolution: "pidtree@npm:0.3.1" @@ -15449,6 +15885,21 @@ __metadata: languageName: node linkType: hard +"plugins-shared@workspace:packages/plugins-shared": + version: 0.0.0-use.local + resolution: "plugins-shared@workspace:packages/plugins-shared" + dependencies: + "@emotion/css": "npm:^11.13.4" + "@types/react": "npm:^18.2.0" + i18next: "npm:^23.11.5" + react: "npm:18.2.0" + throttleit: "npm:^1.0.1" + typescript: "npm:^5.0.0" + vite: "npm:^5.2.14" + vite-plugin-dts: "npm:4.3.0" + languageName: unknown + linkType: soft + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -16631,6 +17082,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:~1.22.1, resolve@npm:~1.22.2": + version: 1.22.9 + resolution: "resolve@npm:1.22.9" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/787b122cffd34944e8e899dc6f934278142df9f47c1228672cf80d21791364f0a9ff17b766374e9e83b78dee1cf4ded28d8387d264343861db77dc1141c5ec78 + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" @@ -16657,6 +17121,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": + version: 1.22.9 + resolution: "resolve@patch:resolve@npm%3A1.22.9#optional!builtin::version=1.22.9&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/423e54ddf58784c85ba2382f1e982f57e55dc19967f348214e1e6bc80d2fdbdaef35453d1a6a3c31810ac5e4e87e05ad9f5b3a3b1f117d3e673de313690eb54a + languageName: node + linkType: hard + "responselike@npm:^2.0.0": version: 2.0.1 resolution: "responselike@npm:2.0.1" @@ -17003,6 +17480,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:~7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 10/985dec0d372370229a262c737063860fabd4a1c730662c1ea3200a2f649117761a42184c96df62a0e885e76fbd5dace41087d6c1ac0351b13c0df5d6bcb1b5ac + languageName: node + linkType: hard + "serialize-error@npm:^7.0.1": version: 7.0.1 resolution: "serialize-error@npm:7.0.1" @@ -17317,7 +17805,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 @@ -17517,7 +18005,7 @@ __metadata: languageName: node linkType: hard -"string-argv@npm:~0.3.2": +"string-argv@npm:~0.3.1, string-argv@npm:~0.3.2": version: 0.3.2 resolution: "string-argv@npm:0.3.2" checksum: 10/f9d3addf887026b4b5f997a271149e93bf71efc8692e7dc0816e8807f960b18bcb9787b45beedf0f97ff459575ee389af3f189d8b649834cac602f2e857e75af @@ -17767,7 +18255,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 10/492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -17842,7 +18330,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0": +"supports-color@npm:^8.0.0, supports-color@npm:~8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -18580,6 +19068,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.4.2": + version: 5.4.2 + resolution: "typescript@npm:5.4.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/f8cfdc630ab1672f004e9561eb2916935b2d267792d07ce93e97fc601c7a65191af32033d5e9c0169b7dc37da7db9bf320f7432bc84527cb7697effaa4e4559d + languageName: node + linkType: hard + "typescript@npm:^4.0.2": version: 4.9.5 resolution: "typescript@npm:4.9.5" @@ -18590,6 +19088,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.0.0": + version: 5.7.2 + resolution: "typescript@npm:5.7.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/4caa3904df69db9d4a8bedc31bafc1e19ffb7b24fbde2997a1633ae1398d0de5bdbf8daf602ccf3b23faddf1aeeb9b795223a2ed9c9a4fdcaf07bfde114a401a + languageName: node + linkType: hard + "typescript@npm:^5.0.4, typescript@npm:^5.5.4": version: 5.5.4 resolution: "typescript@npm:5.5.4" @@ -18600,6 +19108,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A5.4.2#optional!builtin": + version: 5.4.2 + resolution: "typescript@patch:typescript@npm%3A5.4.2#optional!builtin::version=5.4.2&hash=5adc0c" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/f5f9a4133c2670761f0166eae5b3bafbc4a3fc24f0f42a93c9c893d9e9d6e66ea066969c5e7483fa66b4ae0e99125592553f3b92fd3599484de8be13b0615176 + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^4.0.2#optional!builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" @@ -18610,6 +19128,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A^5.0.0#optional!builtin": + version: 5.7.2 + resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=379a07" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/ff27fc124bceb8969be722baa38af945b2505767cf794de3e2715e58f61b43780284060287d651fcbbdfb6f917f4653b20f4751991f17e0706db389b9bb3f75d + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin": version: 5.5.4 resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" @@ -18914,7 +19442,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2": +"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -19192,6 +19720,29 @@ __metadata: languageName: node linkType: hard +"vite-plugin-dts@npm:4.3.0": + version: 4.3.0 + resolution: "vite-plugin-dts@npm:4.3.0" + dependencies: + "@microsoft/api-extractor": "npm:^7.47.11" + "@rollup/pluginutils": "npm:^5.1.0" + "@volar/typescript": "npm:^2.4.4" + "@vue/language-core": "npm:2.1.6" + compare-versions: "npm:^6.1.1" + debug: "npm:^4.3.6" + kolorist: "npm:^1.8.0" + local-pkg: "npm:^0.5.0" + magic-string: "npm:^0.30.11" + peerDependencies: + typescript: "*" + vite: "*" + peerDependenciesMeta: + vite: + optional: true + checksum: 10/bbf59fb9d4ab9420f3fd2be2090439a072c4a57194cf6ee987ae990d1d95e2d9b16fae1a7c26578705d6a396a81eb6346ec522216e1f7cfc4f4d891fc29bd839 + languageName: node + linkType: hard + "vite-plugin-pwa@npm:^0.20.0": version: 0.20.0 resolution: "vite-plugin-pwa@npm:0.20.0" @@ -19329,6 +19880,13 @@ __metadata: languageName: node linkType: hard +"vscode-uri@npm:^3.0.8": + version: 3.0.8 + resolution: "vscode-uri@npm:3.0.8" + checksum: 10/e882d6b679e0d053cbc042893c0951a135d899a192b62cd07f0a8924f11ae722067a8d6b1b5b147034becf57faf9fff9fb543b17b749fd0f17db1f54f783f07c + languageName: node + linkType: hard + "w3c-hr-time@npm:^1.0.2": version: 1.0.2 resolution: "w3c-hr-time@npm:1.0.2" From 73f3c0381ffc3a4651bfc4f79cba43083aa8abec Mon Sep 17 00:00:00 2001 From: Leandro Menezes Date: Wed, 18 Dec 2024 01:02:41 -0300 Subject: [PATCH 2/8] removed hardcoded plugin url --- .../desktop-client/src/components/ActualPluginsProvider.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/desktop-client/src/components/ActualPluginsProvider.tsx b/packages/desktop-client/src/components/ActualPluginsProvider.tsx index 0d172969d4d..996ff5130d7 100644 --- a/packages/desktop-client/src/components/ActualPluginsProvider.tsx +++ b/packages/desktop-client/src/components/ActualPluginsProvider.tsx @@ -134,7 +134,7 @@ async function loadPluginFromRepo(repo: string): Promise { // ); // console.log(`Downloading plugin “${repo}” v${latestVersion}...`); - const response = await fetch('http://localhost:3001/index.es.js'); + const response = await fetch('/index.es.js'); if (!response.ok) { throw new Error(`Failed to download plugin script for ${repo}`); @@ -145,7 +145,7 @@ async function loadPluginFromRepo(repo: string): Promise { console.log(`Plugin “${repo}” loaded successfully.`); return await loadPluginScript(indexJsBlob); } catch (error) { - console.error(`Error loading plugin “repo}”:`, error); + console.error(`Error loading plugin “${repo}”:`, error); return null; } } From aedf42da0600b1873dc68c1ec14a2bce5ecd6895 Mon Sep 17 00:00:00 2001 From: Leandro Menezes Date: Wed, 18 Dec 2024 08:48:50 -0300 Subject: [PATCH 3/8] small fix --- packages/desktop-client/src/components/settings/Themes.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/desktop-client/src/components/settings/Themes.tsx b/packages/desktop-client/src/components/settings/Themes.tsx index 37e865f3f03..d29e3db60cc 100644 --- a/packages/desktop-client/src/components/settings/Themes.tsx +++ b/packages/desktop-client/src/components/settings/Themes.tsx @@ -133,6 +133,8 @@ export function ThemeSettings() { typeof themesExtended === 'object' ) { setThemeObject(JSON.stringify(themesExtended?.[value] ?? '')); + } else { + setThemeObject(null); } }} value={theme} From 79da15cb7ef429a438832d7519d5780bb3d08f5e Mon Sep 17 00:00:00 2001 From: Leandro Menezes Date: Wed, 18 Dec 2024 08:51:12 -0300 Subject: [PATCH 4/8] md --- upcoming-release-notes/4001.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 upcoming-release-notes/4001.md diff --git a/upcoming-release-notes/4001.md b/upcoming-release-notes/4001.md new file mode 100644 index 00000000000..338a1abd961 --- /dev/null +++ b/upcoming-release-notes/4001.md @@ -0,0 +1,6 @@ +--- +category: Features +authors: [lelemm] +--- + +Plugin support for Actual Budget. From fde6c5042771e4158b05deccb30bb7c30319d4e6 Mon Sep 17 00:00:00 2001 From: Leandro Menezes Date: Wed, 18 Dec 2024 08:55:44 -0300 Subject: [PATCH 5/8] typecheck fix --- packages/loot-core/src/types/prefs.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/loot-core/src/types/prefs.d.ts b/packages/loot-core/src/types/prefs.d.ts index c6ab9de6dd5..da4e44bf59e 100644 --- a/packages/loot-core/src/types/prefs.d.ts +++ b/packages/loot-core/src/types/prefs.d.ts @@ -86,5 +86,5 @@ export type GlobalPrefs = Partial<{ preferredDarkTheme: DarkTheme; documentDir: string; // Electron only serverSelfSignedCert: string; // Electron only - customTheme: string; + customTheme: string | null; }>; From 933c48537cbc6d8051e166ad40881df55f976bfc Mon Sep 17 00:00:00 2001 From: Leandro Menezes Date: Wed, 18 Dec 2024 09:33:05 -0300 Subject: [PATCH 6/8] removed unused parameters --- .../src/components/settings/Themes.tsx | 27 +++---------------- packages/desktop-client/src/style/theme.tsx | 21 +++------------ .../src/interfaces/actualPlugin.ts | 4 +-- 3 files changed, 10 insertions(+), 42 deletions(-) diff --git a/packages/desktop-client/src/components/settings/Themes.tsx b/packages/desktop-client/src/components/settings/Themes.tsx index d29e3db60cc..c7b0eeec0a4 100644 --- a/packages/desktop-client/src/components/settings/Themes.tsx +++ b/packages/desktop-client/src/components/settings/Themes.tsx @@ -58,18 +58,18 @@ export function ThemeSettings() { const { plugins: loadedPlugins } = useActualPlugins(); useEffect(() => { - const themesLight = + const customThemes = loadedPlugins?.reduce((acc, plugin) => { if (plugin.availableThemes?.length) { plugin - .availableThemes(false) + .availableThemes() .filter(theme => theme !== undefined) .forEach(theme => { acc = { ...acc, [theme]: { name: theme, - colors: plugin?.getThemeSchema?.(theme, false) ?? {}, + colors: plugin?.getThemeSchema?.(theme) ?? {}, }, }; }); @@ -77,26 +77,7 @@ export function ThemeSettings() { return acc; }, {} as ThemesExtendedType) ?? ({} as ThemesExtendedType); - const themesDark = - loadedPlugins?.reduce((acc, plugin) => { - if (plugin.availableThemes?.length) { - plugin - .availableThemes(true) - .filter(theme => theme !== undefined) - .forEach(theme => { - acc = { - ...acc, - [theme]: { - name: theme, - colors: plugin?.getThemeSchema?.(theme, true) ?? {}, - }, - }; - }); - } - return acc; - }, {} as ThemesExtendedType) ?? ({} as ThemesExtendedType); - - setThemesExtended({ ...themes, ...themesLight, ...themesDark }); + setThemesExtended({ ...themes, ...customThemes }); }, [loadedPlugins]); useEffect(() => { diff --git a/packages/desktop-client/src/style/theme.tsx b/packages/desktop-client/src/style/theme.tsx index dcf4d43ff2f..7730b4016db 100644 --- a/packages/desktop-client/src/style/theme.tsx +++ b/packages/desktop-client/src/style/theme.tsx @@ -56,33 +56,20 @@ export function ThemeStyle() { const { plugins: loadedPlugins } = useActualPlugins(); useEffect(() => { - const themesLight = + const customThemes = loadedPlugins?.reduce((acc, plugin) => { if (plugin.availableThemes?.length) { - plugin.availableThemes(false).forEach(theme => { + plugin.availableThemes().forEach(theme => { acc[theme] = { name: theme, - colors: plugin.getThemeSchema(theme, false), + colors: plugin.getThemeSchema(theme), }; }); } return acc; }, {}) ?? {}; - const themesDark = - loadedPlugins?.reduce((acc, plugin) => { - if (plugin.availableThemes?.length) { - plugin.availableThemes(true).forEach(theme => { - acc[theme] = { - name: theme, - colors: plugin.getThemeSchema(theme, true), - }; - }); - } - return acc; - }, {}) ?? {}; - - setThemesExtended({ ...themes, ...themesLight, ...themesDark }); + setThemesExtended({ ...themes, ...customThemes }); }, [loadedPlugins]); useEffect(() => { diff --git a/packages/plugins-shared/src/interfaces/actualPlugin.ts b/packages/plugins-shared/src/interfaces/actualPlugin.ts index e29f62717ed..939f76fe855 100644 --- a/packages/plugins-shared/src/interfaces/actualPlugin.ts +++ b/packages/plugins-shared/src/interfaces/actualPlugin.ts @@ -5,13 +5,13 @@ import { ThemeDefinition } from './themeDefinition'; export interface ActualPlugin { name: string; version: string; - availableThemes?: (darkMode: boolean) => string[]; + availableThemes?: () => string[]; getThemeIcon?: ( themeName: string, darkMode: boolean, properties?: CSSProperties, ) => JSX.Element; - getThemeSchema?: (themeName: string, darkMode: boolean) => ThemeDefinition; + getThemeSchema?: (themeName: string) => ThemeDefinition; // hooks: { // menuItems?: () => React.ReactNode[]; // dropdownItems?: () => React.ReactNode[]; From 768268f06c867dc377f52a3b964f0490922b0f76 Mon Sep 17 00:00:00 2001 From: Leandro Menezes Date: Wed, 18 Dec 2024 10:34:49 -0300 Subject: [PATCH 7/8] small changes --- packages/desktop-client/public/index.es.js | 1659 ++++++++--------- .../src/components/ThemeSelector.tsx | 49 +- packages/plugins-shared/package.json | 5 +- packages/plugins-shared/src/index.ts | 2 + .../src/interfaces/actualPlugin.ts | 6 +- .../src/interfaces/actualPluginManifest.ts | 8 + 6 files changed, 849 insertions(+), 880 deletions(-) create mode 100644 packages/plugins-shared/src/interfaces/actualPluginManifest.ts diff --git a/packages/desktop-client/public/index.es.js b/packages/desktop-client/public/index.es.js index 40f4a6f0c99..263959a87f6 100644 --- a/packages/desktop-client/public/index.es.js +++ b/packages/desktop-client/public/index.es.js @@ -1,835 +1,830 @@ -const c = e => t => - /* @__PURE__ */ e.createElement( - 'svg', - { - ...t, - xmlns: 'http://www.w3.org/2000/svg', - viewBox: '0 0 20 20', - style: { - color: 'inherit', - ...t.style, - }, - }, - /* @__PURE__ */ e.createElement('path', { - d: 'M11 9.27V0l6 11-4 6H7l-4-6L9 0v9.27a2 2 0 1 0 2 0zM6 18h8v2H6v-2z', - fill: 'currentColor', - }), - ), - u = e => { - const o = c(e); - return ({ themeName: d, darkMode: a, style: r }) => { - switch (d) { - case 'dracula': - return /* @__PURE__ */ e.createElement(o, { style: r }); - } - return /* @__PURE__ */ e.createElement('div', { style: r }); - }; - }, - b = { - // Page - pageBackground: '#282a36', - // Dark background - pageBackgroundModalActive: '#44475a', - // Slightly lighter modal background - pageBackgroundTopLeft: '#44475a', - pageBackgroundBottomRight: '#6272a4', - // Muted blue for a gradient - pageBackgroundLineTop: '#bd93f9', - // Purple - pageBackgroundLineMid: '#6272a4', - // Muted blue - pageBackgroundLineBottom: '#ff79c6', - // Pink - pageText: '#f8f8f2', - // Light text - pageTextLight: '#bd93f9', - // Purple for lighter tone - pageTextSubdued: '#6272a4', - // Comments - pageTextDark: '#ff79c6', - // Pink for emphasis - pageTextPositive: '#50fa7b', - // Green for positivity - pageTextLink: '#8be9fd', - // Cyan for links - pageTextLinkLight: '#50fa7b', - // Light green for hover links - // Card - cardBackground: '#44475a', - // Current line background - cardBorder: '#bd93f9', - // Purple border - cardShadow: 'rgba(0, 0, 0, 0.5)', - // Slight shadow - // Table - tableBackground: '#282a36', - tableRowBackgroundHover: '#44475a', - tableRowBackgroundHighlight: '#ff79c6', - // Pink highlight - tableRowBackgroundHighlightText: '#282a36', - tableText: '#f8f8f2', - tableTextLight: '#bd93f9', - tableTextSubdued: '#6272a4', - tableTextSelected: '#50fa7b', - // Green selection - tableTextHover: '#ff79c6', - tableTextInactive: '#6272a4', - tableHeaderText: '#8be9fd', - // Cyan header text - tableHeaderBackground: '#44475a', - tableBorder: '#6272a4', - tableBorderSelected: '#bd93f9', - tableBorderHover: '#50fa7b', - tableBorderSeparator: '#44475a', - // Sidebar - sidebarBackground: '#282a36', - sidebarItemBackgroundPending: '#ffb86c', - // Orange pending - sidebarItemBackgroundPositive: '#50fa7b', - // Green for success - sidebarItemBackgroundFailed: '#ff5555', - // Red for failure - sidebarItemBackgroundHover: '#44475a', - sidebarItemAccentSelected: '#ff79c6', - sidebarItemText: '#f8f8f2', - sidebarItemTextSelected: '#ff79c6', - // Menu - menuBackground: '#44475a', - menuItemBackground: '#282a36', - menuItemBackgroundHover: '#6272a4', - menuItemText: '#f8f8f2', - menuItemTextHover: '#ff79c6', - menuItemTextSelected: '#50fa7b', - menuItemTextHeader: '#bd93f9', - menuBorder: '#6272a4', - menuBorderHover: '#ff79c6', - menuKeybindingText: '#8be9fd', - // Cyan for keybindings - menuAutoCompleteBackground: '#282a36', - menuAutoCompleteBackgroundHover: '#44475a', - menuAutoCompleteText: '#f8f8f2', - menuAutoCompleteTextHover: '#50fa7b', - menuAutoCompleteTextHeader: '#ffb86c', - menuAutoCompleteItemTextHover: '#ff79c6', - menuAutoCompleteItemText: '#f8f8f2', - // Modal - modalBackground: '#44475a', - modalBorder: '#6272a4', - // Mobile - mobileHeaderBackground: '#44475a', - mobileHeaderText: '#ff79c6', - mobileHeaderTextSubdued: '#6272a4', - mobileHeaderTextHover: 'rgba(255, 121, 198, 0.15)', - mobilePageBackground: '#282a36', - mobileNavBackground: '#44475a', - mobileNavItem: '#6272a4', - mobileNavItemSelected: '#ff79c6', - mobileAccountShadow: 'rgba(0, 0, 0, 0.6)', - mobileAccountText: '#8be9fd', - mobileTransactionSelected: '#50fa7b', - // Mobile Themes - mobileViewTheme: '#44475a', - mobileConfigServerViewTheme: '#ff79c6', - // Markdown - markdownNormal: '#ff79c6', - markdownDark: '#bd93f9', - markdownLight: '#50fa7b', - // Buttons - buttonMenuText: '#f8f8f2', - buttonMenuTextHover: '#ff79c6', - buttonMenuBackground: 'transparent', - buttonMenuBackgroundHover: 'rgba(255, 121, 198, 0.2)', - buttonMenuBorder: '#bd93f9', - buttonMenuSelectedText: '#282a36', - buttonMenuSelectedTextHover: '#282a36', - buttonMenuSelectedBackground: '#50fa7b', - buttonMenuSelectedBackgroundHover: '#6272a4', - buttonMenuSelectedBorder: '#50fa7b', - buttonPrimaryText: '#282a36', - buttonPrimaryTextHover: '#282a36', - buttonPrimaryBackground: '#50fa7b', - buttonPrimaryBackgroundHover: '#8be9fd', - buttonPrimaryBorder: '#50fa7b', - buttonPrimaryShadow: 'rgba(0, 0, 0, 0.6)', - buttonPrimaryDisabledText: '#6272a4', - buttonPrimaryDisabledBackground: '#44475a', - buttonPrimaryDisabledBorder: '#6272a4', - buttonNormalText: '#f8f8f2', - buttonNormalTextHover: '#ff79c6', - buttonNormalBackground: '#44475a', - buttonNormalBackgroundHover: '#6272a4', - buttonNormalBorder: '#6272a4', - buttonNormalShadow: 'rgba(0, 0, 0, 0.3)', - buttonNormalDisabledText: '#6272a4', - buttonNormalDisabledBackground: '#282a36', - buttonNormalDisabledBorder: '#6272a4', - buttonBareText: '#f8f8f2', - buttonBareTextHover: '#ff79c6', - buttonBareBackground: 'transparent', - buttonBareBackgroundHover: 'rgba(255, 121, 198, 0.2)', - buttonBareBackgroundActive: 'rgba(255, 121, 198, 0.3)', - buttonBareDisabledText: '#6272a4', - buttonBareDisabledBackground: 'transparent', - // Calendar - calendarText: '#f8f8f2', - calendarBackground: '#282a36', - calendarItemText: '#f8f8f2', - calendarItemBackground: '#44475a', - calendarSelectedBackground: '#bd93f9', - // Notices - noticeBackground: '#50fa7b', - noticeText: '#282a36', - noticeBorder: '#6272a4', - warningBackground: '#ffb86c', - warningText: '#282a36', - warningBorder: '#bd93f9', - errorBackground: '#ff5555', - errorText: '#282a36', - errorBorder: '#ff79c6', - upcomingBackground: '#bd93f9', - upcomingText: '#282a36', - upcomingBorder: '#ff79c6', - // Form - formLabelText: '#8be9fd', - formLabelBackground: '#44475a', - formInputBackground: '#44475a', - formInputBackgroundSelected: '#6272a4', - formInputBackgroundSelection: '#50fa7b', - formInputBorder: '#bd93f9', - formInputText: '#f8f8f2', - formInputTextSelected: '#50fa7b', - formInputTextPlaceholder: '#6272a4', - formInputTextHighlight: '#ff79c6', - formInputShadowSelected: 'rgba(189, 147, 249, 0.5)', - // Miscellaneous - pillBackground: '#44475a', - pillBackgroundLight: '#6272a4', - pillText: '#f8f8f2', - pillTextHighlighted: '#ff79c6', - pillBorder: '#bd93f9', - pillBackgroundSelected: '#50fa7b', - pillTextSelected: '#282a36', - pillBorderSelected: '#50fa7b', - pillTextSubdued: '#6272a4', - reportsRed: '#ff5555', - reportsBlue: '#8be9fd', - reportsGreen: '#50fa7b', - reportsGray: '#6272a4', - reportsLabel: '#f8f8f2', - reportsInnerLabel: '#bd93f9', - noteTagBackground: '#44475a', - noteTagBackgroundHover: '#6272a4', - noteTagText: '#8be9fd', - floatingActionBarBackground: '#44475a', - floatingActionBarBorder: '#bd93f9', - floatingActionBarText: '#f8f8f2', - tooltipText: '#f8f8f2', - tooltipBackground: '#44475a', - tooltipBorder: '#bd93f9', - }, - l = { - // Page - pageBackground: '#f4ecd8', - // Light sepia background - pageBackgroundModalActive: '#e8dcc0', - // Slightly darker modal - pageBackgroundTopLeft: '#f3e4c8', - pageBackgroundBottomRight: '#d9c7a5', - pageBackgroundLineTop: '#bfa786', - pageBackgroundLineMid: '#a39077', - pageBackgroundLineBottom: '#8c7b65', - pageText: '#5c4b3b', - // Dark brown for text - pageTextLight: '#7d6c5b', - pageTextSubdued: '#a08e7b', - pageTextDark: '#3d2f25', - pageTextPositive: '#9b7e5a', - // Muted warm sepia - pageTextLink: '#8c6f4d', - pageTextLinkLight: '#af8b67', - // Card - cardBackground: '#ede1c8', - cardBorder: '#d3b997', - cardShadow: 'rgba(75, 60, 45, 0.3)', - // Table - tableBackground: '#f4ecd8', - tableRowBackgroundHover: '#e2d4b7', - tableRowBackgroundHighlight: '#d9c7a5', - tableRowBackgroundHighlightText: '#5c4b3b', - tableText: '#5c4b3b', - tableTextLight: '#8c7b65', - tableTextSubdued: '#a08e7b', - tableTextSelected: '#9b7e5a', - tableTextHover: '#7d6c5b', - tableTextInactive: '#bfa786', - tableHeaderText: '#7c6a53', - tableHeaderBackground: '#ede1c8', - tableBorder: '#d3b997', - tableBorderSelected: '#b89d7d', - tableBorderHover: '#a89072', - tableBorderSeparator: '#c5b299', - // Sidebar - sidebarBackground: '#f4ecd8', - sidebarItemBackgroundPending: '#bfa786', - sidebarItemBackgroundPositive: '#9b7e5a', - sidebarItemBackgroundFailed: '#a67c52', - sidebarItemBackgroundHover: '#e2d4b7', - sidebarItemAccentSelected: '#8c6f4d', - sidebarItemText: '#5c4b3b', - sidebarItemTextSelected: '#7c6a53', - // Menu - menuBackground: '#e8dcc0', - menuItemBackground: '#ede1c8', - menuItemBackgroundHover: '#d9c7a5', - menuItemText: '#5c4b3b', - menuItemTextHover: '#7d6c5b', - menuItemTextSelected: '#9b7e5a', - menuItemTextHeader: '#8c6f4d', - menuBorder: '#d3b997', - menuBorderHover: '#bfa786', - menuKeybindingText: '#a08e7b', - menuAutoCompleteBackground: '#f3e4c8', - menuAutoCompleteBackgroundHover: '#e2d4b7', - menuAutoCompleteText: '#5c4b3b', - menuAutoCompleteTextHover: '#9b7e5a', - menuAutoCompleteTextHeader: '#bfa786', - menuAutoCompleteItemTextHover: '#7d6c5b', - menuAutoCompleteItemText: '#5c4b3b', - // Modal - modalBackground: '#ede1c8', - modalBorder: '#d3b997', - // Mobile - mobileHeaderBackground: '#d9c7a5', - mobileHeaderText: '#5c4b3b', - mobileHeaderTextSubdued: '#7c6a53', - mobileHeaderTextHover: 'rgba(140, 111, 77, 0.2)', - mobilePageBackground: '#f4ecd8', - mobileNavBackground: '#e8dcc0', - mobileNavItem: '#a08e7b', - mobileNavItemSelected: '#9b7e5a', - mobileAccountShadow: 'rgba(75, 60, 45, 0.2)', - mobileAccountText: '#8c6f4d', - mobileTransactionSelected: '#b89d7d', - // Mobile Themes - mobileViewTheme: '#e2d4b7', - mobileConfigServerViewTheme: '#a67c52', - // Markdown - markdownNormal: '#8c6f4d', - markdownDark: '#5c4b3b', - markdownLight: '#bfa786', - // Buttons - buttonMenuText: '#5c4b3b', - buttonMenuTextHover: '#7d6c5b', - buttonMenuBackground: 'transparent', - buttonMenuBackgroundHover: 'rgba(140, 111, 77, 0.2)', - buttonMenuBorder: '#9b7e5a', - buttonMenuSelectedText: '#f4ecd8', - buttonMenuSelectedTextHover: '#f4ecd8', - buttonMenuSelectedBackground: '#8c6f4d', - buttonMenuSelectedBackgroundHover: '#9b7e5a', - buttonMenuSelectedBorder: '#9b7e5a', - buttonPrimaryText: '#f4ecd8', - buttonPrimaryTextHover: '#f4ecd8', - buttonPrimaryBackground: '#8c6f4d', - buttonPrimaryBackgroundHover: '#7d6c5b', - buttonPrimaryBorder: '#9b7e5a', - buttonPrimaryShadow: 'rgba(75, 60, 45, 0.4)', - buttonPrimaryDisabledText: '#bfa786', - buttonPrimaryDisabledBackground: '#d9c7a5', - buttonPrimaryDisabledBorder: '#c5b299', - buttonNormalText: '#5c4b3b', - buttonNormalTextHover: '#7d6c5b', - buttonNormalBackground: '#ede1c8', - buttonNormalBackgroundHover: '#e2d4b7', - buttonNormalBorder: '#d3b997', - buttonNormalShadow: 'rgba(75, 60, 45, 0.3)', - buttonNormalDisabledText: '#bfa786', - buttonNormalDisabledBackground: '#e8dcc0', - buttonNormalDisabledBorder: '#c5b299', - buttonBareText: '#5c4b3b', - buttonBareTextHover: '#7d6c5b', - buttonBareBackground: 'transparent', - buttonBareBackgroundHover: 'rgba(140, 111, 77, 0.2)', - buttonBareBackgroundActive: 'rgba(140, 111, 77, 0.3)', - buttonBareDisabledText: '#a08e7b', - buttonBareDisabledBackground: 'transparent', - // Calendar - calendarText: '#5c4b3b', - calendarBackground: '#f4ecd8', - calendarItemText: '#7d6c5b', - calendarItemBackground: '#d9c7a5', - calendarSelectedBackground: '#bfa786', - // Notices - noticeBackground: '#d9c7a5', - noticeText: '#5c4b3b', - noticeBorder: '#bfa786', - warningBackground: '#b89d7d', - warningText: '#5c4b3b', - warningBorder: '#a67c52', - errorBackground: '#a67c52', - errorText: '#f4ecd8', - errorBorder: '#8c6f4d', - upcomingBackground: '#c5b299', - upcomingText: '#5c4b3b', - upcomingBorder: '#9b7e5a', - // Form - formLabelText: '#8c6f4d', - formLabelBackground: '#ede1c8', - formInputBackground: '#e8dcc0', - formInputBackgroundSelected: '#d3b997', - formInputBackgroundSelection: '#bfa786', - formInputBorder: '#c5b299', - formInputText: '#5c4b3b', - formInputTextSelected: '#3d2f25', - formInputTextPlaceholder: '#a08e7b', - formInputTextHighlight: '#8c6f4d', - formInputShadowSelected: 'rgba(140, 111, 77, 0.3)', - // Miscellaneous - pillBackground: '#e2d4b7', - pillBackgroundLight: '#ede1c8', - pillText: '#5c4b3b', - pillTextHighlighted: '#7d6c5b', - pillBorder: '#bfa786', - pillBackgroundSelected: '#c5b299', - pillTextSelected: '#3d2f25', - pillBorderSelected: '#9b7e5a', - pillTextSubdued: '#a08e7b', - reportsRed: '#a67c52', - reportsBlue: '#9b7e5a', - reportsGreen: '#8c6f4d', - reportsGray: '#bfa786', - reportsLabel: '#5c4b3b', - reportsInnerLabel: '#7d6c5b', - noteTagBackground: '#e2d4b7', - noteTagBackgroundHover: '#d3b997', - noteTagText: '#5c4b3b', - floatingActionBarBackground: '#ede1c8', - floatingActionBarBorder: '#bfa786', - floatingActionBarText: '#5c4b3b', - tooltipText: '#5c4b3b', - tooltipBackground: '#d9c7a5', - tooltipBorder: '#bfa786', - }, - g = { - // Page - pageBackground: '#191724', - // Base background - pageBackgroundModalActive: '#1f1d2e', - // Surface - pageBackgroundTopLeft: '#191724', - pageBackgroundBottomRight: '#26233a', - pageBackgroundLineTop: '#eb6f92', - // Rose - pageBackgroundLineMid: '#9ccfd8', - // Foam - pageBackgroundLineBottom: '#c4a7e7', - // Iris - pageText: '#e0def4', - pageTextLight: '#908caa', - // Subtle - pageTextSubdued: '#6e6a86', - // Muted - pageTextDark: '#f6c177', - // Gold - pageTextPositive: '#31748f', - // Pine - pageTextLink: '#ebbcba', - // Love - pageTextLinkLight: '#9ccfd8', - // Foam - // Card - cardBackground: '#1f1d2e', - cardBorder: '#c4a7e7', - cardShadow: 'rgba(0, 0, 0, 0.5)', - // Table - tableBackground: '#1f1d2e', - tableRowBackgroundHover: '#26233a', - tableText: '#e0def4', - tableTextLight: '#908caa', - tableTextSubdued: '#6e6a86', - tableTextSelected: '#c4a7e7', - tableTextHover: '#f6c177', - tableTextInactive: '#6e6a86', - tableHeaderText: '#9ccfd8', - tableHeaderBackground: '#191724', - tableBorder: '#6e6a86', - tableBorderSelected: '#c4a7e7', - tableBorderHover: '#f6c177', - tableBorderSeparator: '#6e6a86', - tableRowBackgroundHighlight: '#31748f', - tableRowBackgroundHighlightText: '#e0def4', - tableRowHeaderBackground: '#26233a', - tableRowHeaderText: '#f6c177', - // Sidebar - sidebarBackground: '#191724', - sidebarItemBackgroundPending: '#f6c177', - sidebarItemBackgroundPositive: '#31748f', - sidebarItemBackgroundFailed: '#eb6f92', - sidebarItemAccentSelected: '#c4a7e7', - sidebarItemBackgroundHover: '#26233a', - sidebarItemText: '#e0def4', - sidebarItemTextSelected: '#ebbcba', - // Menu - menuBackground: '#26233a', - menuItemBackground: '#1f1d2e', - menuItemBackgroundHover: '#31748f', - menuItemText: '#e0def4', - menuItemTextHover: '#f6c177', - menuItemTextSelected: '#c4a7e7', - menuItemTextHeader: '#9ccfd8', - menuBorder: '#6e6a86', - menuBorderHover: '#c4a7e7', - menuKeybindingText: '#9ccfd8', - menuAutoCompleteBackground: '#1f1d2e', - menuAutoCompleteBackgroundHover: '#26233a', - menuAutoCompleteText: '#e0def4', - menuAutoCompleteTextHover: '#c4a7e7', - menuAutoCompleteTextHeader: '#f6c177', - menuAutoCompleteItemTextHover: '#f6c177', - menuAutoCompleteItemText: '#e0def4', - // Modal - modalBackground: '#1f1d2e', - modalBorder: '#c4a7e7', - // Mobile - mobileHeaderBackground: '#26233a', - mobileHeaderText: '#f6c177', - mobileHeaderTextSubdued: '#6e6a86', - mobileHeaderTextHover: 'rgba(246, 193, 119, 0.2)', - mobilePageBackground: '#191724', - mobileNavBackground: '#1f1d2e', - mobileNavItem: '#6e6a86', - mobileNavItemSelected: '#c4a7e7', - mobileAccountShadow: 'rgba(0, 0, 0, 0.5)', - mobileAccountText: '#9ccfd8', - mobileTransactionSelected: '#ebbcba', - // Mobile Themes - mobileViewTheme: '#26233a', - mobileConfigServerViewTheme: '#c4a7e7', - // Markdown - markdownNormal: '#ebbcba', - markdownDark: '#eb6f92', - markdownLight: '#c4a7e7', - // Buttons - buttonMenuText: '#e0def4', - buttonMenuTextHover: '#f6c177', - buttonMenuBackground: 'transparent', - buttonMenuBackgroundHover: 'rgba(246, 193, 119, 0.2)', - buttonMenuBorder: '#9ccfd8', - buttonMenuSelectedText: '#191724', - buttonMenuSelectedTextHover: '#191724', - buttonMenuSelectedBackground: '#f6c177', - buttonMenuSelectedBackgroundHover: '#ebbcba', - buttonMenuSelectedBorder: '#f6c177', - buttonPrimaryText: '#191724', - buttonPrimaryTextHover: '#191724', - buttonPrimaryBackground: '#f6c177', - buttonPrimaryBackgroundHover: '#ebbcba', - buttonPrimaryBorder: '#f6c177', - buttonPrimaryShadow: 'rgba(0, 0, 0, 0.5)', - buttonPrimaryDisabledText: '#6e6a86', - buttonPrimaryDisabledBackground: '#26233a', - buttonPrimaryDisabledBorder: '#6e6a86', - buttonNormalText: '#e0def4', - buttonNormalTextHover: '#f6c177', - buttonNormalBackground: '#26233a', - buttonNormalBackgroundHover: '#31748f', - buttonNormalBorder: '#9ccfd8', - buttonNormalShadow: 'rgba(0, 0, 0, 0.3)', - buttonNormalSelectedText: '#191724', - buttonNormalSelectedBackground: '#c4a7e7', - buttonNormalDisabledText: '#6e6a86', - buttonNormalDisabledBackground: '#1f1d2e', - buttonNormalDisabledBorder: '#6e6a86', - buttonBareText: '#e0def4', - buttonBareTextHover: '#f6c177', - buttonBareBackground: 'transparent', - buttonBareBackgroundHover: 'rgba(246, 193, 119, 0.2)', - buttonBareBackgroundActive: 'rgba(246, 193, 119, 0.3)', - buttonBareDisabledText: '#6e6a86', - buttonBareDisabledBackground: 'transparent', - // Calendar - calendarText: '#e0def4', - calendarBackground: '#191724', - calendarItemText: '#e0def4', - calendarItemBackground: '#1f1d2e', - calendarSelectedBackground: '#c4a7e7', - // Notices - noticeBackground: '#f6c177', - noticeBackgroundLight: '#f4a261', - noticeBackgroundDark: '#ebbcba', - noticeText: '#191724', - noticeTextLight: '#6e6a86', - noticeTextDark: '#9ccfd8', - noticeTextMenu: '#eb6f92', - noticeTextMenuHover: '#f6c177', - noticeBorder: '#c4a7e7', - warningBackground: '#ebbcba', - warningText: '#191724', - warningTextLight: '#f6c177', - warningTextDark: '#c4a7e7', - warningBorder: '#eb6f92', - errorBackground: '#eb6f92', - errorText: '#191724', - errorTextDark: '#c4a7e7', - errorTextDarker: '#c4a7e7', - errorTextMenu: '#f6c177', - errorBorder: '#ebbcba', - upcomingBackground: '#c4a7e7', - upcomingText: '#191724', - upcomingBorder: '#9ccfd8', - // Form - formLabelText: '#9ccfd8', - formLabelBackground: '#26233a', - formInputBackground: '#1f1d2e', - formInputBackgroundSelected: '#26233a', - formInputBackgroundSelection: '#c4a7e7', - formInputBorder: '#9ccfd8', - formInputTextReadOnlySelection: '#6e6a86', - formInputBorderSelected: '#f6c177', - formInputText: '#e0def4', - formInputTextSelected: '#ebbcba', - formInputTextPlaceholder: '#6e6a86', - formInputTextPlaceholderSelected: '#9ccfd8', - formInputTextSelection: '#c4a7e7', - formInputShadowSelected: 'rgba(189, 147, 249, 0.5)', - formInputTextHighlight: '#f6c177', - // Checkbox - checkboxText: '#e0def4', - checkboxBackgroundSelected: '#9ccfd8', - checkboxBorderSelected: '#c4a7e7', - checkboxShadowSelected: 'rgba(0, 0, 0, 0.4)', - checkboxToggleBackground: '#6e6a86', - checkboxToggleBackgroundSelected: '#c4a7e7', - checkboxToggleDisabled: '#26233a', - // Pill - pillBackground: '#26233a', - pillBackgroundLight: '#1f1d2e', - pillText: '#e0def4', - pillTextHighlighted: '#f6c177', - pillBorder: '#9ccfd8', - pillBorderDark: '#6e6a86', - pillBackgroundSelected: '#c4a7e7', - pillTextSelected: '#191724', - pillBorderSelected: '#f6c177', - pillTextSubdued: '#6e6a86', - // Reports - reportsRed: '#eb6f92', - reportsBlue: '#9ccfd8', - reportsGreen: '#31748f', - reportsGray: '#6e6a86', - reportsLabel: '#e0def4', - reportsInnerLabel: '#908caa', - // Misc - noteTagBackground: '#26233a', - noteTagBackgroundHover: '#1f1d2e', - noteTagText: '#f6c177', - floatingActionBarBackground: '#26233a', - floatingActionBarBorder: '#c4a7e7', - floatingActionBarText: '#e0def4', - tooltipText: '#e0def4', - tooltipBackground: '#1f1d2e', - tooltipBorder: '#c4a7e7', - // Budget - budgetOtherMonth: '#1f1d2e', - budgetCurrentMonth: '#26233a', - budgetHeaderOtherMonth: '#6e6a86', - budgetHeaderCurrentMonth: '#c4a7e7', - }, - f = { - // Page - pageBackground: '#1a1b26', - // Dark navy blue - pageBackgroundModalActive: '#16161e', - // Deeper navy for modal - pageBackgroundTopLeft: '#1f2335', - // Slightly lighter navy - pageBackgroundBottomRight: '#16161e', - // Dark navy - pageBackgroundLineTop: '#7aa2f7', - // Light blue - pageBackgroundLineMid: '#565f89', - // Grayish blue - pageBackgroundLineBottom: '#9ece6a', - // Soft green - pageText: '#c0caf5', - // Light gray-blue - pageTextLight: '#a9b1d6', - // Subtle light gray - pageTextSubdued: '#565f89', - // Muted gray-blue - pageTextDark: '#f7768e', - // Rose red - pageTextPositive: '#9ece6a', - // Green - pageTextLink: '#7aa2f7', - // Light blue - pageTextLinkLight: '#bb9af7', - // Purple - // Card - cardBackground: '#1f2335', - // Surface color - cardBorder: '#565f89', - cardShadow: 'rgba(0, 0, 0, 0.5)', - // Table - tableBackground: '#1a1b26', - tableRowBackgroundHover: '#1f2335', - tableRowBackgroundHighlight: '#7aa2f7', - tableRowBackgroundHighlightText: '#c0caf5', - tableText: '#c0caf5', - tableTextLight: '#a9b1d6', - tableTextSubdued: '#565f89', - tableTextSelected: '#bb9af7', - // Purple - tableTextHover: '#7dcfff', - // Cyan - tableTextInactive: '#414868', - tableHeaderText: '#7aa2f7', - tableHeaderBackground: '#1f2335', - tableBorder: '#565f89', - tableBorderSelected: '#7aa2f7', - tableBorderHover: '#9ece6a', - tableBorderSeparator: '#414868', - tableRowHeaderBackground: '#1a1b26', - tableRowHeaderText: '#c0caf5', - // Sidebar - sidebarBackground: '#1a1b26', - sidebarItemBackgroundPending: '#f7768e', - sidebarItemBackgroundPositive: '#9ece6a', - sidebarItemBackgroundFailed: '#f7768e', - sidebarItemAccentSelected: '#bb9af7', - sidebarItemBackgroundHover: '#26233a', - sidebarItemText: '#c0caf5', - sidebarItemTextSelected: '#7aa2f7', - // Menu - menuBackground: '#1f2335', - menuItemBackground: '#1a1b26', - menuItemBackgroundHover: '#7dcfff', - menuItemText: '#c0caf5', - menuItemTextHover: '#9ece6a', - menuItemTextSelected: '#bb9af7', - menuItemTextHeader: '#7dcfff', - menuBorder: '#414868', - menuBorderHover: '#7aa2f7', - menuKeybindingText: '#565f89', - menuAutoCompleteBackground: '#1f2335', - menuAutoCompleteBackgroundHover: '#26233a', - menuAutoCompleteText: '#c0caf5', - menuAutoCompleteTextHover: '#7dcfff', - menuAutoCompleteTextHeader: '#f7768e', - menuAutoCompleteItemTextHover: '#9ece6a', - menuAutoCompleteItemText: '#c0caf5', - // Modal - modalBackground: '#1f2335', - modalBorder: '#565f89', - // Mobile - mobileHeaderBackground: '#16161e', - mobileHeaderText: '#7aa2f7', - mobileHeaderTextSubdued: '#565f89', - mobileHeaderTextHover: 'rgba(122, 162, 247, 0.2)', - mobilePageBackground: '#1a1b26', - mobileNavBackground: '#1f2335', - mobileNavItem: '#565f89', - mobileNavItemSelected: '#7aa2f7', - mobileAccountShadow: 'rgba(0, 0, 0, 0.5)', - mobileAccountText: '#bb9af7', - mobileTransactionSelected: '#f7768e', - // Buttons - buttonMenuText: '#c0caf5', - buttonMenuTextHover: '#7aa2f7', - buttonMenuBackground: 'transparent', - buttonMenuBackgroundHover: 'rgba(122, 162, 247, 0.2)', - buttonMenuBorder: '#414868', - buttonMenuSelectedText: '#1a1b26', - buttonMenuSelectedTextHover: '#1a1b26', - buttonMenuSelectedBackground: '#7aa2f7', - buttonMenuSelectedBackgroundHover: '#7dcfff', - buttonMenuSelectedBorder: '#7aa2f7', - buttonPrimaryText: '#1a1b26', - buttonPrimaryTextHover: '#1a1b26', - buttonPrimaryBackground: '#7aa2f7', - buttonPrimaryBackgroundHover: '#7dcfff', - buttonPrimaryBorder: '#7aa2f7', - buttonPrimaryShadow: 'rgba(0, 0, 0, 0.5)', - buttonPrimaryDisabledText: '#565f89', - buttonPrimaryDisabledBackground: '#16161e', - buttonPrimaryDisabledBorder: '#414868', - buttonNormalText: '#c0caf5', - buttonNormalTextHover: '#7aa2f7', - buttonNormalBackground: '#1f2335', - buttonNormalBackgroundHover: '#26233a', - buttonNormalBorder: '#565f89', - buttonNormalShadow: 'rgba(0, 0, 0, 0.3)', - buttonNormalSelectedText: '#1a1b26', - buttonNormalSelectedBackground: '#bb9af7', - buttonNormalDisabledText: '#565f89', - buttonNormalDisabledBackground: '#16161e', - buttonNormalDisabledBorder: '#414868', - buttonBareText: '#c0caf5', - buttonBareTextHover: '#7aa2f7', - buttonBareBackground: 'transparent', - buttonBareBackgroundHover: 'rgba(122, 162, 247, 0.2)', - buttonBareBackgroundActive: 'rgba(122, 162, 247, 0.3)', - buttonBareDisabledText: '#565f89', - buttonBareDisabledBackground: 'transparent', - // Calendar - calendarText: '#c0caf5', - calendarBackground: '#1a1b26', - calendarItemText: '#c0caf5', - calendarItemBackground: '#1f2335', - calendarSelectedBackground: '#7aa2f7', - // Notices - noticeBackground: '#7aa2f7', - noticeBackgroundLight: '#9ece6a', - noticeBackgroundDark: '#414868', - noticeText: '#1a1b26', - noticeTextLight: '#c0caf5', - noticeTextDark: '#f7768e', - noticeTextMenu: '#7aa2f7', - noticeTextMenuHover: '#9ece6a', - noticeBorder: '#565f89', - // Form - formLabelText: '#7aa2f7', - formLabelBackground: '#1f2335', - formInputBackground: '#1a1b26', - formInputBackgroundSelected: '#26233a', - formInputBackgroundSelection: '#7aa2f7', - formInputBorder: '#565f89', - formInputTextReadOnlySelection: '#414868', - formInputBorderSelected: '#7aa2f7', - formInputText: '#c0caf5', - formInputTextSelected: '#9ece6a', - formInputTextPlaceholder: '#565f89', - formInputTextPlaceholderSelected: '#7dcfff', - formInputShadowSelected: 'rgba(122, 162, 247, 0.5)', - // Miscellaneous - tooltipText: '#c0caf5', - tooltipBackground: '#1a1b26', - tooltipBorder: '#7aa2f7', +const c = (e) => (a) => /* @__PURE__ */ e.createElement( + "svg", + { + ...a, + xmlns: "http://www.w3.org/2000/svg", + viewBox: "0 0 20 20", + style: { + color: "inherit", + ...a.style + } }, - i = e => { - const o = u(e), - t = { - name: 'Example', - version: '0.0.1', - availableThemes: a => - a ? ['Dracula'] : ['Sepia', 'Rose Pine', 'Tokyo Night'], - getThemeIcon: (a, r, n) => - /* @__PURE__ */ e.createElement(o, { - themeName: a, - darkMode: r, - style: n, - }), - getThemeSchema: d, - }; - function d(a, r) { - return a === 'Dracula' - ? b - : a === 'Rose Pine' - ? g - : a === 'Tokyo Night' - ? f - : l; + /* @__PURE__ */ e.createElement( + "path", + { + d: "M11 9.27V0l6 11-4 6H7l-4-6L9 0v9.27a2 2 0 1 0 2 0zM6 18h8v2H6v-2z", + fill: "currentColor" + } + ) +), u = (e) => { + const t = c(e); + return ({ themeName: d, darkMode: r, style: o }) => { + switch (d) { + case "dracula": + return /* @__PURE__ */ e.createElement(t, { style: o }); } - return t; + return /* @__PURE__ */ e.createElement("div", { style: o }); }; -export { i as default }; +}, b = { + // Page + pageBackground: "#282a36", + // Dark background + pageBackgroundModalActive: "#44475a", + // Slightly lighter modal background + pageBackgroundTopLeft: "#44475a", + pageBackgroundBottomRight: "#6272a4", + // Muted blue for a gradient + pageBackgroundLineTop: "#bd93f9", + // Purple + pageBackgroundLineMid: "#6272a4", + // Muted blue + pageBackgroundLineBottom: "#ff79c6", + // Pink + pageText: "#f8f8f2", + // Light text + pageTextLight: "#bd93f9", + // Purple for lighter tone + pageTextSubdued: "#6272a4", + // Comments + pageTextDark: "#ff79c6", + // Pink for emphasis + pageTextPositive: "#50fa7b", + // Green for positivity + pageTextLink: "#8be9fd", + // Cyan for links + pageTextLinkLight: "#50fa7b", + // Light green for hover links + // Card + cardBackground: "#44475a", + // Current line background + cardBorder: "#bd93f9", + // Purple border + cardShadow: "rgba(0, 0, 0, 0.5)", + // Slight shadow + // Table + tableBackground: "#282a36", + tableRowBackgroundHover: "#44475a", + tableRowBackgroundHighlight: "#ff79c6", + // Pink highlight + tableRowBackgroundHighlightText: "#282a36", + tableText: "#f8f8f2", + tableTextLight: "#bd93f9", + tableTextSubdued: "#6272a4", + tableTextSelected: "#50fa7b", + // Green selection + tableTextHover: "#ff79c6", + tableTextInactive: "#6272a4", + tableHeaderText: "#8be9fd", + // Cyan header text + tableHeaderBackground: "#44475a", + tableBorder: "#6272a4", + tableBorderSelected: "#bd93f9", + tableBorderHover: "#50fa7b", + tableBorderSeparator: "#44475a", + // Sidebar + sidebarBackground: "#282a36", + sidebarItemBackgroundPending: "#ffb86c", + // Orange pending + sidebarItemBackgroundPositive: "#50fa7b", + // Green for success + sidebarItemBackgroundFailed: "#ff5555", + // Red for failure + sidebarItemBackgroundHover: "#44475a", + sidebarItemAccentSelected: "#ff79c6", + sidebarItemText: "#f8f8f2", + sidebarItemTextSelected: "#ff79c6", + // Menu + menuBackground: "#44475a", + menuItemBackground: "#282a36", + menuItemBackgroundHover: "#6272a4", + menuItemText: "#f8f8f2", + menuItemTextHover: "#ff79c6", + menuItemTextSelected: "#50fa7b", + menuItemTextHeader: "#bd93f9", + menuBorder: "#6272a4", + menuBorderHover: "#ff79c6", + menuKeybindingText: "#8be9fd", + // Cyan for keybindings + menuAutoCompleteBackground: "#282a36", + menuAutoCompleteBackgroundHover: "#44475a", + menuAutoCompleteText: "#f8f8f2", + menuAutoCompleteTextHover: "#50fa7b", + menuAutoCompleteTextHeader: "#ffb86c", + menuAutoCompleteItemTextHover: "#ff79c6", + menuAutoCompleteItemText: "#f8f8f2", + // Modal + modalBackground: "#44475a", + modalBorder: "#6272a4", + // Mobile + mobileHeaderBackground: "#44475a", + mobileHeaderText: "#ff79c6", + mobileHeaderTextSubdued: "#6272a4", + mobileHeaderTextHover: "rgba(255, 121, 198, 0.15)", + mobilePageBackground: "#282a36", + mobileNavBackground: "#44475a", + mobileNavItem: "#6272a4", + mobileNavItemSelected: "#ff79c6", + mobileAccountShadow: "rgba(0, 0, 0, 0.6)", + mobileAccountText: "#8be9fd", + mobileTransactionSelected: "#50fa7b", + // Mobile Themes + mobileViewTheme: "#44475a", + mobileConfigServerViewTheme: "#ff79c6", + // Markdown + markdownNormal: "#ff79c6", + markdownDark: "#bd93f9", + markdownLight: "#50fa7b", + // Buttons + buttonMenuText: "#f8f8f2", + buttonMenuTextHover: "#ff79c6", + buttonMenuBackground: "transparent", + buttonMenuBackgroundHover: "rgba(255, 121, 198, 0.2)", + buttonMenuBorder: "#bd93f9", + buttonMenuSelectedText: "#282a36", + buttonMenuSelectedTextHover: "#282a36", + buttonMenuSelectedBackground: "#50fa7b", + buttonMenuSelectedBackgroundHover: "#6272a4", + buttonMenuSelectedBorder: "#50fa7b", + buttonPrimaryText: "#282a36", + buttonPrimaryTextHover: "#282a36", + buttonPrimaryBackground: "#50fa7b", + buttonPrimaryBackgroundHover: "#8be9fd", + buttonPrimaryBorder: "#50fa7b", + buttonPrimaryShadow: "rgba(0, 0, 0, 0.6)", + buttonPrimaryDisabledText: "#6272a4", + buttonPrimaryDisabledBackground: "#44475a", + buttonPrimaryDisabledBorder: "#6272a4", + buttonNormalText: "#f8f8f2", + buttonNormalTextHover: "#ff79c6", + buttonNormalBackground: "#44475a", + buttonNormalBackgroundHover: "#6272a4", + buttonNormalBorder: "#6272a4", + buttonNormalShadow: "rgba(0, 0, 0, 0.3)", + buttonNormalDisabledText: "#6272a4", + buttonNormalDisabledBackground: "#282a36", + buttonNormalDisabledBorder: "#6272a4", + buttonBareText: "#f8f8f2", + buttonBareTextHover: "#ff79c6", + buttonBareBackground: "transparent", + buttonBareBackgroundHover: "rgba(255, 121, 198, 0.2)", + buttonBareBackgroundActive: "rgba(255, 121, 198, 0.3)", + buttonBareDisabledText: "#6272a4", + buttonBareDisabledBackground: "transparent", + // Calendar + calendarText: "#f8f8f2", + calendarBackground: "#282a36", + calendarItemText: "#f8f8f2", + calendarItemBackground: "#44475a", + calendarSelectedBackground: "#bd93f9", + // Notices + noticeBackground: "#50fa7b", + noticeText: "#282a36", + noticeBorder: "#6272a4", + warningBackground: "#ffb86c", + warningText: "#282a36", + warningBorder: "#bd93f9", + errorBackground: "#ff5555", + errorText: "#282a36", + errorBorder: "#ff79c6", + upcomingBackground: "#bd93f9", + upcomingText: "#282a36", + upcomingBorder: "#ff79c6", + // Form + formLabelText: "#8be9fd", + formLabelBackground: "#44475a", + formInputBackground: "#44475a", + formInputBackgroundSelected: "#6272a4", + formInputBackgroundSelection: "#50fa7b", + formInputBorder: "#bd93f9", + formInputText: "#f8f8f2", + formInputTextSelected: "#50fa7b", + formInputTextPlaceholder: "#6272a4", + formInputTextHighlight: "#ff79c6", + formInputShadowSelected: "rgba(189, 147, 249, 0.5)", + // Miscellaneous + pillBackground: "#44475a", + pillBackgroundLight: "#6272a4", + pillText: "#f8f8f2", + pillTextHighlighted: "#ff79c6", + pillBorder: "#bd93f9", + pillBackgroundSelected: "#50fa7b", + pillTextSelected: "#282a36", + pillBorderSelected: "#50fa7b", + pillTextSubdued: "#6272a4", + reportsRed: "#ff5555", + reportsBlue: "#8be9fd", + reportsGreen: "#50fa7b", + reportsGray: "#6272a4", + reportsLabel: "#f8f8f2", + reportsInnerLabel: "#bd93f9", + noteTagBackground: "#44475a", + noteTagBackgroundHover: "#6272a4", + noteTagText: "#8be9fd", + floatingActionBarBackground: "#44475a", + floatingActionBarBorder: "#bd93f9", + floatingActionBarText: "#f8f8f2", + tooltipText: "#f8f8f2", + tooltipBackground: "#44475a", + tooltipBorder: "#bd93f9" +}, l = { + // Page + pageBackground: "#f4ecd8", + // Light sepia background + pageBackgroundModalActive: "#e8dcc0", + // Slightly darker modal + pageBackgroundTopLeft: "#f3e4c8", + pageBackgroundBottomRight: "#d9c7a5", + pageBackgroundLineTop: "#bfa786", + pageBackgroundLineMid: "#a39077", + pageBackgroundLineBottom: "#8c7b65", + pageText: "#5c4b3b", + // Dark brown for text + pageTextLight: "#7d6c5b", + pageTextSubdued: "#a08e7b", + pageTextDark: "#3d2f25", + pageTextPositive: "#9b7e5a", + // Muted warm sepia + pageTextLink: "#8c6f4d", + pageTextLinkLight: "#af8b67", + // Card + cardBackground: "#ede1c8", + cardBorder: "#d3b997", + cardShadow: "rgba(75, 60, 45, 0.3)", + // Table + tableBackground: "#f4ecd8", + tableRowBackgroundHover: "#e2d4b7", + tableRowBackgroundHighlight: "#d9c7a5", + tableRowBackgroundHighlightText: "#5c4b3b", + tableText: "#5c4b3b", + tableTextLight: "#8c7b65", + tableTextSubdued: "#a08e7b", + tableTextSelected: "#9b7e5a", + tableTextHover: "#7d6c5b", + tableTextInactive: "#bfa786", + tableHeaderText: "#7c6a53", + tableHeaderBackground: "#ede1c8", + tableBorder: "#d3b997", + tableBorderSelected: "#b89d7d", + tableBorderHover: "#a89072", + tableBorderSeparator: "#c5b299", + // Sidebar + sidebarBackground: "#f4ecd8", + sidebarItemBackgroundPending: "#bfa786", + sidebarItemBackgroundPositive: "#9b7e5a", + sidebarItemBackgroundFailed: "#a67c52", + sidebarItemBackgroundHover: "#e2d4b7", + sidebarItemAccentSelected: "#8c6f4d", + sidebarItemText: "#5c4b3b", + sidebarItemTextSelected: "#7c6a53", + // Menu + menuBackground: "#e8dcc0", + menuItemBackground: "#ede1c8", + menuItemBackgroundHover: "#d9c7a5", + menuItemText: "#5c4b3b", + menuItemTextHover: "#7d6c5b", + menuItemTextSelected: "#9b7e5a", + menuItemTextHeader: "#8c6f4d", + menuBorder: "#d3b997", + menuBorderHover: "#bfa786", + menuKeybindingText: "#a08e7b", + menuAutoCompleteBackground: "#f3e4c8", + menuAutoCompleteBackgroundHover: "#e2d4b7", + menuAutoCompleteText: "#5c4b3b", + menuAutoCompleteTextHover: "#9b7e5a", + menuAutoCompleteTextHeader: "#bfa786", + menuAutoCompleteItemTextHover: "#7d6c5b", + menuAutoCompleteItemText: "#5c4b3b", + // Modal + modalBackground: "#ede1c8", + modalBorder: "#d3b997", + // Mobile + mobileHeaderBackground: "#d9c7a5", + mobileHeaderText: "#5c4b3b", + mobileHeaderTextSubdued: "#7c6a53", + mobileHeaderTextHover: "rgba(140, 111, 77, 0.2)", + mobilePageBackground: "#f4ecd8", + mobileNavBackground: "#e8dcc0", + mobileNavItem: "#a08e7b", + mobileNavItemSelected: "#9b7e5a", + mobileAccountShadow: "rgba(75, 60, 45, 0.2)", + mobileAccountText: "#8c6f4d", + mobileTransactionSelected: "#b89d7d", + // Mobile Themes + mobileViewTheme: "#e2d4b7", + mobileConfigServerViewTheme: "#a67c52", + // Markdown + markdownNormal: "#8c6f4d", + markdownDark: "#5c4b3b", + markdownLight: "#bfa786", + // Buttons + buttonMenuText: "#5c4b3b", + buttonMenuTextHover: "#7d6c5b", + buttonMenuBackground: "transparent", + buttonMenuBackgroundHover: "rgba(140, 111, 77, 0.2)", + buttonMenuBorder: "#9b7e5a", + buttonMenuSelectedText: "#f4ecd8", + buttonMenuSelectedTextHover: "#f4ecd8", + buttonMenuSelectedBackground: "#8c6f4d", + buttonMenuSelectedBackgroundHover: "#9b7e5a", + buttonMenuSelectedBorder: "#9b7e5a", + buttonPrimaryText: "#f4ecd8", + buttonPrimaryTextHover: "#f4ecd8", + buttonPrimaryBackground: "#8c6f4d", + buttonPrimaryBackgroundHover: "#7d6c5b", + buttonPrimaryBorder: "#9b7e5a", + buttonPrimaryShadow: "rgba(75, 60, 45, 0.4)", + buttonPrimaryDisabledText: "#bfa786", + buttonPrimaryDisabledBackground: "#d9c7a5", + buttonPrimaryDisabledBorder: "#c5b299", + buttonNormalText: "#5c4b3b", + buttonNormalTextHover: "#7d6c5b", + buttonNormalBackground: "#ede1c8", + buttonNormalBackgroundHover: "#e2d4b7", + buttonNormalBorder: "#d3b997", + buttonNormalShadow: "rgba(75, 60, 45, 0.3)", + buttonNormalDisabledText: "#bfa786", + buttonNormalDisabledBackground: "#e8dcc0", + buttonNormalDisabledBorder: "#c5b299", + buttonBareText: "#5c4b3b", + buttonBareTextHover: "#7d6c5b", + buttonBareBackground: "transparent", + buttonBareBackgroundHover: "rgba(140, 111, 77, 0.2)", + buttonBareBackgroundActive: "rgba(140, 111, 77, 0.3)", + buttonBareDisabledText: "#a08e7b", + buttonBareDisabledBackground: "transparent", + // Calendar + calendarText: "#5c4b3b", + calendarBackground: "#f4ecd8", + calendarItemText: "#7d6c5b", + calendarItemBackground: "#d9c7a5", + calendarSelectedBackground: "#bfa786", + // Notices + noticeBackground: "#d9c7a5", + noticeText: "#5c4b3b", + noticeBorder: "#bfa786", + warningBackground: "#b89d7d", + warningText: "#5c4b3b", + warningBorder: "#a67c52", + errorBackground: "#a67c52", + errorText: "#f4ecd8", + errorBorder: "#8c6f4d", + upcomingBackground: "#c5b299", + upcomingText: "#5c4b3b", + upcomingBorder: "#9b7e5a", + // Form + formLabelText: "#8c6f4d", + formLabelBackground: "#ede1c8", + formInputBackground: "#e8dcc0", + formInputBackgroundSelected: "#d3b997", + formInputBackgroundSelection: "#bfa786", + formInputBorder: "#c5b299", + formInputText: "#5c4b3b", + formInputTextSelected: "#3d2f25", + formInputTextPlaceholder: "#a08e7b", + formInputTextHighlight: "#8c6f4d", + formInputShadowSelected: "rgba(140, 111, 77, 0.3)", + // Miscellaneous + pillBackground: "#e2d4b7", + pillBackgroundLight: "#ede1c8", + pillText: "#5c4b3b", + pillTextHighlighted: "#7d6c5b", + pillBorder: "#bfa786", + pillBackgroundSelected: "#c5b299", + pillTextSelected: "#3d2f25", + pillBorderSelected: "#9b7e5a", + pillTextSubdued: "#a08e7b", + reportsRed: "#a67c52", + reportsBlue: "#9b7e5a", + reportsGreen: "#8c6f4d", + reportsGray: "#bfa786", + reportsLabel: "#5c4b3b", + reportsInnerLabel: "#7d6c5b", + noteTagBackground: "#e2d4b7", + noteTagBackgroundHover: "#d3b997", + noteTagText: "#5c4b3b", + floatingActionBarBackground: "#ede1c8", + floatingActionBarBorder: "#bfa786", + floatingActionBarText: "#5c4b3b", + tooltipText: "#5c4b3b", + tooltipBackground: "#d9c7a5", + tooltipBorder: "#bfa786" +}, g = { + // Page + pageBackground: "#191724", + // Base background + pageBackgroundModalActive: "#1f1d2e", + // Surface + pageBackgroundTopLeft: "#191724", + pageBackgroundBottomRight: "#26233a", + pageBackgroundLineTop: "#eb6f92", + // Rose + pageBackgroundLineMid: "#9ccfd8", + // Foam + pageBackgroundLineBottom: "#c4a7e7", + // Iris + pageText: "#e0def4", + pageTextLight: "#908caa", + // Subtle + pageTextSubdued: "#6e6a86", + // Muted + pageTextDark: "#f6c177", + // Gold + pageTextPositive: "#31748f", + // Pine + pageTextLink: "#ebbcba", + // Love + pageTextLinkLight: "#9ccfd8", + // Foam + // Card + cardBackground: "#1f1d2e", + cardBorder: "#c4a7e7", + cardShadow: "rgba(0, 0, 0, 0.5)", + // Table + tableBackground: "#1f1d2e", + tableRowBackgroundHover: "#26233a", + tableText: "#e0def4", + tableTextLight: "#908caa", + tableTextSubdued: "#6e6a86", + tableTextSelected: "#c4a7e7", + tableTextHover: "#f6c177", + tableTextInactive: "#6e6a86", + tableHeaderText: "#9ccfd8", + tableHeaderBackground: "#191724", + tableBorder: "#6e6a86", + tableBorderSelected: "#c4a7e7", + tableBorderHover: "#f6c177", + tableBorderSeparator: "#6e6a86", + tableRowBackgroundHighlight: "#31748f", + tableRowBackgroundHighlightText: "#e0def4", + tableRowHeaderBackground: "#26233a", + tableRowHeaderText: "#f6c177", + // Sidebar + sidebarBackground: "#191724", + sidebarItemBackgroundPending: "#f6c177", + sidebarItemBackgroundPositive: "#31748f", + sidebarItemBackgroundFailed: "#eb6f92", + sidebarItemAccentSelected: "#c4a7e7", + sidebarItemBackgroundHover: "#26233a", + sidebarItemText: "#e0def4", + sidebarItemTextSelected: "#ebbcba", + // Menu + menuBackground: "#26233a", + menuItemBackground: "#1f1d2e", + menuItemBackgroundHover: "#31748f", + menuItemText: "#e0def4", + menuItemTextHover: "#f6c177", + menuItemTextSelected: "#c4a7e7", + menuItemTextHeader: "#9ccfd8", + menuBorder: "#6e6a86", + menuBorderHover: "#c4a7e7", + menuKeybindingText: "#9ccfd8", + menuAutoCompleteBackground: "#1f1d2e", + menuAutoCompleteBackgroundHover: "#26233a", + menuAutoCompleteText: "#e0def4", + menuAutoCompleteTextHover: "#c4a7e7", + menuAutoCompleteTextHeader: "#f6c177", + menuAutoCompleteItemTextHover: "#f6c177", + menuAutoCompleteItemText: "#e0def4", + // Modal + modalBackground: "#1f1d2e", + modalBorder: "#c4a7e7", + // Mobile + mobileHeaderBackground: "#26233a", + mobileHeaderText: "#f6c177", + mobileHeaderTextSubdued: "#6e6a86", + mobileHeaderTextHover: "rgba(246, 193, 119, 0.2)", + mobilePageBackground: "#191724", + mobileNavBackground: "#1f1d2e", + mobileNavItem: "#6e6a86", + mobileNavItemSelected: "#c4a7e7", + mobileAccountShadow: "rgba(0, 0, 0, 0.5)", + mobileAccountText: "#9ccfd8", + mobileTransactionSelected: "#ebbcba", + // Mobile Themes + mobileViewTheme: "#26233a", + mobileConfigServerViewTheme: "#c4a7e7", + // Markdown + markdownNormal: "#ebbcba", + markdownDark: "#eb6f92", + markdownLight: "#c4a7e7", + // Buttons + buttonMenuText: "#e0def4", + buttonMenuTextHover: "#f6c177", + buttonMenuBackground: "transparent", + buttonMenuBackgroundHover: "rgba(246, 193, 119, 0.2)", + buttonMenuBorder: "#9ccfd8", + buttonMenuSelectedText: "#191724", + buttonMenuSelectedTextHover: "#191724", + buttonMenuSelectedBackground: "#f6c177", + buttonMenuSelectedBackgroundHover: "#ebbcba", + buttonMenuSelectedBorder: "#f6c177", + buttonPrimaryText: "#191724", + buttonPrimaryTextHover: "#191724", + buttonPrimaryBackground: "#f6c177", + buttonPrimaryBackgroundHover: "#ebbcba", + buttonPrimaryBorder: "#f6c177", + buttonPrimaryShadow: "rgba(0, 0, 0, 0.5)", + buttonPrimaryDisabledText: "#6e6a86", + buttonPrimaryDisabledBackground: "#26233a", + buttonPrimaryDisabledBorder: "#6e6a86", + buttonNormalText: "#e0def4", + buttonNormalTextHover: "#f6c177", + buttonNormalBackground: "#26233a", + buttonNormalBackgroundHover: "#31748f", + buttonNormalBorder: "#9ccfd8", + buttonNormalShadow: "rgba(0, 0, 0, 0.3)", + buttonNormalSelectedText: "#191724", + buttonNormalSelectedBackground: "#c4a7e7", + buttonNormalDisabledText: "#6e6a86", + buttonNormalDisabledBackground: "#1f1d2e", + buttonNormalDisabledBorder: "#6e6a86", + buttonBareText: "#e0def4", + buttonBareTextHover: "#f6c177", + buttonBareBackground: "transparent", + buttonBareBackgroundHover: "rgba(246, 193, 119, 0.2)", + buttonBareBackgroundActive: "rgba(246, 193, 119, 0.3)", + buttonBareDisabledText: "#6e6a86", + buttonBareDisabledBackground: "transparent", + // Calendar + calendarText: "#e0def4", + calendarBackground: "#191724", + calendarItemText: "#e0def4", + calendarItemBackground: "#1f1d2e", + calendarSelectedBackground: "#c4a7e7", + // Notices + noticeBackground: "#f6c177", + noticeBackgroundLight: "#f4a261", + noticeBackgroundDark: "#ebbcba", + noticeText: "#191724", + noticeTextLight: "#6e6a86", + noticeTextDark: "#9ccfd8", + noticeTextMenu: "#eb6f92", + noticeTextMenuHover: "#f6c177", + noticeBorder: "#c4a7e7", + warningBackground: "#ebbcba", + warningText: "#191724", + warningTextLight: "#f6c177", + warningTextDark: "#c4a7e7", + warningBorder: "#eb6f92", + errorBackground: "#eb6f92", + errorText: "#191724", + errorTextDark: "#c4a7e7", + errorTextDarker: "#c4a7e7", + errorTextMenu: "#f6c177", + errorBorder: "#ebbcba", + upcomingBackground: "#c4a7e7", + upcomingText: "#191724", + upcomingBorder: "#9ccfd8", + // Form + formLabelText: "#9ccfd8", + formLabelBackground: "#26233a", + formInputBackground: "#1f1d2e", + formInputBackgroundSelected: "#26233a", + formInputBackgroundSelection: "#c4a7e7", + formInputBorder: "#9ccfd8", + formInputTextReadOnlySelection: "#6e6a86", + formInputBorderSelected: "#f6c177", + formInputText: "#e0def4", + formInputTextSelected: "#ebbcba", + formInputTextPlaceholder: "#6e6a86", + formInputTextPlaceholderSelected: "#9ccfd8", + formInputTextSelection: "#c4a7e7", + formInputShadowSelected: "rgba(189, 147, 249, 0.5)", + formInputTextHighlight: "#f6c177", + // Checkbox + checkboxText: "#e0def4", + checkboxBackgroundSelected: "#9ccfd8", + checkboxBorderSelected: "#c4a7e7", + checkboxShadowSelected: "rgba(0, 0, 0, 0.4)", + checkboxToggleBackground: "#6e6a86", + checkboxToggleBackgroundSelected: "#c4a7e7", + checkboxToggleDisabled: "#26233a", + // Pill + pillBackground: "#26233a", + pillBackgroundLight: "#1f1d2e", + pillText: "#e0def4", + pillTextHighlighted: "#f6c177", + pillBorder: "#9ccfd8", + pillBorderDark: "#6e6a86", + pillBackgroundSelected: "#c4a7e7", + pillTextSelected: "#191724", + pillBorderSelected: "#f6c177", + pillTextSubdued: "#6e6a86", + // Reports + reportsRed: "#eb6f92", + reportsBlue: "#9ccfd8", + reportsGreen: "#31748f", + reportsGray: "#6e6a86", + reportsLabel: "#e0def4", + reportsInnerLabel: "#908caa", + // Misc + noteTagBackground: "#26233a", + noteTagBackgroundHover: "#1f1d2e", + noteTagText: "#f6c177", + floatingActionBarBackground: "#26233a", + floatingActionBarBorder: "#c4a7e7", + floatingActionBarText: "#e0def4", + tooltipText: "#e0def4", + tooltipBackground: "#1f1d2e", + tooltipBorder: "#c4a7e7", + // Budget + budgetOtherMonth: "#1f1d2e", + budgetCurrentMonth: "#26233a", + budgetHeaderOtherMonth: "#6e6a86", + budgetHeaderCurrentMonth: "#c4a7e7" +}, f = { + // Page + pageBackground: "#1a1b26", + // Dark navy blue + pageBackgroundModalActive: "#16161e", + // Deeper navy for modal + pageBackgroundTopLeft: "#1f2335", + // Slightly lighter navy + pageBackgroundBottomRight: "#16161e", + // Dark navy + pageBackgroundLineTop: "#7aa2f7", + // Light blue + pageBackgroundLineMid: "#565f89", + // Grayish blue + pageBackgroundLineBottom: "#9ece6a", + // Soft green + pageText: "#c0caf5", + // Light gray-blue + pageTextLight: "#a9b1d6", + // Subtle light gray + pageTextSubdued: "#565f89", + // Muted gray-blue + pageTextDark: "#f7768e", + // Rose red + pageTextPositive: "#9ece6a", + // Green + pageTextLink: "#7aa2f7", + // Light blue + pageTextLinkLight: "#bb9af7", + // Purple + // Card + cardBackground: "#1f2335", + // Surface color + cardBorder: "#565f89", + cardShadow: "rgba(0, 0, 0, 0.5)", + // Table + tableBackground: "#1a1b26", + tableRowBackgroundHover: "#1f2335", + tableRowBackgroundHighlight: "#7aa2f7", + tableRowBackgroundHighlightText: "#c0caf5", + tableText: "#c0caf5", + tableTextLight: "#a9b1d6", + tableTextSubdued: "#565f89", + tableTextSelected: "#bb9af7", + // Purple + tableTextHover: "#7dcfff", + // Cyan + tableTextInactive: "#414868", + tableHeaderText: "#7aa2f7", + tableHeaderBackground: "#1f2335", + tableBorder: "#565f89", + tableBorderSelected: "#7aa2f7", + tableBorderHover: "#9ece6a", + tableBorderSeparator: "#414868", + tableRowHeaderBackground: "#1a1b26", + tableRowHeaderText: "#c0caf5", + // Sidebar + sidebarBackground: "#1a1b26", + sidebarItemBackgroundPending: "#f7768e", + sidebarItemBackgroundPositive: "#9ece6a", + sidebarItemBackgroundFailed: "#f7768e", + sidebarItemAccentSelected: "#bb9af7", + sidebarItemBackgroundHover: "#26233a", + sidebarItemText: "#c0caf5", + sidebarItemTextSelected: "#7aa2f7", + // Menu + menuBackground: "#1f2335", + menuItemBackground: "#1a1b26", + menuItemBackgroundHover: "#7dcfff", + menuItemText: "#c0caf5", + menuItemTextHover: "#9ece6a", + menuItemTextSelected: "#bb9af7", + menuItemTextHeader: "#7dcfff", + menuBorder: "#414868", + menuBorderHover: "#7aa2f7", + menuKeybindingText: "#565f89", + menuAutoCompleteBackground: "#1f2335", + menuAutoCompleteBackgroundHover: "#26233a", + menuAutoCompleteText: "#c0caf5", + menuAutoCompleteTextHover: "#7dcfff", + menuAutoCompleteTextHeader: "#f7768e", + menuAutoCompleteItemTextHover: "#9ece6a", + menuAutoCompleteItemText: "#c0caf5", + // Modal + modalBackground: "#1f2335", + modalBorder: "#565f89", + // Mobile + mobileHeaderBackground: "#16161e", + mobileHeaderText: "#7aa2f7", + mobileHeaderTextSubdued: "#565f89", + mobileHeaderTextHover: "rgba(122, 162, 247, 0.2)", + mobilePageBackground: "#1a1b26", + mobileNavBackground: "#1f2335", + mobileNavItem: "#565f89", + mobileNavItemSelected: "#7aa2f7", + mobileAccountShadow: "rgba(0, 0, 0, 0.5)", + mobileAccountText: "#bb9af7", + mobileTransactionSelected: "#f7768e", + // Buttons + buttonMenuText: "#c0caf5", + buttonMenuTextHover: "#7aa2f7", + buttonMenuBackground: "transparent", + buttonMenuBackgroundHover: "rgba(122, 162, 247, 0.2)", + buttonMenuBorder: "#414868", + buttonMenuSelectedText: "#1a1b26", + buttonMenuSelectedTextHover: "#1a1b26", + buttonMenuSelectedBackground: "#7aa2f7", + buttonMenuSelectedBackgroundHover: "#7dcfff", + buttonMenuSelectedBorder: "#7aa2f7", + buttonPrimaryText: "#1a1b26", + buttonPrimaryTextHover: "#1a1b26", + buttonPrimaryBackground: "#7aa2f7", + buttonPrimaryBackgroundHover: "#7dcfff", + buttonPrimaryBorder: "#7aa2f7", + buttonPrimaryShadow: "rgba(0, 0, 0, 0.5)", + buttonPrimaryDisabledText: "#565f89", + buttonPrimaryDisabledBackground: "#16161e", + buttonPrimaryDisabledBorder: "#414868", + buttonNormalText: "#c0caf5", + buttonNormalTextHover: "#7aa2f7", + buttonNormalBackground: "#1f2335", + buttonNormalBackgroundHover: "#26233a", + buttonNormalBorder: "#565f89", + buttonNormalShadow: "rgba(0, 0, 0, 0.3)", + buttonNormalSelectedText: "#1a1b26", + buttonNormalSelectedBackground: "#bb9af7", + buttonNormalDisabledText: "#565f89", + buttonNormalDisabledBackground: "#16161e", + buttonNormalDisabledBorder: "#414868", + buttonBareText: "#c0caf5", + buttonBareTextHover: "#7aa2f7", + buttonBareBackground: "transparent", + buttonBareBackgroundHover: "rgba(122, 162, 247, 0.2)", + buttonBareBackgroundActive: "rgba(122, 162, 247, 0.3)", + buttonBareDisabledText: "#565f89", + buttonBareDisabledBackground: "transparent", + // Calendar + calendarText: "#c0caf5", + calendarBackground: "#1a1b26", + calendarItemText: "#c0caf5", + calendarItemBackground: "#1f2335", + calendarSelectedBackground: "#7aa2f7", + // Notices + noticeBackground: "#7aa2f7", + noticeBackgroundLight: "#9ece6a", + noticeBackgroundDark: "#414868", + noticeText: "#1a1b26", + noticeTextLight: "#c0caf5", + noticeTextDark: "#f7768e", + noticeTextMenu: "#7aa2f7", + noticeTextMenuHover: "#9ece6a", + noticeBorder: "#565f89", + // Form + formLabelText: "#7aa2f7", + formLabelBackground: "#1f2335", + formInputBackground: "#1a1b26", + formInputBackgroundSelected: "#26233a", + formInputBackgroundSelection: "#7aa2f7", + formInputBorder: "#565f89", + formInputTextReadOnlySelection: "#414868", + formInputBorderSelected: "#7aa2f7", + formInputText: "#c0caf5", + formInputTextSelected: "#9ece6a", + formInputTextPlaceholder: "#565f89", + formInputTextPlaceholderSelected: "#7dcfff", + formInputShadowSelected: "rgba(122, 162, 247, 0.5)", + // Miscellaneous + tooltipText: "#c0caf5", + tooltipBackground: "#1a1b26", + tooltipBorder: "#7aa2f7" +}, i = (e) => { + const t = u(e), a = { + name: "Example", + version: "0.0.1", + availableThemes: () => ["Dracula", "Sepia", "Rose Pine", "Tokyo Night"], + getThemeIcon: (r, o, n) => /* @__PURE__ */ e.createElement(t, { themeName: r, darkMode: o, style: n }), + getThemeSchema: d + }; + function d(r) { + switch (r) { + case "Dracula": + return b; + case "Rose Pine": + return g; + case "Tokyo Night": + return f; + case "Sepia": + return l; + } + return {}; + } + return a; +}; +export { + i as default +}; diff --git a/packages/desktop-client/src/components/ThemeSelector.tsx b/packages/desktop-client/src/components/ThemeSelector.tsx index 31447b36dbd..6edc1e8e0ca 100644 --- a/packages/desktop-client/src/components/ThemeSelector.tsx +++ b/packages/desktop-client/src/components/ThemeSelector.tsx @@ -62,65 +62,32 @@ export function ThemeSelector({ style }: ThemeSelectorProps) { const { plugins: loadedPlugins } = useActualPlugins(); useEffect(() => { - const pluginIconsLight = + const pluginIcons = loadedPlugins?.reduce((acc, plugin) => { if (plugin.availableThemes?.length) { - plugin.availableThemes(false).forEach(theme => { + plugin.availableThemes().forEach(theme => { acc = { ...acc, [theme]: (props: SVGProps) => - plugin?.getThemeIcon?.(theme, false, props.style) ?? , + plugin?.getThemeIcon?.(theme, props.style) ?? , }; }); } return acc; }, {} as ThemesIconsType) ?? ({} as ThemesIconsType); - const pluginIconsDark = - loadedPlugins?.reduce((acc, plugin) => { - if (plugin.availableThemes?.length) { - plugin.availableThemes(true).forEach(theme => { - acc = { - ...acc, - [theme]: (props: SVGProps) => - plugin?.getThemeIcon?.(theme, true, props.style) ?? , - }; - }); - } - return acc; - }, {} as ThemesIconsType) ?? ({} as ThemesIconsType); - - const themesLight = - loadedPlugins?.reduce((acc, plugin) => { - if (plugin.availableThemes?.length) { - plugin - .availableThemes(false) - .filter(theme => theme !== undefined) - .forEach(theme => { - acc = { - ...acc, - [theme]: { - name: theme, - colors: plugin?.getThemeSchema?.(theme, false) ?? {}, - }, - }; - }); - } - return acc; - }, {} as ThemesExtendedType) ?? ({} as ThemesExtendedType); - - const themesDark = + const customThemes = loadedPlugins?.reduce((acc, plugin) => { if (plugin.availableThemes?.length) { plugin - .availableThemes(true) + .availableThemes() .filter(theme => theme !== undefined) .forEach(theme => { acc = { ...acc, [theme]: { name: theme, - colors: plugin?.getThemeSchema?.(theme, true) ?? {}, + colors: plugin?.getThemeSchema?.(theme) ?? {}, }, }; }); @@ -128,9 +95,9 @@ export function ThemeSelector({ style }: ThemeSelectorProps) { return acc; }, {} as ThemesExtendedType) ?? ({} as ThemesExtendedType); - setThemeIcons({ ...baseIcons, ...pluginIconsLight, ...pluginIconsDark }); + setThemeIcons({ ...baseIcons, ...pluginIcons }); - setThemesExtended({ ...themes, ...themesLight, ...themesDark }); + setThemesExtended({ ...themes, ...customThemes }); }, [loadedPlugins, baseIcons]); useEffect(() => { diff --git a/packages/plugins-shared/package.json b/packages/plugins-shared/package.json index 61a06db3ef8..74c358eaca1 100644 --- a/packages/plugins-shared/package.json +++ b/packages/plugins-shared/package.json @@ -1,6 +1,6 @@ { "name": "plugins-shared", - "packageManager": "yarn@4.3.1", + "version": "1.0.0", "main": "dist/index.cjs.js", "module": "dist/index.es.js", "types": "dist/index.d.ts", @@ -16,5 +16,6 @@ "typescript": "^5.0.0", "vite": "^5.2.14", "vite-plugin-dts": "4.3.0" - } + }, + "packageManager": "yarn@4.3.1" } diff --git a/packages/plugins-shared/src/index.ts b/packages/plugins-shared/src/index.ts index afd9c9398a7..1a7604691aa 100644 --- a/packages/plugins-shared/src/index.ts +++ b/packages/plugins-shared/src/index.ts @@ -1,3 +1,5 @@ export type { ActualPlugin } from './interfaces/actualPlugin'; export type { ThemeDefinition } from './interfaces/themeDefinition'; export type { ActualPluginEntry } from './interfaces/actualPluginEntry'; +// eslint-disable-next-line import/no-unused-modules +export type { ActualPluginManifest } from './interfaces/actualPluginManifest'; diff --git a/packages/plugins-shared/src/interfaces/actualPlugin.ts b/packages/plugins-shared/src/interfaces/actualPlugin.ts index 939f76fe855..f5d1677d090 100644 --- a/packages/plugins-shared/src/interfaces/actualPlugin.ts +++ b/packages/plugins-shared/src/interfaces/actualPlugin.ts @@ -6,11 +6,7 @@ export interface ActualPlugin { name: string; version: string; availableThemes?: () => string[]; - getThemeIcon?: ( - themeName: string, - darkMode: boolean, - properties?: CSSProperties, - ) => JSX.Element; + getThemeIcon?: (themeName: string, properties?: CSSProperties) => JSX.Element; getThemeSchema?: (themeName: string) => ThemeDefinition; // hooks: { // menuItems?: () => React.ReactNode[]; diff --git a/packages/plugins-shared/src/interfaces/actualPluginManifest.ts b/packages/plugins-shared/src/interfaces/actualPluginManifest.ts new file mode 100644 index 00000000000..4692fc889e0 --- /dev/null +++ b/packages/plugins-shared/src/interfaces/actualPluginManifest.ts @@ -0,0 +1,8 @@ +export interface ActualPluginManifest { + slug: string; + name: string; + version: string; + description?: string; + pluginType: 'server' | 'client'; + minimumActualVersion: string; +} From af2c85eca7ef25df4860541a0f213350ee72d5b5 Mon Sep 17 00:00:00 2001 From: Leandro Menezes Date: Wed, 18 Dec 2024 10:50:29 -0300 Subject: [PATCH 8/8] typecheck, linter and a fix --- .../desktop-client/src/components/ThemeSelector.tsx | 12 ++++++++++-- .../src/components/settings/Themes.tsx | 6 +++++- packages/desktop-client/src/style/theme.tsx | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/desktop-client/src/components/ThemeSelector.tsx b/packages/desktop-client/src/components/ThemeSelector.tsx index 6edc1e8e0ca..9d571950527 100644 --- a/packages/desktop-client/src/components/ThemeSelector.tsx +++ b/packages/desktop-client/src/components/ThemeSelector.tsx @@ -64,7 +64,11 @@ export function ThemeSelector({ style }: ThemeSelectorProps) { useEffect(() => { const pluginIcons = loadedPlugins?.reduce((acc, plugin) => { - if (plugin.availableThemes?.length) { + if ( + plugin && + plugin.availableThemes && + plugin.availableThemes().length > 0 + ) { plugin.availableThemes().forEach(theme => { acc = { ...acc, @@ -78,7 +82,11 @@ export function ThemeSelector({ style }: ThemeSelectorProps) { const customThemes = loadedPlugins?.reduce((acc, plugin) => { - if (plugin.availableThemes?.length) { + if ( + plugin && + plugin.availableThemes && + plugin.availableThemes().length > 0 + ) { plugin .availableThemes() .filter(theme => theme !== undefined) diff --git a/packages/desktop-client/src/components/settings/Themes.tsx b/packages/desktop-client/src/components/settings/Themes.tsx index c7b0eeec0a4..2e17c2de170 100644 --- a/packages/desktop-client/src/components/settings/Themes.tsx +++ b/packages/desktop-client/src/components/settings/Themes.tsx @@ -60,7 +60,11 @@ export function ThemeSettings() { useEffect(() => { const customThemes = loadedPlugins?.reduce((acc, plugin) => { - if (plugin.availableThemes?.length) { + if ( + plugin && + plugin.availableThemes && + plugin.availableThemes().length > 0 + ) { plugin .availableThemes() .filter(theme => theme !== undefined) diff --git a/packages/desktop-client/src/style/theme.tsx b/packages/desktop-client/src/style/theme.tsx index 7730b4016db..9695cfe5a46 100644 --- a/packages/desktop-client/src/style/theme.tsx +++ b/packages/desktop-client/src/style/theme.tsx @@ -58,7 +58,7 @@ export function ThemeStyle() { useEffect(() => { const customThemes = loadedPlugins?.reduce((acc, plugin) => { - if (plugin.availableThemes?.length) { + if (plugin.availableThemes()?.length) { plugin.availableThemes().forEach(theme => { acc[theme] = { name: theme,