Merge branch 'development' of github.com:FreeTubeApp/FreeTube into feat/add-page-bookmarking

This commit is contained in:
Jason Henriquez 2024-05-20 09:12:35 -05:00
commit 5597720028
56 changed files with 1159 additions and 641 deletions

View File

@ -1,14 +1,18 @@
const { existsSync, readFileSync, statSync } = require('fs')
const { existsSync, readFileSync } = require('fs')
const { readFile } = require('fs/promises')
const { join } = require('path')
const { brotliCompress, constants } = require('zlib')
const { promisify } = require('util')
const { load: loadYaml } = require('js-yaml')
const brotliCompressAsync = promisify(brotliCompress)
const PLUGIN_NAME = 'ProcessLocalesPlugin'
class ProcessLocalesPlugin {
constructor(options = {}) {
this.compress = !!options.compress
this.isIncrementalBuild = false
this.hotReload = !!options.hotReload
if (typeof options.inputDir !== 'string') {
throw new Error('ProcessLocalesPlugin: no input directory `inputDir` specified.')
@ -22,49 +26,68 @@ class ProcessLocalesPlugin {
}
this.outputDir = options.outputDir
this.locales = {}
/** @type {Map<str, any>} */
this.locales = new Map()
this.localeNames = []
this.activeLocales = []
this.cache = {}
/** @type {Map<str, any>} */
this.cache = new Map()
this.filePaths = []
this.previousTimestamps = new Map()
this.startTime = Date.now()
/** @type {(updatedLocales: [string, string][]) => void|null} */
this.notifyLocaleChange = null
if (this.hotReload) {
this.hotReloadScript = readFileSync(`${__dirname}/_hotReloadLocalesScript.js`, 'utf-8')
}
this.loadLocales()
}
/** @param {import('webpack').Compiler} compiler */
apply(compiler) {
compiler.hooks.thisCompilation.tap('ProcessLocalesPlugin', (compilation) => {
const { CachedSource, RawSource } = compiler.webpack.sources;
const { Compilation } = compiler.webpack
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
const IS_DEV_SERVER = !!compiler.watching
const { CachedSource, RawSource } = compiler.webpack.sources;
compilation.hooks.additionalAssets.tapPromise('process-locales-plugin', async (_assets) => {
compilation.hooks.processAssets.tapPromise({
name: PLUGIN_NAME,
stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL
}, async (_assets) => {
// While running in the webpack dev server, this hook gets called for every incremental build.
// For incremental builds we can return the already processed versions, which saves time
// and makes webpack treat them as cached
const promises = []
// Prevents `loadLocales` called twice on first time (e.g. release build)
if (this.isIncrementalBuild) {
this.loadLocales(true)
} else {
this.isIncrementalBuild = true
/** @type {[string, string][]} */
const updatedLocales = []
if (this.hotReload && !this.notifyLocaleChange) {
console.warn('ProcessLocalesPlugin: Unable to live reload locales as `notifyLocaleChange` is not set.')
}
Object.values(this.locales).forEach((localeEntry) => {
const { locale, data, mtimeMs } = localeEntry
for (let [locale, data] of this.locales) {
promises.push(new Promise(async (resolve) => {
if (IS_DEV_SERVER) {
const cacheEntry = this.cache[locale]
if (IS_DEV_SERVER && compiler.fileTimestamps) {
const filePath = join(this.inputDir, `${locale}.yaml`)
if (cacheEntry != null) {
const { filename, source, mtimeMs: cachedMtimeMs } = cacheEntry
const timestamp = compiler.fileTimestamps.get(filePath)?.safeTime
if (cachedMtimeMs === mtimeMs) {
compilation.emitAsset(filename, source, { minimized: true })
resolve()
return
}
if (timestamp && timestamp > (this.previousTimestamps.get(locale) ?? this.startTime)) {
this.previousTimestamps.set(locale, timestamp)
const contents = await readFile(filePath, 'utf-8')
data = loadYaml(contents)
} else {
const { filename, source } = this.cache.get(locale)
compilation.emitAsset(filename, source, { minimized: true })
resolve()
return
}
}
@ -73,6 +96,10 @@ class ProcessLocalesPlugin {
let filename = `${this.outputDir}/${locale}.json`
let output = JSON.stringify(data)
if (this.hotReload && compiler.fileTimestamps) {
updatedLocales.push([locale, output])
}
if (this.compress) {
filename += '.br'
output = await this.compressLocale(output)
@ -82,51 +109,61 @@ class ProcessLocalesPlugin {
if (IS_DEV_SERVER) {
source = new CachedSource(source)
this.cache[locale] = { filename, source, mtimeMs }
this.cache.set(locale, { filename, source })
// we don't need the unmodified sources anymore, as we use the cache `this.cache`
// so we can clear this to free some memory
this.locales.set(locale, null)
}
compilation.emitAsset(filename, source, { minimized: true })
resolve()
}))
if (IS_DEV_SERVER) {
// we don't need the unmodified sources anymore, as we use the cache `this.cache`
// so we can clear this to free some memory
delete localeEntry.data
}
})
}
await Promise.all(promises)
if (this.hotReload && this.notifyLocaleChange && updatedLocales.length > 0) {
this.notifyLocaleChange(updatedLocales)
}
})
})
compiler.hooks.afterCompile.tap(PLUGIN_NAME, (compilation) => {
if (!!compiler.watching) {
// watch locale files for changes
compilation.fileDependencies.addAll(this.filePaths)
}
})
compiler.hooks.emit.tap(PLUGIN_NAME, (compilation) => {
if (this.hotReload) {
// Find generated JavaScript output file (e.g. renderer.js or web.js)
// and inject the code snippet that listens for locale updates and replaces vue-i18n's locales
/** @type {string} */
const filename = [...[...compilation.chunks][0].files]
.find(file => file.endsWith('.js'))
compilation.assets[filename]._source._children.push(`\n${this.hotReloadScript}`)
}
})
}
loadLocales(loadModifiedFilesOnly = false) {
if (this.activeLocales.length === 0) {
this.activeLocales = JSON.parse(readFileSync(`${this.inputDir}/activeLocales.json`))
}
loadLocales() {
const activeLocales = JSON.parse(readFileSync(`${this.inputDir}/activeLocales.json`))
for (const locale of activeLocales) {
const filePath = join(this.inputDir, `${locale}.yaml`)
this.filePaths.push(filePath)
for (const locale of this.activeLocales) {
const filePath = `${this.inputDir}/${locale}.yaml`
// Cannot use `mtime` since values never equal
const mtimeMsFromStats = statSync(filePath).mtimeMs
if (loadModifiedFilesOnly) {
// Skip reading files where mtime (modified time) same as last read
// (stored in mtime)
const existingMtime = this.locales[locale]?.mtimeMs
if (existingMtime != null && existingMtime === mtimeMsFromStats) {
continue
}
}
const contents = readFileSync(filePath, 'utf-8')
const data = loadYaml(contents)
this.locales[locale] = { locale, data, mtimeMs: mtimeMsFromStats }
this.locales.set(locale, data)
const localeName = data['Locale Name'] ?? locale
if (!loadModifiedFilesOnly) {
this.localeNames.push(localeName)
}
this.localeNames.push(data['Locale Name'] ?? locale)
}
}

View File

@ -0,0 +1,18 @@
const websocket = new WebSocket('ws://localhost:9080/ws')
websocket.onmessage = (event) => {
const message = JSON.parse(event.data)
if (message.type === 'freetube-locale-update') {
const i18n = document.getElementById('app').__vue__.$i18n
for (const [locale, data] of message.data) {
// Only update locale data if it was already loaded
if (i18n.availableLocales.includes(locale)) {
const localeData = JSON.parse(data)
i18n.setLocaleMessage(locale, localeData)
}
}
}
}

View File

@ -8,6 +8,8 @@ const kill = require('tree-kill')
const path = require('path')
const { spawn } = require('child_process')
const ProcessLocalesPlugin = require('./ProcessLocalesPlugin')
let electronProcess = null
let manualRestart = null
@ -76,6 +78,22 @@ async function restartElectron() {
})
}
/**
* @param {import('webpack').Compiler} compiler
* @param {WebpackDevServer} devServer
*/
function setupNotifyLocaleUpdate(compiler, devServer) {
const notifyLocaleChange = (updatedLocales) => {
devServer.sendMessage(devServer.webSocketServer.clients, "freetube-locale-update", updatedLocales)
}
compiler.options.plugins
.filter(plugin => plugin instanceof ProcessLocalesPlugin)
.forEach((/** @type {ProcessLocalesPlugin} */plugin) => {
plugin.notifyLocaleChange = notifyLocaleChange
})
}
function startMain() {
const compiler = webpack(mainConfig)
const { name } = compiler
@ -116,6 +134,7 @@ function startRenderer(callback) {
ignored: [
/(dashFiles|storyboards)\/*/,
'/**/.DS_Store',
'**/static/locales/*'
]
},
publicPath: '/static'
@ -126,6 +145,8 @@ function startRenderer(callback) {
server.startCallback(err => {
if (err) console.error(err)
setupNotifyLocaleUpdate(compiler, server)
callback()
})
}
@ -142,11 +163,12 @@ function startWeb () {
const server = new WebpackDevServer({
open: true,
static: {
directory: path.join(process.cwd(), 'dist/web/static'),
directory: path.resolve(__dirname, '..', 'static'),
watch: {
ignored: [
/(dashFiles|storyboards)\/*/,
'/**/.DS_Store',
'**/static/locales/*'
]
}
},
@ -155,6 +177,8 @@ function startWeb () {
server.startCallback(err => {
if (err) console.error(err)
setupNotifyLocaleUpdate(compiler, server)
})
}
if (!web) {

View File

@ -6,7 +6,6 @@ const VueLoaderPlugin = require('vue-loader/lib/plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
const ProcessLocalesPlugin = require('./ProcessLocalesPlugin')
const WatchExternalFilesPlugin = require('webpack-watch-external-files-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const isDevMode = process.env.NODE_ENV === 'development'
@ -15,6 +14,7 @@ const { version: swiperVersion } = JSON.parse(readFileSync(path.join(__dirname,
const processLocalesPlugin = new ProcessLocalesPlugin({
compress: !isDevMode,
hotReload: isDevMode,
inputDir: path.join(__dirname, '../static/locales'),
outputDir: 'static/locales',
})
@ -165,16 +165,4 @@ const config = {
target: 'electron-renderer',
}
if (isDevMode) {
const activeLocales = JSON.parse(readFileSync(path.join(__dirname, '../static/locales/activeLocales.json')))
config.plugins.push(
new WatchExternalFilesPlugin({
files: [
`./static/locales/{${activeLocales.join(',')}}.yaml`,
],
}),
)
}
module.exports = config

View File

@ -178,6 +178,7 @@ const config = {
const processLocalesPlugin = new ProcessLocalesPlugin({
compress: false,
hotReload: isDevMode,
inputDir: path.join(__dirname, '../static/locales'),
outputDir: 'static/locales',
})

View File

@ -56,6 +56,7 @@
"@fortawesome/fontawesome-svg-core": "^6.5.2",
"@fortawesome/free-brands-svg-icons": "^6.5.2",
"@fortawesome/free-solid-svg-icons": "^6.5.2",
"@fortawesome/free-regular-svg-icons": "^6.5.2",
"@fortawesome/vue-fontawesome": "^2.0.10",
"@seald-io/nedb": "^4.0.4",
"@silvermine/videojs-quality-selector": "^1.3.1",
@ -66,7 +67,7 @@
"path-browserify": "^1.0.1",
"portal-vue": "^2.1.7",
"process": "^0.11.10",
"swiper": "^11.1.1",
"swiper": "^11.1.3",
"video.js": "7.21.5",
"videojs-contrib-quality-levels": "^3.0.0",
"videojs-http-source-selector": "^1.1.6",
@ -90,32 +91,32 @@
"babel-loader": "^9.1.3",
"copy-webpack-plugin": "^12.0.2",
"css-loader": "^7.1.1",
"css-minimizer-webpack-plugin": "^6.0.0",
"electron": "^30.0.2",
"css-minimizer-webpack-plugin": "^7.0.0",
"electron": "^30.0.3",
"electron-builder": "^24.13.3",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsonc": "^2.15.1",
"eslint-plugin-n": "^17.4.0",
"eslint-plugin-n": "^17.7.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-unicorn": "^52.0.0",
"eslint-plugin-vue": "^9.25.0",
"eslint-plugin-unicorn": "^53.0.0",
"eslint-plugin-vue": "^9.26.0",
"eslint-plugin-vuejs-accessibility": "^2.3.0",
"eslint-plugin-yml": "^1.14.0",
"html-webpack-plugin": "^5.6.0",
"js-yaml": "^4.1.0",
"json-minimizer-webpack-plugin": "^5.0.0",
"lefthook": "^1.6.10",
"lefthook": "^1.6.12",
"mini-css-extract-plugin": "^2.9.0",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.38",
"postcss-scss": "^4.0.9",
"prettier": "^2.8.8",
"rimraf": "^5.0.5",
"sass": "^1.76.0",
"rimraf": "^5.0.7",
"sass": "^1.77.2",
"sass-loader": "^14.2.1",
"stylelint": "^16.5.0",
"stylelint-config-sass-guidelines": "^11.1.0",
@ -129,7 +130,6 @@
"webpack": "^5.91.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.0.4",
"webpack-watch-external-files-plugin": "^3.0.0",
"yaml-eslint-parser": "^1.2.2"
}
}

View File

@ -4,8 +4,6 @@ const IpcChannels = {
DISABLE_PROXY: 'disable-proxy',
OPEN_EXTERNAL_LINK: 'open-external-link',
GET_SYSTEM_LOCALE: 'get-system-locale',
GET_USER_DATA_PATH: 'get-user-data-path',
GET_USER_DATA_PATH_SYNC: 'get-user-data-path-sync',
GET_PICTURES_PATH: 'get-pictures-path',
SHOW_OPEN_DIALOG: 'show-open-dialog',
SHOW_SAVE_DIALOG: 'show-save-dialog',
@ -28,7 +26,10 @@ const IpcChannels = {
SYNC_PLAYLISTS: 'sync-playlists',
GET_REPLACE_HTTP_CACHE: 'get-replace-http-cache',
TOGGLE_REPLACE_HTTP_CACHE: 'toggle-replace-http-cache'
TOGGLE_REPLACE_HTTP_CACHE: 'toggle-replace-http-cache',
PLAYER_CACHE_GET: 'player-cache-get',
PLAYER_CACHE_SET: 'player-cache-set'
}
const DBActions = {

View File

@ -199,10 +199,12 @@ function runApp() {
app.commandLine.appendSwitch('enable-features', 'VaapiVideoDecodeLinuxGL')
}
const userDataPath = app.getPath('userData')
// command line switches need to be added before the app ready event first
// that means we can't use the normal settings system as that is asynchronous,
// doing it synchronously ensures that we add it before the event fires
const REPLACE_HTTP_CACHE_PATH = `${app.getPath('userData')}/experiment-replace-http-cache`
const REPLACE_HTTP_CACHE_PATH = `${userDataPath}/experiment-replace-http-cache`
const replaceHttpCache = existsSync(REPLACE_HTTP_CACHE_PATH)
if (replaceHttpCache) {
// the http cache causes excessive disk usage during video playback
@ -211,6 +213,8 @@ function runApp() {
app.commandLine.appendSwitch('disable-http-cache')
}
const PLAYER_CACHE_PATH = `${userDataPath}/player_cache`
// See: https://stackoverflow.com/questions/45570589/electron-protocol-handler-not-working-on-windows
// remove so we can register each time as we run the app.
app.removeAsDefaultProtocolClient('freetube')
@ -866,14 +870,6 @@ function runApp() {
return app.getSystemLocale()
})
ipcMain.handle(IpcChannels.GET_USER_DATA_PATH, () => {
return app.getPath('userData')
})
ipcMain.on(IpcChannels.GET_USER_DATA_PATH_SYNC, (event) => {
event.returnValue = app.getPath('userData')
})
ipcMain.handle(IpcChannels.GET_PICTURES_PATH, () => {
return app.getPath('pictures')
})
@ -938,6 +934,35 @@ function runApp() {
relaunch()
})
function playerCachePathForKey(key) {
// Remove path separators and period characters,
// to prevent any files outside of the player_cache directory,
// from being read or written
const sanitizedKey = `${key}`.replaceAll(/[./\\]/g, '__')
return path.join(PLAYER_CACHE_PATH, sanitizedKey)
}
ipcMain.handle(IpcChannels.PLAYER_CACHE_GET, async (_, key) => {
const filePath = playerCachePathForKey(key)
try {
const contents = await asyncFs.readFile(filePath)
return contents.buffer
} catch (e) {
console.error(e)
return undefined
}
})
ipcMain.handle(IpcChannels.PLAYER_CACHE_SET, async (_, key, value) => {
const filePath = playerCachePathForKey(key)
await asyncFs.mkdir(PLAYER_CACHE_PATH, { recursive: true })
await asyncFs.writeFile(filePath, new Uint8Array(value))
})
// ************************************************* //
// DB related IPC calls
// *********** //

View File

@ -40,6 +40,9 @@
overflow-y: scroll;
block-size: 40vh;
display: block;
padding-inline: 16px;
margin-block: 16px;
overflow-wrap: break-word;
}
.fade-enter-active, .fade-leave-active {
@ -64,4 +67,8 @@
.flexBox {
margin-block: 60px -75px;
}
.changeLogText {
block-size: 65vh;
}
}

View File

@ -1,6 +1,5 @@
import Vue, { defineComponent } from 'vue'
import { defineComponent } from 'vue'
import { mapActions, mapMutations } from 'vuex'
import { ObserveVisibility } from 'vue-observe-visibility'
import FtFlexBox from './components/ft-flex-box/ft-flex-box.vue'
import TopNav from './components/top-nav/top-nav.vue'
import SideNav from './components/side-nav/side-nav.vue'
@ -21,8 +20,6 @@ import { translateWindowTitle } from './helpers/strings'
let ipcRenderer = null
Vue.directive('observe-visibility', ObserveVisibility)
export default defineComponent({
name: 'App',
components: {
@ -243,7 +240,17 @@ export default defineComponent({
.then((json) => {
const tagName = json[0].tag_name
const versionNumber = tagName.replace('v', '').replace('-beta', '')
this.updateChangelog = marked.parse(json[0].body)
let changelog = json[0].body
// Link usernames to their GitHub profiles
.replaceAll(/@(\S+)\b/g, '[@$1](https://github.com/$1)')
// Shorten pull request links to #1234
.replaceAll(/https:\/\/github\.com\/FreeTubeApp\/FreeTube\/pull\/(\d+)/g, '[#$1]($&)')
// Add the title
changelog = `# ${json[0].name}\n${changelog}`
this.updateChangelog = marked.parse(changelog)
this.changeLogTitle = json[0].name
this.updateBannerMessage = this.$t('Version {versionNumber} is now available! Click for more details', { versionNumber })

View File

@ -15,6 +15,7 @@
<ft-prompt
v-if="showReleaseNotes"
:label="changeLogTitle"
theme="readable-width"
@click="showReleaseNotes = !showReleaseNotes"
>
<span

View File

@ -65,7 +65,7 @@ export default defineComponent({
default: false
}
},
emits: ['click'],
emits: ['click', 'disabled-click'],
data: function () {
return {
dropdownShown: false,
@ -92,7 +92,10 @@ export default defineComponent({
},
handleIconClick: function () {
if (this.disabled) { return }
if (this.disabled) {
this.$emit('disabled-click')
return
}
if (this.forceDropdown || (this.dropdownOptions.length > 0)) {
this.dropdownShown = !this.dropdownShown

View File

@ -21,19 +21,21 @@
background-color: var(--card-bg-color);
color: var(--primary-text-color);
&:hover,
&:focus-visible {
background-color: var(--side-nav-hover-color);
color: var(--side-nav-hover-text-color);
}
&:not(.disabled) {
&:hover,
&:focus-visible {
background-color: var(--side-nav-hover-color);
color: var(--side-nav-hover-text-color);
}
&:active {
background-color: var(--side-nav-active-color);
color: var(--side-nav-active-text-color);
&:active {
background-color: var(--side-nav-active-color);
color: var(--side-nav-active-text-color);
}
}
}
&.base-no-default {
&.base-no-default:not(.disabled) {
&:hover,
&:focus-visible {
background-color: var(--side-nav-hover-color);
@ -50,27 +52,32 @@
background-color: var(--primary-color);
color: var(--text-with-main-color);
&:hover,
&:focus-visible {
background-color: var(--primary-color-hover);
}
&:not(.disabled) {
&:hover,
&:focus-visible {
background-color: var(--primary-color-hover);
}
&:active {
background-color: var(--primary-color-active);
&:active {
background-color: var(--primary-color-active);
}
}
}
&.secondary {
background-color: var(--accent-color);
color: var(--text-with-accent-color);
&:hover,
&:focus-visible {
background-color: var(--accent-color-hover);
}
&:not(.disabled) {
&:hover,
&:focus-visible {
background-color: var(--accent-color-hover);
}
&:active {
background-color: var(--accent-color-active);
&:active {
background-color: var(--accent-color-active);
}
}
}
@ -78,13 +85,15 @@
background-color: var(--destructive-color);
color: var(--destructive-text-color);
&:hover,
&:focus-visible {
background-color: var(--destructive-hover-color);
}
&:not(.disabled) {
&:hover,
&:focus-visible {
background-color: var(--destructive-hover-color);
}
&:active {
background-color: var(--destructive-active-color);
&:active {
background-color: var(--destructive-active-color);
}
}
}
@ -95,7 +104,8 @@
.disabled {
opacity: 0.5;
pointer-events: none;
pointer-events: auto;
cursor: default;
user-select: none;
}

View File

@ -16,6 +16,7 @@
}"
tabindex="0"
role="button"
:aria-disabled="disabled"
:aria-expanded="dropdownShown"
@click="handleIconClick"
@mousedown="handleIconMouseDown"

View File

@ -1,6 +1,7 @@
import { defineComponent } from 'vue'
import FtIconButton from '../ft-icon-button/ft-icon-button.vue'
import { mapActions } from 'vuex'
import { showToast } from '../../helpers/utils'
export default defineComponent({
name: 'FtListPlaylist',
@ -40,6 +41,20 @@ export default defineComponent({
return this.$store.getters.getCurrentInvidiousInstance
},
quickBookmarkPlaylistId() {
return this.$store.getters.getQuickBookmarkTargetPlaylistId
},
quickBookmarkPlaylist() {
return this.$store.getters.getPlaylist(this.quickBookmarkPlaylistId)
},
markedAsQuickBookmarkTarget() {
// Only user playlists can be target
if (this.playlistId == null) { return false }
if (this.quickBookmarkPlaylistId == null) { return false }
return this.quickBookmarkPlaylistId === this.playlistId
},
listType: function () {
return this.$store.getters.getListType
},
@ -112,6 +127,10 @@ export default defineComponent({
})
},
handleQuickBookmarkEnabledDisabledClick: function () {
showToast(this.$t('User Playlists.SinglePlaylistView.Toast["This playlist is already being used for quick bookmark."]'))
},
parseInvidiousData: function () {
this.title = this.data.title
if (this.thumbnailCanBeShown) {
@ -154,8 +173,34 @@ export default defineComponent({
this.videoCount = this.data.videos.length
},
enableQuickBookmarkForThisPlaylist: function () {
const currentQuickBookmarkTargetPlaylist = this.quickBookmarkPlaylist
this.updateQuickBookmarkTargetPlaylistId(this.playlistId)
if (currentQuickBookmarkTargetPlaylist != null) {
showToast(
this.$t('User Playlists.SinglePlaylistView.Toast["This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo"]', {
oldPlaylistName: currentQuickBookmarkTargetPlaylist.playlistName,
}),
5000,
() => {
this.updateQuickBookmarkTargetPlaylistId(currentQuickBookmarkTargetPlaylist._id)
showToast(
this.$t('User Playlists.SinglePlaylistView.Toast["Reverted to use {oldPlaylistName} for quick bookmark"]', {
oldPlaylistName: currentQuickBookmarkTargetPlaylist.playlistName,
}),
5000,
)
},
)
} else {
showToast(this.$t('User Playlists.SinglePlaylistView.Toast.This playlist is now used for quick bookmark'))
}
},
...mapActions([
'openInExternalPlayer'
'openInExternalPlayer',
'updateQuickBookmarkTargetPlaylistId'
])
}
})

View File

@ -67,6 +67,20 @@
:use-shadow="false"
@click="handleExternalPlayer"
/>
<span
v-if="isUserPlaylist"
class="playlistIcons"
>
<ft-icon-button
:title="markedAsQuickBookmarkTarget ? $t('User Playlists.Quick Bookmark Enabled') : $t('User Playlists.Enable Quick Bookmark With This Playlist')"
:icon="markedAsQuickBookmarkTarget ? ['fas', 'bookmark'] : ['far', 'bookmark']"
:disabled="markedAsQuickBookmarkTarget"
:theme="markedAsQuickBookmarkTarget ? 'secondary' : 'base-no-default'"
:size="16"
@disabled-click="handleQuickBookmarkEnabledDisabledClick"
@click="enableQuickBookmarkForThisPlaylist"
/>
</span>
</div>
</div>
</template>

View File

@ -285,28 +285,32 @@ export default defineComponent({
{
label: this.$t('Video.Open Channel in Invidious'),
value: 'openInvidiousChannel'
},
{
type: 'divider'
}
)
const hiddenChannels = JSON.parse(this.$store.getters.getChannelsHidden)
const channelShouldBeHidden = hiddenChannels.some(c => c === this.channelId)
if (channelShouldBeHidden) {
options.push({
label: this.$t('Video.Unhide Channel'),
value: 'unhideChannel'
})
} else {
options.push({
label: this.$t('Video.Hide Channel'),
value: 'hideChannel'
})
}
}
}
if (this.channelId !== null) {
const hiddenChannels = JSON.parse(this.$store.getters.getChannelsHidden)
const channelShouldBeHidden = hiddenChannels.some(c => c === this.channelId)
options.push(
{
type: 'divider'
},
channelShouldBeHidden
? {
label: this.$t('Video.Unhide Channel'),
value: 'unhideChannel'
}
: {
label: this.$t('Video.Hide Channel'),
value: 'hideChannel'
}
)
}
return options
},
@ -666,7 +670,7 @@ export default defineComponent({
this.uploadedTime = new Date(this.data.published).toLocaleDateString([this.currentLocale, 'en'])
} else {
// Use 30 days per month, just like calculatePublishedDate
this.uploadedTime = getRelativeTimeFromDate(new Date(this.data.published), false)
this.uploadedTime = getRelativeTimeFromDate(this.data.published, false)
}
}

View File

@ -47,6 +47,13 @@
padding-block: 10px;
}
.promptCard.readable-width {
max-inline-size: 50em;
margin-inline: auto;
inset-inline: 0;
padding-inline: 0;
}
.center {
text-align: center;
}

View File

@ -97,7 +97,7 @@ export default defineComponent({
this.$emit('click', null)
},
handleHide: function (event) {
if (event.target.getAttribute('role') === 'button' || event.target.className === 'prompt') {
if (event.target.className === 'prompt') {
this.hide()
}
},

View File

@ -14,7 +14,8 @@
:select-names="colorNames"
:select-values="colorValues"
:icon="['fas', 'palette']"
:icon-color="sponsorBlockValues.color"
:class="'sec' + sponsorBlockValues.color"
icon-color="var(--accent-color)"
@change="updateColor"
/>
<ft-select

View File

@ -230,9 +230,6 @@ export default defineComponent({
quickBookmarkPlaylist() {
return this.$store.getters.getPlaylist(this.quickBookmarkPlaylistId)
},
quickBookmarkEnabled() {
return this.quickBookmarkPlaylist != null
},
markedAsQuickBookmarkTarget() {
// Only user playlists can be target
if (this.selectedUserPlaylist == null) { return false }
@ -240,6 +237,9 @@ export default defineComponent({
return this.quickBookmarkPlaylist._id === this.selectedUserPlaylist._id
},
playlistDeletionDisabledLabel: function () {
return this.$t('User Playlists["Cannot delete the quick bookmark target playlist."]')
},
},
watch: {
showDeletePlaylistPrompt(shown) {
@ -319,6 +319,14 @@ export default defineComponent({
})
},
handleQuickBookmarkEnabledDisabledClick: function () {
showToast(this.$t('User Playlists.SinglePlaylistView.Toast["This playlist is already being used for quick bookmark."]'))
},
handlePlaylistDeleteDisabledClick: function () {
showToast(this.playlistDeletionDisabledLabel)
},
exitEditMode: function () {
this.editMode = false
@ -402,10 +410,6 @@ export default defineComponent({
showToast(this.$t('User Playlists.SinglePlaylistView.Toast.This playlist is now used for quick bookmark'))
}
},
disableQuickBookmark() {
this.updateQuickBookmarkTargetPlaylistId(null)
showToast(this.$t('User Playlists.SinglePlaylistView.Toast.Quick bookmark disabled'))
},
updateQuery(query) {
this.query = query

View File

@ -123,7 +123,15 @@
theme="secondary"
@click="exitEditMode"
/>
<ft-icon-button
v-if="!editMode && isUserPlaylist"
:title="markedAsQuickBookmarkTarget ? $t('User Playlists.Quick Bookmark Enabled') : $t('User Playlists.Enable Quick Bookmark With This Playlist')"
:icon="markedAsQuickBookmarkTarget ? ['fas', 'bookmark'] : ['far', 'bookmark']"
:disabled="markedAsQuickBookmarkTarget"
:theme="markedAsQuickBookmarkTarget ? 'secondary' : 'base-no-default'"
@disabled-click="handleQuickBookmarkEnabledDisabledClick"
@click="enableQuickBookmarkForThisPlaylist"
/>
<ft-icon-button
v-if="!editMode && isUserPlaylist"
:title="$t('User Playlists.Edit Playlist Info')"
@ -138,20 +146,6 @@
theme="secondary"
@click="toggleCopyVideosPrompt"
/>
<ft-icon-button
v-if="!editMode && isUserPlaylist && !markedAsQuickBookmarkTarget"
:title="$t('User Playlists.Enable Quick Bookmark With This Playlist')"
:icon="['fas', 'link']"
theme="secondary"
@click="enableQuickBookmarkForThisPlaylist"
/>
<ft-icon-button
v-if="!editMode && isUserPlaylist && markedAsQuickBookmarkTarget"
:title="$t('User Playlists.Disable Quick Bookmark')"
:icon="['fas', 'link-slash']"
theme="secondary"
@click="disableQuickBookmark"
/>
<ft-icon-button
v-if="!editMode && isUserPlaylist && videoCount > 0"
:title="$t('User Playlists.Remove Watched Videos')"
@ -161,9 +155,11 @@
/>
<ft-icon-button
v-if="deletePlaylistButtonVisible"
:title="$t('User Playlists.Delete Playlist')"
:disabled="markedAsQuickBookmarkTarget"
:title="!markedAsQuickBookmarkTarget ? $t('User Playlists.Delete Playlist') : playlistDeletionDisabledLabel"
:icon="['fas', 'trash']"
theme="destructive"
@disabled-click="handlePlaylistDeleteDisabledClick"
@click="showDeletePlaylistPrompt = true"
/>
<ft-share-button

View File

@ -30,16 +30,20 @@ export default defineComponent({
'restart',
'cancel'
],
/* Themes are devided into 3 groups. The first group contains the default themes. The second group are themes that don't have specific primary and secondary colors. The third group are themes that do have specific primary and secondary colors available. */
baseThemeValues: [
// First group
'system',
'light',
'dark',
'black',
'dracula',
'catppuccinMocha',
'pastelPink',
'hotPink',
// Second group
'nordic',
'hotPink',
'pastelPink',
// Third group
'catppuccinMocha',
'dracula',
'solarizedDark',
'solarizedLight'
]
@ -97,17 +101,21 @@ export default defineComponent({
]
},
/* Themes are devided into 3 groups. The first group contains the default themes. The second group are themes that don't have specific primary and secondary colors. The third group are themes that do have specific primary and secondary colors available. */
baseThemeNames: function () {
return [
// First group
this.$t('Settings.Theme Settings.Base Theme.System Default'),
this.$t('Settings.Theme Settings.Base Theme.Light'),
this.$t('Settings.Theme Settings.Base Theme.Dark'),
this.$t('Settings.Theme Settings.Base Theme.Black'),
this.$t('Settings.Theme Settings.Base Theme.Dracula'),
this.$t('Settings.Theme Settings.Base Theme.Catppuccin Mocha'),
this.$t('Settings.Theme Settings.Base Theme.Pastel Pink'),
this.$t('Settings.Theme Settings.Base Theme.Hot Pink'),
// Second group
this.$t('Settings.Theme Settings.Base Theme.Nordic'),
this.$t('Settings.Theme Settings.Base Theme.Hot Pink'),
this.$t('Settings.Theme Settings.Base Theme.Pastel Pink'),
// Third group
this.$t('Settings.Theme Settings.Base Theme.Catppuccin Mocha'),
this.$t('Settings.Theme Settings.Base Theme.Dracula'),
this.$t('Settings.Theme Settings.Base Theme.Solarized Dark'),
this.$t('Settings.Theme Settings.Base Theme.Solarized Light')
]

View File

@ -1,43 +1,21 @@
import fs from 'fs/promises'
import path from 'path'
import { IpcChannels } from '../../../constants'
import { pathExists } from '../filesystem'
// based off https://github.com/LuanRT/YouTube.js/blob/6caa679df6ddc77d25be02dcb7355b722ab268aa/src/utils/Cache.ts
// avoids errors caused by the fully dynamic `fs` and `path` module imports that youtubei.js's UniversalCache does
export class PlayerCache {
constructor(cacheDirectory) {
this.cacheDirectory = cacheDirectory
}
async get(key) {
const filePath = path.resolve(this.cacheDirectory, key)
try {
const contents = await fs.readFile(filePath)
return contents.buffer
} catch (e) {
if (e?.code === 'ENOENT') {
return undefined
}
throw e
if (process.env.IS_ELECTRON) {
const { ipcRenderer } = require('electron')
return await ipcRenderer.invoke(IpcChannels.PLAYER_CACHE_GET, key)
}
}
async set(key, value) {
await fs.mkdir(this.cacheDirectory, { recursive: true })
const filePath = path.resolve(this.cacheDirectory, key)
await fs.writeFile(filePath, new Uint8Array(value))
}
async remove(key) {
const filePath = path.resolve(this.cacheDirectory, key)
if (await pathExists(filePath)) {
try {
await fs.unlink(filePath)
} catch { }
if (process.env.IS_ELECTRON) {
const { ipcRenderer } = require('electron')
await ipcRenderer.invoke(IpcChannels.PLAYER_CACHE_SET, key, value)
}
}
async remove(_key) {
// no-op; YouTube.js only uses remove for the OAuth credentials, but we don't use that in FreeTube
}
}

View File

@ -1,6 +1,5 @@
import { ClientType, Endpoints, Innertube, Misc, UniversalCache, Utils, YT } from 'youtubei.js'
import Autolinker from 'autolinker'
import { join } from 'path'
import { SEARCH_CHAR_LIMIT } from '../../../constants'
import { PlayerCache } from './PlayerCache'
@ -9,7 +8,6 @@ import {
calculatePublishedDate,
escapeHTML,
extractNumberFromString,
getUserDataPath,
toLocalePublicationString
} from '../utils'
@ -41,8 +39,7 @@ async function createInnertube({ withPlayer = false, location = undefined, safet
let cache
if (withPlayer) {
if (process.env.IS_ELECTRON) {
const userData = await getUserDataPath()
cache = new PlayerCache(join(userData, 'player_cache'))
cache = new PlayerCache()
} else {
cache = new UniversalCache(false)
}

View File

@ -17,13 +17,6 @@ export const colors = [
{ name: 'Amber', value: '#FFAB00' },
{ name: 'Orange', value: '#FF6D00' },
{ name: 'DeepOrange', value: '#DD2C00' },
{ name: 'DraculaCyan', value: '#8BE9FD' },
{ name: 'DraculaGreen', value: '#50FA7B' },
{ name: 'DraculaOrange', value: '#FFB86C' },
{ name: 'DraculaPink', value: '#FF79C6' },
{ name: 'DraculaPurple', value: '#BD93F9' },
{ name: 'DraculaRed', value: '#FF5555' },
{ name: 'DraculaYellow', value: '#F1FA8C' },
{ name: 'CatppuccinMochaRosewater', value: '#F5E0DC' },
{ name: 'CatppuccinMochaFlamingo', value: '#F2CDCD' },
{ name: 'CatppuccinMochaPink', value: '#F5C2E7' },
@ -38,6 +31,13 @@ export const colors = [
{ name: 'CatppuccinMochaSapphire', value: '#74C7EC' },
{ name: 'CatppuccinMochaBlue', value: '#89B4FA' },
{ name: 'CatppuccinMochaLavender', value: '#B4BEFE' },
{ name: 'DraculaCyan', value: '#8BE9FD' },
{ name: 'DraculaGreen', value: '#50FA7B' },
{ name: 'DraculaOrange', value: '#FFB86C' },
{ name: 'DraculaPink', value: '#FF79C6' },
{ name: 'DraculaPurple', value: '#BD93F9' },
{ name: 'DraculaRed', value: '#FF5555' },
{ name: 'DraculaYellow', value: '#F1FA8C' },
{ name: 'SolarizedYellow', value: '#b58900' },
{ name: 'SolarizedOrange', value: '#cb4b16' },
{ name: 'SolarizedRed', value: '#dc322f' },
@ -66,13 +66,6 @@ export function getColorTranslations() {
i18n.t('Settings.Theme Settings.Main Color Theme.Amber'),
i18n.t('Settings.Theme Settings.Main Color Theme.Orange'),
i18n.t('Settings.Theme Settings.Main Color Theme.Deep Orange'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Cyan'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Green'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Orange'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Pink'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Purple'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Red'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Yellow'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Rosewater'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Flamingo'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Pink'),
@ -87,6 +80,13 @@ export function getColorTranslations() {
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Sapphire'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Blue'),
i18n.t('Settings.Theme Settings.Main Color Theme.Catppuccin Mocha Lavender'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Cyan'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Green'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Orange'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Pink'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Purple'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Red'),
i18n.t('Settings.Theme Settings.Main Color Theme.Dracula Yellow'),
i18n.t('Settings.Theme Settings.Main Color Theme.Solarized Yellow'),
i18n.t('Settings.Theme Settings.Main Color Theme.Solarized Orange'),
i18n.t('Settings.Theme Settings.Main Color Theme.Solarized Red'),

View File

@ -611,16 +611,6 @@ export async function getSystemLocale() {
return locale || 'en-US'
}
export async function getUserDataPath() {
if (process.env.IS_ELECTRON) {
const { ipcRenderer } = require('electron')
return await ipcRenderer.invoke(IpcChannels.GET_USER_DATA_PATH)
} else {
// TODO: implement getUserDataPath web compatible callback
return null
}
}
export async function getPicturesPath() {
if (process.env.IS_ELECTRON) {
const { ipcRenderer } = require('electron')

View File

@ -8,6 +8,8 @@ import { library } from '@fortawesome/fontawesome-svg-core'
import { register as registerSwiper } from 'swiper/element'
import { ObserveVisibility } from 'vue-observe-visibility'
// Please keep the list of constants sorted by name
// to avoid code conflict and duplicate entries
import {
@ -89,6 +91,9 @@ import {
faTrash,
faUsers,
} from '@fortawesome/free-solid-svg-icons'
import {
faBookmark as farBookmark
} from '@fortawesome/free-regular-svg-icons'
import {
faBitcoin,
faGithub,
@ -185,6 +190,9 @@ library.add(
faTrash,
faUsers,
// solid icons
farBookmark,
// brand icons
faGithub,
faBitcoin,
@ -195,6 +203,7 @@ library.add(
registerSwiper()
Vue.component('FontAwesomeIcon', FontAwesomeIcon)
Vue.directive('observe-visibility', ObserveVisibility)
/* eslint-disable-next-line no-new */
new Vue({

View File

@ -10,11 +10,11 @@ const state = {
}
const getters = {
getHistoryCacheSorted: () => {
getHistoryCacheSorted(state) {
return state.historyCacheSorted
},
getHistoryCacheById: () => {
getHistoryCacheById(state) {
return state.historyCacheById
}
}

View File

@ -13,6 +13,26 @@ function generateRandomUniqueId() {
return crypto.randomUUID ? crypto.randomUUID() : `id-${Date.now()}-${Math.floor(Math.random() * 10000)}`
}
/*
* Function to find the first playlist with 0 videos, or otherwise the most recently accessed.
* This is a good default quick bookmark target if one needs to be set.
*/
function findEmptyOrLatestPlayedPlaylist(playlists) {
const emptyPlaylist = playlists.find((playlist) => playlist.videos.length === 0)
if (emptyPlaylist) return emptyPlaylist
let max = -1
let maxIndex = 0
for (let i = 0; i < playlists.length; i++) {
if (playlists[i].lastPlayedAt != null && playlists[i].lastPlayedAt > max) {
maxIndex = i
max = playlists[i].lastPlayedAt
}
}
return playlists[maxIndex]
}
const state = {
// Playlist loading takes time on app load (new windows)
// This is necessary to let components to know when to start data loading
@ -38,15 +58,15 @@ const state = {
}
const getters = {
getPlaylistsReady: () => state.playlistsReady,
getAllPlaylists: () => state.playlists,
getPlaylistsReady: (state) => state.playlistsReady,
getAllPlaylists: (state) => state.playlists,
getPlaylist: (state) => (playlistId) => {
return state.playlists.find(playlist => playlist._id === playlistId)
},
}
const actions = {
async addPlaylist({ commit }, payload) {
async addPlaylist({ state, commit, rootState, dispatch }, payload) {
// In case internal id is forgotten, generate one (instead of relying on caller and have a chance to cause data corruption)
if (payload._id == null) {
// {Time now in unix time}-{0-9999}
@ -79,15 +99,28 @@ const actions = {
try {
await DBPlaylistHandlers.create([payload])
const noQuickBookmarkSet = !rootState.settings.quickBookmarkTargetPlaylistId || !state.playlists.some((playlist) => playlist._id === rootState.settings.quickBookmarkTargetPlaylistId)
if (noQuickBookmarkSet) {
dispatch('updateQuickBookmarkTargetPlaylistId', payload._id, { root: true })
}
commit('addPlaylist', payload)
} catch (errMessage) {
console.error(errMessage)
}
},
async addPlaylists({ commit }, payload) {
async addPlaylists({ state, commit, rootState, dispatch }, payload) {
try {
await DBPlaylistHandlers.create(payload)
const noQuickBookmarkSet = !rootState.settings.quickBookmarkTargetPlaylistId || !state.playlists.some((playlist) => playlist._id === rootState.settings.quickBookmarkTargetPlaylistId)
if (noQuickBookmarkSet) {
const chosenPlaylist = findEmptyOrLatestPlayedPlaylist(payload)
dispatch('updateQuickBookmarkTargetPlaylistId', chosenPlaylist._id, { root: true })
}
commit('addPlaylists', payload)
} catch (errMessage) {
console.error(errMessage)
@ -185,7 +218,7 @@ const actions = {
}
},
async grabAllPlaylists({ commit, dispatch, state }) {
async grabAllPlaylists({ rootState, commit, dispatch, state }) {
try {
const payload = (await DBPlaylistHandlers.find()).filter((e) => e != null)
if (payload.length === 0) {
@ -308,6 +341,13 @@ const actions = {
}
}
// if no quick bookmark is set, try to find another playlist
const noQuickBookmarkSet = !rootState.settings.quickBookmarkTargetPlaylistId || !payload.some((playlist) => playlist._id === rootState.settings.quickBookmarkTargetPlaylistId)
if (noQuickBookmarkSet && payload.length > 0) {
const chosenPlaylist = findEmptyOrLatestPlayedPlaylist(payload)
dispatch('updateQuickBookmarkTargetPlaylistId', chosenPlaylist._id, { root: true })
}
commit('setAllPlaylists', payload)
}
commit('setPlaylistsReady', true)

View File

@ -15,7 +15,7 @@ const state = {
}
const getters = {
getProfileList: () => {
getProfileList: (state) => {
return state.profileList
},

View File

@ -5,7 +5,7 @@ const state = {
}
const getters = {
getPageBookmarks: () => {
getPageBookmarks: (state) => () => {
return state.pageBookmarks
},

View File

@ -61,19 +61,19 @@ const state = {
}
const getters = {
getIsSideNavOpen () {
getIsSideNavOpen(state) {
return state.isSideNavOpen
},
getOutlinesHidden() {
getOutlinesHidden(state) {
return state.outlinesHidden
},
getCurrentVolume () {
getCurrentVolume(state) {
return state.currentVolume
},
getSessionSearchHistory () {
getSessionSearchHistory(state) {
return state.sessionSearchHistory
},
@ -81,91 +81,91 @@ const getters = {
return state.deArrowCache
},
getPopularCache () {
getPopularCache(state) {
return state.popularCache
},
getTrendingCache () {
getTrendingCache(state) {
return state.trendingCache
},
getCachedPlaylist() {
getCachedPlaylist(state) {
return state.cachedPlaylist
},
getSearchSettings () {
getSearchSettings(state) {
return state.searchSettings
},
getSearchFilterValueChanged () {
getSearchFilterValueChanged(state) {
return state.searchFilterValueChanged
},
getShowAddToPlaylistPrompt () {
getShowAddToPlaylistPrompt(state) {
return state.showAddToPlaylistPrompt
},
getShowCreatePlaylistPrompt () {
getShowCreatePlaylistPrompt(state) {
return state.showCreatePlaylistPrompt
},
getShowPageBookmarkPrompt () {
getShowPageBookmarkPrompt(state) {
return state.showPageBookmarkPrompt
},
getShowSearchFilters () {
getShowSearchFilters(state) {
return state.showSearchFilters
},
getToBeAddedToPlaylistVideoList () {
getToBeAddedToPlaylistVideoList(state) {
return state.toBeAddedToPlaylistVideoList
},
getNewPlaylistDefaultProperties () {
getNewPlaylistDefaultProperties(state) {
return state.newPlaylistDefaultProperties
},
getNewPlaylistVideoObject () {
getNewPlaylistVideoObject(state) {
return state.newPlaylistVideoObject
},
getShowProgressBar () {
getShowProgressBar(state) {
return state.showProgressBar
},
getProgressBarPercentage () {
getProgressBarPercentage(state) {
return state.progressBarPercentage
},
getRegionNames () {
getRegionNames(state) {
return state.regionNames
},
getRegionValues () {
getRegionValues(state) {
return state.regionValues
},
getRecentBlogPosts () {
getRecentBlogPosts(state) {
return state.recentBlogPosts
},
getExternalPlayerNames () {
getExternalPlayerNames(state) {
return state.externalPlayerNames
},
getExternalPlayerValues () {
getExternalPlayerValues(state) {
return state.externalPlayerValues
},
getExternalPlayerCmdArguments () {
getExternalPlayerCmdArguments (state) {
return state.externalPlayerCmdArguments
},
getLastTrendingRefreshTimestamp() {
getLastTrendingRefreshTimestamp(state) {
return state.lastTrendingRefreshTimestamp
},
getLastPopularRefreshTimestamp() {
getLastPopularRefreshTimestamp(state) {
return state.lastPopularRefreshTimestamp
},

View File

@ -1,7 +1,5 @@
<template>
<div
ref="search"
>
<div>
<ft-loader
v-if="isLoading && !errorMessage"
:fullscreen="true"

View File

@ -1,7 +1,5 @@
<template>
<div
ref="search"
>
<div>
<ft-loader
v-if="isLoading"
:fullscreen="true"

View File

@ -282,6 +282,8 @@ Settings:
Pastel Pink: الباستيل الوردي
Hot Pink: وردي فاقع
Nordic: بلدان الشمال الأوروبي
Solarized Dark: مظلم مشمس
Solarized Light: مشمس داكن
Main Color Theme:
Main Color Theme: 'لون السِمة الأساسي'
Red: 'أحمر'
@ -321,6 +323,14 @@ Settings:
Catppuccin Mocha Red: كاتبوتشين موكا أحمر
Catppuccin Mocha Maroon: كاتبوتشين موكا مارون
Catppuccin Mocha Yellow: كاتبوتشين موكا أصفر
Solarized Yellow: مشمس فاتح
Solarized Orange: مشمس برتقالي
Solarized Red: مشمس أحمر
Solarized Magenta: مشمس أرجواني
Solarized Violet: مشمس بنفسجي
Solarized Blue: مشمس أزرق
Solarized Cyan: مشمس سماوي
Solarized Green: مشمس أخضر
Secondary Color Theme: 'لون السِمة الثانوي'
#* Main Color Theme
UI Scale: مقياس واجهة المستخدم
@ -679,6 +689,8 @@ About:
Downloads / Changelog: التحميلات\التغييرات
Licensed under the AGPLv3: مرخّص تحت رخصة أفيرو جيبيإل النسخة الثالثة
Discussions: المناقشات
Licensed under the: مرخص تحت
AGPLv3: AGPLv3
Profile:
All Channels: 'جميع القنوات'
Profile Manager: 'مدير الملف الشخصي'

View File

@ -277,6 +277,9 @@ Settings:
Ask Before Opening Link: Питане, преди отворяне на връзка
Open Link: Отваряне на връзка
External Link Handling: Работа с външни връзки
Auto Load Next Page:
Label: Автоматично зареждане на следващата страница
Tooltip: Автоматично зареждане на допълнителни страници и коментари.
Theme Settings:
Theme Settings: 'Настройки на изгледа на приложението'
Match Top Bar with Main Color: 'Съвпадане на горната лента с основната цветова
@ -292,6 +295,8 @@ Settings:
Pastel Pink: Пастелно розово
Hot Pink: Горещо розово
Nordic: Nordic
Solarized Dark: Solarized тъмна
Solarized Light: Solarized светла
Main Color Theme:
Main Color Theme: 'Основна цветова тема'
Red: 'Червено'
@ -331,6 +336,14 @@ Settings:
Catppuccin Mocha Lavender: Catppuccin Mocha Лавандула
Catppuccin Mocha Blue: Catppuccin Mocha Синьо
Catppuccin Mocha Green: Catppuccin Mocha Зелено
Solarized Yellow: Solarized жълта
Solarized Orange: Solarized оранжева
Solarized Red: Solarized червена
Solarized Magenta: Solarized пурпурна
Solarized Violet: Solarized виолетова
Solarized Blue: Solarized синя
Solarized Cyan: Solarized синьо-зелена
Solarized Green: Solarized зелена
Secondary Color Theme: 'Вторична цветова тема'
#* Main Color Theme
UI Scale: Мащаб на интерфейса
@ -637,6 +650,7 @@ Settings:
Unlock: Отключване
Password: Парола
Expand All Settings Sections: Разширяване на всички раздели с настройки
Sort Settings Sections (A-Z): Сортиране на секциите на настройките (A-Z)
About:
#On About page
About: 'Относно'
@ -693,6 +707,8 @@ About:
Beta: Бета
Credits: Заслуги
Discussions: Дискусии
Licensed under the: Лицензирано под
AGPLv3: AGPLv3
Profile:
Profile Select: 'Избор на профил'
All Channels: 'Всички канали'
@ -971,6 +987,15 @@ Playlist:
#* Published
#& Views
Playlist: Плейлист
Sort By:
DateAddedNewest: Първо последно добавени
DateAddedOldest: Първо най-рано добавени
Sort By: Подреждане по
AuthorAscending: Автор (A-Z)
AuthorDescending: Автор (Z-A)
VideoTitleAscending: Заглавие (A-Z)
Custom: Потребителски
VideoTitleDescending: Заглавие (Z-A)
Toggle Theatre Mode: 'Режим "Широк екран"'
Change Format:
Change Media Formats: 'Смяна видео формати'
@ -1194,3 +1219,15 @@ Age Restricted:
This channel is age restricted: Този канал е с възрастово ограничение
This video is age restricted: Това видео е с възрастово ограничение
Close Banner: Затваряне на банер
Search character limit: Заявката за търсене е над лимита от {searchCharacterLimit}
символа
Feed:
Feed Last Updated: '{feedName} последната актуализация на емисията: {date}'
Refresh Feed: Обновяване на {subscriptionName}
Yes, Delete: Да, изтрий
Yes, Restart: Да, рестартирай
Yes, Open Link: Да, отваряне на връзката
Cancel: Отказ
Moments Ago: преди няколко минути
checkmark:
Display Label: '{label}: {value}'

View File

@ -300,6 +300,8 @@ Settings:
Hot Pink: Pink
Pastel Pink: Pastellrosa
Nordic: Nordic
Solarized Dark: Solarisiert Dunkel
Solarized Light: Solarisiert Hell
Main Color Theme:
Main Color Theme: Hauptfarbe des Farbschemas
Red: Rot
@ -339,6 +341,14 @@ Settings:
Catppuccin Mocha Red: Catppuccin Mocha Rot
Catppuccin Mocha Maroon: Catppuccin Mocha Kastanienbraun
Catppuccin Mocha Teal: Catppuccin Mokka Blaugrün
Solarized Red: Solarisiertes Rot
Solarized Yellow: Solarisiertes Gelb
Solarized Orange: Solarisiertes Orange
Solarized Magenta: Solarisiertes Magenta
Solarized Blue: Solarisiertes Blau
Solarized Cyan: Solarisiertes Cyan
Solarized Violet: Solarisiertes Violett
Solarized Green: Solarisiertes Grün
Secondary Color Theme: Sekundäres Farbschema
#* Main Color Theme
UI Scale: Skalierung der Benutzeroberfläche
@ -724,6 +734,8 @@ About:
Licensed under the AGPLv3: Lizenziert unter der AGPLv3
Source code: Quellcode
Discussions: Diskussionen
Licensed under the: Lizenziert unter der
AGPLv3: AGPLv3
Channel:
Subscribe: Abonnieren
Unsubscribe: Deabonnieren

View File

@ -173,9 +173,10 @@ User Playlists:
Copy Playlist: Copy Playlist
Remove Watched Videos: Remove Watched Videos
Enable Quick Bookmark With This Playlist: Enable Quick Bookmark With This Playlist
Disable Quick Bookmark: Disable Quick Bookmark
Quick Bookmark Enabled: Quick Bookmark Enabled
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: Are you sure you want to remove all watched videos from this playlist? This cannot be undone.
Delete Playlist: Delete Playlist
Cannot delete the quick bookmark target playlist.: Cannot delete the quick bookmark target playlist.
Are you sure you want to delete this playlist? This cannot be undone: Are you sure you want to delete this playlist? This cannot be undone.
Sort By:
@ -201,8 +202,8 @@ User Playlists:
Video has been removed: Video has been removed
There was a problem with removing this video: There was a problem with removing this video
This playlist is already being used for quick bookmark.: This playlist is already being used for quick bookmark.
This playlist is now used for quick bookmark: This playlist is now used for quick bookmark
Quick bookmark disabled: Quick bookmark disabled
This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo
Reverted to use {oldPlaylistName} for quick bookmark: Reverted to use {oldPlaylistName} for quick bookmark
@ -214,6 +215,7 @@ User Playlists:
There were no videos to remove.: There were no videos to remove.
This playlist is protected and cannot be removed.: This playlist is protected and cannot be removed.
Playlist {playlistName} has been deleted.: Playlist {playlistName} has been deleted.
Playlist {playlistName} is the new quick bookmark playlist.: Playlist {playlistName} is the new quick bookmark playlist.
This playlist does not exist: This playlist does not exist
AddVideoPrompt:

View File

@ -1158,3 +1158,6 @@ Channel Hidden: '{channel} added to channel filter'
Channel Unhidden: '{channel} removed from channel filter'
Trimmed input must be at least N characters long: Trimmed input must be at least 1
character long | Trimmed input must be at least {length} characters long
Yes, Delete: Yes, delete
Yes, Restart: Yes, restart
Yes, Open Link: Yes, open link

View File

@ -292,6 +292,8 @@ Settings:
Pastel Pink: Pastelne roosa
Hot Pink: Säravroosa
Nordic: Põhjala
Solarized Dark: Tume päikesekuma
Solarized Light: Hele päikesekuma
Main Color Theme:
Main Color Theme: 'Põhiline värviteema'
Red: 'Punane'
@ -331,6 +333,14 @@ Settings:
Catppuccin Mocha Teal: Catppuccin Mocha Rohekassinine
Catppuccin Mocha Sky: Catppuccin Mocha Helesinine
Catppuccin Mocha Sapphire: Catppuccin Mocha Safiir
Solarized Orange: Oranž päikesekuma
Solarized Red: Punane päikesekuma
Solarized Magenta: Fuksiapunane päikesekuma
Solarized Violet: Punakassinine päikesekuma
Solarized Blue: Sinine päikesekuma
Solarized Cyan: Rohekassinine päikesekuma
Solarized Green: Roheline päikesekuma
Solarized Yellow: Kollane päikesekuma
Secondary Color Theme: 'Värvide alamteema'
#* Main Color Theme
UI Scale: Kasutajaliidese suurus
@ -633,6 +643,8 @@ About:
Source code: Lähtekood
Beta: beetaversioon
Discussions: Arutelud
Licensed under the: Avaldatud ja litsentseeritud
AGPLv3: AGPLv3 alusel
Profile:
Profile Select: 'Vali profiil'
All Channels: 'Kõik kanalid'

View File

@ -280,6 +280,9 @@ Settings:
Current instance will be randomized on startup: Uneko instantzia ausaz banatuko
da abiaraztean
Clear Default Instance: Garbitu lehenetsitako instantzia
Auto Load Next Page:
Tooltip: Kargatu orrialde eta iruzkin gehigarriak automatikoki.
Label: Kargatu automatikoki hurrengo orria
Theme Settings:
Theme Settings: 'Gaien ezarpenak'
Match Top Bar with Main Color: 'Lotu goiko barra kolore nagusiarekin'
@ -297,6 +300,8 @@ Settings:
Nordic: nordikoa
Pastel Pink: Pastel arrosa
Hot Pink: Arrosa beroa
Solarized Dark: Solarizatu iluna
Solarized Light: Solarizatu argia
Main Color Theme:
Main Color Theme: 'Oinarrizko koloreen gaia'
Red: 'Gorria'
@ -336,6 +341,14 @@ Settings:
Catppuccin Mocha Green: Catppuccin Motxa Berdea
Catppuccin Mocha Teal: Catppuccin Motxa Zertzeta
Catppuccin Mocha Sky: Catppuccin Motxa Zerua
Solarized Yellow: Hori solarizatua
Solarized Orange: Laranja solarizatua
Solarized Red: Gorri solarizatua
Solarized Magenta: Magenta solarizatua
Solarized Blue: Urdin solarizatua
Solarized Cyan: Zian solarizatua
Solarized Violet: Violeta solarizatua
Solarized Green: Berde solarizatua
Secondary Color Theme: 'Gaiaren bigarren mailako kolorea'
#* Main Color Theme
Hide Side Bar Labels: Ezkutatu alboko barraren etiketak
@ -605,6 +618,7 @@ Settings:
Remove Password: Pasahitza ezabatu
Set Password: Ezarri pasahitza
Expand All Settings Sections: Zabaldu ezarpen guztien atalak
Sort Settings Sections (A-Z): Ordenatu ezarpenen atalak (A-Z)
About:
#On About page
About: 'Honi buruz'
@ -635,6 +649,8 @@ About:
Donate: 'Donazioa egin'
Discussions: Eztabaidak
Licensed under the: Lizentziapean
AGPLv3: AGPLv3
Profile:
Profile Select: 'Hautatu profila'
Profile Filter: 'Profilaren iragazkiak'
@ -904,6 +920,15 @@ Playlist:
#* Published
#& Views
Playlist: Erreprodukzio-zerrenda
Sort By:
Sort By: Honen arabera ordenatu
DateAddedNewest: Azken gehitua lehenengo
Custom: Pertsonalizatua
DateAddedOldest: Lehenago gehitutakoak lehenengo
VideoTitleAscending: Izenburua (A-Z)
VideoTitleDescending: Izenburua (Z-A)
AuthorAscending: Egilea (A-Z)
AuthorDescending: Egilea (Z-A)
Toggle Theatre Mode: 'Aldatu Antzerki modura'
Change Format:
Change Media Formats: 'Bideoen formatuak aldatu'
@ -1141,3 +1166,13 @@ Ok: Ados
Channel Hidden: '{channel} gehitu da kanalaren iragazkian'
Display Label: '{label}: {value}'
checkmark:
Search character limit: Bilaketa-kontsultak {searchCharacterLimit} karaktereen muga
gainditzen du
Feed:
Feed Last Updated: '{feedName} jarioaren azken eguneraketa: {date}'
Refresh Feed: Eguneratu {subscriptionName}
Moments Ago: duela momentu batzuk
Yes, Delete: Bai, ezabatu
Cancel: Utzi
Yes, Open Link: Bai, ireki esteka
Yes, Restart: Bai, berrabiarazi

View File

@ -305,6 +305,8 @@ Settings:
Pastel Pink: Rose pastel
Hot Pink: Rose vif
Nordic: Nordic
Solarized Light: Clair polarisé
Solarized Dark: Noir polarisé
Main Color Theme:
Main Color Theme: 'Couleur principale du thème'
Red: 'Rouge'
@ -344,6 +346,14 @@ Settings:
Catppuccin Mocha Sapphire: Catppuccin moka saphir
Catppuccin Mocha Lavender: Catppuccin moka lavande
Catppuccin Mocha Teal: Catppuccin moka bleu sarcelle
Solarized Magenta: Magenta polarisé
Solarized Violet: Violet polarisé
Solarized Blue: Bleu polarisé
Solarized Cyan: Cyan polarisé
Solarized Green: Vert polarisé
Solarized Yellow: Jaune polarisé
Solarized Orange: Orange polarisé
Solarized Red: Rouge polarisé
Secondary Color Theme: 'Couleur secondaire du thème'
#* Main Color Theme
UI Scale: Échelle de l'interface utilisateur
@ -737,6 +747,8 @@ About:
GitHub releases: Les différentes versions de FreeTube disponibles sur GitHub
Downloads / Changelog: Téléchargements / Journal des modifications
Discussions: Discussions
AGPLv3: AGPLv3
Licensed under the: Sous licence
Channel:
Subscribe: 'S''abonner'
Unsubscribe: 'Se désabonner'
@ -1280,8 +1292,8 @@ Feed:
Feed Last Updated: '{feedName} dernière mise à jour du flux: {date}'
Refresh Feed: Rafraîchir {subscriptionName}
Moments Ago: il y a quelques instants
Yes, Delete: Oui, Effacer
Yes, Restart: Oui, Redémarrer
Yes, Open Link: Oui, Ouvrir le lien
Yes, Delete: Oui, effacer
Yes, Restart: Oui, redémarrer
Yes, Open Link: Oui, ouvrir le lien
Cancel: Annuler
Search character limit: La recherche dépasse le nombre de caractères impartis

View File

@ -283,6 +283,8 @@ Settings:
Pastel Pink: Pastelno ružičasta
Hot Pink: Vruća ružičasta
Nordic: Nordic
Solarized Dark: Solarna tamna
Solarized Light: Solarna svijetla
Main Color Theme:
Main Color Theme: 'Glavna boja teme'
Red: 'Crvena'
@ -322,6 +324,14 @@ Settings:
Catppuccin Mocha Blue: Catppuccin Mocha Plava
Catppuccin Mocha Lavender: Catppuccin Mocha Lavanda
Catppuccin Mocha Green: Catppuccin Mocha Zelena
Solarized Blue: Solarna plava
Solarized Green: Solarna zelena
Solarized Yellow: Solarna žuta
Solarized Orange: Solarna narančasta
Solarized Red: Solarna crvena
Solarized Magenta: Solarna magenta
Solarized Violet: Solarna ljubičasta
Solarized Cyan: Solarna cijan
Secondary Color Theme: 'Sekundarna boja teme'
#* Main Color Theme
UI Scale: Uvećanje korisničkog sučelja
@ -691,6 +701,8 @@ About:
Licensed under the AGPLv3: AGPLv3 licenca
Source code: Izvorni kod
Discussions: Diskusije
Licensed under the: Licencirano pod
AGPLv3: AGPLv3
Profile:
All Channels: 'Svi kanali'
Profile Manager: 'Upravljač profila'
@ -1205,3 +1217,5 @@ Yes, Delete: Da, izbriši
Yes, Open Link: Da, otvori poveznicu
Cancel: Odustani
Yes, Restart: Da, pokreni ponovo
Search character limit: Upit za pretraživanje premašuje ograničenje od {searchCharacterLimit}
znakova

View File

@ -183,6 +183,10 @@ User Playlists:
Kattintson ide a visszavonáshoz
Reverted to use {oldPlaylistName} for quick bookmark: Visszaállítva a(z) {oldPlaylistName}
használatára a gyors könyvjelzőhöz
Playlist {playlistName} is the new quick bookmark playlist.: A(z) {playlistName}
lejátszási lista az új gyors könyvjelző lejátszási lista.
This playlist is already being used for quick bookmark.: Ez a lejátszási lista
már használatban van mint gyors könyvjelző.
Search for Videos: Videók keresése
Are you sure you want to delete this playlist? This cannot be undone: Biztos, hogy
törölni szeretné ezt a lejátszási listát? Ezt nem lehet visszacsinálni.
@ -230,6 +234,9 @@ User Playlists:
Enable Quick Bookmark With This Playlist: Gyors Könyvjelző Engedélyezése Ezzel A
Lejátszási Listával
Playlists with Matching Videos: Lejátszási listák a kapcsolódó videókkal
Cannot delete the quick bookmark target playlist.: Nem lehet törölni a gyors könyvjelző
cél lejátszási listát.
Quick Bookmark Enabled: Gyors könyvjelző engedélyezve
History:
# On History Page
History: 'Előzmények'
@ -302,6 +309,8 @@ Settings:
Pastel Pink: Pasztell rózsaszín
Hot Pink: Forró rózsaszín
Nordic: Skandináv
Solarized Light: Szolarizált világos
Solarized Dark: Szolarizált sötét
Main Color Theme:
Main Color Theme: 'Fő színtéma'
Red: 'Vörös'
@ -341,6 +350,14 @@ Settings:
Catppuccin Mocha Rosewater: Catppuccin Mocha Rózsavíz
Catppuccin Mocha Peach: Catppuccin Mocha Barackvirágszínű
Catppuccin Mocha Yellow: Catppuccin Mocha Sárga
Solarized Yellow: Szolarizált sárga
Solarized Orange: Szolarizált narancssárga
Solarized Red: Szolarizált vörös
Solarized Blue: Szolarizált kék
Solarized Cyan: Szolarizált ciánkék
Solarized Green: Szolarizált zöld
Solarized Magenta: Szolarizált magenta
Solarized Violet: Szolarizált ibolya
Secondary Color Theme: 'Másodlagos színtéma'
#* Main Color Theme
UI Scale: Felhasználói felület méretezése
@ -709,6 +726,8 @@ About:
FAQ: GyIK
Report a problem: Probléma jelentése
Discussions: Megbeszélések
AGPLv3: licenc alapján
Licensed under the: Az AGPLv3
Profile:
Profile Select: 'Profil kiválasztása'
All Channels: 'Összes csatorna'

View File

@ -293,6 +293,8 @@ Settings:
Pastel Pink: Rosa pastello
Hot Pink: Rosa caldo
Nordic: Nordico
Solarized Dark: Solarizzato scuro
Solarized Light: Solarizzato chiaro
Main Color Theme:
Main Color Theme: 'Colore principale del tema'
Red: 'Rosso'
@ -332,6 +334,14 @@ Settings:
Catppuccin Mocha Peach: Cappuccino moka pesca
Catppuccin Mocha Teal: Cappuccino moka alzavola
Catppuccin Mocha Sky: Cappuccino moka cielo
Solarized Yellow: Solarizzato giallo
Solarized Orange: Solarizzato arancione
Solarized Red: Solarizzato rosso
Solarized Magenta: Solarizzato magenta
Solarized Violet: Solarizzato viola
Solarized Cyan: Solarizzato ciano
Solarized Green: Solarizzato verde
Solarized Blue: Solarizzato blu
Secondary Color Theme: 'Colore secondario del tema'
#* Main Color Theme
UI Scale: Dimensioni dell'interfaccia utente
@ -705,6 +715,8 @@ About:
Source code: Codice sorgente
Beta: Beta
Discussions: Discussioni
AGPLv3: AGPLv3
Licensed under the: Concesso con licenza
Channel:
Subscribe: 'Iscriviti'
Unsubscribe: 'Disiscriviti'

View File

@ -41,6 +41,8 @@ Global:
View Count: 1 回視聴 | {count} 回視聴
Watching Count: 1 人が視聴中 | {count} 人が視聴中
Channel Count: 1 チャンネル | {count} チャンネル
Input Tags:
Length Requirement: タグは最低でも {number} 文字以上である必要があります
Search / Go to URL: '検索 / URL の表示'
# In Filter Button
Search Filters:
@ -109,14 +111,64 @@ Playlists: '再生リスト'
User Playlists:
Your Playlists: 'あなたの再生リスト'
Your saved videos are empty. Click on the save button on the corner of a video to have it listed here: 保存した動画はありません。一覧に表示させるには、ビデオの角にある保存ボタンをクリックします
Playlist Message:
Playlist Message:
このページは、完全に動作する動画リストではありません。保存またはお気に入りと設定した動画のみが表示されます。操作が完了すると、現在ここにあるすべての動画は「お気に入り」の動画リストに移動します。
Search bar placeholder: 動画リスト内の検索
Search bar placeholder: 再生リストの検索
Empty Search Message: この再生リストに、検索に一致する動画はありません
This playlist currently has no videos.: 存在、この再生リストには動画があっていません。
Create New Playlist: 規再生リストを作られる
This playlist currently has no videos.: 現在、この再生リストには動画がありません。
Create New Playlist: しい再生リストの作成
Sort By:
NameAscending: A-Z
EarliestCreatedFirst: 初期に作成
LatestUpdatedFirst: 最近の更新
EarliestUpdatedFirst: 初期に更新
EarliestPlayedFirst: 初期に再生
LatestPlayedFirst: 最近の再生
Sort By: 並び替え順
LatestCreatedFirst: 最近に作成
NameDescending: Z-A
Remove from Favorites: '{playlistName} から削除'
Move Video Down: 動画を下へ移動
Playlist Name: 再生リストの名前
Remove from Playlist: 再生リストから削除
Playlist Description: 再生リストの説明
Copy Playlist: 再生リストのコピー
Edit Playlist Info: 再生リスト情報の編集
Remove Watched Videos: 再生済み動画の削除
Enable Quick Bookmark With This Playlist: 再生リストでクイック ブックマークを有効にする
SinglePlaylistView:
Toast:
This playlist is protected and cannot be removed.: この再生リストは保護されており、削除できません。
This video cannot be moved down.: この動画は下に移動できません.
This video cannot be moved up.: この動画は上に移動できません.
Some videos in the playlist are not loaded yet. Click here to copy anyway.: 再生リスト内のすべての動画が読み込まれていません。とにかくコピーするにはここをクリック。
There was an issue with updating this playlist.: この再生リストの更新に問題が発生しました。
Quick bookmark disabled: クイックブックマークは無効です
This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: この再生リストは、{oldPlaylistName}
の代わりにクイックブックマークとして使用されるようになりました。元に戻すにはここをクリック
Video has been removed: 動画は削除されました
There was a problem with removing this video: この動画の削除に問題が発生しました
This playlist is now used for quick bookmark: この再生リストは、今からクイックブックマークとして使用されます
Playlist has been updated.: 再生リストを更新しました。
Playlist name cannot be empty. Please input a name.: 再生リストの名前は空白にできません。名前を入力してください.
Reverted to use {oldPlaylistName} for quick bookmark: クイックブックマーク用に {oldPlaylistName}
を元に戻しました
"{videoCount} video(s) have been removed": 1 つの動画を削除しました | {video Count} 動画を削除しました
Playlist {playlistName} has been deleted.: 再生リスト {playlistName} が削除されました。
There were no videos to remove.: 削除する動画はありません。
This playlist does not exist: この再生リストは存在しません
Search for Videos: 動画検索
Save Changes: 変更の保存
Move Video Up: 動画を上へ移動
Add to Favorites: '{playlistName} に追加'
Playlists with Matching Videos: 動画付き再生リスト
Add to Playlist: 再生リストに追加
Delete Playlist: 再生リストの削除
Cancel: キャンセル
Disable Quick Bookmark: クイック ブックマークを無効にする
Are you sure you want to delete this playlist? This cannot be undone: 再生リストを削除してもいいですか?復元は不可能です。
Are you sure you want to remove all watched videos from this playlist? This cannot be undone: 再生リストから再生済みの動画を削除してもいいですか?復元は不可能です。
You have no playlists. Click on the create new playlist button to create a new one.: 再生リストがありません。新しい再生リストを作成するには、「新しい再生リストの作成」ボタンをクリックしてください。
History:
# On History Page
History: '履歴'
@ -465,7 +517,7 @@ Settings:
Experimental Settings:
Replace HTTP Cache: HTTP キャッシュの置換
Experimental Settings: 実験中の設定
Warning:
Warning:
これらの設定は実験的なものであり、有効にするとアプリのクラッシュを引き起こす恐れがあります。バックアップをとっておくことを強くお勧めします。自己責任で使用してください!
Password Settings:
Password Settings: パスワード設定
@ -850,7 +902,7 @@ The playlist has been reversed: 再生リストを逆順にしました
A new blog is now available, {blogTitle}. Click to view more: '新着ブログ公開、{blogTitle}。クリックしてブログを読む'
Download From Site: サイトからダウンロード
Version {versionNumber} is now available! Click for more details: 最新バージョン {versionNumber}
配信中!詳細はクリックして確認してください
配信中! 詳細はクリックして確認してください
This video is unavailable because of missing formats. This can happen due to country unavailability.: この動画は、動画形式の情報が利用できないため再生できません。再生が許可されていない国で発生します。
Tooltips:
Subscription Settings:
@ -937,7 +989,11 @@ Ok: OK
Hashtag:
Hashtag: ハッシュタグ
This hashtag does not currently have any videos: このハッシュタグには現在動画がありません
Playlist will pause when current video is finished: 現在のビデオが終了すると、プレイリストは停止します
Playlist will not pause when current video is finished: 現在のビデオが終了しても、プレイリストは停止しません
Playlist will pause when current video is finished: 現在のビデオが終了すると、再生リストは一旦停止します
Playlist will not pause when current video is finished: 現在のビデオが終了しても、再生リストは一旦停止しません
Close Banner: バナーを閉じる
Go to page: '{page}に行く'
Go to page: '{page} を表示'
Search character limit: 検索クエリは {searchCharacterLimit} 文字制限を超えています
Feed:
Feed Last Updated: '{feedName} フィードの最終更新日時: {date}'
Refresh Feed: '{subscriptionName} の更新'

View File

@ -291,6 +291,8 @@ Settings:
Pastel Pink: Pastel­roze
Hot Pink: Heet-roze
Nordic: Noords
Solarized Dark: Gesolariseerd donker
Solarized Light: Gesolariseerd licht
Main Color Theme:
Main Color Theme: 'Primaire themakleur'
Red: 'Rood'
@ -330,6 +332,14 @@ Settings:
Catppuccin Mocha Sapphire: Catppuccin Mokka Saffier
Catppuccin Mocha Teal: Catppuccin Mokka Wintertaling
Catppuccin Mocha Sky: Catppuccin Mokka Hemel
Solarized Yellow: Gesolariseerd geel
Solarized Orange: Gesolariseerd oranje
Solarized Red: Gesolariseerd rood
Solarized Magenta: Gesolariseerd magenta
Solarized Violet: Gesolariseerd violet
Solarized Blue: Gesolariseerd blauw
Solarized Cyan: Gesolariseerd cyaan
Solarized Green: Gesolariseerd groen
Secondary Color Theme: 'Secundaire themakleur'
#* Main Color Theme
UI Scale: Interface­schaal
@ -695,6 +705,8 @@ About:
Source code: Broncode
Beta: Bèta
Discussions: Discussies
AGPLv3: AGPLv3
Licensed under the: Gelicentieerd onder de
Channel:
Subscriber: 'Abonnee'
Subscribers: 'Abonnees'

View File

@ -290,6 +290,8 @@ Settings:
Hot Pink: Gorący róż
Pastel Pink: Pastelowy róż
Nordic: Nordycki
Solarized Light: Nasłoneczniony jasny
Solarized Dark: Nasłoneczniony ciemny
Main Color Theme:
Main Color Theme: 'Główny kolor motywu'
Red: 'Czerwony'
@ -329,6 +331,14 @@ Settings:
Catppuccin Mocha Peach: Catppuccin Mocha Brzoskwiniowy
Catppuccin Mocha Sky: Catppuccin Mocha Kolor Nieba
Catppuccin Mocha Maroon: Catppuccin Mocha Kasztanowy
Solarized Orange: Nasłoneczniony pomarańczowy
Solarized Red: Nasłoneczniony czerwony
Solarized Magenta: Nasłoneczniony magenta
Solarized Violet: Nasłoneczniony fioletowy
Solarized Blue: Nasłoneczniony niebieski
Solarized Cyan: Nasłoneczniony cyjan
Solarized Green: Nasłoneczniony zielony
Solarized Yellow: Nasłoneczniony żółty
Secondary Color Theme: 'Drugi kolor motywu'
#* Main Color Theme
UI Scale: Skala UI
@ -710,6 +720,8 @@ About:
Source code: Kod źródłowy
FreeTube is made possible by: FreeTube powstał dzięki
Discussions: Dyskusje
Licensed under the: Licencjonowany na
AGPLv3: AGPLv3
Channel:
Subscriber: 'Subskrybent/ka'
Subscribers: 'subskrybentów'

View File

@ -287,6 +287,8 @@ Settings:
Pastel Pink: Rosa Pastel
Hot Pink: Rosa Choque
Nordic: Nordico
Solarized Light: Claro Solarizado
Solarized Dark: Escuro Solarizado
Main Color Theme:
Main Color Theme: 'Cor principal'
Red: 'Vermelha'
@ -326,6 +328,14 @@ Settings:
Catppuccin Mocha Sky: Catppuccin Mocha Céu
Catppuccin Mocha Teal: Catppuccin Mocha Verde-azulado
Catppuccin Mocha Lavender: Catppuccin Mocha Lavanda
Solarized Yellow: Amarelo Solarizado
Solarized Red: Vermelho Solarizado
Solarized Magenta: Magenta Solarizado
Solarized Violet: Violeta Solarizada
Solarized Blue: Azul Solarizado
Solarized Cyan: Ciano Solarizado
Solarized Green: Verde Solarizado
Solarized Orange: Laranja Solarizada
Secondary Color Theme: 'Cor secundária'
#* Main Color Theme
UI Scale: Escala da Interface de Usuário
@ -699,6 +709,8 @@ About:
Please check for duplicates before posting: Verifique se há duplicações antes de
postar
Discussions: Discussões
Licensed under the: Licenciado sob o
AGPLv3: AGPLv3
Channel:
Subscriber: 'Inscrito'
Subscribers: 'Inscritos'

View File

@ -293,6 +293,8 @@ Settings:
Pastel Pink: Rosa pastel
Hot Pink: Rosa choque
Nordic: Nórdico
Solarized Dark: Escuro solar
Solarized Light: Claro solar
Main Color Theme:
Main Color Theme: 'Cor principal'
Red: 'Vermelho'
@ -332,6 +334,14 @@ Settings:
Catppuccin Mocha Sapphire: Cappuccino mocha safira
Catppuccin Mocha Blue: Cappuccino mocha azul
Catppuccin Mocha Lavender: Cappuccino mocha lavanda
Solarized Yellow: Amarelo solar
Solarized Orange: Laranja solar
Solarized Red: Vermelho solar
Solarized Magenta: Magenta solar
Solarized Violet: Violeta solar
Solarized Blue: Azul solar
Solarized Cyan: Ciano solar
Solarized Green: Verde solar
Secondary Color Theme: 'Cor secundária'
#* Main Color Theme
UI Scale: Escala da interface gráfica
@ -693,6 +703,8 @@ About:
Source code: Código-fonte
Beta: Beta
Discussions: Discussões
Licensed under the: Licenciado nos termos da
AGPLv3: AGPLv3
Profile:
Profile Select: 'Seleção de perfil'
All Channels: 'Todos os canais'

View File

@ -133,7 +133,7 @@ User Playlists:
Search bar placeholder: Căutați liste de redare
Empty Search Message: Nu există videoclipuri în această listă de redare care să
corespundă căutării dvs.
Move Video Down: Mutați video în jos
Move Video Down: Mutați videoclipul în jos
Enable Quick Bookmark With This Playlist: Activați marcajul rapid cu această listă
de redare
Sort By:
@ -143,6 +143,9 @@ User Playlists:
NameAscending: A-Z
LatestUpdatedFirst: Actualizat recent
EarliestCreatedFirst: Cel mai devreme creat
LatestPlayedFirst: Redate recent
EarliestUpdatedFirst: Cea mai recentă actualizare
EarliestPlayedFirst: Cele mai recent redate
This playlist currently has no videos.: Această listă de redare nu are în prezent
niciun videoclip.
You have no playlists. Click on the create new playlist button to create a new one.: Nu
@ -164,7 +167,7 @@ User Playlists:
Add to Playlist: Adăugați la lista de redare
Add to Favorites: Adaugă la {playlistName}
Remove from Favorites: Eliminați din {playlistName}
Move Video Up: Mutați video în sus
Move Video Up: Mutați videoclipul în sus
Remove from Playlist: Eliminați din lista de redare
Playlist Name: Numele listei de redare
Playlist Description: Descrierea listei de redare
@ -183,6 +186,20 @@ User Playlists:
deja o listă de redare cu acest nume. Vă rugăm să alegeți un alt nume.
New Playlist Name: Numele noii liste de redare
Create: Creați
SinglePlaylistView:
Toast:
There was a problem with removing this video: A existat o problemă cu eliminarea
acestui videoclip
This playlist is now used for quick bookmark: Această listă de redare este acum
utilizată pentru marcaje rapide
This playlist is now used for quick bookmark instead of {oldPlaylistName}. Click here to undo: Această
listă de redare este acum utilizată pentru marcajul rapid în loc de {oldPlaylistName}.
Faceți clic aici pentru a anula
This video cannot be moved down.: Acest videoclip nu poate fi mutat în jos.
This video cannot be moved up.: Acest videoclip nu poate fi mutat în sus.
Video has been removed: Videoclipul a fost eliminat
Quick bookmark disabled: Marcaj rapid dezactivat
Search for Videos: Căutați videoclipuri
History:
# On History Page
History: 'Istoric'

View File

@ -302,6 +302,8 @@ Settings:
Catppuccin Mocha: Catppuccin Mocha
System Default: Системски подразумевано
Nordic: Нордичка
Solarized Dark: Соларизована тамна
Solarized Light: Соларизована светла
Main Color Theme:
Main Color Theme: 'Главна тема боја'
Red: 'Црвена'
@ -341,6 +343,14 @@ Settings:
Catppuccin Mocha Lavender: Catppuccin Mocha лаванда
Catppuccin Mocha Blue: Catppuccin Mocha плава
Catppuccin Mocha Green: Catppuccin Mocha зелена
Solarized Yellow: Соларизована жута
Solarized Orange: Соларизована наранџаста
Solarized Red: Соларизована црвена
Solarized Cyan: Соларизована цијан
Solarized Green: Соларизована зелена
Solarized Magenta: Соларизована магента
Solarized Blue: Соларизована плава
Solarized Violet: Соларизована љубичаста
Secondary Color Theme: 'Секундарна тема боје'
#* Main Color Theme
Hide FreeTube Header Logo: Сакриј FreeTube логотип у заглављу
@ -638,6 +648,8 @@ About:
Donate: 'Донација'
Discussions: Дискусије
Licensed under the: Лиценцирано под
AGPLv3: AGPLv3
Profile:
Profile Select: 'Избор профила'
Profile Filter: 'Филтер профила'

View File

@ -255,6 +255,8 @@ Settings:
Pastel Pink: Pastel Pink
Hot Pink: Hot Pink
Nordic: Nordic
Solarized Light: 日照白
Solarized Dark: 日照黑
Main Color Theme:
Main Color Theme: '主题色'
Red: '红'
@ -294,6 +296,14 @@ Settings:
Catppuccin Mocha Red: Catppuccin Mocha Red
Catppuccin Mocha Blue: Catppuccin Mocha Blue
Catppuccin Mocha Lavender: Catppuccin Mocha Lavender
Solarized Orange: 日照橙
Solarized Magenta: 日照品红
Solarized Cyan: 日照青
Solarized Green: 日照绿
Solarized Yellow: 日照黄
Solarized Red: 日照红
Solarized Blue: 日照蓝
Solarized Violet: 日照紫
Secondary Color Theme: '次主题色'
#* Main Color Theme
UI Scale: UI缩放
@ -616,6 +626,8 @@ About:
these people and projects: 这些人和项目
FreeTube is made possible by: FreeTube 的存在依赖
Discussions: 讨论
Licensed under the: 许可依据
AGPLv3: AGPLv3
Channel:
Subscriber: '订阅者'
Subscribers: '订阅者'

View File

@ -256,6 +256,8 @@ Settings:
Pastel Pink: 淡粉紅色
Hot Pink: 亮粉紅色
Nordic: 北歐
Solarized Dark: Solarized Dark
Solarized Light: Solarized Light
Main Color Theme:
Main Color Theme: '主題色'
Red: '紅'
@ -295,6 +297,14 @@ Settings:
Catppuccin Mocha Sky: 卡布奇諾摩卡天藍色
Catppuccin Mocha Peach: 卡布奇諾摩卡桃紅色
Catppuccin Mocha Sapphire: 卡布奇諾摩卡藍寶石色
Solarized Yellow: Solarized 黃色
Solarized Orange: Solarized 橘色
Solarized Red: Solarized 紅色
Solarized Magenta: Solarized 洋紅色
Solarized Violet: Solarized 紫色
Solarized Blue: Solarized 藍色
Solarized Cyan: Solarized 青色
Solarized Green: Solarized 綠色
Secondary Color Theme: '次要主題色'
#* Main Color Theme
UI Scale: UI縮放
@ -626,6 +636,8 @@ About:
Licensed under the AGPLv3: 以 AGPLv3 授權
Source code: 原始碼
Discussions: 討論
Licensed under the: 授權以
AGPLv3: AGPLv3
Channel:
Subscriber: '訂閱者'
Subscribers: '訂閱者'

671
yarn.lock
View File

@ -375,12 +375,7 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
"@babel/helper-validator-identifier@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
"@babel/helper-validator-identifier@^7.24.5":
"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
@ -1277,6 +1272,21 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@eslint/eslintrc@^3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.0.2.tgz#36180f8e85bf34d2fe3ccc2261e8e204a411ab4e"
integrity sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
espree "^10.0.1"
globals "^14.0.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@eslint/js@8.57.0":
version "8.57.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
@ -1306,6 +1316,13 @@
dependencies:
"@fortawesome/fontawesome-common-types" "6.5.2"
"@fortawesome/free-regular-svg-icons@^6.5.2":
version "6.5.2"
resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.2.tgz#e8e04b4368d49920abdf1bacc63c67c870635222"
integrity sha512-iabw/f5f8Uy2nTRtJ13XZTS1O5+t+anvlamJ3zJGLEVE2pKsAWhPv2lq01uQlfgCX7VaveT3EVs515cCN9jRbw==
dependencies:
"@fortawesome/fontawesome-common-types" "6.5.2"
"@fortawesome/free-solid-svg-icons@^6.5.2":
version "6.5.2"
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz#9b40b077b27400a5e9fcbf2d15b986c7be69e9ca"
@ -1482,15 +1499,7 @@
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.21", "@jridgewell/trace-mapping@^0.3.9":
version "0.3.22"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c"
integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9":
version "0.3.25"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
@ -2144,7 +2153,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2, acorn@^8.9.0:
acorn@^8.11.3, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2, acorn@^8.9.0:
version "8.11.3"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
@ -2888,7 +2897,7 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
colord@^2.9.1, colord@^2.9.3:
colord@^2.9.3:
version "2.9.3"
resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
@ -3029,10 +3038,10 @@ copy-webpack-plugin@^12.0.2:
schema-utils "^4.2.0"
serialize-javascript "^6.0.2"
core-js-compat@^3.31.0, core-js-compat@^3.34.0, core-js-compat@^3.36.1:
version "3.36.1"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8"
integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==
core-js-compat@^3.31.0, core-js-compat@^3.36.1, core-js-compat@^3.37.0:
version "3.37.0"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73"
integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==
dependencies:
browserslist "^4.23.0"
@ -3083,10 +3092,10 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
css-declaration-sorter@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.1.1.tgz#9796bcc257b4647c39993bda8d431ce32b666f80"
integrity sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==
css-declaration-sorter@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024"
integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==
css-functions-list@^3.2.2:
version "3.2.2"
@ -3107,15 +3116,15 @@ css-loader@^7.1.1:
postcss-value-parser "^4.2.0"
semver "^7.5.4"
css-minimizer-webpack-plugin@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-6.0.0.tgz#eb79947af785467739375faf7fcb8c2dbf4f06dc"
integrity sha512-BLpR9CCDkKvhO3i0oZQgad6v9pCxUuhSc5RT6iUEy9M8hBXi4TJb5vqF2GQ2deqYHmRi3O6IR9hgAZQWg0EBwA==
css-minimizer-webpack-plugin@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.0.tgz#b77a3d2f7c0fd02d3ac250dcc2f79065363f3cd3"
integrity sha512-niy66jxsQHqO+EYbhPuIhqRQ1mNcNVUHrMnkzzir9kFOERJUaQDDRhh7dKDz33kBpkWMF9M8Vx0QlDbc5AHOsw==
dependencies:
"@jridgewell/trace-mapping" "^0.3.21"
cssnano "^6.0.3"
"@jridgewell/trace-mapping" "^0.3.25"
cssnano "^7.0.1"
jest-worker "^29.7.0"
postcss "^8.4.33"
postcss "^8.4.38"
schema-utils "^4.2.0"
serialize-javascript "^6.0.2"
@ -3167,53 +3176,54 @@ cssesc@^3.0.0:
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
cssnano-preset-default@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.3.tgz#b4ce755974f4dc8d3d09ac13bb6281cce3ced45e"
integrity sha512-4y3H370aZCkT9Ev8P4SO4bZbt+AExeKhh8wTbms/X7OLDo5E7AYUUy6YPxa/uF5Grf+AJwNcCnxKhZynJ6luBA==
cssnano-preset-default@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.1.tgz#b05c93a29868dd7bd810fa8bbf89f482804da922"
integrity sha512-Fumyr+uZMcjYQeuHssAZxn0cKj3cdQc5GcxkBcmEzISGB+UW9CLNlU4tBOJbJGcPukFDlicG32eFbrc8K9V5pw==
dependencies:
css-declaration-sorter "^7.1.1"
cssnano-utils "^4.0.1"
postcss-calc "^9.0.1"
postcss-colormin "^6.0.2"
postcss-convert-values "^6.0.2"
postcss-discard-comments "^6.0.1"
postcss-discard-duplicates "^6.0.1"
postcss-discard-empty "^6.0.1"
postcss-discard-overridden "^6.0.1"
postcss-merge-longhand "^6.0.2"
postcss-merge-rules "^6.0.3"
postcss-minify-font-values "^6.0.1"
postcss-minify-gradients "^6.0.1"
postcss-minify-params "^6.0.2"
postcss-minify-selectors "^6.0.2"
postcss-normalize-charset "^6.0.1"
postcss-normalize-display-values "^6.0.1"
postcss-normalize-positions "^6.0.1"
postcss-normalize-repeat-style "^6.0.1"
postcss-normalize-string "^6.0.1"
postcss-normalize-timing-functions "^6.0.1"
postcss-normalize-unicode "^6.0.2"
postcss-normalize-url "^6.0.1"
postcss-normalize-whitespace "^6.0.1"
postcss-ordered-values "^6.0.1"
postcss-reduce-initial "^6.0.2"
postcss-reduce-transforms "^6.0.1"
postcss-svgo "^6.0.2"
postcss-unique-selectors "^6.0.2"
browserslist "^4.23.0"
css-declaration-sorter "^7.2.0"
cssnano-utils "^5.0.0"
postcss-calc "^10.0.0"
postcss-colormin "^7.0.0"
postcss-convert-values "^7.0.0"
postcss-discard-comments "^7.0.0"
postcss-discard-duplicates "^7.0.0"
postcss-discard-empty "^7.0.0"
postcss-discard-overridden "^7.0.0"
postcss-merge-longhand "^7.0.0"
postcss-merge-rules "^7.0.0"
postcss-minify-font-values "^7.0.0"
postcss-minify-gradients "^7.0.0"
postcss-minify-params "^7.0.0"
postcss-minify-selectors "^7.0.0"
postcss-normalize-charset "^7.0.0"
postcss-normalize-display-values "^7.0.0"
postcss-normalize-positions "^7.0.0"
postcss-normalize-repeat-style "^7.0.0"
postcss-normalize-string "^7.0.0"
postcss-normalize-timing-functions "^7.0.0"
postcss-normalize-unicode "^7.0.0"
postcss-normalize-url "^7.0.0"
postcss-normalize-whitespace "^7.0.0"
postcss-ordered-values "^7.0.0"
postcss-reduce-initial "^7.0.0"
postcss-reduce-transforms "^7.0.0"
postcss-svgo "^7.0.0"
postcss-unique-selectors "^7.0.0"
cssnano-utils@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.1.tgz#fd18b42f95938bf55ab47967705355d6047bf1da"
integrity sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ==
cssnano-utils@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687"
integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==
cssnano@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.3.tgz#46db972da71aa159437287fb4c6bc9c5d3cc5d93"
integrity sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw==
cssnano@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.1.tgz#a62675fc17f9a26d8560d3e61d79228b628dbb63"
integrity sha512-917Mej/4SdI7b55atsli3sU4MOJ9XDoKgnlCtQtXYj8XUFcM3riTuYHyqBBnnskawW+zWwp0KxJzpEUodlpqUg==
dependencies:
cssnano-preset-default "^6.0.3"
lilconfig "^3.0.0"
cssnano-preset-default "^7.0.1"
lilconfig "^3.1.1"
csso@^5.0.5:
version "5.0.5"
@ -3607,10 +3617,10 @@ electron-to-chromium@^1.4.668:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz#bb16bcf2a3537962fccfa746b5c98c5f7404ff46"
integrity sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==
electron@^30.0.2:
version "30.0.2"
resolved "https://registry.yarnpkg.com/electron/-/electron-30.0.2.tgz#95ba019216bf8be9f3097580123e33ea37497733"
integrity sha512-zv7T+GG89J/hyWVkQsLH4Y/rVEfqJG5M/wOBIGNaDdqd8UV9/YZPdS7CuFeaIj0H9LhCt95xkIQNpYB/3svOkQ==
electron@^30.0.3:
version "30.0.3"
resolved "https://registry.yarnpkg.com/electron/-/electron-30.0.3.tgz#7c25ddb12ba89fd117991d010f1b274b1bafcb73"
integrity sha512-h+suwx6e0fnv/9wi0/cmCMtG+4LrPzJZa+3DEEpxcPcP+pcWnBI70t8QspxgMNIh2wzXLMD9XVqrLkEbiBAInw==
dependencies:
"@electron/get" "^2.0.0"
"@types/node" "^20.9.0"
@ -3940,10 +3950,10 @@ eslint-plugin-jsonc@^2.15.1:
natural-compare "^1.4.0"
synckit "^0.6.0"
eslint-plugin-n@^17.4.0:
version "17.4.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.4.0.tgz#a090462d523c4aa959ea7aa0851f1e70f12fac51"
integrity sha512-RtgGgNpYxECwE9dFr+D66RtbN0B8r/fY6ZF8EVsmK2YnZxE8/n9LNQhgnkL9z37UFZjYVmvMuC32qu7fQBsLVQ==
eslint-plugin-n@^17.7.0:
version "17.7.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.7.0.tgz#90b4f777cefb9bf0d91dafa94347961c4e8a072c"
integrity sha512-4Jg4ZKVE4VjHig2caBqPHYNW5na84RVufUuipFLJbgM/G57O6FdpUKJbHakCDJb/yjQuyqVzYWRtU3HNYaZUwg==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
enhanced-resolve "^5.15.0"
@ -3967,17 +3977,17 @@ eslint-plugin-promise@^6.1.1:
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816"
integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==
eslint-plugin-unicorn@^52.0.0:
version "52.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-52.0.0.tgz#c7a559edd52e3932cf2b3a05c3b0efc604c1eeb8"
integrity sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==
eslint-plugin-unicorn@^53.0.0:
version "53.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz#df3a5c9ecabeb759e6fd867b2d84198466ac8c4d"
integrity sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==
dependencies:
"@babel/helper-validator-identifier" "^7.22.20"
"@babel/helper-validator-identifier" "^7.24.5"
"@eslint-community/eslint-utils" "^4.4.0"
"@eslint/eslintrc" "^2.1.4"
"@eslint/eslintrc" "^3.0.2"
ci-info "^4.0.0"
clean-regexp "^1.0.0"
core-js-compat "^3.34.0"
core-js-compat "^3.37.0"
esquery "^1.5.0"
indent-string "^4.0.0"
is-builtin-module "^3.2.1"
@ -3986,13 +3996,13 @@ eslint-plugin-unicorn@^52.0.0:
read-pkg-up "^7.0.1"
regexp-tree "^0.1.27"
regjsparser "^0.10.0"
semver "^7.5.4"
semver "^7.6.1"
strip-indent "^3.0.0"
eslint-plugin-vue@^9.25.0:
version "9.25.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz#615cb7bb6d0e2140d21840b9aa51dce69e803e7a"
integrity sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==
eslint-plugin-vue@^9.26.0:
version "9.26.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz#bf7f5cce62c8f878059b91edae44d22974133af5"
integrity sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
globals "^13.24.0"
@ -4049,6 +4059,11 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint-visitor-keys@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb"
integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==
eslint@^8.57.0:
version "8.57.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668"
@ -4093,6 +4108,15 @@ eslint@^8.57.0:
strip-ansi "^6.0.1"
text-table "^0.2.0"
espree@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-10.0.1.tgz#600e60404157412751ba4a6f3a2ee1a42433139f"
integrity sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==
dependencies:
acorn "^8.11.3"
acorn-jsx "^5.3.2"
eslint-visitor-keys "^4.0.0"
espree@^9.0.0, espree@^9.3.1, espree@^9.4.0, espree@^9.6.0, espree@^9.6.1:
version "9.6.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
@ -4645,7 +4669,7 @@ glob-to-regexp@^0.4.1:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
glob@10.3.10, glob@^10.3.7:
glob@^10.3.7:
version "10.3.10"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b"
integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
@ -4727,6 +4751,11 @@ globals@^13.19.0, globals@^13.24.0:
dependencies:
type-fest "^0.20.2"
globals@^14.0.0:
version "14.0.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
globals@^15.0.0:
version "15.1.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-15.1.0.tgz#4e03d200c8362201636b8cdfaa316d6cef67ff1e"
@ -5736,59 +5765,59 @@ lazy-val@^1.0.4, lazy-val@^1.0.5:
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
lefthook-darwin-arm64@1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.10.tgz#31c6ba2f0e5c24a938b468f77bdff3b829bb528d"
integrity sha512-Hh11OkoKG7FEOByS1dcgNV7ETq45VmwBbw0VPTiBznyfOG4k+pi0fIdc1qbmbxvYqNE0r420QR/Q3bimaa4Kxg==
lefthook-darwin-arm64@1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.12.tgz#82477afe106d114a3432b2ef279ccc1ef6b28cbb"
integrity sha512-IJa50i+78nGxtSvnxLSDfSjBjjM7Ixl03V4+yl3Kdn+S+FwzEZet3LYTLbnKFUVy9Bg23obI3yXgwUx+tJjFXg==
lefthook-darwin-x64@1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.10.tgz#4d49622dccb0f3ff7a6a2c4d4a9af0c098e2595c"
integrity sha512-FiOB0t5OBcQ8OnG/LSdfUYj736SJdlLjWuOZ4wTlJ7EUrHditieap6VNAxwMmFVyQN0X2ZwKWytwY35y+Hflhw==
lefthook-darwin-x64@1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.12.tgz#2d298d79a98cd5d183ae9c3eb0a7732f42f7cba8"
integrity sha512-h11ByUtwM78FShgWgSUyyZtwKW6pjYfYvTygw24c/lZXKjupfowK5Ps5A73hCsjr0AEJNVpgW1S5Jd22gIJJCA==
lefthook-freebsd-arm64@1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.10.tgz#b3594d47582a2b90025c585ec6ec85a10b515294"
integrity sha512-IxGgS3RrNwk3Kr83o5SQhGxqppQi7fu2t//nsp6ocgnJeStrTtXZJOrel2VohzrFxpzQdJVXBGgUGLXtY8t8qw==
lefthook-freebsd-arm64@1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.12.tgz#2fa66fba88e7fd7258ef406241565956a0e7b426"
integrity sha512-Aw1+AosL8r/LFSVKG7i8GI1FpHnWFG66/6DBDUgCwNAwhNCXt7tERAM8dj9S6EqmqHCQCC0nI/6qKNBsFPk7Ow==
lefthook-freebsd-x64@1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.10.tgz#3eba68b410d4913038672404ed535b8fa5248eb1"
integrity sha512-sFSe+dGLa4iBblWAhAGTP9moarcbFtFAH6aaCeyqSX51O6p9VPdGjqNtcE8aGbGAk4lO6v1ScRjk5ogMSinJwQ==
lefthook-freebsd-x64@1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.12.tgz#ab2d4d1e95bbb4a6fd858bc34b22e4c9dd66d727"
integrity sha512-G8Dg7UuRstXrqaEA8MSOZikz6PpjPUQu3QmiihzcyGdzI76jFsmjJb2vkrnvMsH9u2gWb3J4sp3TULhbMHXwSw==
lefthook-linux-arm64@1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.10.tgz#4a39cc574ea05d742fc7765a03ccae66a01a634a"
integrity sha512-fXnKiNdRIW+FRvc1keVrvWX5EqIhVFfPjcy+PbsKdxiWRXgjtidi6LPmQ8eosH0DC9PxZ0mpdCMf40FHEZLbQA==
lefthook-linux-arm64@1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.12.tgz#241640da8e130fa980e7e2c976fdec843d284abe"
integrity sha512-fwO0i6x5EPelL66EwaySzGzvVbN2vLFZDUWuTi8nZzEgBsCBuG0mORxZg91cNCGLRPT3sgzWPraTkyzIJa7kHg==
lefthook-linux-x64@1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook-linux-x64/-/lefthook-linux-x64-1.6.10.tgz#546e134afea574cb72ea9b0dd2829f45ae6fb309"
integrity sha512-bm6l2GOFnmYreZxmHb47QeOiFAItttOOxvCEX1okIRD7JbUC+lGC9evW5GJv/ltjZBoTDYEtQAUa+BpHTGuY2A==
lefthook-linux-x64@1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook-linux-x64/-/lefthook-linux-x64-1.6.12.tgz#77e2023e733a50b68a123b791c3ec3bd63420398"
integrity sha512-pRAZKZhSoirjRwDF0TrqxgkeXtUmJqaUi0kGmMJmutToqo9IXQcnpueVmyV9Z1m6lLJn4PpKoFydY6tFXqvyNQ==
lefthook-windows-arm64@1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.10.tgz#4a3feeb23cf2118de5025f65b5c239ca05ed54d8"
integrity sha512-pFxT8KbOMzGxj6cz4glHYwQSNC7XCuy9RDqIO0AxPlpATsCpapkF4ngDxBT1iFv2VhdeweMa7RXUDsMAGQA4Qw==
lefthook-windows-arm64@1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.12.tgz#1ae4fa50895c5c406d89b117ba8ed214501b885e"
integrity sha512-jMMIoqNKtiqGrwyWeN3JXGXi7H7iAXsGB5v4DkcUbdw9y50qhruxWz84I2PoxwYmZVeMxRR+VpYvS7nOvBmzWA==
lefthook-windows-x64@1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook-windows-x64/-/lefthook-windows-x64-1.6.10.tgz#fb775fbc14d6122cec5fb041c442951175dd8fc2"
integrity sha512-fcDnUSTv95AdLvm0NIrn3jBWXuRq8SlbDDjkkB5OHLiSmjz4eOr6wyD7xceDp33zZgZmWFzHebJngxxcIaUuHw==
lefthook-windows-x64@1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook-windows-x64/-/lefthook-windows-x64-1.6.12.tgz#ea67ff6e2c42f72edcbb41726b357244204f9410"
integrity sha512-XqEBVIhp/Fd1Fs+VBlPhrSJlUkyXEJuxQmiYSYow3C18RNpQQrJFVFpz0wE/IDTn2jOXx+p5+hcdlJb+s6bnpA==
lefthook@^1.6.10:
version "1.6.10"
resolved "https://registry.yarnpkg.com/lefthook/-/lefthook-1.6.10.tgz#f0175c1042635d54a15687e6f2f7109fc6c40ce3"
integrity sha512-HeVjsDCrHLe9htQHbLuQJu2YdLK6Tl5bh36fOpmXqckEXTI0BDR0Y5JYc7G5Inj4YXQsc51a9dUDZMeniSnSag==
lefthook@^1.6.12:
version "1.6.12"
resolved "https://registry.yarnpkg.com/lefthook/-/lefthook-1.6.12.tgz#46aad7e0df047b6465a3b8e059ee08e3a8272664"
integrity sha512-SoHhB0L1D5twH5KKsGAT1h4qF+RhGfPo/JC5z60H0RDuFWtSwFNOeFpT4Qa7XwM6J9c1fvqZzOH9/4XF7dG9Uw==
optionalDependencies:
lefthook-darwin-arm64 "1.6.10"
lefthook-darwin-x64 "1.6.10"
lefthook-freebsd-arm64 "1.6.10"
lefthook-freebsd-x64 "1.6.10"
lefthook-linux-arm64 "1.6.10"
lefthook-linux-x64 "1.6.10"
lefthook-windows-arm64 "1.6.10"
lefthook-windows-x64 "1.6.10"
lefthook-darwin-arm64 "1.6.12"
lefthook-darwin-x64 "1.6.12"
lefthook-freebsd-arm64 "1.6.12"
lefthook-freebsd-x64 "1.6.12"
lefthook-linux-arm64 "1.6.12"
lefthook-linux-x64 "1.6.12"
lefthook-windows-arm64 "1.6.12"
lefthook-windows-x64 "1.6.12"
levn@^0.4.1:
version "0.4.1"
@ -5805,10 +5834,10 @@ lie@3.1.1:
dependencies:
immediate "~3.0.5"
lilconfig@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc"
integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==
lilconfig@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3"
integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==
lines-and-columns@^1.1.6:
version "1.2.4"
@ -6629,14 +6658,6 @@ path-type@^5.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8"
integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==
path@0.12.7:
version "0.12.7"
resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==
dependencies:
process "^0.11.1"
util "^0.10.3"
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
@ -6720,106 +6741,106 @@ portal-vue@^2.1.7:
resolved "https://registry.yarnpkg.com/portal-vue/-/portal-vue-2.1.7.tgz#ea08069b25b640ca08a5b86f67c612f15f4e4ad4"
integrity sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==
postcss-calc@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6"
integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==
postcss-calc@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.0.0.tgz#aca29a1c66dd481ca30d08f6932b1274a1003716"
integrity sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==
dependencies:
postcss-selector-parser "^6.0.11"
postcss-selector-parser "^6.0.16"
postcss-value-parser "^4.2.0"
postcss-colormin@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.2.tgz#2af9ce753937b08e058dbc6879e4aedfab42806b"
integrity sha512-TXKOxs9LWcdYo5cgmcSHPkyrLAh86hX1ijmyy6J8SbOhyv6ua053M3ZAM/0j44UsnQNIWdl8gb5L7xX2htKeLw==
postcss-colormin@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.0.tgz#76b9e40eff69a363c1fc5ce2f0ece1d4a01d1de8"
integrity sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg==
dependencies:
browserslist "^4.22.2"
browserslist "^4.23.0"
caniuse-api "^3.0.0"
colord "^2.9.1"
colord "^2.9.3"
postcss-value-parser "^4.2.0"
postcss-convert-values@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.2.tgz#c4a7509aeb1cc7ac3f6948fcbffc2bf8cac7c56a"
integrity sha512-aeBmaTnGQ+NUSVQT8aY0sKyAD/BaLJenEKZ03YK0JnDE1w1Rr8XShoxdal2V2H26xTJKr3v5haByOhJuyT4UYw==
postcss-convert-values@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.0.tgz#4a53e79c4bd81cfed8a7ed3fffb7b255a2f5f300"
integrity sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w==
dependencies:
browserslist "^4.22.2"
browserslist "^4.23.0"
postcss-value-parser "^4.2.0"
postcss-discard-comments@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.1.tgz#46176212bd9c3e5f48aa4b8b4868786726c41d36"
integrity sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==
postcss-discard-comments@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.0.tgz#3919e4237630f74927f3976ac5789cfc26731494"
integrity sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA==
postcss-discard-duplicates@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.1.tgz#112b1a95948e69b3484fdd43584dda6930977939"
integrity sha512-1hvUs76HLYR8zkScbwyJ8oJEugfPV+WchpnA+26fpJ7Smzs51CzGBHC32RS03psuX/2l0l0UKh2StzNxOrKCYg==
postcss-discard-duplicates@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.0.tgz#47ae1154cc89ad0a50099fbac1f74c942214c961"
integrity sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==
postcss-discard-empty@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.1.tgz#b34cb45ec891246da4506b53e352390fdef126c4"
integrity sha512-yitcmKwmVWtNsrrRqGJ7/C0YRy53i0mjexBDQ9zYxDwTWVBgbU4+C9jIZLmQlTDT9zhml+u0OMFJh8+31krmOg==
postcss-discard-empty@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz#218829d1ef0a5d5142dd62f0aa60e00e599d2033"
integrity sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==
postcss-discard-overridden@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.1.tgz#c63c559237758d74bc505452393a64dda9b19ef4"
integrity sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA==
postcss-discard-overridden@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz#b123ea51e3d4e1d0a254cf71eaff1201926d319c"
integrity sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==
postcss-media-query-parser@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==
postcss-merge-longhand@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.2.tgz#cd4e83014851da59545e9a906b245615550f4064"
integrity sha512-+yfVB7gEM8SrCo9w2lCApKIEzrTKl5yS1F4yGhV3kSim6JzbfLGJyhR1B6X+6vOT0U33Mgx7iv4X9MVWuaSAfw==
postcss-merge-longhand@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.0.tgz#aabfae74428a5506c4d50842445845c1cc10c9c6"
integrity sha512-0X8I4/9+G03X5/5NnrfopG/YEln2XU8heDh7YqBaiq2SeaKIG3n66ShZPjIolmVuLBQ0BEm3yS8o1mlCLHdW7A==
dependencies:
postcss-value-parser "^4.2.0"
stylehacks "^6.0.2"
stylehacks "^7.0.0"
postcss-merge-rules@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.3.tgz#08fcf714faaad75b1980ecd961b080ae2f8ddeb3"
integrity sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA==
postcss-merge-rules@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.0.tgz#069a427807fdb1e2dcca3bf218d0a9f70103526a"
integrity sha512-Zty3VlOsD6VSjBMu6PiHCVpLegtBT/qtZRVBcSeyEZ6q1iU5qTYT0WtEoLRV+YubZZguS5/ycfP+NRiKfjv6aw==
dependencies:
browserslist "^4.22.2"
browserslist "^4.23.0"
caniuse-api "^3.0.0"
cssnano-utils "^4.0.1"
postcss-selector-parser "^6.0.15"
cssnano-utils "^5.0.0"
postcss-selector-parser "^6.0.16"
postcss-minify-font-values@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.0.1.tgz#788eb930168be90225f3937f0b70aa19d8b532b2"
integrity sha512-tIwmF1zUPoN6xOtA/2FgVk1ZKrLcCvE0dpZLtzyyte0j9zUeB8RTbCqrHZGjJlxOvNWKMYtunLrrl7HPOiR46w==
postcss-minify-font-values@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz#d16a75a2548e000779566b3568fc874ee5d0aa17"
integrity sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==
dependencies:
postcss-value-parser "^4.2.0"
postcss-minify-gradients@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.1.tgz#4faf1880b483dc37016658aa186b42194ff9b5bc"
integrity sha512-M1RJWVjd6IOLPl1hYiOd5HQHgpp6cvJVLrieQYS9y07Yo8itAr6jaekzJphaJFR0tcg4kRewCk3kna9uHBxn/w==
postcss-minify-gradients@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz#f6d84456e6d49164a55d0e45bb1b1809c6cf0959"
integrity sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==
dependencies:
colord "^2.9.1"
cssnano-utils "^4.0.1"
colord "^2.9.3"
cssnano-utils "^5.0.0"
postcss-value-parser "^4.2.0"
postcss-minify-params@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.2.tgz#bd64af642fa5610281b8a9461598bbb91f92ae05"
integrity sha512-zwQtbrPEBDj+ApELZ6QylLf2/c5zmASoOuA4DzolyVGdV38iR2I5QRMsZcHkcdkZzxpN8RS4cN7LPskOkTwTZw==
postcss-minify-params@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.0.tgz#dfa8263d38570b1116da2c72f69190ea665b17aa"
integrity sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ==
dependencies:
browserslist "^4.22.2"
cssnano-utils "^4.0.1"
browserslist "^4.23.0"
cssnano-utils "^5.0.0"
postcss-value-parser "^4.2.0"
postcss-minify-selectors@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.2.tgz#62065b38d3453ddc6627ba50e4f4a2154b031aa0"
integrity sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==
postcss-minify-selectors@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.0.tgz#5dedb26806f58d683a3bb362e095ad5aa24f1bf6"
integrity sha512-f00CExZhD6lNw2vTZbcnmfxVgaVKzUw6IRsIFX3JTT8GdsoABc1WnhhGwL1i8YPJ3sSWw39fv7XPtvLb+3Uitw==
dependencies:
postcss-selector-parser "^6.0.15"
postcss-selector-parser "^6.0.16"
postcss-modules-extract-imports@^3.1.0:
version "3.1.0"
@ -6849,88 +6870,88 @@ postcss-modules-values@^4.0.0:
dependencies:
icss-utils "^5.0.0"
postcss-normalize-charset@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.1.tgz#5f70e1eb8bbdbcfcbed060ef70f179e8fef57d0c"
integrity sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg==
postcss-normalize-charset@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz#92244ae73c31bf8f8885d5f16ff69e857ac6c001"
integrity sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==
postcss-normalize-display-values@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.1.tgz#ff9aa30bbf1283294bfd9cc8b6fb81ff060a7f2d"
integrity sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw==
postcss-normalize-display-values@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz#01fb50e5e97ef8935363629bea5a6d3b3aac1342"
integrity sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==
dependencies:
postcss-value-parser "^4.2.0"
postcss-normalize-positions@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.1.tgz#41ffdc72994f024c6cd6e91dbfb40ab9abe6fe90"
integrity sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg==
postcss-normalize-positions@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz#4eebd7c9d3dde40c97b8047cad38124fc844c463"
integrity sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==
dependencies:
postcss-value-parser "^4.2.0"
postcss-normalize-repeat-style@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.1.tgz#55dc54b6f80305b280a379899a6626e0a07b04a8"
integrity sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ==
postcss-normalize-repeat-style@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz#0cb784655d5714d29bd3bda6dee2fb628aa7227b"
integrity sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==
dependencies:
postcss-value-parser "^4.2.0"
postcss-normalize-string@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.1.tgz#7605e0fb4ec7bf2709709991d13a949e4419db1d"
integrity sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg==
postcss-normalize-string@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz#a119d3e63a9614570d8413d572fb9fc8c6a64e8c"
integrity sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==
dependencies:
postcss-value-parser "^4.2.0"
postcss-normalize-timing-functions@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.1.tgz#ef937b7ca2fd62ed0b46645ea5728b842a3600db"
integrity sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g==
postcss-normalize-timing-functions@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz#99d0ee8c4b23b7f4355fafb91385833b9b07108b"
integrity sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==
dependencies:
postcss-value-parser "^4.2.0"
postcss-normalize-unicode@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.2.tgz#361026744ff11baebaec771b60c2a5f36f274fd0"
integrity sha512-Ff2VdAYCTGyMUwpevTZPZ4w0+mPjbZzLLyoLh/RMpqUqeQKZ+xMm31hkxBavDcGKcxm6ACzGk0nBfZ8LZkStKA==
postcss-normalize-unicode@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.0.tgz#bd66bfc238bf4d1eaea356639260c04fce408476"
integrity sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w==
dependencies:
browserslist "^4.22.2"
browserslist "^4.23.0"
postcss-value-parser "^4.2.0"
postcss-normalize-url@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.1.tgz#eae58cb4f5f9a4fa5bbbf6d4222dff534ad46186"
integrity sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ==
postcss-normalize-url@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz#c88cb7cf8952d3ff631e4eba924e7b060ca802f6"
integrity sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==
dependencies:
postcss-value-parser "^4.2.0"
postcss-normalize-whitespace@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.1.tgz#b5933750b938814c028d3d2b2e5c0199e0037b53"
integrity sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==
postcss-normalize-whitespace@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz#46b025f0bea72139ddee63015619b0c21cebd845"
integrity sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==
dependencies:
postcss-value-parser "^4.2.0"
postcss-ordered-values@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.1.tgz#553e735d009065b362da93340e57f43d5f2d0fbc"
integrity sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA==
postcss-ordered-values@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.0.tgz#cea4e2a140ed1c7b055e0ab967b82a36b584debf"
integrity sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w==
dependencies:
cssnano-utils "^4.0.1"
cssnano-utils "^5.0.0"
postcss-value-parser "^4.2.0"
postcss-reduce-initial@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.2.tgz#763d25902406c872264041df69f182eb15a5d9be"
integrity sha512-YGKalhNlCLcjcLvjU5nF8FyeCTkCO5UtvJEt0hrPZVCTtRLSOH4z00T1UntQPj4dUmIYZgMj8qK77JbSX95hSw==
postcss-reduce-initial@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.0.tgz#a9e64778dd44604c2bda109e2fd14b99ab0d1416"
integrity sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ==
dependencies:
browserslist "^4.22.2"
browserslist "^4.23.0"
caniuse-api "^3.0.0"
postcss-reduce-transforms@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.1.tgz#7bf59d7c6e7066e3b18ef17237d2344bd3da6d75"
integrity sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ==
postcss-reduce-transforms@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz#0386080a14e5faad9f8eda33375b79fe7c4f9677"
integrity sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==
dependencies:
postcss-value-parser "^4.2.0"
@ -6949,7 +6970,7 @@ postcss-scss@^4.0.9:
resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685"
integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==
postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.15, postcss-selector-parser@^6.0.16, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
postcss-selector-parser@^6.0.15, postcss-selector-parser@^6.0.16, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
version "6.0.16"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04"
integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==
@ -6957,20 +6978,20 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.15, postcss-select
cssesc "^3.0.0"
util-deprecate "^1.0.2"
postcss-svgo@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.2.tgz#dbc9d03e7f346bc0d82443078602a951e0214836"
integrity sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ==
postcss-svgo@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.0.0.tgz#2f11b45c6fa42da155fd7c16c44e69bf086c5992"
integrity sha512-Xj5DRdvA97yRy3wjbCH2NKXtDUwEnph6EHr5ZXszsBVKCNrKXYBjzAXqav7/Afz5WwJ/1peZoTguCEJIg7ytmA==
dependencies:
postcss-value-parser "^4.2.0"
svgo "^3.2.0"
postcss-unique-selectors@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.2.tgz#09a34a5a31a649d3e9bca5962af0616f39d071d2"
integrity sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ==
postcss-unique-selectors@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.0.tgz#8cc2f919bce33c429cce93624f2b8f9bbd4bd882"
integrity sha512-NYFqcft7vVQMZlQPsMdMPy+qU/zDpy95Malpw4GeA9ZZjM6dVXDshXtDmLc0m4WCD6XeZCJqjTfPT1USsdt+rA==
dependencies:
postcss-selector-parser "^6.0.15"
postcss-selector-parser "^6.0.16"
postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
version "4.2.0"
@ -7024,7 +7045,7 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
process@^0.11.1, process@^0.11.10:
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
@ -7431,10 +7452,10 @@ rimraf@^3.0.0, rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
rimraf@^5.0.5:
version "5.0.5"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf"
integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==
rimraf@^5.0.5, rimraf@^5.0.7:
version "5.0.7"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74"
integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==
dependencies:
glob "^10.3.7"
@ -7531,10 +7552,10 @@ sass-loader@^14.2.1:
dependencies:
neo-async "^2.6.2"
sass@^1.76.0:
version "1.76.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.76.0.tgz#fe15909500735ac154f0dc7386d656b62b03987d"
integrity sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw==
sass@^1.77.2:
version "1.77.2"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa"
integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@ -7592,12 +7613,10 @@ semver@^6.2.0, semver@^6.3.0, semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0:
version "7.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
dependencies:
lru-cache "^6.0.0"
semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.1:
version "7.6.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
send@0.18.0:
version "0.18.0"
@ -7909,16 +7928,7 @@ statuses@2.0.1:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@ -8004,14 +8014,7 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@ -8052,13 +8055,13 @@ strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
stylehacks@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.2.tgz#5bf2654561752547d4548765f35c9a49659b3742"
integrity sha512-00zvJGnCu64EpMjX8b5iCZ3us2Ptyw8+toEkb92VdmkEaRaSGBNKAoK6aWZckhXxmQP8zWiTaFaiMGIU8Ve8sg==
stylehacks@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.0.tgz#68e8ee54724671c0c698be82e1299c6548c31921"
integrity sha512-47Nw4pQ6QJb4CA6dzF2m9810sjQik4dfk4UwAm5wlwhrW3syzZKF8AR4/cfO3Cr6lsFgAoznQq0Wg57qhjTA2A==
dependencies:
browserslist "^4.22.2"
postcss-selector-parser "^6.0.15"
browserslist "^4.23.0"
postcss-selector-parser "^6.0.16"
stylelint-config-recommended@^14.0.0:
version "14.0.0"
@ -8207,10 +8210,10 @@ svgo@^3.2.0:
csso "^5.0.5"
picocolors "^1.0.0"
swiper@^11.1.1:
version "11.1.1"
resolved "https://registry.yarnpkg.com/swiper/-/swiper-11.1.1.tgz#5efaa222d4a47a3ac75090cfc2fda6e53e564982"
integrity sha512-jGmEA/fNz1lACIcY4/40ggm1Gcyv+EUivmgV/Jd2WFPsEJhbWXnRAwzZR8OPjkBLtDxmzcoYG/iiAMWfRs0YKQ==
swiper@^11.1.3:
version "11.1.3"
resolved "https://registry.yarnpkg.com/swiper/-/swiper-11.1.3.tgz#ff5cbeea349d207a2423c4106b1905cb12804a19"
integrity sha512-80MSxonyTxrGcaWj9YgvvhD8OG0B9/9IVZP33vhIEvyWvmKjnQDBieO+29wKvMx285sAtvZyrWBdkxaw6+D3aw==
synckit@^0.6.0:
version "0.6.2"
@ -8584,13 +8587,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
util@^0.10.3:
version "0.10.4"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
dependencies:
inherits "2.0.3"
util@^0.12.4:
version "0.12.4"
resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253"
@ -8903,14 +8899,6 @@ webpack-sources@^3.2.3:
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
webpack-watch-external-files-plugin@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/webpack-watch-external-files-plugin/-/webpack-watch-external-files-plugin-3.0.0.tgz#65d75389b1c9b05e84a2cfad83897ac12f146c7e"
integrity sha512-u0geLnZ/uJXh92B+40apyovnexoP+m9I6QktyGlG8rP6CXXYKe3yhG7zY9P2Wbg75sPTP1PYv2rropRlZdxg9A==
dependencies:
glob "10.3.10"
path "0.12.7"
webpack@^5.91.0:
version "5.91.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9"
@ -9008,16 +8996,7 @@ wildcard@^2.0.0:
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==