Merge branch 'main' into 1931-filter-for-home-timeline

This commit is contained in:
Shinigami 2023-04-14 22:48:08 +02:00 committed by GitHub
commit ac1d5f6328
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 4291 additions and 4084 deletions

View file

@ -20,6 +20,7 @@ const relationship = $(useRelationship(account))
const namedFields = ref<mastodon.v1.AccountField[]>([]) const namedFields = ref<mastodon.v1.AccountField[]>([])
const iconFields = ref<mastodon.v1.AccountField[]>([]) const iconFields = ref<mastodon.v1.AccountField[]>([])
const isEditingPersonalNote = ref<boolean>(false)
const hasHeader = $computed(() => !account.header.endsWith('/original/missing.png')) const hasHeader = $computed(() => !account.header.endsWith('/original/missing.png'))
function getFieldIconTitle(fieldName: string) { function getFieldIconTitle(fieldName: string) {
@ -80,6 +81,19 @@ watchEffect(() => {
iconFields.value = icons iconFields.value = icons
}) })
async function editNote(event: Event) {
if (!event.target || !('value' in event.target) || !relationship)
return
const newNote = event.target?.value as string
if (relationship.note?.trim() === newNote.trim())
return
const newNoteApiResult = await client.v1.accounts.createNote(account.id, { comment: newNote })
relationship.note = newNoteApiResult.note
}
const isSelf = $(useSelfAccount(() => account)) const isSelf = $(useSelfAccount(() => account))
const isNotifiedOnPost = $computed(() => !!relationship?.notifying) const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
</script> </script>
@ -107,7 +121,11 @@ const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
</NuxtLink> </NuxtLink>
<AccountFollowButton :account="account" :command="command" /> <AccountFollowButton :account="account" :command="command" />
<span inset-ie-0 flex gap-2 items-center> <span inset-ie-0 flex gap-2 items-center>
<AccountMoreButton :account="account" :command="command" /> <AccountMoreButton
:account="account" :command="command"
@add-note="isEditingPersonalNote = true"
@remove-note="isEditingPersonalNote = false"
/>
<CommonTooltip v-if="!isSelf && relationship?.following" :content="getNotificationIconTitle()"> <CommonTooltip v-if="!isSelf && relationship?.following" :content="getNotificationIconTitle()">
<button <button
:aria-pressed="isNotifiedOnPost" :aria-pressed="isNotifiedOnPost"
@ -145,6 +163,25 @@ const isNotifiedOnPost = $computed(() => !!relationship?.notifying)
<AccountHandle :account="account" /> <AccountHandle :account="account" />
</div> </div>
</div> </div>
<label
v-if="relationship?.note?.length !== 0 || isEditingPersonalNote"
space-y-2
pb-4
block
border="b base"
>
<div flex flex-row space-x-2 flex-v-center>
<div i-ri-edit-2-line />
<p font-medium>
{{ $t('account.profile_personal_note') }}
</p>
</div>
<textarea
input-base
:value="relationship?.note ?? ''"
@change="editNote"
/>
</label>
<div v-if="account.note" max-h-100 overflow-y-auto> <div v-if="account.note" max-h-100 overflow-y-auto>
<ContentRich text-4 text-base :content="account.note" :emojis="account.emojis" /> <ContentRich text-4 text-base :content="account.note" :emojis="account.emojis" />
</div> </div>

View file

