From 676cb5d058c005a0a92f2f282f4886badd27d77f Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 6 Dec 2024 21:47:21 +0100 Subject: [PATCH 01/37] wip: migrate to new ipc pattern --- package-lock.json | 78 ++++++++----------- package.json | 4 +- src/app.js | 60 +++++++------- src/components/ui/FeatureList.js | 6 +- src/electron/ipc-api/overlayWindow.ts | 18 ++++- src/electron/ipc-api/settings.js | 7 +- .../containers/PlanSelectionScreen.js | 17 ++-- src/features/planSelection/index.js | 14 ++-- src/features/shareFranz/Component.js | 24 +++--- src/features/shareFranz/index.js | 8 +- src/index.js | 22 +++--- src/ipcChannels.ts | 7 ++ src/overlayApp.js | 28 +++---- src/stores/AppStore.js | 2 +- src/stores/ServicesStore.js | 8 +- src/stores/SettingsStore.js | 11 +-- src/styles/layout.scss | 4 +- 17 files changed, 168 insertions(+), 150 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3da2485ba..3f151d1e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -102,7 +102,7 @@ "cross-env": "^5.0.5", "cz-conventional-changelog": "2.1.0", "dotenv": "^4.0.0", - "electron": "29.0.0", + "electron": "33.2.1", "electron-builder": "24.9.1", "electron-notarize": "1.0.0", "electron-rebuild": "3.2.9", @@ -131,7 +131,7 @@ "lerna": "^3.8.0", "mobx-react-devtools": "6.0.3", "mocha": "5.2.0", - "node-abi": "3.54.0", + "node-abi": "3.71.0", "prettier": "1.15.2", "react-intl-translations-manager": "5.0.3", "terser-webpack-plugin": "1.2.1", @@ -11878,9 +11878,9 @@ } }, "node_modules/electron": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-29.0.0.tgz", - "integrity": "sha512-HhrRC5vWb6fAbWXP3A6ABwKUO9JvYSC4E141RzWFgnDBqNiNtabfmgC8hsVeCR65RQA2MLSDgC8uP52I9zFllQ==", + "version": "33.2.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.2.1.tgz", + "integrity": "sha512-SG/nmSsK9Qg1p6wAW+ZfqU+AV8cmXMTIklUL18NnOKfZLlum4ZsDoVdmmmlL39ZmeCaq27dr7CgslRPahfoVJg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -13107,12 +13107,12 @@ } }, "node_modules/electron/node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "version": "20.17.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", + "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/elliptic": { @@ -23830,9 +23830,9 @@ } }, "node_modules/node-abi": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", - "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -26696,7 +26696,6 @@ }, "node_modules/npm/node_modules/lodash._baseindexof": { "version": "3.1.0", - "extraneous": true, "inBundle": true, "license": "MIT" }, @@ -26711,19 +26710,16 @@ }, "node_modules/npm/node_modules/lodash._bindcallback": { "version": "3.0.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/lodash._cacheindexof": { "version": "3.0.2", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/lodash._createcache": { "version": "3.1.2", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -26737,7 +26733,6 @@ }, "node_modules/npm/node_modules/lodash._getnative": { "version": "3.9.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, @@ -26753,7 +26748,6 @@ }, "node_modules/npm/node_modules/lodash.restparam": { "version": "3.6.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, @@ -34761,9 +34755,9 @@ "dev": true }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -46200,9 +46194,9 @@ } }, "electron": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-29.0.0.tgz", - "integrity": "sha512-HhrRC5vWb6fAbWXP3A6ABwKUO9JvYSC4E141RzWFgnDBqNiNtabfmgC8hsVeCR65RQA2MLSDgC8uP52I9zFllQ==", + "version": "33.2.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.2.1.tgz", + "integrity": "sha512-SG/nmSsK9Qg1p6wAW+ZfqU+AV8cmXMTIklUL18NnOKfZLlum4ZsDoVdmmmlL39ZmeCaq27dr7CgslRPahfoVJg==", "dev": true, "requires": { "@electron/get": "^2.0.0", @@ -46211,12 +46205,12 @@ }, "dependencies": { "@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "version": "20.17.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", + "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", "dev": true, "requires": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } } } @@ -55778,9 +55772,9 @@ } }, "node-abi": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", - "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", "dev": true, "requires": { "semver": "^7.3.5" @@ -57742,8 +57736,7 @@ }, "lodash._baseindexof": { "version": "3.1.0", - "bundled": true, - "extraneous": true + "bundled": true }, "lodash._baseuniq": { "version": "4.6.0", @@ -57755,18 +57748,15 @@ }, "lodash._bindcallback": { "version": "3.0.1", - "bundled": true, - "extraneous": true + "bundled": true }, "lodash._cacheindexof": { "version": "3.0.2", - "bundled": true, - "extraneous": true + "bundled": true }, "lodash._createcache": { "version": "3.1.2", "bundled": true, - "extraneous": true, "requires": { "lodash._getnative": "^3.0.0" } @@ -57777,8 +57767,7 @@ }, "lodash._getnative": { "version": "3.9.1", - "bundled": true, - "extraneous": true + "bundled": true }, "lodash._root": { "version": "3.0.1", @@ -57790,8 +57779,7 @@ }, "lodash.restparam": { "version": "3.6.1", - "bundled": true, - "extraneous": true + "bundled": true }, "lodash.union": { "version": "4.6.0", @@ -64397,9 +64385,9 @@ "dev": true }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { diff --git a/package.json b/package.json index 274c530ce..e4b1d80c4 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "cross-env": "^5.0.5", "cz-conventional-changelog": "2.1.0", "dotenv": "^4.0.0", - "electron": "29.0.0", + "electron": "33.2.1", "electron-builder": "24.9.1", "electron-notarize": "1.0.0", "electron-rebuild": "3.2.9", @@ -156,7 +156,7 @@ "lerna": "^3.8.0", "mobx-react-devtools": "6.0.3", "mocha": "5.2.0", - "node-abi": "3.54.0", + "node-abi": "3.71.0", "prettier": "1.15.2", "react-intl-translations-manager": "5.0.3", "terser-webpack-plugin": "1.2.1", diff --git a/src/app.js b/src/app.js index 9a1306622..a8d7f086d 100644 --- a/src/app.js +++ b/src/app.js @@ -1,52 +1,54 @@ import { webFrame } from 'electron'; -import React from 'react'; -import { render } from 'react-dom'; import { Provider } from 'mobx-react'; -import { syncHistoryWithStore, RouterStore } from 'mobx-react-router'; +import { RouterStore, syncHistoryWithStore } from 'mobx-react-router'; +import { render } from 'react-dom'; import { - Router, Route, hashHistory, IndexRoute, IndexRedirect, + hashHistory, + IndexRedirect, + Route, + Router, } from 'react-router'; import '@babel/polyfill'; import smoothScroll from 'smoothscroll-polyfill'; -import ServerApi from './api/server/ServerApi'; -import LocalApi from './api/server/LocalApi'; -import storeFactory from './stores'; -import apiFactory from './api'; import actions from './actions'; +import apiFactory from './api'; +import LocalApi from './api/server/LocalApi'; +import ServerApi from './api/server/ServerApi'; import MenuFactory from './lib/Menu'; import TouchBarFactory from './lib/TouchBar'; import * as analytics from './lib/analytics'; +import storeFactory from './stores'; import I18N from './I18n'; -import AppLayoutContainer from './containers/layout/AppLayoutContainer'; -import SettingsWindow from './containers/settings/SettingsWindow'; -import RecipesScreen from './containers/settings/RecipesScreen'; -import ServicesScreen from './containers/settings/ServicesScreen'; -import EditServiceScreen from './containers/settings/EditServiceScreen'; -import AccountScreen from './containers/settings/AccountScreen'; -import TeamScreen from './containers/settings/TeamScreen'; -import EditUserScreen from './containers/settings/EditUserScreen'; -import EditSettingsScreen from './containers/settings/EditSettingsScreen'; -import InviteSettingsScreen from './containers/settings/InviteScreen'; -import WelcomeScreen from './containers/auth/WelcomeScreen'; +import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; +import ImportScreen from './containers/auth/ImportScreen'; +import InviteScreen from './containers/auth/InviteScreen'; import LoginScreen from './containers/auth/LoginScreen'; import PasswordScreen from './containers/auth/PasswordScreen'; -import SignupScreen from './containers/auth/SignupScreen'; -import ImportScreen from './containers/auth/ImportScreen'; import PricingScreen from './containers/auth/PricingScreen'; -import InviteScreen from './containers/auth/InviteScreen'; import SetupAssistentScreen from './containers/auth/SetupAssistantScreen'; -import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; +import SignupScreen from './containers/auth/SignupScreen'; +import WelcomeScreen from './containers/auth/WelcomeScreen'; +import AppLayoutContainer from './containers/layout/AppLayoutContainer'; +import AccountScreen from './containers/settings/AccountScreen'; +import EditServiceScreen from './containers/settings/EditServiceScreen'; +import EditSettingsScreen from './containers/settings/EditSettingsScreen'; +import EditUserScreen from './containers/settings/EditUserScreen'; +import InviteSettingsScreen from './containers/settings/InviteScreen'; +import RecipesScreen from './containers/settings/RecipesScreen'; +import ServicesScreen from './containers/settings/ServicesScreen'; +import SettingsWindow from './containers/settings/SettingsWindow'; +import TeamScreen from './containers/settings/TeamScreen'; import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; -import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; -import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; -import { WORKSPACES_ROUTES } from './features/workspaces'; -import AnnouncementScreen from './features/announcements/components/AnnouncementScreen'; -import { ANNOUNCEMENTS_ROUTES } from './features/announcements'; import { isMac } from './environment'; +import { ANNOUNCEMENTS_ROUTES } from './features/announcements'; +import AnnouncementScreen from './features/announcements/components/AnnouncementScreen'; +import { WORKSPACES_ROUTES } from './features/workspaces'; +import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; +import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; // Add Polyfills smoothScroll.polyfill(); @@ -110,7 +112,7 @@ window.addEventListener('load', () => { - + diff --git a/src/components/ui/FeatureList.js b/src/components/ui/FeatureList.js index 72c799819..979ae569b 100644 --- a/src/components/ui/FeatureList.js +++ b/src/components/ui/FeatureList.js @@ -1,9 +1,9 @@ -import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import { Component } from 'react'; import { defineMessages, intlShape } from 'react-intl'; -import { FeatureItem } from './FeatureItem'; import { PLANS } from '../../config'; +import { FeatureItem } from './FeatureItem'; const messages = defineMessages({ availableRecipes: { @@ -139,7 +139,7 @@ export class FeatureList extends Component { return ( ); } diff --git a/src/electron/ipc-api/overlayWindow.ts b/src/electron/ipc-api/overlayWindow.ts index 42650140f..a70757e7e 100644 --- a/src/electron/ipc-api/overlayWindow.ts +++ b/src/electron/ipc-api/overlayWindow.ts @@ -1,7 +1,10 @@ -import { BrowserWindow, ipcMain, webContents } from 'electron'; +import { + BrowserWindow, ipcMain, + webContents, +} from 'electron'; // eslint-disable-next-line import/no-named-default import { isDevMode, isLinux, isMac } from '../../environment'; -import { OVERLAY_OPEN } from '../../ipcChannels'; +import { OVERLAY_OPEN, RELAY_MESSAGE } from '../../ipcChannels'; const debug = require('debug')('Franz:ipcApi:overlayWindow'); @@ -66,6 +69,17 @@ export function openOverlay(mainWindow: BrowserWindow, settings: any, args: IArg }); window.on('close', () => resolve('closed')); + + // ipc messages + ipcMain.on(RELAY_MESSAGE, (event, channel, ...data) => { + const mainWindowWebContentsId = mainWindow.webContents.id; + + if (event.sender.id === mainWindowWebContentsId) { + window.webContents.send(channel, event.sender.id, ...data); + } else { + mainWindow.webContents.send(channel, event.sender.id, ...data); + } + }); } catch (err) { console.log(err); resolve('error'); diff --git a/src/electron/ipc-api/settings.js b/src/electron/ipc-api/settings.js index 15182739c..4383f6236 100644 --- a/src/electron/ipc-api/settings.js +++ b/src/electron/ipc-api/settings.js @@ -1,10 +1,11 @@ import { ipcMain } from 'electron'; +import { GET_SETTINGS, SEND_SETTINGS } from '../../ipcChannels'; export default (params) => { - ipcMain.on('getAppSettings', (event, type) => { - params.mainWindow.webContents.send('appSettings', { + ipcMain.on(GET_SETTINGS, (event, type) => { + event.sender.send(SEND_SETTINGS, { type, - data: params.settings[type].allSerialized, + data: params.settings[type]?.allSerialized, }); }); diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js index c97c65d0d..c3b236458 100644 --- a/src/features/planSelection/containers/PlanSelectionScreen.js +++ b/src/features/planSelection/containers/PlanSelectionScreen.js @@ -1,14 +1,13 @@ -import React, { Component } from 'react'; import { dialog, getCurrentWindow } from '@electron/remote'; -import { defineMessages, intlShape } from 'react-intl'; import { ipcRenderer } from 'electron'; +import { Component } from 'react'; +import { defineMessages, intlShape } from 'react-intl'; -import PlanSelection from '../components/PlanSelection'; -import ErrorBoundary from '../../../components/util/ErrorBoundary'; import { ACTIONS, GA_CATEGORY_PLAN_SELECTION } from '..'; +import ErrorBoundary from '../../../components/util/ErrorBoundary'; +import { PLAN_SELECTION_GET_DATA, PLAN_SELECTION_TRIGGER_ACTION, RELAY_MESSAGE } from '../../../ipcChannels'; import { gaEvent, gaPage } from '../../../lib/analytics'; -import { DEFAULT_WEB_CONTENTS_ID } from '../../../config'; -import { PLAN_SELECTION_GET_DATA, PLAN_SELECTION_TRIGGER_ACTION } from '../../../ipcChannels'; +import PlanSelection from '../components/PlanSelection'; const messages = defineMessages({ dialogTitle: { @@ -44,7 +43,7 @@ class PlanSelectionScreen extends Component { } componentWillMount() { - ipcRenderer.on(PLAN_SELECTION_GET_DATA, (event, data) => { + ipcRenderer.on(PLAN_SELECTION_GET_DATA, (event, senderId, data) => { this.setState(prevState => ({ ...prevState, ...data, @@ -52,11 +51,11 @@ class PlanSelectionScreen extends Component { })); }); - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, PLAN_SELECTION_GET_DATA); + ipcRenderer.send(RELAY_MESSAGE, PLAN_SELECTION_GET_DATA); } triggerAction(action, data) { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, PLAN_SELECTION_TRIGGER_ACTION, action, data); + ipcRenderer.send(RELAY_MESSAGE, PLAN_SELECTION_TRIGGER_ACTION, action, data); } render() { diff --git a/src/features/planSelection/index.js b/src/features/planSelection/index.js index 97154a31c..a5a08482f 100644 --- a/src/features/planSelection/index.js +++ b/src/features/planSelection/index.js @@ -1,7 +1,9 @@ import { BrowserWindow, webContents } from '@electron/remote'; import { ipcRenderer } from 'electron'; import { reaction } from 'mobx'; -import { OVERLAY_OPEN, PLAN_SELECTION_GET_DATA, PLAN_SELECTION_TRIGGER_ACTION } from '../../ipcChannels'; +import { + OVERLAY_OPEN, PLAN_SELECTION_GET_DATA, PLAN_SELECTION_TRIGGER_ACTION, RELAY_MESSAGE, +} from '../../ipcChannels'; import PlanSelectionStore from './store'; const debug = require('debug')('Franz:feature:planSelection'); @@ -35,9 +37,9 @@ export default function initPlanSelection(stores, actions) { route: '/plan-selection', modal: true, }); - ipcRenderer.on(PLAN_SELECTION_GET_DATA, (event) => { + ipcRenderer.on(PLAN_SELECTION_GET_DATA, () => { debug('requesting data'); - ipcRenderer.sendTo(event.senderId, PLAN_SELECTION_GET_DATA, { + ipcRenderer.send(RELAY_MESSAGE, PLAN_SELECTION_GET_DATA, { firstname: user.data.firstname, hadSubscription: user.data.hadSubscription, isSubscriptionExpired: user.team && user.team.state === 'expired' && !user.team.userHasDowngraded, @@ -48,14 +50,14 @@ export default function initPlanSelection(stores, actions) { }); }); - ipcRenderer.on(PLAN_SELECTION_TRIGGER_ACTION, (event, action, data) => { + ipcRenderer.on(PLAN_SELECTION_TRIGGER_ACTION, (event, senderId, action, data) => { if (action === ACTIONS.UPGRADE_ACCOUNT) { debug('upgrade account'); actions.payment.upgradeAccount({ planId: data.planId, - overrideParent: event.senderId, + overrideParent: senderId, onCloseWindow: async () => { - const planSelectionWindow = BrowserWindow.fromWebContents(webContents.fromId(event.senderId)); + const planSelectionWindow = BrowserWindow.fromWebContents(webContents.fromId(senderId)); await user.getUserInfoRequest._promise; diff --git a/src/features/shareFranz/Component.js b/src/features/shareFranz/Component.js index 0f22bd367..6aa55a8c9 100644 --- a/src/features/shareFranz/Component.js +++ b/src/features/shareFranz/Component.js @@ -1,20 +1,22 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { observer } from 'mobx-react'; -import injectSheet from 'react-jss'; -import { defineMessages, intlShape } from 'react-intl'; import { Button } from '@meetfranz/forms'; import { H1, Icon } from '@meetfranz/ui'; +import { observer } from 'mobx-react'; +import PropTypes from 'prop-types'; +import { Component } from 'react'; +import { defineMessages, intlShape } from 'react-intl'; +import injectSheet from 'react-jss'; import { - mdiHeart, mdiEmail, mdiFacebookBox, mdiTwitter, mdiLinkedinBox, mdiClose, + mdiClose, + mdiEmail, mdiFacebookBox, + mdiHeart, + mdiLinkedinBox, + mdiTwitter, } from '@mdi/js'; import { ipcRenderer } from 'electron'; import { state } from '.'; +import { RELAY_MESSAGE, SHARE_FRANZ_GET_SERVICE_COUNT } from '../../ipcChannels'; import { gaEvent } from '../../lib/analytics'; -import { DEFAULT_WEB_CONTENTS_ID } from '../../config'; -import { SHARE_FRANZ_GET_SERVICE_COUNT } from '../../ipcChannels'; -import service from '../../actions/service'; const messages = defineMessages({ headline: { @@ -120,10 +122,10 @@ export default @injectSheet(styles) @observer class ShareFranzModal extends Comp } componentDidMount() { - ipcRenderer.on(SHARE_FRANZ_GET_SERVICE_COUNT, (event, { serviceCount }) => { + ipcRenderer.on(SHARE_FRANZ_GET_SERVICE_COUNT, (event, senderId, { serviceCount }) => { this.setState({ serviceCount }); }); - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, SHARE_FRANZ_GET_SERVICE_COUNT); + ipcRenderer.send(RELAY_MESSAGE, SHARE_FRANZ_GET_SERVICE_COUNT); } close() { diff --git a/src/features/shareFranz/index.js b/src/features/shareFranz/index.js index 488e6a1db..3400e71c9 100644 --- a/src/features/shareFranz/index.js +++ b/src/features/shareFranz/index.js @@ -2,9 +2,9 @@ import { observable, reaction } from 'mobx'; import ms from 'ms'; import { ipcRenderer } from 'electron'; -import { state as delayAppState } from '../delayApp'; +import { OVERLAY_OPEN, RELAY_MESSAGE, SHARE_FRANZ_GET_SERVICE_COUNT } from '../../ipcChannels'; import { gaEvent, gaPage } from '../../lib/analytics'; -import { OVERLAY_OPEN, SHARE_FRANZ_GET_SERVICE_COUNT } from '../../ipcChannels'; +import { state as delayAppState } from '../delayApp'; import { planSelectionStore } from '../planSelection'; export { default as Component } from './Component'; @@ -25,8 +25,8 @@ export default function initialize(stores) { state, }; - ipcRenderer.on(SHARE_FRANZ_GET_SERVICE_COUNT, (event) => { - ipcRenderer.sendTo(event.senderId, SHARE_FRANZ_GET_SERVICE_COUNT, { serviceCount: stores.services.all.length }); + ipcRenderer.on(SHARE_FRANZ_GET_SERVICE_COUNT, () => { + ipcRenderer.send(RELAY_MESSAGE, SHARE_FRANZ_GET_SERVICE_COUNT, { serviceCount: stores.services.all.length }); }); function showModal() { diff --git a/src/index.js b/src/index.js index bc460238c..dd6425cc1 100644 --- a/src/index.js +++ b/src/index.js @@ -3,25 +3,25 @@ import { app, BrowserWindow, - shell, - ipcMain, dialog, + ipcMain, + shell, } from 'electron'; // import isDevMode from 'electron-is-dev'; -import fs from 'fs-extra'; -import path from 'path'; -import windowStateKeeper from 'electron-window-state'; -import { enforceMacOSAppLocation } from 'electron-util'; import * as remoteMain from '@electron/remote/main'; +import { enforceMacOSAppLocation } from 'electron-util'; +import windowStateKeeper from 'electron-window-state'; import { EventEmitter } from 'events'; +import fs from 'fs-extra'; +import path from 'path'; remoteMain.initialize(); import { + isLinux, isMac, isWindows, - isLinux, } from './environment'; // Set app directory before loading user modules @@ -44,23 +44,23 @@ if (isDevMode) { app.commandLine.appendSwitch('disable-features', 'CrossOriginOpenerPolicy'); app.commandLine.appendSwitch('disable-site-isolation-trials'); -import ipcApi from './electron/ipc-api'; -import Tray from './lib/Tray'; import Settings from './electron/Settings'; import handleDeepLink from './electron/deepLinking'; +import './electron/exception'; +import ipcApi from './electron/ipc-api'; import { isPositionValid } from './electron/windowUtils'; +import Tray from './lib/Tray'; import { appId } from './package.json'; // eslint-disable-line import/no-unresolved -import './electron/exception'; import { DEFAULT_APP_SETTINGS, DEFAULT_WINDOW_OPTIONS, LIVE_API_WEBSITE, } from './config'; +import { openOverlay } from './electron/ipc-api/overlayWindow'; import { asarPath } from './helpers/asar-helpers'; import { isValidExternalURL } from './helpers/url-helpers'; import userAgent from './helpers/userAgent-helpers'; -import { openOverlay } from './electron/ipc-api/overlayWindow'; import { darkThemeGrayDarker, themeGrayLightest, windowsTitleBarHeight } from './theme/default/legacy'; /* eslint-enable import/first */ diff --git a/src/ipcChannels.ts b/src/ipcChannels.ts index 49102514e..f24c5da8e 100644 --- a/src/ipcChannels.ts +++ b/src/ipcChannels.ts @@ -20,6 +20,10 @@ export const UPDATE_SERVICE_STATE = 'UPDATE_SERVICE_STATE'; export const OVERLAY_OPEN = 'OVERLAY_OPEN'; export const OVERLAY_SHARE_SETTINGS = 'OVERLAY_SHARE_SETTINGS'; +// Settings +export const GET_SETTINGS = 'REQUEST_SETTINGS'; +export const SEND_SETTINGS = 'SEND_SETTINGS'; + // Share Franz Dialog export const SHARE_FRANZ_GET_SERVICE_COUNT = 'SHARE_FRANZ_GET_SERVICE_COUNT'; @@ -51,3 +55,6 @@ export const FETCH_DEBUG_INFO = 'FETCH_DEBUG_INFO'; export const TOGGLE_FULL_SCREEN = 'TOGGLE_FULL_SCREEN'; export const CHECK_MACOS_PERMISSIONS = 'CHECK_MACOS_PERMISSIONS'; export const RELOAD_APP = 'RELOAD_APP'; + +// Relay +export const RELAY_MESSAGE = 'RELAY_MESSAGE'; diff --git a/src/overlayApp.js b/src/overlayApp.js index 23f9ae8f4..24e26672d 100644 --- a/src/overlayApp.js +++ b/src/overlayApp.js @@ -1,25 +1,25 @@ import { ipcRenderer, webFrame } from 'electron'; -import React from 'react'; -import { IntlProvider } from 'react-intl'; import { render } from 'react-dom'; +import { IntlProvider } from 'react-intl'; import { - Router, Route, hashHistory, + Route, + Router, + hashHistory, } from 'react-router'; import '@babel/polyfill'; -import smoothScroll from 'smoothscroll-polyfill'; -import { ThemeProvider } from 'react-jss'; import { theme } from '@meetfranz/theme'; +import { ThemeProvider } from 'react-jss'; +import smoothScroll from 'smoothscroll-polyfill'; -import translations from './i18n/translations'; -import ShareFranz from './features/shareFranz/Component'; -import { OVERLAY_SHARE_SETTINGS } from './ipcChannels'; -import { DEFAULT_WEB_CONTENTS_ID } from './config'; import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; -import PlanSelectionScreen from './features/planSelection/containers/PlanSelectionScreen'; -import { Component as DesktopCapturer } from './features/desktopCapturer'; import { Component as BasicAuth } from './features/basicAuth'; +import { Component as DesktopCapturer } from './features/desktopCapturer'; +import PlanSelectionScreen from './features/planSelection/containers/PlanSelectionScreen'; +import ShareFranz from './features/shareFranz/Component'; +import translations from './i18n/translations'; +import { GET_SETTINGS, SEND_SETTINGS } from './ipcChannels'; // Add Polyfills smoothScroll.polyfill(); @@ -58,7 +58,7 @@ let checkAppInitLoop; function initOverlayApp() { if (!overlayAppInitialized) { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, OVERLAY_SHARE_SETTINGS); + ipcRenderer.send(GET_SETTINGS, 'app'); } else { clearInterval(checkAppInitLoop); } @@ -70,10 +70,10 @@ window.addEventListener('load', () => { checkAppInitLoop = setInterval(() => initOverlayApp(), 500); }); -ipcRenderer.on(OVERLAY_SHARE_SETTINGS, (event, settings) => { +ipcRenderer.on(SEND_SETTINGS, (event, { data: settings }) => { setup(settings); - if (settings.theme === 'dark') { + if (settings.darkMode) { document.querySelector('body').classList.add('theme__dark'); } diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index 5e0beab80..aa674e04f 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -30,7 +30,7 @@ import { sleep } from '../helpers/async-helpers'; import { getServiceIdsFromPartitions, removeServicePartitionDirectory } from '../helpers/service-helpers.js'; import { isValidExternalURL } from '../helpers/url-helpers'; import { - CHECK_FOR_UPDATE, CHECK_MACOS_PERMISSIONS, FETCH_DEBUG_INFO, OVERLAY_SHARE_SETTINGS, RELOAD_APP, WINDOWS_TITLEBAR_FETCH_MENU + CHECK_FOR_UPDATE, CHECK_MACOS_PERMISSIONS, FETCH_DEBUG_INFO, OVERLAY_SHARE_SETTINGS, RELOAD_APP, WINDOWS_TITLEBAR_FETCH_MENU, } from '../ipcChannels'; const debug = require('debug')('Franz:AppStore'); diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index cf77bdc01..aed5c7548 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -523,11 +523,13 @@ export default class ServicesStore extends Store { this.allDisplayed[prevIndex].isActive = true; } - @action _setUnreadMessageCount({ serviceId, count }) { + @action _setUnreadMessageCount({ serviceId, count = { direct: 0, indirect: 0 } }) { const service = this.one(serviceId); - service.unreadDirectMessageCount = count.direct; - service.unreadIndirectMessageCount = count.indirect; + if (service) { + service.unreadDirectMessageCount = count.direct; + service.unreadIndirectMessageCount = count.indirect; + } } @action _toggleService({ serviceId }) { diff --git a/src/stores/SettingsStore.js b/src/stores/SettingsStore.js index c10a99b4f..9e1ce8f37 100644 --- a/src/stores/SettingsStore.js +++ b/src/stores/SettingsStore.js @@ -4,13 +4,14 @@ import { } from 'mobx'; import localStorage from 'mobx-localstorage'; -import Store from './lib/Store'; -import Request from './lib/Request'; import { getLocale } from '../helpers/i18n-helpers'; +import Request from './lib/Request'; +import Store from './lib/Store'; import { DEFAULT_APP_SETTINGS, FILE_SYSTEM_SETTINGS_TYPES } from '../config'; -import { SPELLCHECKER_LOCALES } from '../i18n/languages'; import { APP_MENU_ACKNOWLEDGED_KEY } from '../features/appMenu'; +import { SPELLCHECKER_LOCALES } from '../i18n/languages'; +import { GET_SETTINGS, SEND_SETTINGS } from '../ipcChannels'; const debug = require('debug')('Franz:SettingsStore'); @@ -31,14 +32,14 @@ export default class SettingsStore extends Store { this.actions.settings.update.listen(this._update.bind(this)); this.actions.settings.remove.listen(this._remove.bind(this)); - ipcRenderer.on('appSettings', (event, resp) => { + ipcRenderer.on(SEND_SETTINGS, (event, resp) => { debug('Get appSettings resolves', resp.type, resp.data); Object.assign(this._fileSystemSettingsCache[resp.type], resp.data); }); this.fileSystemSettingsTypes.forEach((type) => { - ipcRenderer.send('getAppSettings', type); + ipcRenderer.send(GET_SETTINGS, type); }); } diff --git a/src/styles/layout.scss b/src/styles/layout.scss index 1919026d4..fc26ad52d 100644 --- a/src/styles/layout.scss +++ b/src/styles/layout.scss @@ -77,7 +77,7 @@ body:not(.darwin):not(.isFullScreen) .app .app__content { .electron-app-title-bar { z-index: 99999999; } body.darwin .window-draggable { - height: 35px; + height: 15px; left: 0; pointer-events: none; position: absolute; @@ -177,4 +177,4 @@ body:not(.darwin) .window-draggable { .appMenuBar { background: $theme-gray-lightest; -} \ No newline at end of file +} From e3c51571513fc0df6a4ff2fe526cfba99f3fe95b Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 6 Dec 2024 21:56:06 +0100 Subject: [PATCH 02/37] fix text & button color --- src/components/services/content/ServiceDisabled.js | 6 +++--- src/styles/button.scss | 13 +++++++++++++ src/styles/services.scss | 8 ++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/components/services/content/ServiceDisabled.js b/src/components/services/content/ServiceDisabled.js index d0f12256e..1dda9ceb8 100644 --- a/src/components/services/content/ServiceDisabled.js +++ b/src/components/services/content/ServiceDisabled.js @@ -1,6 +1,6 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; import { observer } from 'mobx-react'; +import PropTypes from 'prop-types'; +import { Component } from 'react'; import { defineMessages, intlShape } from 'react-intl'; import Button from '../../ui/Button'; @@ -39,7 +39,7 @@ export default @observer class ServiceDisabled extends Component {