@ -7,7 +7,7 @@ const props = defineProps<{
disabled?: boolean disabled?: boolean
}>() }>()
const account = props.account || (props.handle ? useAccountByHandle(props.handle!) : undefined) const account = computed(() => props.account || (props.handle ? useAccountByHandle(props.handle!) : undefined))
const userSettings = useUserSettings() const userSettings = useUserSettings()
defineOptions({ defineOptions({

View file

@ -5,6 +5,11 @@ const { account } = defineProps<{
account: mastodon.v1.Account account: mastodon.v1.Account
command?: boolean command?: boolean
}>() }>()
const emit = defineEmits<{
(evt: 'addNote'): void
(evt: 'removeNote'): void
}>()
let relationship = $(useRelationship(account)) let relationship = $(useRelationship(account))
const isSelf = $(useSelfAccount(() => account)) const isSelf = $(useSelfAccount(() => account))
@ -63,6 +68,19 @@ async function toggleReblogs() {
const showingReblogs = !relationship?.showingReblogs const showingReblogs = !relationship?.showingReblogs
relationship = await client.v1.accounts.follow(account.id, { reblogs: showingReblogs }) relationship = await client.v1.accounts.follow(account.id, { reblogs: showingReblogs })
} }
async function addUserNote() {
emit('addNote')
}
async function removeUserNote() {
if (!relationship!.note || relationship!.note.length === 0)
return
const newNote = await client.v1.accounts.createNote(account.id, { comment: '' })
relationship!.note = newNote.note
emit('removeNote')
}
</script> </script>
<template> <template>
@ -112,6 +130,21 @@ async function toggleReblogs() {
@click="toggleReblogs()" @click="toggleReblogs()"
/> />
<CommonDropdownItem
v-if="!relationship?.note || relationship?.note?.length === 0"
:text="$t('menu.add_personal_note', [`@${account.acct}`])"
icon="i-ri-edit-2-line"
:command="command"
@click="addUserNote()"
/>
<CommonDropdownItem
v-else
:text="$t('menu.remove_personal_note', [`@${account.acct}`])"
icon="i-ri-edit-2-line"
:command="command"
@click="removeUserNote()"
/>
<CommonDropdownItem <CommonDropdownItem
v-if="!relationship?.muting" v-if="!relationship?.muting"
:text="$t('menu.mute_account', [`@${account.acct}`])" :text="$t('menu.mute_account', [`@${account.acct}`])"

View file

@ -2,7 +2,7 @@
const emit = defineEmits<{ const emit = defineEmits<{
(event: 'close'): void (event: 'close'): void
}>() }>()
const { modelValue: visible } = defineModel<{ const { modelValue: visible } = defineModels<{
modelValue?: boolean modelValue?: boolean
}>() }>()

View file

@ -3,7 +3,7 @@ defineProps<{
label: string label: string
hover?: boolean hover?: boolean
}>() }>()
const { modelValue } = defineModel<{ const { modelValue } = defineModels<{
modelValue?: boolean modelValue?: boolean
}>() }>()
</script> </script>

View file

@ -14,7 +14,7 @@ const props = withDefaults(defineProps<Props>(), {
stencilSizePercentage: 0.9, stencilSizePercentage: 0.9,
}) })
const { modelValue: file } = defineModel<{ const { modelValue: file } = defineModels<{
/** Images to be cropped */ /** Images to be cropped */
modelValue: File | null modelValue: File | null
}>() }>()

View file

@ -22,7 +22,7 @@ const emit = defineEmits<{
(event: 'error', code: number, message: string): void (event: 'error', code: number, message: string): void
}>() }>()
const { modelValue: file } = defineModel<{ const { modelValue: file } = defineModels<{
modelValue: FileWithHandle | null modelValue: FileWithHandle | null
}>() }>()

View file

@ -4,7 +4,7 @@ defineProps<{
value: any value: any
hover?: boolean hover?: boolean
}>() }>()
const { modelValue } = defineModel<{ const { modelValue } = defineModels<{
modelValue: any modelValue: any
}>() }>()
</script> </script>

View file

@ -8,7 +8,7 @@ const { options, command } = defineProps<{
command?: boolean command?: boolean
}>() }>()
const { modelValue } = defineModel<{ const { modelValue } = defineModels<{
modelValue: string modelValue: string
}>() }>()

View file

@ -6,7 +6,7 @@ const emit = defineEmits<{
(e: 'listUpdated', list: mastodon.v1.List): void (e: 'listUpdated', list: mastodon.v1.List): void
(e: 'listRemoved', id: string): void (e: 'listRemoved', id: string): void
}>() }>()
const { list } = defineModel<{ const { list } = defineModels<{
list: mastodon.v1.List list: mastodon.v1.List
}>() }>()

View file

@ -48,7 +48,7 @@ const emit = defineEmits<{
(event: 'close',): void (event: 'close',): void
}>() }>()
const { modelValue: visible } = defineModel<{ const { modelValue: visible } = defineModels<{
/** v-model dislog visibility */ /** v-model dislog visibility */
modelValue: boolean modelValue: boolean
}>() }>()

View file

@ -14,7 +14,7 @@ const emit = defineEmits<{
(event: 'close'): void (event: 'close'): void
}>() }>()
const { modelValue } = defineModel<{ const { modelValue } = defineModels<{
modelValue: number modelValue: number
}>() }>()

View file

@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
let { modelValue } = $defineModel<{ let { modelValue } = $defineModels<{
modelValue: boolean modelValue: boolean
}>() }>()
const colorMode = useColorMode() const colorMode = useColorMode()

View file

@ -3,7 +3,7 @@ defineProps<{
title?: string title?: string
message: string message: string
}>() }>()
const { modelValue } = defineModel<{ const { modelValue } = defineModels<{
modelValue: boolean modelValue: boolean
}>() }>()
</script> </script>

View file

@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import type { Editor } from '@tiptap/core' import type { Editor } from '@tiptap/core'
const { editor } = defineProps<{ const { editor } = defineProps<{
editor: Editor editor: Editor
}>() }>()

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import Fuse from 'fuse.js' import Fuse from 'fuse.js'
let { modelValue } = $defineModel<{ let { modelValue } = $defineModels<{
modelValue: string modelValue: string
}>() }>()

View file

@ -3,7 +3,7 @@ const { editing } = defineProps<{
editing?: boolean editing?: boolean
}>() }>()
let { modelValue } = $defineModel<{ let { modelValue } = $defineModels<{
modelValue: string modelValue: string
}>() }>()

View file

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
const { form } = defineModel<{ const { form } = defineModels<{
form: { form: {
fieldsAttributes: NonNullable<mastodon.v1.UpdateCredentialsParams['fieldsAttributes']> fieldsAttributes: NonNullable<mastodon.v1.UpdateCredentialsParams['fieldsAttributes']>
} }

View file

@ -19,11 +19,11 @@ const { client } = $(useMasto())
async function vote(e: Event) { async function vote(e: Event) {
const formData = new FormData(e.target as HTMLFormElement) const formData = new FormData(e.target as HTMLFormElement)
const choices = formData.getAll('choices') as string[] const choices = formData.getAll('choices').map(i => +i) as number[]
// Update the poll optimistically // Update the poll optimistically
for (const [index, option] of poll.options.entries()) { for (const [index, option] of poll.options.entries()) {
if (choices.includes(String(index))) if (choices.includes(index))
option.votesCount = (option.votesCount || 0) + 1 option.votesCount = (option.votesCount || 0) + 1
} }
poll.voted = true poll.voted = true

View file

@ -1,7 +1,7 @@
import LRU from 'lru-cache' import { LRUCache } from 'lru-cache'
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
const cache = new LRU<string, any>({ const cache = new LRUCache<string, any>({
max: 1000, max: 1000,
}) })

View file

@ -13,6 +13,6 @@
}, },
"devDependencies": { "devDependencies": {
"@nuxt-themes/docus": "^1.10.1", "@nuxt-themes/docus": "^1.10.1",
"nuxt": "^3.3.2" "nuxt": "^3.4.0"
} }
} }

View file