{intl.formatMessage(messages.headline, { name })}

From 30f445c4fa81fe06c28b7ff76a95f847f59ca6c0 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sat, 14 Dec 2024 21:49:12 +0100 Subject: [PATCH 24/37] fix(App): Improve image quality of window previews in share screen selection --- src/electron/ipc-api/desktopCapturer.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/electron/ipc-api/desktopCapturer.ts b/src/electron/ipc-api/desktopCapturer.ts index 9cf6d46cd..9ac3fd9bf 100644 --- a/src/electron/ipc-api/desktopCapturer.ts +++ b/src/electron/ipc-api/desktopCapturer.ts @@ -9,6 +9,7 @@ export default async () => { const sources = await desktopCapturer.getSources({ types: ['window', 'screen'], fetchWindowIcons: true, + thumbnailSize: { width: 1920, height: 1080 }, }); debug('Available sources', sources); return sources.map((source) => { From a28c1d9547ff693245444b5ce67a26286f656c8d Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sat, 14 Dec 2024 21:49:40 +0100 Subject: [PATCH 25/37] fix(App): Fix background colors --- src/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index dd6425cc1..fd56aeb84 100644 --- a/src/index.js +++ b/src/index.js @@ -61,7 +61,9 @@ import { openOverlay } from './electron/ipc-api/overlayWindow'; import { asarPath } from './helpers/asar-helpers'; import { isValidExternalURL } from './helpers/url-helpers'; import userAgent from './helpers/userAgent-helpers'; -import { darkThemeGrayDarker, themeGrayLightest, windowsTitleBarHeight } from './theme/default/legacy'; +import { + darkThemeGrayDarker, darkThemeGrayDarkest, themeGrayLightest, windowsTitleBarHeight +} from './theme/default/legacy'; /* eslint-enable import/first */ const debug = require('debug')('Franz:App'); @@ -184,7 +186,7 @@ const createWindow = () => { minWidth: 600, minHeight: 500, frame: !isMac, - backgroundColor: !settings.get('darkMode') ? '#3498db' : '#1E1E1E', + backgroundColor: !settings.get('darkMode') ? themeGrayLightest : darkThemeGrayDarkest, titleBarStyle: 'hidden', autoHideMenuBar: true, titleBarOverlay: { From 3117c9e53b297d74a9e39dbb8aa20cff57934103 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sat, 14 Dec 2024 21:50:10 +0100 Subject: [PATCH 26/37] add missing prop validation --- src/components/layout/AppLayout.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index febf9aaf2..9d6dabb2b 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -64,6 +64,7 @@ class AppLayout extends Component { hasActivatedTrial: PropTypes.bool.isRequired, showWebControls: PropTypes.bool.isRequired, activeService: PropTypes.instanceOf(Service), + reloadAfterCountdownEnd: PropTypes.func.isRequired, }; static defaultProps = { From 313ca031915fa6d603f05a4aa88f5124ed237c2d Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sat, 14 Dec 2024 22:09:14 +0100 Subject: [PATCH 27/37] fix(App): Fix screen not being shared after selecting source --- src/webview/desktopCapturer.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/webview/desktopCapturer.js b/src/webview/desktopCapturer.js index b6d6dcd2d..53d02beac 100644 --- a/src/webview/desktopCapturer.js +++ b/src/webview/desktopCapturer.js @@ -24,9 +24,11 @@ function getDisplayMedia() { width: 600, }); - if (overlayAction === 'closed') { - reject(new Error('Source selection canceled')); - } + setTimeout(() => { + if (overlayAction === 'closed') { + reject(new Error('Source selection canceled')); + } + }, 250); }); } From 69ad832a39eda5ded884b965928c93cb85b8aebf Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sat, 14 Dec 2024 22:09:38 +0100 Subject: [PATCH 28/37] fix(App): Fix crash on logout --- src/electron/ipc-api/browserViewManager.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/electron/ipc-api/browserViewManager.ts b/src/electron/ipc-api/browserViewManager.ts index 4370b7800..4e75ce4fe 100644 --- a/src/electron/ipc-api/browserViewManager.ts +++ b/src/electron/ipc-api/browserViewManager.ts @@ -289,7 +289,7 @@ export default async ({ mainWindow, settings: { app: settings } }: { mainWindow: ipcMain.on(IPC.TODOS_CLIENT_CHANNEL, (event, data) => { debug('Received client IPC message from Todos', data); - mainWindow.webContents.send(IPC.TODOS_CLIENT_CHANNEL, data); + mainWindow?.webContents.send(IPC.TODOS_CLIENT_CHANNEL, data); }); ipcMain.on(IPC.TODOS_HOST_CHANNEL, (event, data) => { @@ -298,10 +298,10 @@ export default async ({ mainWindow, settings: { app: settings } }: { mainWindow: if (data.action === 'todos:toggleDevTools') { if (todosService) { - todosService.webContents.toggleDevTools(); + todosService?.webContents.toggleDevTools(); } } else { - todosService.webContents.send(IPC.TODOS_HOST_CHANNEL, data); + todosService?.webContents.send(IPC.TODOS_HOST_CHANNEL, data); } }); From f0517dbff9b9bf8a86c3639cb99de5e6ecbea9ce Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sat, 14 Dec 2024 22:24:33 +0100 Subject: [PATCH 29/37] add macos deps check as before-build hook --- build-helpers/ensure-mac-dependency.js | 59 ++++++++++++++------------ electron-builder.yml | 2 + package.json | 2 +- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/build-helpers/ensure-mac-dependency.js b/build-helpers/ensure-mac-dependency.js index 84109ed3d..4826d53f8 100644 --- a/build-helpers/ensure-mac-dependency.js +++ b/build-helpers/ensure-mac-dependency.js @@ -9,38 +9,43 @@ const packages = [ // Add more packages here if needed ]; -const isMac = os.platform() === 'darwin'; -packages.forEach((packageName) => { - const packagePath = path.join(__dirname, '..', 'node_modules', packageName); +exports.default = function () { + console.log('Checking for macOS dependencies...'); - if (isMac) { + const isMac = os.platform() === 'darwin'; + + packages.forEach((packageName) => { + const packagePath = path.join(__dirname, '..', 'node_modules', packageName); + + if (isMac) { // On macOS, ensure that the package is installed - if (!fs.existsSync(packagePath)) { - console.log(`macOS detected and ${packageName} is not installed. Installing...`); - try { - execSync(`npm install ${packageName}`, { stdio: 'inherit' }); - console.log(`${packageName} installed successfully.`); - } catch (error) { - console.error(`Failed to install ${packageName} on macOS:`, error); - process.exit(1); + if (!fs.existsSync(packagePath)) { + console.log(`macOS detected and ${packageName} is not installed. Installing...`); + try { + execSync(`npm install ${packageName}`, { stdio: 'inherit' }); + console.log(`${packageName} installed successfully.`); + } catch (error) { + console.error(`Failed to install ${packageName} on macOS:`, error); + process.exit(1); + } + } else { + console.log(`macOS detected and ${packageName} is already installed. No action needed.`); } } else { - console.log(`macOS detected and ${packageName} is already installed. No action needed.`); - } - } else { // On non-macOS platforms, ensure that the package is not present - if (fs.existsSync(packagePath)) { - console.log(`Non-macOS platform detected and ${packageName} is present. Removing...`); - try { - execSync(`npm uninstall ${packageName}`, { stdio: 'inherit' }); - console.log(`${packageName} removed successfully.`); - } catch (error) { - console.error(`Failed to uninstall ${packageName} on non-mac platform:`, error); - process.exit(1); + if (fs.existsSync(packagePath)) { + console.log(`Non-macOS platform detected and ${packageName} is present. Removing...`); + try { + execSync(`npm uninstall ${packageName}`, { stdio: 'inherit' }); + console.log(`${packageName} removed successfully.`); + } catch (error) { + console.error(`Failed to uninstall ${packageName} on non-mac platform:`, error); + process.exit(1); + } + } else { + console.log(`Non-macOS platform detected and ${packageName} is not installed. No action needed.`); } - } else { - console.log(`Non-macOS platform detected and ${packageName} is not installed. No action needed.`); } - } -}); + }); +}; diff --git a/electron-builder.yml b/electron-builder.yml index 6d3c06b11..d64bf2881 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -62,3 +62,5 @@ protocols: asarUnpack: - ./assets/images/taskbar + +beforeBuild: ./build-helpers/ensure-mac-dependency.js diff --git a/package.json b/package.json index 869e65ea2..fb7d16759 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "buildPackges": "npx lerna run build", "packages": "npx lerna publish --no-git-tag-version", "uidev": "cd uidev && webpack-dev-server", - "postinstall": "npx lerna run prepare && node ./build-helpers/ensure-mac-dependency.js" + "postinstall": "npx lerna run prepare" }, "keywords": [], "author": "Stefan Malzner ", From 33717e5c72bff6ce6c92c733e1761dc3273efcfe Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 15 Dec 2024 21:41:40 +0100 Subject: [PATCH 30/37] fix windows menu --- src/features/appMenu/index.js | 10 ++--- src/ipcChannels.ts | 1 - src/lib/Menu.js | 75 +++++++++++++++++++---------------- src/stores/AppStore.js | 6 +-- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/features/appMenu/index.js b/src/features/appMenu/index.js index dec5d5de9..d1f106f93 100644 --- a/src/features/appMenu/index.js +++ b/src/features/appMenu/index.js @@ -1,14 +1,14 @@ -import React, { Component } from 'react'; -import { PropTypes } from 'prop-types'; +import { mdiDotsVertical } from '@mdi/js'; +import { Icon } from '@meetfranz/ui'; import { inject, observer } from 'mobx-react'; +import { PropTypes } from 'prop-types'; +import React, { Component } from 'react'; import { intlShape } from 'react-intl'; import injectSheet from 'react-jss'; -import { Icon } from '@meetfranz/ui'; -import { mdiDotsVertical } from '@mdi/js'; -import { windowsTitleBarHeight } from '../../theme/default/legacy'; import { AppMenu } from '../../lib/Menu'; import AppStore from '../../stores/AppStore'; import SettingsStore from '../../stores/SettingsStore'; +import { windowsTitleBarHeight } from '../../theme/default/legacy'; export const APP_MENU_ACKNOWLEDGED_KEY = 'appMenuBarAcknowledged'; diff --git a/src/ipcChannels.ts b/src/ipcChannels.ts index f24c5da8e..d476bc3b5 100644 --- a/src/ipcChannels.ts +++ b/src/ipcChannels.ts @@ -50,7 +50,6 @@ export const WORKSPACE_OPEN_SETTINGS = 'WORKSPACE_OPEN_SETTINGS'; export const WORKSPACE_ACTIVATE = 'WORKSPACE_ACTIVATE'; // General -export const CHECK_FOR_UPDATE = 'CHECK_FOR_UPDATE'; export const FETCH_DEBUG_INFO = 'FETCH_DEBUG_INFO'; export const TOGGLE_FULL_SCREEN = 'TOGGLE_FULL_SCREEN'; export const CHECK_MACOS_PERMISSIONS = 'CHECK_MACOS_PERMISSIONS'; diff --git a/src/lib/Menu.js b/src/lib/Menu.js index b630d9042..c3456ab28 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js @@ -1,23 +1,28 @@ -import { shell, clipboard, ipcRenderer } from 'electron'; import { - app, Menu, dialog, webContents, getCurrentWindow, + app, + dialog, + getCurrentWindow, + Menu, + webContents, } from '@electron/remote'; -import { observable, autorun } from 'mobx'; +import { clipboard, ipcRenderer, shell } from 'electron'; +import { autorun, observable } from 'mobx'; import { defineMessages } from 'react-intl'; -import { isMac, ctrlKey, cmdKey } from '../environment'; -import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../features/workspaces/index'; -import { workspaceActions } from '../features/workspaces/actions'; -import { gaEvent } from './analytics'; -import { announcementActions } from '../features/announcements/actions'; +import { DEFAULT_WEB_CONTENTS_ID } from '../config'; +import { cmdKey, ctrlKey, isMac } from '../environment'; import { announcementsStore } from '../features/announcements'; +import { announcementActions } from '../features/announcements/actions'; import { GA_CATEGORY_TODOS, todosStore } from '../features/todos'; import { todoActions } from '../features/todos/actions'; import { CUSTOM_WEBSITE_ID } from '../features/webControls/constants'; +import { workspaceActions } from '../features/workspaces/actions'; +import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../features/workspaces/index'; import { - ACTIVATE_NEXT_SERVICE, ACTIVATE_PREVIOUS_SERVICE, ACTIVATE_SERVICE, CHECK_FOR_UPDATE, FETCH_DEBUG_INFO, GET_ACTIVE_SERVICE_WEB_CONTENTS_ID, OPEN_SERVICE_DEV_TOOLS, RELOAD_APP, RELOAD_SERVICE, SETTINGS_NAVIGATE_TO, TODOS_OPEN_DEV_TOOLS, TODOS_RELOAD, TODOS_TOGGLE_DRAWER, TODOS_TOGGLE_ENABLE_TODOS, TOGGLE_FULL_SCREEN, WORKSPACE_ACTIVATE, WORKSPACE_OPEN_SETTINGS, WORKSPACE_TOGGLE_DRAWER, + ACTIVATE_NEXT_SERVICE, ACTIVATE_PREVIOUS_SERVICE, ACTIVATE_SERVICE, + GET_ACTIVE_SERVICE_WEB_CONTENTS_ID, OPEN_SERVICE_DEV_TOOLS, RELOAD_APP, RELOAD_SERVICE, SETTINGS_NAVIGATE_TO, TODOS_OPEN_DEV_TOOLS, TODOS_RELOAD, TODOS_TOGGLE_DRAWER, TODOS_TOGGLE_ENABLE_TODOS, TOGGLE_FULL_SCREEN, WORKSPACE_ACTIVATE, WORKSPACE_OPEN_SETTINGS, WORKSPACE_TOGGLE_DRAWER, } from '../ipcChannels'; -import { DEFAULT_WEB_CONTENTS_ID } from '../config'; +import { gaEvent } from './analytics'; export const menuItems = defineMessages({ edit: { @@ -452,7 +457,7 @@ export const _titleBarTemplateFactory = ({ user, intl }) => [ label: intl.formatMessage(menuItems.reloadFranz), accelerator: `${cmdKey}+Shift+R`, click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, RELOAD_APP); + window.location.reload(); }, }, { @@ -493,7 +498,7 @@ export const _titleBarTemplateFactory = ({ user, intl }) => [ }, { label: intl.formatMessage(menuItems.changelog), - click() { shell.openExternal('https://github.com/meetfranz/franz/blob/master/CHANGELOG.md'); }, + click() { shell.openExternal('https://meetfranz.com/changelog'); }, }, { type: 'separator', @@ -519,17 +524,14 @@ export const _titleBarTemplateFactory = ({ user, intl }) => [ { label: intl.formatMessage(menuItems.debugInfo), click: () => { - ipcRenderer.on(FETCH_DEBUG_INFO, (e, data) => { - console.log('huhu, debug'); - clipboard.write({ - text: JSON.stringify(data), - }); + const { debugInfo } = window.franz.stores.app; + clipboard.write({ + text: JSON.stringify(debugInfo, null, 2), + }); - const notification = new window.Notification(intl.formatMessage(menuItems.debugInfoCopiedHeadline), { - body: intl.formatMessage(menuItems.debugInfoCopiedBody), - }); + const notification = new window.Notification(intl.formatMessage(menuItems.debugInfoCopiedHeadline), { + body: intl.formatMessage(menuItems.debugInfoCopiedBody), }); - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, FETCH_DEBUG_INFO); }, }, ], @@ -557,7 +559,7 @@ export const _titleBarTemplateFactory = ({ user, intl }) => [ { label: intl.formatMessage(menuItems.checkForUpdates), click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, CHECK_FOR_UPDATE); + window.franz.actions.app.checkForUpdates(); }, }, { @@ -567,18 +569,13 @@ export const _titleBarTemplateFactory = ({ user, intl }) => [ label: intl.formatMessage(menuItems.settings), accelerator: 'CmdOrCtrl+,', click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, SETTINGS_NAVIGATE_TO, { - path: 'app', - }); + window.franz.actions.ui.openSettings({ path: 'app' }); }, enabled: user.isLoggedIn, }, { type: 'separator', }, - { - type: 'separator', - }, { label: intl.formatMessage(menuItems.edit), visible: false, @@ -785,7 +782,8 @@ function serviceMenu({ && services.length > 0) { ipcRenderer.send(RELOAD_SERVICE); } else { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, RELOAD_APP); + const contents = webContents.fromId(DEFAULT_WEB_CONTENTS_ID); + contents.send(RELOAD_APP); } }, }); @@ -819,7 +817,8 @@ function workspacesMenu({ label: intl.formatMessage(menuItems.addNewWorkspace), accelerator: `${cmdKey}+Shift+N`, click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, WORKSPACE_OPEN_SETTINGS); + const contents = webContents.fromId(DEFAULT_WEB_CONTENTS_ID); + contents.send(WORKSPACE_OPEN_SETTINGS); }, enabled: user.isLoggedIn, }); @@ -832,7 +831,8 @@ function workspacesMenu({ label: intl.formatMessage(drawerLabel), accelerator: `${cmdKey}+D`, click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, WORKSPACE_TOGGLE_DRAWER); + const contents = webContents.fromId(DEFAULT_WEB_CONTENTS_ID); + contents.send(WORKSPACE_TOGGLE_DRAWER); gaEvent(GA_CATEGORY_WORKSPACES, 'toggleDrawer', 'menu'); }, enabled: user.isLoggedIn, @@ -847,7 +847,8 @@ function workspacesMenu({ type: 'radio', checked: !activeWorkspace, click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, WORKSPACE_ACTIVATE); + const contents = webContents.fromId(DEFAULT_WEB_CONTENTS_ID); + contents.send(WORKSPACE_ACTIVATE); gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'menu'); }, }); @@ -860,7 +861,8 @@ function workspacesMenu({ type: 'radio', checked: activeWorkspace ? workspace.id === activeWorkspace.id : false, click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, WORKSPACE_ACTIVATE, { workspaceId: workspace.id }); + const contents = webContents.fromId(DEFAULT_WEB_CONTENTS_ID); + contents.send(WORKSPACE_ACTIVATE, { workspaceId: workspace.id }); gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'menu'); }, })); @@ -880,7 +882,9 @@ function todosMenu({ label: intl.formatMessage(drawerLabel), accelerator: `${cmdKey}+T`, click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, TODOS_TOGGLE_DRAWER); + const contents = webContents.fromId(DEFAULT_WEB_CONTENTS_ID); + contents.send(TODOS_TOGGLE_DRAWER); + gaEvent(GA_CATEGORY_TODOS, 'toggleDrawer', 'menu'); }, enabled: user.isLoggedIn && isTodosEnabled, @@ -908,7 +912,8 @@ function todosMenu({ }, { label: intl.formatMessage(menuItems.enableTodos), click: () => { - ipcRenderer.sendTo(DEFAULT_WEB_CONTENTS_ID, TODOS_TOGGLE_ENABLE_TODOS); + const contents = webContents.fromId(DEFAULT_WEB_CONTENTS_ID); + contents.send(TODOS_TOGGLE_ENABLE_TODOS); gaEvent(GA_CATEGORY_TODOS, 'enable', 'menu'); }, }); diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index aa674e04f..83e8edc07 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -30,7 +30,7 @@ import { sleep } from '../helpers/async-helpers'; import { getServiceIdsFromPartitions, removeServicePartitionDirectory } from '../helpers/service-helpers.js'; import { isValidExternalURL } from '../helpers/url-helpers'; import { - CHECK_FOR_UPDATE, CHECK_MACOS_PERMISSIONS, FETCH_DEBUG_INFO, OVERLAY_SHARE_SETTINGS, RELOAD_APP, WINDOWS_TITLEBAR_FETCH_MENU, + CHECK_MACOS_PERMISSIONS, FETCH_DEBUG_INFO, OVERLAY_SHARE_SETTINGS, RELOAD_APP, WINDOWS_TITLEBAR_FETCH_MENU } from '../ipcChannels'; const debug = require('debug')('Franz:AppStore'); @@ -180,10 +180,6 @@ export default class AppStore extends Store { ipcRenderer.sendTo(e.senderId, FETCH_DEBUG_INFO, JSON.parse(JSON.stringify(this.debugInfo))); }); - ipcRenderer.on(CHECK_FOR_UPDATE, () => { - this._checkForUpdates(); - }); - // Handle deep linking (franz://) ipcRenderer.on('navigateFromDeepLink', (event, data) => { debug('Navigate from deep link', data); From a06f5c03138299b5d310ac39a768b87c0d50000d Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 15 Dec 2024 21:53:16 +0100 Subject: [PATCH 31/37] test build with custom python setup --- .github/workflows/build.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cfae14f96..2e9e8082c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,6 +51,17 @@ jobs: node-version: 16.14.0 cache: "npm" + - name: Set up Python (mac only) + if: matrix.platform == 'mac' + uses: actions/setup-python@v4 + with: + python-version: '3.9' + + - name: Upgrade pip and install setuptools/wheel (mac only) + if: matrix.platform == 'mac' + run: | + python3 -m pip install --upgrade pip setuptools wheel + - name: Install dependencies run: | npm i -g lerna@3.8 From 34f29ef21a30d0219ba538407c331596c7d6f676 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 15 Dec 2024 21:59:34 +0100 Subject: [PATCH 32/37] move notarization team id to env vars --- .github/workflows/build.yml | 1 + electron-builder.yml | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2e9e8082c..069e8b232 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,7 @@ jobs: out/*.mac.zip.blockmap out/latest-mac.yml CSC_LINK: CSC_LINK_MAC + APPLE_TEAM_ID: TAC9P63ANZ - platform: ubuntu os: ubuntu-latest diff --git a/electron-builder.yml b/electron-builder.yml index d64bf2881..cc32ed356 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -9,8 +9,6 @@ compression: maximum mac: category: public.app-category.productivity icon: ./build-helpers/images/icon.icns - notarize: - teamId: TAC9P63ANZ target: target: default arch: From 310fb68b74910d71a89a6f431f9d0da072b39342 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 15 Dec 2024 21:59:37 +0100 Subject: [PATCH 33/37] migrate to upload-artifact v4 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 069e8b232..688819c2d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,7 @@ jobs: run: npm run build - name: Upload Artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.platform }} path: ${{ matrix.artifactPath }} From 753827f81d9decfba3f5de691736d227806d89a4 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 15 Dec 2024 22:24:45 +0100 Subject: [PATCH 34/37] fix missing node_modules --- build-helpers/ensure-mac-dependency.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build-helpers/ensure-mac-dependency.js b/build-helpers/ensure-mac-dependency.js index 4826d53f8..6acadf9d7 100644 --- a/build-helpers/ensure-mac-dependency.js +++ b/build-helpers/ensure-mac-dependency.js @@ -48,4 +48,6 @@ exports.default = function () { } } }); + + return true; }; From 87c0846c1cf1b00419e3179cc473b3009c472c38 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 15 Dec 2024 22:45:51 +0100 Subject: [PATCH 35/37] update notarization env vars --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 688819c2d..06e0bfa05 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,8 +3,8 @@ name: Build/release on: push env: - APPLEID: ${{ secrets.APPLEID }} - APPLEIDPASS: ${{ secrets.APPLEIDPASS }} + APPLE_ID: ${{ secrets.APPLEID }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLEIDPASS }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} From 97c34d4da0c322464df588ec1a258b71c66b7245 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 15 Dec 2024 23:34:05 +0100 Subject: [PATCH 36/37] fix(Service): Fix custom service icon upload --- .../settings/services/EditServiceForm.js | 24 +++++------ src/components/ui/ImageUpload.js | 43 +++++++++++++++---- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js index 65c1ec8a1..601e9868e 100644 --- a/src/components/settings/services/EditServiceForm.js +++ b/src/components/settings/services/EditServiceForm.js @@ -1,25 +1,25 @@ -import React, { Component, Fragment } from 'react'; -import PropTypes from 'prop-types'; import { observer } from 'mobx-react'; -import { Link } from 'react-router'; -import { defineMessages, intlShape } from 'react-intl'; import normalizeUrl from 'normalize-url'; +import PropTypes from 'prop-types'; +import { Component, Fragment } from 'react'; +import { defineMessages, intlShape } from 'react-intl'; +import { Link } from 'react-router'; import Form from '../../../lib/Form'; -import User from '../../../models/User'; import Recipe from '../../../models/Recipe'; import Service from '../../../models/Service'; -import Tabs, { TabItem } from '../../ui/Tabs'; -import Input from '../../ui/Input'; -import Toggle from '../../ui/Toggle'; +import User from '../../../models/User'; import Button from '../../ui/Button'; import ImageUpload from '../../ui/ImageUpload'; +import Input from '../../ui/Input'; import Select from '../../ui/Select'; +import Tabs, { TabItem } from '../../ui/Tabs'; +import Toggle from '../../ui/Toggle'; -import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; -import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox'; -import { serviceLimitStore } from '../../../features/serviceLimit'; import { isMac } from '../../../environment'; +import { serviceLimitStore } from '../../../features/serviceLimit'; +import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox'; +import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; const messages = defineMessages({ saveService: { @@ -160,7 +160,7 @@ export default @observer class EditServiceForm extends Component { const values = form.values(); let isValid = true; - const files = form.$('customIcon').files; + const { files } = form.$('customIcon'); if (files) { values.iconFile = files[0]; } diff --git a/src/components/ui/ImageUpload.js b/src/components/ui/ImageUpload.js index 83a05554b..df2a64383 100644 --- a/src/components/ui/ImageUpload.js +++ b/src/components/ui/ImageUpload.js @@ -1,8 +1,8 @@ -import React, { Component, Fragment } from 'react'; -import PropTypes from 'prop-types'; +import classnames from 'classnames'; import { observer } from 'mobx-react'; import { Field } from 'mobx-react-form'; -import classnames from 'classnames'; +import PropTypes from 'prop-types'; +import { Component, Fragment } from 'react'; import Dropzone from 'react-dropzone'; export default @observer class ImageUpload extends Component { @@ -21,6 +21,7 @@ export default @observer class ImageUpload extends Component { state = { path: null, + image: null, } dropzoneRef = null; @@ -28,10 +29,32 @@ export default @observer class ImageUpload extends Component { onDrop(acceptedFiles) { const { field } = this.props; + console.log('acceptedFiles', acceptedFiles); + acceptedFiles.forEach((file) => { - this.setState({ - path: file.path, - }); + if (file) { + const reader = new FileReader(); + + // When the file reader is done, this function runs + reader.onloadend = () => { + // `reader.result` is something like: "data:image/png;base64,iVBORw0K..." + const base64Data = reader.result; + + // If you need just the base64 portion without the data URL prefix: + // const base64String = base64Data.split(',')[1]; + + console.log('Base64 Image:', base64Data); + + this.setState({ + image: base64Data, + }); + // Now you can use `base64Data` (or `base64String`) as needed. + }; + + // Read the file as a Data URL + reader.readAsDataURL(file); + } + this.props.field.onDrop(file); }); @@ -52,16 +75,18 @@ export default @observer class ImageUpload extends Component { [`${className}`]: className, }); + console.log('state', this.state); + return (
- {(field.value && field.value !== 'delete') || this.state.path ? ( + {(field.value && field.value !== 'delete') || this.state.image ? (
@@ -72,7 +97,7 @@ export default @observer class ImageUpload extends Component { field.set('delete'); } else { this.setState({ - path: null, + image: null, }); } }} From 46632c5ba48d3382879f37ebb5b9142ddd1802e8 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 15 Dec 2024 23:34:14 +0100 Subject: [PATCH 37/37] add tailwind --- gulpfile.babel.js | 27 +- package-lock.json | 1438 +++++++++++++++++++++++++++++++++++++++--- package.json | 4 + src/styles/main.scss | 4 + tailwind.config.js | 10 + 5 files changed, 1395 insertions(+), 88 deletions(-) create mode 100644 tailwind.config.js diff --git a/gulpfile.babel.js b/gulpfile.babel.js index bc1f9b7ba..516ea89cc 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -11,6 +11,11 @@ import ts from 'gulp-typescript'; import hexRgb from 'hex-rgb'; import kebabCase from 'kebab-case'; +// Tailwind & PostCSS +import autoprefixer from 'autoprefixer'; +import postcss from 'gulp-postcss'; +import tailwindcss from 'tailwindcss'; + import config from './package.json'; import * as rawStyleConfig from './src/theme/default/legacy.js'; @@ -23,7 +28,13 @@ dotenv.config(); const styleConfig = Object.keys(rawStyleConfig).map((key) => { const isHex = /^#[0-9A-F]{6}$/i.test(rawStyleConfig[key]); - return ({ [`$raw_${kebabCase(key)}`]: isHex ? hexRgb(rawStyleConfig[key], { format: 'array' }).splice(0, 3).join(',') : rawStyleConfig[key] }); + return ({ + [`$raw_${kebabCase(key)}`]: isHex + ? hexRgb(rawStyleConfig[key], { format: 'array' }) + .splice(0, 3) + .join(',') + : rawStyleConfig[key], + }); }); const paths = { @@ -45,7 +56,6 @@ const paths = { src: 'src/**/*.js', dest: 'build/', watch: [ - // 'packages/**/*.js', 'src/**/*.js', ], }, @@ -53,17 +63,11 @@ const paths = { src: 'src/**/*.ts', dest: 'build/', watch: [ - // 'packages/**/*.js', 'src/**/*.ts', ], }, packages: { watch: 'packages/**/*', - // dest: 'build/', - // watch: [ - // // 'packages/**/*.js', - // 'src/**/*.js', - // ], }, }; @@ -86,7 +90,6 @@ function _shell(cmd, cb) { const clean = (done) => { removeSync(paths.tmp); removeSync(paths.dest); - done(); }; export { clean }; @@ -96,7 +99,6 @@ export function mvSrc() { [ `${paths.src}/*`, `${paths.src}/*/**`, - `!${paths.scripts.watch[1]}`, `!${paths.src}/styles/**`, `!${paths.src}/**/*.js`, `!${paths.src}/**/*.ts`, @@ -139,6 +141,10 @@ export function styles() { '../node_modules', ], }).on('error', sass.logError)) + .pipe(postcss([ + tailwindcss('./tailwind.config.js'), + autoprefixer(), + ])) .pipe(gulp.dest(paths.styles.dest)); } @@ -169,7 +175,6 @@ export function watch() { gulp.watch([ paths.src, `${paths.scripts.src}`, - `${paths.scripts.src}`, `${paths.styles.src}`, ], mvSrc); diff --git a/package-lock.json b/package-lock.json index f9917866d..a5c2d5c2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,6 +92,7 @@ "@types/uuid": "3.4.4", "@typescript-eslint/eslint-plugin": "5.13.0", "@typescript-eslint/parser": "5.13.0", + "autoprefixer": "10.4.20", "babel-eslint": "10.0.1", "babel-loader": "^8.0.4", "babel-plugin-react-intl": "3.0.1", @@ -116,6 +117,7 @@ "gulp": "^4.0.0", "gulp-babel": "^8.0.0", "gulp-cli": "1.2.2", + "gulp-postcss": "10.0.0", "gulp-sass": "5.0.0", "gulp-sass-variables": "1.1.1", "gulp-server-livereload": "^1.9.2", @@ -130,8 +132,10 @@ "mobx-react-devtools": "6.0.3", "mocha": "5.2.0", "node-abi": "3.71.0", + "postcss": "8.4.49", "prettier": "1.15.2", "react-intl-translations-manager": "5.0.3", + "tailwindcss": "3.4.16", "terser-webpack-plugin": "1.2.1", "ts-loader": "5.3.2", "tslint": "5.12.0", @@ -195,6 +199,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/cli": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.0.0.tgz", @@ -7668,6 +7684,12 @@ "readable-stream": "^2.0.6" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -8140,6 +8162,43 @@ "node": ">=4" } }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -8990,9 +9049,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -9009,10 +9068,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -9532,6 +9591,15 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", @@ -9562,9 +9630,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001515", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", - "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, "funding": [ { @@ -11592,6 +11660,18 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -12205,6 +12285,12 @@ "wrappy": "1" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -12271,6 +12357,12 @@ "node": ">=4" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/dmg-builder": { "version": "25.1.8", "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.1.8.tgz", @@ -13756,9 +13848,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.457", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz", - "integrity": "sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true }, "node_modules/electron-updater": { @@ -14303,9 +14395,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -16134,6 +16226,19 @@ "node": ">= 0.6" } }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -16270,10 +16375,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -17589,6 +17697,48 @@ "y18n": "^3.2.0" } }, + "node_modules/gulp-postcss": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-10.0.0.tgz", + "integrity": "sha512-z1RF2RJEX/BvFsKN11PXai8lRmihZTiHnlJf7Zu8uHaA/Q7Om4IeN8z1NtMAW5OiLwUY02H0DIFl9tHl0CNSgA==", + "dev": true, + "dependencies": { + "fancy-log": "^2.0.0", + "plugin-error": "^2.0.1", + "postcss-load-config": "^5.0.0", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/gulp-postcss/node_modules/fancy-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz", + "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==", + "dev": true, + "dependencies": { + "color-support": "^1.1.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp-postcss/node_modules/plugin-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-2.0.1.tgz", + "integrity": "sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/gulp-sass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.0.0.tgz", @@ -18866,6 +19016,18 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -19862,12 +20024,15 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", + "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21378,6 +21543,15 @@ "node": ">=6" } }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -22454,6 +22628,18 @@ "lightercollective": "index.js" } }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -24930,9 +25116,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node_modules/node-watch": { @@ -24989,6 +25175,15 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -30688,9 +30883,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -30871,6 +31066,171 @@ "node": ">=0.10.0" } }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -31588,6 +31948,24 @@ "read-binary-file-arch": "cli.js" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-cmd-shim": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", @@ -32271,12 +32649,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", + "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -33813,6 +34191,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -34417,6 +34804,105 @@ "node": ">=4" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -34477,6 +34963,293 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/tailwindcss": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz", + "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tailwindcss/node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwindcss/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/tailwindcss/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/tailwindcss/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss/node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/tailwindcss/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -35059,6 +35832,12 @@ "utf8-byte-length": "^1.0.1" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/ts-loader": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.2.tgz", @@ -35710,9 +36489,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -35729,8 +36508,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -37256,6 +38035,18 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -37548,6 +38339,12 @@ } } }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, "@babel/cli": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.0.0.tgz", @@ -43510,6 +44307,12 @@ "readable-stream": "^2.0.6" } }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -43879,6 +44682,20 @@ "core-js": "^2.5.0" } }, + "autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "requires": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + } + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -44614,15 +45431,15 @@ } }, "browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" } }, "bser": { @@ -45017,6 +45834,12 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, "camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", @@ -45037,9 +45860,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001515", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", - "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true }, "capture-exit": { @@ -46683,6 +47506,12 @@ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -47164,6 +47993,12 @@ "wrappy": "1" } }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -47217,6 +48052,12 @@ "path-type": "^3.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "dmg-builder": { "version": "25.1.8", "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.1.8.tgz", @@ -48372,9 +49213,9 @@ } }, "electron-to-chromium": { - "version": "1.4.457", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz", - "integrity": "sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true }, "electron-updater": { @@ -48847,9 +49688,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-html": { @@ -50285,6 +51126,12 @@ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, + "fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -50401,9 +51248,9 @@ } }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { @@ -51700,6 +52547,38 @@ } } }, + "gulp-postcss": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-10.0.0.tgz", + "integrity": "sha512-z1RF2RJEX/BvFsKN11PXai8lRmihZTiHnlJf7Zu8uHaA/Q7Om4IeN8z1NtMAW5OiLwUY02H0DIFl9tHl0CNSgA==", + "dev": true, + "requires": { + "fancy-log": "^2.0.0", + "plugin-error": "^2.0.1", + "postcss-load-config": "^5.0.0", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "dependencies": { + "fancy-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz", + "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==", + "dev": true, + "requires": { + "color-support": "^1.1.3" + } + }, + "plugin-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-2.0.1.tgz", + "integrity": "sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1" + } + } + } + }, "gulp-sass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.0.0.tgz", @@ -52463,6 +53342,15 @@ "minimalistic-assert": "^1.0.1" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -53255,12 +54143,12 @@ } }, "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", + "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.2" } }, "is-data-descriptor": { @@ -54430,6 +55318,12 @@ } } }, + "jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -55354,6 +56248,12 @@ "integrity": "sha512-J9tg5uraYoQKaWbmrzDDexbG6hHnMcWS1qLYgJSWE+mpA3U5OCSeMUhb+K55otgZJ34oFdR0ECvdIb3xuO5JOQ==", "dev": true }, + "lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -57394,9 +58294,9 @@ } }, "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node-watch": { @@ -57444,6 +58344,12 @@ "remove-trailing-separator": "^1.0.1" } }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -61781,9 +62687,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -61929,6 +62835,80 @@ "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true }, + "postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "dependencies": { + "nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true + } + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "requires": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + } + }, + "postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.1.1" + } + }, + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -62492,6 +63472,23 @@ "debug": "^4.3.4" } }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, "read-cmd-shim": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", @@ -63043,12 +64040,12 @@ } }, "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", + "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", "dev": true, "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -64311,6 +65308,12 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -64807,6 +65810,77 @@ "through": "^2.3.4" } }, + "sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } + } + }, "sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -64852,6 +65926,204 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "tailwindcss": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz", + "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "requires": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -65345,6 +66617,12 @@ "utf8-byte-length": "^1.0.1" } }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "ts-loader": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.2.tgz", @@ -65866,13 +67144,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "upper-case": { @@ -67127,6 +68405,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", diff --git a/package.json b/package.json index fb7d16759..6fc6dc7d4 100644 --- a/package.json +++ b/package.json @@ -117,6 +117,7 @@ "@types/uuid": "3.4.4", "@typescript-eslint/eslint-plugin": "5.13.0", "@typescript-eslint/parser": "5.13.0", + "autoprefixer": "10.4.20", "babel-eslint": "10.0.1", "babel-loader": "^8.0.4", "babel-plugin-react-intl": "3.0.1", @@ -141,6 +142,7 @@ "gulp": "^4.0.0", "gulp-babel": "^8.0.0", "gulp-cli": "1.2.2", + "gulp-postcss": "10.0.0", "gulp-sass": "5.0.0", "gulp-sass-variables": "1.1.1", "gulp-server-livereload": "^1.9.2", @@ -155,8 +157,10 @@ "mobx-react-devtools": "6.0.3", "mocha": "5.2.0", "node-abi": "3.71.0", + "postcss": "8.4.49", "prettier": "1.15.2", "react-intl-translations-manager": "5.0.3", + "tailwindcss": "3.4.16", "terser-webpack-plugin": "1.2.1", "ts-loader": "5.3.2", "tslint": "5.12.0", diff --git a/src/styles/main.scss b/src/styles/main.scss index 446bdca14..c61909456 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -3,6 +3,10 @@ $mdi-font-path: '../node_modules/mdi/fonts'; $mdi-font-path: '../../node_modules/mdi/fonts'; } +@tailwind base; +@tailwind components; +@tailwind utilities; + @import './node_modules/mdi/scss/materialdesignicons.scss'; // modules diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 000000000..cb1dfcaca --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,10 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './src/**/*.{html,js,ts}', + ], + theme: { + extend: {}, + }, + plugins: [], +};