@ -34,6 +34,7 @@
"posts": "Posts", "posts": "Posts",
"posts_count": "{0} Posts|{0} Post|{0} Posts", "posts_count": "{0} Posts|{0} Post|{0} Posts",
"profile_description": "{0}'s profile header", "profile_description": "{0}'s profile header",
"profile_personal_note": "Personal Note",
"profile_unavailable": "Profile unavailable", "profile_unavailable": "Profile unavailable",
"request_follow": "Request to follow", "request_follow": "Request to follow",
"unblock": "Unblock", "unblock": "Unblock",
@ -225,6 +226,7 @@
"sequence_then": "then" "sequence_then": "then"
}, },
"menu": { "menu": {
"add_personal_note": "Add personal note to {0}",
"block_account": "Block {0}", "block_account": "Block {0}",
"block_domain": "Block domain {0}", "block_domain": "Block domain {0}",
"copy_link_to_post": "Copy link to this post", "copy_link_to_post": "Copy link to this post",
@ -239,6 +241,7 @@
"mute_conversation": "Mute this post", "mute_conversation": "Mute this post",
"open_in_original_site": "Open in original site", "open_in_original_site": "Open in original site",
"pin_on_profile": "Pin on profile", "pin_on_profile": "Pin on profile",
"remove_personal_note": "Remove personal note from {0}",
"share_post": "Share this post", "share_post": "Share this post",
"show_favourited_and_boosted_by": "Show who favorited and boosted", "show_favourited_and_boosted_by": "Show who favorited and boosted",
"show_reblogs": "Show boosts from {0}", "show_reblogs": "Show boosts from {0}",

View file

@ -95,6 +95,7 @@
"common": { "common": {
"end_of_list": "列表到底啦", "end_of_list": "列表到底啦",
"error": "错误", "error": "错误",
"fetching": "加载中...",
"in": "在", "in": "在",
"not_found": "无法找到相关内容", "not_found": "无法找到相关内容",
"offline_desc": "您目前已离线,请检查网络连接。" "offline_desc": "您目前已离线,请检查网络连接。"
@ -198,6 +199,31 @@
"remove_account": "移除列表中的用户", "remove_account": "移除列表中的用户",
"save": "保存更改" "save": "保存更改"
}, },
"magic_keys": {
"dialog_header": "快捷键",
"groups": {
"actions": {
"boost": "转发",
"command_mode": "命令面板",
"compose": "撰写",
"favourite": "喜欢",
"title": "操作",
"zen_mode": "禅模式"
},
"media": {
"title": "媒体"
},
"navigation": {
"go_to_home": "首页",
"go_to_notifications": "通知",
"next_status": "下一条帖文",
"previous_status": "上一条帖文",
"shortcut_help": "快捷键帮助",
"title": "导航"
}
},
"sequence_then": "then"
},
"menu": { "menu": {
"block_account": "拉黑 {0}", "block_account": "拉黑 {0}",
"block_domain": "拉黑域名 {0}", "block_domain": "拉黑域名 {0}",
@ -228,6 +254,9 @@
"unmute_conversation": "取消静音帖子", "unmute_conversation": "取消静音帖子",
"unpin_on_profile": "取消置顶" "unpin_on_profile": "取消置顶"
}, },
"modals": {
"aria_label_close": "关闭"
},
"nav": { "nav": {
"back": "回退", "back": "回退",
"blocked_domains": "已拉黑的域名", "blocked_domains": "已拉黑的域名",
@ -373,6 +402,7 @@
"save_settings": "保存设置改动", "save_settings": "保存设置改动",
"subscription_error": { "subscription_error": {
"clear_error": "清除错误", "clear_error": "清除错误",
"error_hint": "你可以参考常见问题列表来尝试解决问题:{0}。",
"invalid_vapid_key": "VAPID 密钥无效。", "invalid_vapid_key": "VAPID 密钥无效。",
"permission_denied": "权限不足:请在你的浏览器中打开通知权限。", "permission_denied": "权限不足:请在你的浏览器中打开通知权限。",
"repo_link": "鹿鸣在 Github 上的仓库", "repo_link": "鹿鸣在 Github 上的仓库",
@ -402,6 +432,8 @@
"notifications_settings": "通知", "notifications_settings": "通知",
"preferences": { "preferences": {
"enable_autoplay": "开启自动播放", "enable_autoplay": "开启自动播放",
"enable_data_saving": "启用数据保存",
"enable_data_saving_description": "通过阻止附件自动加载来保存数据。",
"enable_pinch_to_zoom": "启用双指缩放功能", "enable_pinch_to_zoom": "启用双指缩放功能",
"github_cards": "GitHub 卡片", "github_cards": "GitHub 卡片",
"grayscale_mode": "灰色模式", "grayscale_mode": "灰色模式",
@ -561,6 +593,7 @@
"explore_posts_intro": "来自本站和分布式网络上其他站点的这些嘟文正在本站引起关注。", "explore_posts_intro": "来自本站和分布式网络上其他站点的这些嘟文正在本站引起关注。",
"explore_tags_intro": "这些标签正在本站和分布式网络上其他站点的用户中引起关注。", "explore_tags_intro": "这些标签正在本站和分布式网络上其他站点的用户中引起关注。",
"open_editor_tools": "编辑器工具", "open_editor_tools": "编辑器工具",
"pick_an_icon": "选择一个图标",
"publish_failed": "关闭编辑器上方的错误信息以重新发布帖文。", "publish_failed": "关闭编辑器上方的错误信息以重新发布帖文。",
"toggle_bold": "切换加粗", "toggle_bold": "切换加粗",
"toggle_code_block": "切换代码块", "toggle_code_block": "切换代码块",

View file

@ -1,3 +1,4 @@
import { Buffer } from 'node:buffer'
import { readFile } from 'fs-extra' import { readFile } from 'fs-extra'
import { createResolver } from '@nuxt/kit' import { createResolver } from '@nuxt/kit'
import type { ManifestOptions } from 'vite-plugin-pwa' import type { ManifestOptions } from 'vite-plugin-pwa'

View file

@ -11,7 +11,7 @@ import { type LocalizedWebManifest, createI18n, pwaLocales } from './i18n'
export * from './types' export * from './types'
export default defineNuxtModule<VitePWANuxtOptions>({ export default defineNuxtModule<VitePWANuxtOptions>({
meta: { meta: {
name: 'pwa', name: 'elk-pwa',
configKey: 'pwa', configKey: 'pwa',
}, },
defaults: nuxt => ({ defaults: nuxt => ({

View file

@ -3,6 +3,7 @@ import { isCI, isDevelopment, isWindows } from 'std-env'
import { isPreview } from './config/env' import { isPreview } from './config/env'
import { i18n } from './config/i18n' import { i18n } from './config/i18n'
import { pwa } from './config/pwa' import { pwa } from './config/pwa'
import type { BuildInfo } from './types'
const { resolve } = createResolver(import.meta.url) const { resolve } = createResolver(import.meta.url)
@ -32,11 +33,14 @@ export default defineNuxtConfig({
'~/modules/tauri/index', '~/modules/tauri/index',
'~/modules/pwa/index', // change to '@vite-pwa/nuxt' once released and remove pwa module '~/modules/pwa/index', // change to '@vite-pwa/nuxt' once released and remove pwa module
'stale-dep/nuxt', 'stale-dep/nuxt',
'@nuxt/devtools',
], ],
devtools: {
enabled: true,
},
experimental: { experimental: {
payloadExtraction: false, payloadExtraction: false,
inlineSSRStyles: false, inlineSSRStyles: false,
renderJsonPayloads: true,
}, },
css: [ css: [
'@unocss/reset/tailwind.css', '@unocss/reset/tailwind.css',
@ -260,3 +264,11 @@ declare module 'nuxt/dist/app' {
'elk-timeline-home-filter:change': () => void 'elk-timeline-home-filter:change': () => void
} }
} }
declare module '@nuxt/schema' {
interface AppConfig {
storage: any
env: BuildInfo['env']
buildInfo: BuildInfo
}
}

View file

@ -2,7 +2,7 @@
"name": "@elk-zone/elk", "name": "@elk-zone/elk",
"type": "module", "type": "module",
"version": "0.8.0", "version": "0.8.0",
"packageManager": "pnpm@7.30.5", "packageManager": "pnpm@8.2.0",
"license": "MIT", "license": "MIT",
"homepage": "https://elk.zone/", "homepage": "https://elk.zone/",
"main": "./nuxt.config.ts", "main": "./nuxt.config.ts",
@ -31,38 +31,38 @@
"@emoji-mart/data": "^1.1.2", "@emoji-mart/data": "^1.1.2",
"@fnando/sparkline": "^0.3.10", "@fnando/sparkline": "^0.3.10",
"@iconify-emoji/twemoji": "^1.0.2", "@iconify-emoji/twemoji": "^1.0.2",
"@iconify/json": "^2.2.37", "@iconify/json": "^2.2.49",
"@iconify/utils": "^2.0.12", "@iconify/utils": "^2.1.5",
"@nuxt/devtools": "^0.3.0", "@nuxt/devtools": "^0.4.0",
"@nuxtjs/color-mode": "^3.2.0", "@nuxtjs/color-mode": "^3.2.0",
"@nuxtjs/i18n": "8.0.0-beta.10", "@nuxtjs/i18n": "8.0.0-beta.10",
"@pinia/nuxt": "^0.4.6", "@pinia/nuxt": "^0.4.8",
"@tiptap/extension-character-count": "2.0.1", "@tiptap/extension-character-count": "2.0.2",
"@tiptap/extension-code-block": "2.0.1", "@tiptap/extension-code-block": "2.0.2",
"@tiptap/extension-history": "2.0.1", "@tiptap/extension-history": "2.0.2",
"@tiptap/extension-mention": "2.0.1", "@tiptap/extension-mention": "2.0.2",
"@tiptap/extension-paragraph": "2.0.1", "@tiptap/extension-paragraph": "2.0.2",
"@tiptap/extension-placeholder": "2.0.1", "@tiptap/extension-placeholder": "2.0.2",
"@tiptap/extension-text": "2.0.1", "@tiptap/extension-text": "2.0.2",
"@tiptap/pm": "^2.0.1", "@tiptap/pm": "^2.0.2",
"@tiptap/starter-kit": "2.0.1", "@tiptap/starter-kit": "2.0.2",
"@tiptap/suggestion": "2.0.1", "@tiptap/suggestion": "2.0.2",
"@tiptap/vue-3": "2.0.1", "@tiptap/vue-3": "2.0.2",
"@unocss/nuxt": "^0.50.6", "@unocss/nuxt": "^0.51.4",
"@vue-macros/nuxt": "^1.2.3", "@vue-macros/nuxt": "^1.2.8",
"@vueuse/core": "^9.13.0", "@vueuse/core": "^9.13.0",
"@vueuse/gesture": "2.0.0-beta.1", "@vueuse/gesture": "2.0.0-beta.1",
"@vueuse/integrations": "^9.13.0", "@vueuse/integrations": "^9.13.0",
"@vueuse/math": "^9.13.0", "@vueuse/math": "^9.13.0",
"@vueuse/motion": "2.0.0-beta.12", "@vueuse/motion": "2.0.0-beta.12",
"@vueuse/nuxt": "^9.13.0", "@vueuse/nuxt": "^9.13.0",
"blurhash": "^2.0.4", "blurhash": "^2.0.5",
"browser-fs-access": "^0.33.0", "browser-fs-access": "^0.33.0",
"chroma-js": "^2.4.2", "chroma-js": "^2.4.2",
"emoji-mart": "^5.5.2", "emoji-mart": "^5.5.2",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"floating-vue": "2.0.0-beta.20", "floating-vue": "2.0.0-beta.20",
"focus-trap": "^7.2.0", "focus-trap": "^7.4.0",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"github-reserved-names": "^2.0.4", "github-reserved-names": "^2.0.4",
@ -70,39 +70,39 @@
"ignore-dependency-scripts": "^1.0.1", "ignore-dependency-scripts": "^1.0.1",
"iso-639-1": "^2.1.15", "iso-639-1": "^2.1.15",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"lru-cache": "^7.14.1", "lru-cache": "^9.0.1",
"masto": "^5.9.2", "masto": "^5.11.1",
"nuxt-security": "^0.13.0", "nuxt-security": "^0.13.0",
"nuxt-vitest": "^0.6.4", "nuxt-vitest": "^0.6.9",
"page-lifecycle": "^0.1.2", "page-lifecycle": "^0.1.2",
"pinia": "^2.0.33", "pinia": "^2.0.34",
"postcss-nested": "^6.0.0", "postcss-nested": "^6.0.1",
"rollup-plugin-node-polyfills": "^0.2.1", "rollup-plugin-node-polyfills": "^0.2.1",
"shiki": "^0.14.0", "shiki": "^0.14.1",
"shiki-es": "^0.2.0", "shiki-es": "^0.2.0",
"simple-git": "^3.16.0", "simple-git": "^3.17.0",
"slimeform": "^0.9.0", "slimeform": "^0.9.1",
"stale-dep": "^0.6.0", "stale-dep": "^0.6.0",
"std-env": "^3.3.1", "std-env": "^3.3.2",
"string-length": "^5.0.1", "string-length": "^5.0.1",
"tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log", "tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log",
"tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store", "tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store",
"theme-vitesse": "^0.6.0", "theme-vitesse": "^0.6.4",
"tiny-decode": "^0.1.3", "tiny-decode": "^0.1.3",
"tippy.js": "^6.3.7", "tippy.js": "^6.3.7",
"ufo": "^1.0.1", "ufo": "^1.1.1",
"ultrahtml": "^1.2.0", "ultrahtml": "^1.2.0",
"unimport": "^2.1.0", "unimport": "^3.0.6",
"unplugin-auto-import": "^0.15.0", "unplugin-auto-import": "^0.15.2",
"vite-plugin-pwa": "^0.14.1", "vite-plugin-pwa": "^0.14.7",
"vue-advanced-cropper": "^2.8.8", "vue-advanced-cropper": "^2.8.8",
"vue-virtual-scroller": "2.0.0-beta.8", "vue-virtual-scroller": "2.0.0-beta.8",
"workbox-build": "^6.5.4", "workbox-build": "^6.5.4",
"workbox-window": "^6.5.4" "workbox-window": "^6.5.4"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^0.38.2", "@antfu/eslint-config": "^0.38.4",
"@antfu/ni": "^0.21.2", "@antfu/ni": "^0.21.3",
"@types/chroma-js": "^2.4.0", "@types/chroma-js": "^2.4.0",
"@types/file-saver": "^2.0.5", "@types/file-saver": "^2.0.5",
"@types/flat": "^5.0.2", "@types/flat": "^5.0.2",
@ -110,18 +110,19 @@
"@types/fs-extra": "^11.0.1", "@types/fs-extra": "^11.0.1",
"@types/js-yaml": "^4.0.5", "@types/js-yaml": "^4.0.5",
"@types/prettier": "^2.7.2", "@types/prettier": "^2.7.2",
"@types/wicg-file-system-access": "^2020.9.5", "@types/wicg-file-system-access": "^2020.9.6",
"bumpp": "^9.1.0", "bumpp": "^9.1.0",
"eslint": "^8.37.0", "consola": "^3.0.1",
"eslint": "^8.38.0",
"esno": "^0.16.3", "esno": "^0.16.3",
"flat": "^5.0.2", "flat": "^5.0.2",
"fs-extra": "^11.1.1", "fs-extra": "^11.1.1",
"lint-staged": "^13.2.0", "lint-staged": "^13.2.1",
"nuxt": "3.3.2", "nuxt": "3.4.0",
"prettier": "^2.8.7", "prettier": "^2.8.7",
"simple-git-hooks": "^2.8.1", "simple-git-hooks": "^2.8.1",
"typescript": "^5.0.2", "typescript": "^5.0.4",
"vitest": "^0.29.7", "vitest": "^0.30.1",
"vue-tsc": "^1.2.0" "vue-tsc": "^1.2.0"
}, },
"pnpm": { "pnpm": {

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,4 @@
import { Buffer } from 'node:buffer'
import { join, resolve } from 'pathe' import { join, resolve } from 'pathe'
import fs from 'fs-extra' import fs from 'fs-extra'
import { ofetch } from 'ofetch' import { ofetch } from 'ofetch'

View file

@ -1,3 +1,4 @@
import { Buffer } from 'node:buffer'
import flatten from 'flat' import flatten from 'flat'
import { createResolver } from '@nuxt/kit' import { createResolver } from '@nuxt/kit'
import fs from 'fs-extra' import fs from 'fs-extra'