Compare commits
39 Commits
3689964640
...
82188e6fe5
Author | SHA1 | Date |
---|---|---|
|
82188e6fe5 | |
|
d522d1bf26 | |
|
080276e3e7 | |
|
619bb2214e | |
|
c23f2ff900 | |
|
14d6734cb1 | |
|
3bdb1dd558 | |
|
e75d749784 | |
|
42a2ed8b67 | |
|
41750dd0f4 | |
|
39edab772a | |
|
3afd2c5a75 | |
|
3d24a6e98f | |
|
d9d0494c10 | |
|
3207fb2831 | |
|
291161ca31 | |
|
25f719a5ec | |
|
22895030d7 | |
|
72abb25f04 | |
|
ea7b27f912 | |
|
859fc943af | |
|
667e67bb29 | |
|
9e24354f96 | |
|
f5caa380b6 | |
|
1508d8842d | |
|
ab3395ec91 | |
|
691fc7515c | |
|
040508824e | |
|
ac7c870363 | |
|
2ea59515f1 | |
|
0f37573a4e | |
|
44868b879d | |
|
b4935ea05e | |
|
dfb7cd54df | |
|
11709e974f | |
|
ab0ad7839b | |
|
20bda61f7f | |
|
1dbc0231a0 | |
|
41b11562da |
|
@ -5,7 +5,7 @@
|
||||||
"workspaceFolder": "/workspace",
|
"workspaceFolder": "/workspace",
|
||||||
"features": {
|
"features": {
|
||||||
"ghcr.io/devcontainers/features/node:1": {
|
"ghcr.io/devcontainers/features/node:1": {
|
||||||
"version": "22.11.0"
|
"version": "22.15.0"
|
||||||
},
|
},
|
||||||
"ghcr.io/devcontainers-extra/features/pnpm:2": {
|
"ghcr.io/devcontainers-extra/features/pnpm:2": {
|
||||||
"version": "10.10.0"
|
"version": "10.10.0"
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
22.11.0
|
22.15.0
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
## 2025.5.0
|
## 2025.5.0
|
||||||
|
|
||||||
|
### Note
|
||||||
|
- DockerのNode.jsが22.15.0に更新されました
|
||||||
|
|
||||||
### General
|
### General
|
||||||
-
|
-
|
||||||
|
|
||||||
|
@ -8,6 +11,7 @@
|
||||||
- アクセシビリティ設定からオフにすることもできます
|
- アクセシビリティ設定からオフにすることもできます
|
||||||
- Enhance: タイムラインのパフォーマンスを向上
|
- Enhance: タイムラインのパフォーマンスを向上
|
||||||
- Fix: 一部のブラウザでアコーディオンメニューのアニメーションが動作しない問題を修正
|
- Fix: 一部のブラウザでアコーディオンメニューのアニメーションが動作しない問題を修正
|
||||||
|
- Fix: ダイアログのお知らせが画面からはみ出ることがある問題を修正
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
- Enhance: 凍結されたユーザのノートが各種タイムラインで表示されないように `#15775`
|
- Enhance: 凍結されたユーザのノートが各種タイムラインで表示されないように `#15775`
|
||||||
|
@ -20,6 +24,8 @@
|
||||||
- Fix: チャンネルのフォロー一覧の結果が一部正しくないのを修正 (#12175)
|
- Fix: チャンネルのフォロー一覧の結果が一部正しくないのを修正 (#12175)
|
||||||
- Fix: ファイルをアップロードした際にファイル名が常に untitled になる問題を修正
|
- Fix: ファイルをアップロードした際にファイル名が常に untitled になる問題を修正
|
||||||
- Fix: ファイルのアップロードに失敗することがある問題を修正
|
- Fix: ファイルのアップロードに失敗することがある問題を修正
|
||||||
|
- 投稿フォーム上で画像のクロップを行うと、`Invalid Param.`エラーでノートが投稿出来なくなる問題も解決されます。
|
||||||
|
- この事象によって既にノートが投稿出来ない状態になっている場合は、投稿フォーム右上のメニューから、下書きデータの「リセット」を行ってください。
|
||||||
|
|
||||||
## 2025.4.1
|
## 2025.4.1
|
||||||
|
|
||||||
|
@ -42,6 +48,8 @@
|
||||||
- Enhance: テーマでページヘッダーの色を変更できるように
|
- Enhance: テーマでページヘッダーの色を変更できるように
|
||||||
- Enhance: スワイプでのタブ切り替えを強化
|
- Enhance: スワイプでのタブ切り替えを強化
|
||||||
- Enhance: デザインのブラッシュアップ
|
- Enhance: デザインのブラッシュアップ
|
||||||
|
- Enhance: 投稿フォームの絵文字ピッカーに独立したウィンドウを使用できるように
|
||||||
|
- リアクションピッカーと絵文字ピッカーで表示スタイルの設定が分離しました。絵文字ピッカーでのみウィンドウスタイルを使用可能です。
|
||||||
- Fix: ログアウトした際に処理が終了しない問題を修正
|
- Fix: ログアウトした際に処理が終了しない問題を修正
|
||||||
- Fix: 自動バックアップが設定されている環境でログアウト直前に設定をバックアップするように
|
- Fix: 自動バックアップが設定されている環境でログアウト直前に設定をバックアップするように
|
||||||
- Fix: フォルダを開いた状態でメニューからアップロードしてもルートフォルダにアップロードされる問題を修正 #15836
|
- Fix: フォルダを開いた状態でメニューからアップロードしてもルートフォルダにアップロードされる問題を修正 #15836
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# syntax = docker/dockerfile:1.4
|
# syntax = docker/dockerfile:1.4
|
||||||
|
|
||||||
ARG NODE_VERSION=22.11.0-bookworm
|
ARG NODE_VERSION=22.15.0-bookworm
|
||||||
|
|
||||||
# build assets & compile TypeScript
|
# build assets & compile TypeScript
|
||||||
|
|
||||||
|
|
|
@ -1425,6 +1425,7 @@ _settings:
|
||||||
ifOff: "Quan es desactiva"
|
ifOff: "Quan es desactiva"
|
||||||
enableSyncThemesBetweenDevices: "Sincronitzar els temes instal·lats entre dispositius"
|
enableSyncThemesBetweenDevices: "Sincronitzar els temes instal·lats entre dispositius"
|
||||||
enablePullToRefresh: "Lliscar i actualitzar "
|
enablePullToRefresh: "Lliscar i actualitzar "
|
||||||
|
enablePullToRefresh_description: "Amb el ratolí, llisca mentre prems la roda."
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Mostrar el nom del remitent"
|
showSenderName: "Mostrar el nom del remitent"
|
||||||
sendOnEnter: "Introdueix per enviar"
|
sendOnEnter: "Introdueix per enviar"
|
||||||
|
|
|
@ -1348,6 +1348,7 @@ readonly: "Read only"
|
||||||
goToDeck: "Return to Deck"
|
goToDeck: "Return to Deck"
|
||||||
federationJobs: "Federation Jobs"
|
federationJobs: "Federation Jobs"
|
||||||
driveAboutTip: "In Drive, a list of files you've uploaded in the past will be displayed. <br> \nYou can reuse these files when attaching them to notes, or you can upload files in advance to post later. <br> \n<b>Be careful when deleting a file, as it will not be available in all places where it was used (such as notes, pages, avatars, banners, etc.).</b> <br> \nYou can also create folders to organize your files."
|
driveAboutTip: "In Drive, a list of files you've uploaded in the past will be displayed. <br> \nYou can reuse these files when attaching them to notes, or you can upload files in advance to post later. <br> \n<b>Be careful when deleting a file, as it will not be available in all places where it was used (such as notes, pages, avatars, banners, etc.).</b> <br> \nYou can also create folders to organize your files."
|
||||||
|
scrollToClose: "Scroll to close"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "No messages yet"
|
noMessagesYet: "No messages yet"
|
||||||
newMessage: "New message"
|
newMessage: "New message"
|
||||||
|
@ -1425,6 +1426,7 @@ _settings:
|
||||||
ifOff: "When turned off"
|
ifOff: "When turned off"
|
||||||
enableSyncThemesBetweenDevices: "Synchronize installed themes across devices"
|
enableSyncThemesBetweenDevices: "Synchronize installed themes across devices"
|
||||||
enablePullToRefresh: "Pull to Refresh"
|
enablePullToRefresh: "Pull to Refresh"
|
||||||
|
enablePullToRefresh_description: "When using a mouse, drag while pressing in the scrolling wheel."
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Show sender's name"
|
showSenderName: "Show sender's name"
|
||||||
sendOnEnter: "Press Enter to send"
|
sendOnEnter: "Press Enter to send"
|
||||||
|
|
|
@ -130,6 +130,10 @@ export interface Locale extends ILocale {
|
||||||
* ウィンドウで開く
|
* ウィンドウで開く
|
||||||
*/
|
*/
|
||||||
"openInWindow": string;
|
"openInWindow": string;
|
||||||
|
/**
|
||||||
|
* ウィンドウ
|
||||||
|
*/
|
||||||
|
"window": string;
|
||||||
/**
|
/**
|
||||||
* プロフィール
|
* プロフィール
|
||||||
*/
|
*/
|
||||||
|
@ -542,6 +546,10 @@ export interface Locale extends ILocale {
|
||||||
* 絵文字ピッカー
|
* 絵文字ピッカー
|
||||||
*/
|
*/
|
||||||
"emojiPicker": string;
|
"emojiPicker": string;
|
||||||
|
/**
|
||||||
|
* リアクションピッカー
|
||||||
|
*/
|
||||||
|
"reactionPicker": string;
|
||||||
/**
|
/**
|
||||||
* リアクション時にピン留め表示する絵文字を設定できます
|
* リアクション時にピン留め表示する絵文字を設定できます
|
||||||
*/
|
*/
|
||||||
|
@ -3186,10 +3194,6 @@ export interface Locale extends ILocale {
|
||||||
* 設定はページリロード後に反映されます。
|
* 設定はページリロード後に反映されます。
|
||||||
*/
|
*/
|
||||||
"reloadToApplySetting": string;
|
"reloadToApplySetting": string;
|
||||||
/**
|
|
||||||
* 反映には再起動が必要です。
|
|
||||||
*/
|
|
||||||
"needReloadToApply": string;
|
|
||||||
/**
|
/**
|
||||||
* タイトルバーを表示する
|
* タイトルバーを表示する
|
||||||
*/
|
*/
|
||||||
|
@ -5413,6 +5417,10 @@ export interface Locale extends ILocale {
|
||||||
* フォルダを作って整理することもできます。
|
* フォルダを作って整理することもできます。
|
||||||
*/
|
*/
|
||||||
"driveAboutTip": string;
|
"driveAboutTip": string;
|
||||||
|
/**
|
||||||
|
* スクロールして閉じる
|
||||||
|
*/
|
||||||
|
"scrollToClose": string;
|
||||||
"_chat": {
|
"_chat": {
|
||||||
/**
|
/**
|
||||||
* まだメッセージはありません
|
* まだメッセージはありません
|
||||||
|
|
|
@ -28,6 +28,7 @@ notificationSettings: "通知の設定"
|
||||||
basicSettings: "基本設定"
|
basicSettings: "基本設定"
|
||||||
otherSettings: "その他の設定"
|
otherSettings: "その他の設定"
|
||||||
openInWindow: "ウィンドウで開く"
|
openInWindow: "ウィンドウで開く"
|
||||||
|
window: "ウィンドウ"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
timeline: "タイムライン"
|
timeline: "タイムライン"
|
||||||
noAccountDescription: "自己紹介はありません"
|
noAccountDescription: "自己紹介はありません"
|
||||||
|
@ -131,6 +132,7 @@ add: "追加"
|
||||||
reaction: "リアクション"
|
reaction: "リアクション"
|
||||||
reactions: "リアクション"
|
reactions: "リアクション"
|
||||||
emojiPicker: "絵文字ピッカー"
|
emojiPicker: "絵文字ピッカー"
|
||||||
|
reactionPicker: "リアクションピッカー"
|
||||||
pinnedEmojisForReactionSettingDescription: "リアクション時にピン留め表示する絵文字を設定できます"
|
pinnedEmojisForReactionSettingDescription: "リアクション時にピン留め表示する絵文字を設定できます"
|
||||||
pinnedEmojisSettingDescription: "絵文字入力時にピン留め表示する絵文字を設定できます"
|
pinnedEmojisSettingDescription: "絵文字入力時にピン留め表示する絵文字を設定できます"
|
||||||
emojiPickerDisplay: "ピッカーの表示"
|
emojiPickerDisplay: "ピッカーの表示"
|
||||||
|
@ -792,7 +794,6 @@ center: "中央"
|
||||||
wide: "広い"
|
wide: "広い"
|
||||||
narrow: "狭い"
|
narrow: "狭い"
|
||||||
reloadToApplySetting: "設定はページリロード後に反映されます。"
|
reloadToApplySetting: "設定はページリロード後に反映されます。"
|
||||||
needReloadToApply: "反映には再起動が必要です。"
|
|
||||||
showTitlebar: "タイトルバーを表示する"
|
showTitlebar: "タイトルバーを表示する"
|
||||||
clearCache: "キャッシュをクリア"
|
clearCache: "キャッシュをクリア"
|
||||||
onlineUsersCount: "{n}人がオンライン"
|
onlineUsersCount: "{n}人がオンライン"
|
||||||
|
@ -1348,6 +1349,7 @@ readonly: "読み取り専用"
|
||||||
goToDeck: "デッキへ戻る"
|
goToDeck: "デッキへ戻る"
|
||||||
federationJobs: "連合ジョブ"
|
federationJobs: "連合ジョブ"
|
||||||
driveAboutTip: "ドライブでは、過去にアップロードしたファイルの一覧が表示されます。<br>\nノートに添付する際に再利用したり、あとで投稿するファイルを予めアップロードしておくこともできます。<br>\n<b>ファイルを削除すると、今までそのファイルを使用した全ての場所(ノート、ページ、アバター、バナー等)からも見えなくなるので注意してください。</b><br>\nフォルダを作って整理することもできます。"
|
driveAboutTip: "ドライブでは、過去にアップロードしたファイルの一覧が表示されます。<br>\nノートに添付する際に再利用したり、あとで投稿するファイルを予めアップロードしておくこともできます。<br>\n<b>ファイルを削除すると、今までそのファイルを使用した全ての場所(ノート、ページ、アバター、バナー等)からも見えなくなるので注意してください。</b><br>\nフォルダを作って整理することもできます。"
|
||||||
|
scrollToClose: "スクロールして閉じる"
|
||||||
|
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "まだメッセージはありません"
|
noMessagesYet: "まだメッセージはありません"
|
||||||
|
|
|
@ -1348,6 +1348,7 @@ readonly: "唯讀"
|
||||||
goToDeck: "回去甲板"
|
goToDeck: "回去甲板"
|
||||||
federationJobs: "聯邦通訊作業"
|
federationJobs: "聯邦通訊作業"
|
||||||
driveAboutTip: "在「雲端硬碟」中,會顯示過去上傳的檔案列表。<br>\n可以在附加到貼文時重新利用,或者事先上傳之後再用於發布。<br>\n<b>請注意,刪除檔案後,之前使用過該檔案的所有地方(貼文、頁面、大頭貼、橫幅等)也會一併無法顯示。</b><br>\n也可以建立資料夾來整理檔案。"
|
driveAboutTip: "在「雲端硬碟」中,會顯示過去上傳的檔案列表。<br>\n可以在附加到貼文時重新利用,或者事先上傳之後再用於發布。<br>\n<b>請注意,刪除檔案後,之前使用過該檔案的所有地方(貼文、頁面、大頭貼、橫幅等)也會一併無法顯示。</b><br>\n也可以建立資料夾來整理檔案。"
|
||||||
|
scrollToClose: "用滾輪關閉"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "尚無訊息"
|
noMessagesYet: "尚無訊息"
|
||||||
newMessage: "新訊息"
|
newMessage: "新訊息"
|
||||||
|
@ -1425,6 +1426,7 @@ _settings:
|
||||||
ifOff: "關閉時"
|
ifOff: "關閉時"
|
||||||
enableSyncThemesBetweenDevices: "在裝置之間同步已安裝的主題"
|
enableSyncThemesBetweenDevices: "在裝置之間同步已安裝的主題"
|
||||||
enablePullToRefresh: "下拉更新"
|
enablePullToRefresh: "下拉更新"
|
||||||
|
enablePullToRefresh_description: "使用滑鼠,按下並拖曳滾輪。"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "顯示發送者的名稱"
|
showSenderName: "顯示發送者的名稱"
|
||||||
sendOnEnter: "按下 Enter 發送訊息"
|
sendOnEnter: "按下 Enter 發送訊息"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2025.5.0-alpha.0",
|
"version": "2025.5.0-alpha.1",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import tsParser from '@typescript-eslint/parser';
|
import tsParser from '@typescript-eslint/parser';
|
||||||
|
import globals from 'globals';
|
||||||
import sharedConfig from '../shared/eslint.config.js';
|
import sharedConfig from '../shared/eslint.config.js';
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
|
@ -6,6 +7,13 @@ export default [
|
||||||
{
|
{
|
||||||
ignores: ['**/node_modules', 'built', '@types/**/*', 'migration'],
|
ignores: ['**/node_modules', 'built', '@types/**/*', 'migration'],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
languageOptions: {
|
||||||
|
globals: {
|
||||||
|
...globals.node,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
files: ['**/*.ts', '**/*.tsx'],
|
files: ['**/*.ts', '**/*.tsx'],
|
||||||
languageOptions: {
|
languageOptions: {
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
import child_process from 'node:child_process';
|
||||||
|
import path from 'node:path';
|
||||||
|
import url from 'node:url';
|
||||||
|
|
||||||
|
import semver from 'semver';
|
||||||
|
|
||||||
|
const __filename = url.fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = path.dirname(__filename);
|
||||||
|
|
||||||
|
const args = [];
|
||||||
|
args.push(...[
|
||||||
|
...semver.satisfies(process.version, '^20.17.0 || ^22.0.0') ? ['--no-experimental-require-module'] : [],
|
||||||
|
'--experimental-vm-modules',
|
||||||
|
'--experimental-import-meta-resolve',
|
||||||
|
path.join(__dirname, 'node_modules/jest/bin/jest.js'),
|
||||||
|
...process.argv.slice(2),
|
||||||
|
]);
|
||||||
|
|
||||||
|
child_process.spawn(process.execPath, args, { stdio: 'inherit' });
|
|
@ -22,12 +22,12 @@
|
||||||
"typecheck": "tsc --noEmit && tsc -p test --noEmit && tsc -p test-federation --noEmit",
|
"typecheck": "tsc --noEmit && tsc -p test --noEmit && tsc -p test-federation --noEmit",
|
||||||
"eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"",
|
"eslint": "eslint --quiet \"{src,test-federation}/**/*.ts\"",
|
||||||
"lint": "pnpm typecheck && pnpm eslint",
|
"lint": "pnpm typecheck && pnpm eslint",
|
||||||
"jest": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.unit.cjs",
|
"jest": "cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.unit.cjs",
|
||||||
"jest:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.e2e.cjs",
|
"jest:e2e": "cross-env NODE_ENV=test node ./jest.js --forceExit --config jest.config.e2e.cjs",
|
||||||
"jest:fed": "node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.fed.cjs",
|
"jest:fed": "node ./jest.js --forceExit --config jest.config.fed.cjs",
|
||||||
"jest-and-coverage": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.unit.cjs",
|
"jest-and-coverage": "cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.unit.cjs",
|
||||||
"jest-and-coverage:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.e2e.cjs",
|
"jest-and-coverage:e2e": "cross-env NODE_ENV=test node ./jest.js --coverage --forceExit --config jest.config.e2e.cjs",
|
||||||
"jest-clear": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --clearCache",
|
"jest-clear": "cross-env NODE_ENV=test node ./jest.js --clearCache",
|
||||||
"test": "pnpm jest",
|
"test": "pnpm jest",
|
||||||
"test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e",
|
"test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e",
|
||||||
"test:fed": "pnpm jest:fed",
|
"test:fed": "pnpm jest:fed",
|
||||||
|
|
|
@ -50,6 +50,10 @@ services:
|
||||||
source: ../jest.config.fed.cjs
|
source: ../jest.config.fed.cjs
|
||||||
target: /misskey/packages/backend/jest.config.fed.cjs
|
target: /misskey/packages/backend/jest.config.fed.cjs
|
||||||
read_only: true
|
read_only: true
|
||||||
|
- type: bind
|
||||||
|
source: ../jest.js
|
||||||
|
target: /misskey/packages/backend/jest.js
|
||||||
|
read_only: true
|
||||||
- type: bind
|
- type: bind
|
||||||
source: ../../misskey-js/built
|
source: ../../misskey-js/built
|
||||||
target: /misskey/packages/misskey-js/built
|
target: /misskey/packages/misskey-js/built
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"typescript": "5.8.3",
|
"typescript": "5.8.3",
|
||||||
"uuid": "11.1.0",
|
"uuid": "11.1.0",
|
||||||
"vite": "6.3.3",
|
"vite": "6.3.4",
|
||||||
"vue": "3.5.13"
|
"vue": "3.5.13"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
@ -74,7 +74,7 @@
|
||||||
"typescript": "5.8.3",
|
"typescript": "5.8.3",
|
||||||
"uuid": "11.1.0",
|
"uuid": "11.1.0",
|
||||||
"v-code-diff": "1.13.1",
|
"v-code-diff": "1.13.1",
|
||||||
"vite": "6.3.3",
|
"vite": "6.3.4",
|
||||||
"vue": "3.5.13",
|
"vue": "3.5.13",
|
||||||
"vuedraggable": "next",
|
"vuedraggable": "next",
|
||||||
"wanakana": "5.3.1"
|
"wanakana": "5.3.1"
|
||||||
|
|
|
@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<MkModal ref="modal" :zPriority="'middle'" @closed="$emit('closed')" @click="onBgClick">
|
<MkModal ref="modal" :zPriority="'middle'" :preferType="'dialog'" @closed="$emit('closed')" @click="onBgClick">
|
||||||
<div ref="rootEl" :class="$style.root">
|
<div ref="rootEl" :class="$style.root">
|
||||||
<div :class="$style.header">
|
<div :class="$style.header">
|
||||||
<span :class="$style.icon">
|
<span :class="$style.icon">
|
||||||
|
@ -16,13 +16,21 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<span :class="$style.title">{{ announcement.title }}</span>
|
<span :class="$style.title">{{ announcement.title }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div :class="$style.text"><Mfm :text="announcement.text"/></div>
|
<div :class="$style.text"><Mfm :text="announcement.text"/></div>
|
||||||
<MkButton primary full @click="ok">{{ i18n.ts.ok }}</MkButton>
|
<div ref="bottomEl"></div>
|
||||||
|
<div :class="$style.footer">
|
||||||
|
<MkButton
|
||||||
|
primary
|
||||||
|
full
|
||||||
|
:disabled="!hasReachedBottom"
|
||||||
|
@click="ok"
|
||||||
|
>{{ hasReachedBottom ? i18n.ts.close : i18n.ts.scrollToClose }}</MkButton>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</MkModal>
|
</MkModal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, useTemplateRef } from 'vue';
|
import { onMounted, ref, useTemplateRef } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
import { misskeyApi } from '@/utility/misskey-api.js';
|
import { misskeyApi } from '@/utility/misskey-api.js';
|
||||||
|
@ -32,12 +40,12 @@ import { i18n } from '@/i18n.js';
|
||||||
import { $i } from '@/i.js';
|
import { $i } from '@/i.js';
|
||||||
import { updateCurrentAccountPartial } from '@/accounts.js';
|
import { updateCurrentAccountPartial } from '@/accounts.js';
|
||||||
|
|
||||||
const props = withDefaults(defineProps<{
|
const props = defineProps<{
|
||||||
announcement: Misskey.entities.Announcement;
|
announcement: Misskey.entities.Announcement;
|
||||||
}>(), {
|
}>();
|
||||||
});
|
|
||||||
|
|
||||||
const rootEl = useTemplateRef('rootEl');
|
const rootEl = useTemplateRef('rootEl');
|
||||||
|
const bottomEl = useTemplateRef('bottomEl');
|
||||||
const modal = useTemplateRef('modal');
|
const modal = useTemplateRef('modal');
|
||||||
|
|
||||||
async function ok() {
|
async function ok() {
|
||||||
|
@ -72,7 +80,34 @@ function onBgClick() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const hasReachedBottom = ref(false);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
if (bottomEl.value && rootEl.value) {
|
||||||
|
const bottomElRect = bottomEl.value.getBoundingClientRect();
|
||||||
|
const rootElRect = rootEl.value.getBoundingClientRect();
|
||||||
|
if (
|
||||||
|
bottomElRect.top >= rootElRect.top &&
|
||||||
|
bottomElRect.top <= (rootElRect.bottom - 66) // 66 ≒ 75 * 0.9 (modalのアニメーション分)
|
||||||
|
) {
|
||||||
|
hasReachedBottom.value = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const observer = new IntersectionObserver(entries => {
|
||||||
|
for (const entry of entries) {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
hasReachedBottom.value = true;
|
||||||
|
observer.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
root: rootEl.value,
|
||||||
|
rootMargin: '0px 0px -75px 0px',
|
||||||
|
});
|
||||||
|
|
||||||
|
observer.observe(bottomEl.value);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -80,9 +115,12 @@ onMounted(() => {
|
||||||
.root {
|
.root {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 32px;
|
padding: 32px 32px 0;
|
||||||
min-width: 320px;
|
min-width: 320px;
|
||||||
max-width: 480px;
|
max-width: 480px;
|
||||||
|
max-height: 100%;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background: var(--MI_THEME-panel);
|
background: var(--MI_THEME-panel);
|
||||||
border-radius: var(--MI-radius);
|
border-radius: var(--MI-radius);
|
||||||
|
@ -103,4 +141,14 @@ onMounted(() => {
|
||||||
.text {
|
.text {
|
||||||
margin: 1em 0;
|
margin: 1em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
position: sticky;
|
||||||
|
bottom: 0;
|
||||||
|
left: -32px;
|
||||||
|
backdrop-filter: var(--MI-blur, blur(15px));
|
||||||
|
background: color(from var(--MI_THEME-bg) srgb r g b / 0.5);
|
||||||
|
margin: 0 -32px;
|
||||||
|
padding: 24px 32px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
ref="modal"
|
ref="modal"
|
||||||
v-slot="{ type, maxHeight }"
|
v-slot="{ type, maxHeight }"
|
||||||
:zPriority="'middle'"
|
:zPriority="'middle'"
|
||||||
:preferType="prefer.s.emojiPickerStyle"
|
:preferType="asReactionPicker ? prefer.s.reactionPickerStyle : prefer.s.emojiPickerStyle === 'window' ? 'auto' : prefer.s.emojiPickerStyle"
|
||||||
:hasInteractionWithOtherFocusTrappedEls="true"
|
:hasInteractionWithOtherFocusTrappedEls="true"
|
||||||
:transparentBg="true"
|
:transparentBg="true"
|
||||||
:manualShowing="manualShowing"
|
:manualShowing="manualShowing"
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import MkEmojiPickerWindow from './MkEmojiPickerWindow.vue';
|
||||||
|
void MkEmojiPickerWindow;
|
|
@ -0,0 +1,68 @@
|
||||||
|
<!--
|
||||||
|
SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
-->
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<MkWindow
|
||||||
|
ref="window"
|
||||||
|
:initialWidth="300"
|
||||||
|
:initialHeight="290"
|
||||||
|
:canResize="true"
|
||||||
|
:mini="true"
|
||||||
|
:front="true"
|
||||||
|
@closed="emit('closed')"
|
||||||
|
>
|
||||||
|
<MkEmojiPicker
|
||||||
|
:showPinned="showPinned"
|
||||||
|
:asReactionPicker="asReactionPicker"
|
||||||
|
:targetNote="targetNote"
|
||||||
|
asWindow
|
||||||
|
:class="$style.picker"
|
||||||
|
@chosen="chosen"
|
||||||
|
/>
|
||||||
|
</MkWindow>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { onBeforeUnmount, onMounted, useTemplateRef } from 'vue';
|
||||||
|
import * as Misskey from 'misskey-js';
|
||||||
|
import { globalEvents } from '@/events.js';
|
||||||
|
import MkWindow from '@/components/MkWindow.vue';
|
||||||
|
import MkEmojiPicker from '@/components/MkEmojiPicker.vue';
|
||||||
|
|
||||||
|
withDefaults(defineProps<{
|
||||||
|
src?: HTMLElement;
|
||||||
|
showPinned?: boolean;
|
||||||
|
pinnedEmojis?: string[];
|
||||||
|
asReactionPicker?: boolean;
|
||||||
|
targetNote?: Misskey.entities.Note;
|
||||||
|
}>(), {
|
||||||
|
showPinned: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
(ev: 'chosen', v: string): void;
|
||||||
|
(ev: 'closed'): void;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
function chosen(emoji: string) {
|
||||||
|
emit('chosen', emoji);
|
||||||
|
}
|
||||||
|
|
||||||
|
const windowEl = useTemplateRef('window');
|
||||||
|
|
||||||
|
function close() {
|
||||||
|
windowEl.value?.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
close,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" module>
|
||||||
|
.picker {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -99,13 +99,13 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { inject, watch, nextTick, onMounted, defineAsyncComponent, provide, shallowRef, ref, computed, useTemplateRef } from 'vue';
|
import { inject, watch, nextTick, onMounted, onBeforeUnmount, defineAsyncComponent, provide, shallowRef, ref, computed, useTemplateRef } from 'vue';
|
||||||
|
import type { ShallowRef } from 'vue';
|
||||||
import * as mfm from 'mfm-js';
|
import * as mfm from 'mfm-js';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import insertTextAtCursor from 'insert-text-at-cursor';
|
import insertTextAtCursor from 'insert-text-at-cursor';
|
||||||
import { toASCII } from 'punycode.js';
|
import { toASCII } from 'punycode.js';
|
||||||
import { host, url } from '@@/js/config.js';
|
import { host, url } from '@@/js/config.js';
|
||||||
import type { ShallowRef } from 'vue';
|
|
||||||
import type { PostFormProps } from '@/types/post-form.js';
|
import type { PostFormProps } from '@/types/post-form.js';
|
||||||
import type { MenuItem } from '@/types/menu.js';
|
import type { MenuItem } from '@/types/menu.js';
|
||||||
import type { PollEditorModelValue } from '@/components/MkPollEditor.vue';
|
import type { PollEditorModelValue } from '@/components/MkPollEditor.vue';
|
||||||
|
@ -137,6 +137,7 @@ import { mfmFunctionPicker } from '@/utility/mfm-function-picker.js';
|
||||||
import { prefer } from '@/preferences.js';
|
import { prefer } from '@/preferences.js';
|
||||||
import { getPluginHandlers } from '@/plugin.js';
|
import { getPluginHandlers } from '@/plugin.js';
|
||||||
import { DI } from '@/di.js';
|
import { DI } from '@/di.js';
|
||||||
|
import { globalEvents } from '@/events.js';
|
||||||
|
|
||||||
const $i = ensureSignin();
|
const $i = ensureSignin();
|
||||||
|
|
||||||
|
@ -974,20 +975,20 @@ async function insertEmoji(ev: MouseEvent) {
|
||||||
|
|
||||||
let pos = textareaEl.value?.selectionStart ?? 0;
|
let pos = textareaEl.value?.selectionStart ?? 0;
|
||||||
let posEnd = textareaEl.value?.selectionEnd ?? text.value.length;
|
let posEnd = textareaEl.value?.selectionEnd ?? text.value.length;
|
||||||
emojiPicker.show(
|
emojiPicker.show({
|
||||||
target as HTMLElement,
|
src: target as HTMLElement,
|
||||||
emoji => {
|
onChosen: emoji => {
|
||||||
const textBefore = text.value.substring(0, pos);
|
const textBefore = text.value.substring(0, pos);
|
||||||
const textAfter = text.value.substring(posEnd);
|
const textAfter = text.value.substring(posEnd);
|
||||||
text.value = textBefore + emoji + textAfter;
|
text.value = textBefore + emoji + textAfter;
|
||||||
pos += emoji.length;
|
pos += emoji.length;
|
||||||
posEnd += emoji.length;
|
posEnd += emoji.length;
|
||||||
},
|
},
|
||||||
() => {
|
onClosed: () => {
|
||||||
textAreaReadOnly.value = false;
|
textAreaReadOnly.value = false;
|
||||||
nextTick(() => focus());
|
nextTick(() => focus());
|
||||||
},
|
},
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function insertMfmFunction(ev: MouseEvent) {
|
async function insertMfmFunction(ev: MouseEvent) {
|
||||||
|
@ -1102,6 +1103,10 @@ onMounted(() => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
emojiPicker.closeWindow();
|
||||||
|
});
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
clear,
|
clear,
|
||||||
});
|
});
|
||||||
|
|
|
@ -8,6 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
ref="modal"
|
ref="modal"
|
||||||
:preferType="'dialog'"
|
:preferType="'dialog'"
|
||||||
@click="modal?.close()"
|
@click="modal?.close()"
|
||||||
|
@close="onModalClose()"
|
||||||
@closed="onModalClosed()"
|
@closed="onModalClosed()"
|
||||||
@esc="modal?.close()"
|
@esc="modal?.close()"
|
||||||
>
|
>
|
||||||
|
@ -26,9 +27,10 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useTemplateRef } from 'vue';
|
import { useTemplateRef } from 'vue';
|
||||||
import type { PostFormProps } from '@/types/post-form.js';
|
|
||||||
import MkModal from '@/components/MkModal.vue';
|
import MkModal from '@/components/MkModal.vue';
|
||||||
import MkPostForm from '@/components/MkPostForm.vue';
|
import MkPostForm from '@/components/MkPostForm.vue';
|
||||||
|
import { emojiPicker } from '@/utility/emoji-picker.js';
|
||||||
|
import type { PostFormProps } from '@/types/post-form.js';
|
||||||
|
|
||||||
const props = withDefaults(defineProps<PostFormProps & {
|
const props = withDefaults(defineProps<PostFormProps & {
|
||||||
instant?: boolean;
|
instant?: boolean;
|
||||||
|
@ -50,6 +52,10 @@ function onPosted() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onModalClose() {
|
||||||
|
emojiPicker.closeWindow();
|
||||||
|
}
|
||||||
|
|
||||||
function onModalClosed() {
|
function onModalClosed() {
|
||||||
emit('closed');
|
emit('closed');
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,8 +76,8 @@ function unlockDownScroll() {
|
||||||
scrollEl.style.overscrollBehavior = 'contain';
|
scrollEl.style.overscrollBehavior = 'contain';
|
||||||
}
|
}
|
||||||
|
|
||||||
function moveStart(event: PointerEvent) {
|
function moveStartByMouse(event: MouseEvent) {
|
||||||
if (event.pointerType === 'mouse' && event.button !== 1) return;
|
if (event.button !== 1) return;
|
||||||
if (isRefreshing.value) return;
|
if (isRefreshing.value) return;
|
||||||
|
|
||||||
const scrollPos = scrollEl!.scrollTop;
|
const scrollPos = scrollEl!.scrollTop;
|
||||||
|
@ -88,27 +88,39 @@ function moveStart(event: PointerEvent) {
|
||||||
|
|
||||||
lockDownScroll();
|
lockDownScroll();
|
||||||
|
|
||||||
// マウスでのpull時、画面上のテキスト選択が発生したり、ブラウザの中クリックによる挙動が競合したりして画面がスクロールされたりするのを防ぐ
|
event.preventDefault(); // 中クリックによるスクロール、テキスト選択などを防ぐ
|
||||||
window.document.body.setAttribute('inert', 'true');
|
|
||||||
|
|
||||||
isPulling.value = true;
|
isPulling.value = true;
|
||||||
startScreenY = getScreenY(event);
|
startScreenY = getScreenY(event);
|
||||||
pullDistance.value = 0;
|
pullDistance.value = 0;
|
||||||
|
|
||||||
// タッチデバイスでPointerEventを使うとなんか挙動がおかしいので、TouchEventとMouseEventを使い分ける
|
window.addEventListener('mousemove', moving, { passive: true });
|
||||||
if (event.pointerType === 'mouse') {
|
window.addEventListener('mouseup', () => {
|
||||||
window.addEventListener('mousemove', moving, { passive: true });
|
window.removeEventListener('mousemove', moving);
|
||||||
window.addEventListener('mouseup', () => {
|
onPullRelease();
|
||||||
window.removeEventListener('mousemove', moving);
|
}, { passive: true, once: true });
|
||||||
onPullRelease();
|
}
|
||||||
}, { passive: true, once: true });
|
|
||||||
} else {
|
function moveStartByTouch(event: TouchEvent) {
|
||||||
window.addEventListener('touchmove', moving, { passive: true });
|
if (isRefreshing.value) return;
|
||||||
window.addEventListener('touchend', () => {
|
|
||||||
window.removeEventListener('touchmove', moving);
|
const scrollPos = scrollEl!.scrollTop;
|
||||||
onPullRelease();
|
if (scrollPos !== 0) {
|
||||||
}, { passive: true, once: true });
|
unlockDownScroll();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lockDownScroll();
|
||||||
|
|
||||||
|
isPulling.value = true;
|
||||||
|
startScreenY = getScreenY(event);
|
||||||
|
pullDistance.value = 0;
|
||||||
|
|
||||||
|
window.addEventListener('touchmove', moving, { passive: true });
|
||||||
|
window.addEventListener('touchend', () => {
|
||||||
|
window.removeEventListener('touchmove', moving);
|
||||||
|
onPullRelease();
|
||||||
|
}, { passive: true, once: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
function moveBySystem(to: number): Promise<void> {
|
function moveBySystem(to: number): Promise<void> {
|
||||||
|
@ -148,7 +160,6 @@ async function closeContent() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function onPullRelease() {
|
function onPullRelease() {
|
||||||
window.document.body.removeAttribute('inert');
|
|
||||||
startScreenY = null;
|
startScreenY = null;
|
||||||
if (isPulledEnough.value) {
|
if (isPulledEnough.value) {
|
||||||
isPulledEnough.value = false;
|
isPulledEnough.value = false;
|
||||||
|
@ -208,13 +219,15 @@ onMounted(() => {
|
||||||
if (rootEl.value == null) return;
|
if (rootEl.value == null) return;
|
||||||
scrollEl = getScrollContainer(rootEl.value);
|
scrollEl = getScrollContainer(rootEl.value);
|
||||||
lockDownScroll();
|
lockDownScroll();
|
||||||
rootEl.value.addEventListener('pointerdown', moveStart, { passive: true });
|
rootEl.value.addEventListener('mousedown', moveStartByMouse, { passive: false }); // preventDefaultするため
|
||||||
|
rootEl.value.addEventListener('touchstart', moveStartByTouch, { passive: true });
|
||||||
rootEl.value.addEventListener('touchend', toggleScrollLockOnTouchEnd, { passive: true });
|
rootEl.value.addEventListener('touchend', toggleScrollLockOnTouchEnd, { passive: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
unlockDownScroll();
|
unlockDownScroll();
|
||||||
if (rootEl.value) rootEl.value.removeEventListener('pointerdown', moveStart);
|
if (rootEl.value) rootEl.value.removeEventListener('mousedown', moveStartByMouse);
|
||||||
|
if (rootEl.value) rootEl.value.removeEventListener('touchstart', moveStartByTouch);
|
||||||
if (rootEl.value) rootEl.value.removeEventListener('touchend', toggleScrollLockOnTouchEnd);
|
if (rootEl.value) rootEl.value.removeEventListener('touchend', toggleScrollLockOnTouchEnd);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
|
|
||||||
// TODO: なんでもかんでもos.tsに突っ込むのやめたいのでよしなに分割する
|
// TODO: なんでもかんでもos.tsに突っ込むのやめたいのでよしなに分割する
|
||||||
|
|
||||||
import { markRaw, ref, defineAsyncComponent, nextTick } from 'vue';
|
import { markRaw, ref, shallowRef, defineAsyncComponent, nextTick } from 'vue';
|
||||||
import { EventEmitter } from 'eventemitter3';
|
import { EventEmitter } from 'eventemitter3';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import type { Component, Ref } from 'vue';
|
import type { Component, Ref, ShallowRef } from 'vue';
|
||||||
import type { ComponentProps as CP } from 'vue-component-type-helpers';
|
import type { ComponentProps as CP } from 'vue-component-type-helpers';
|
||||||
import type { Form, GetFormResultType } from '@/utility/form.js';
|
import type { Form, GetFormResultType } from '@/utility/form.js';
|
||||||
import type { MenuItem } from '@/types/menu.js';
|
import type { MenuItem } from '@/types/menu.js';
|
||||||
|
@ -141,6 +141,7 @@ let popupIdCount = 0;
|
||||||
export const popups = ref<{
|
export const popups = ref<{
|
||||||
id: number;
|
id: number;
|
||||||
component: Component;
|
component: Component;
|
||||||
|
componentRef: ShallowRef<Component | null>;
|
||||||
props: Record<string, any>;
|
props: Record<string, any>;
|
||||||
events: Record<string, any>;
|
events: Record<string, any>;
|
||||||
}[]>([]);
|
}[]>([]);
|
||||||
|
@ -178,13 +179,21 @@ type EmitsExtractor<T> = {
|
||||||
[K in keyof T as K extends `onVnode${string}` ? never : K extends `on${infer E}` ? Uncapitalize<E> : K extends string ? never : K]: T[K];
|
[K in keyof T as K extends `onVnode${string}` ? never : K extends `on${infer E}` ? Uncapitalize<E> : K extends string ? never : K]: T[K];
|
||||||
};
|
};
|
||||||
|
|
||||||
export function popup<T extends Component>(
|
export function popup<
|
||||||
|
T extends Component,
|
||||||
|
TI extends T extends new (...args: unknown[]) => infer I ? I : T,
|
||||||
|
>(
|
||||||
component: T,
|
component: T,
|
||||||
props: ComponentProps<T>,
|
props: ComponentProps<T>,
|
||||||
events: Partial<ComponentEmit<T>> = {},
|
events: Partial<ComponentEmit<T>> = {},
|
||||||
): { dispose: () => void } {
|
): {
|
||||||
|
dispose: () => void;
|
||||||
|
componentRef: ShallowRef<TI | null>;
|
||||||
|
} {
|
||||||
markRaw(component);
|
markRaw(component);
|
||||||
|
|
||||||
|
const componentRef = shallowRef<TI | null>(null);
|
||||||
|
|
||||||
const id = ++popupIdCount;
|
const id = ++popupIdCount;
|
||||||
const dispose = () => {
|
const dispose = () => {
|
||||||
// このsetTimeoutが無いと挙動がおかしくなる(autocompleteが閉じなくなる)。Vueのバグ?
|
// このsetTimeoutが無いと挙動がおかしくなる(autocompleteが閉じなくなる)。Vueのバグ?
|
||||||
|
@ -194,6 +203,7 @@ export function popup<T extends Component>(
|
||||||
};
|
};
|
||||||
const state = {
|
const state = {
|
||||||
component,
|
component,
|
||||||
|
componentRef,
|
||||||
props,
|
props,
|
||||||
events,
|
events,
|
||||||
id,
|
id,
|
||||||
|
@ -203,6 +213,7 @@ export function popup<T extends Component>(
|
||||||
|
|
||||||
return {
|
return {
|
||||||
dispose,
|
dispose,
|
||||||
|
componentRef,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<MkTl :events="timeline">
|
<MkTl :events="timeline">
|
||||||
<template #left="{ event }">
|
<template #left="{ event }">
|
||||||
<div>
|
<div>
|
||||||
<MkAvatar :user="event.user" style="width: 24px; height: 24px;"/>
|
<MkAvatar :user="event.user" style="width: 26px; height: 26px;"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #right="{ event, timestamp, delta }">
|
<template #right="{ event, timestamp, delta }">
|
||||||
|
|
|
@ -100,8 +100,19 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<SearchMarker :keywords="['emoji', 'picker', 'style']">
|
<SearchMarker :keywords="['emoji', 'picker', 'style']">
|
||||||
<MkPreferenceContainer k="emojiPickerStyle">
|
<MkPreferenceContainer k="emojiPickerStyle">
|
||||||
<MkSelect v-model="emojiPickerStyle">
|
<MkSelect v-model="emojiPickerStyle">
|
||||||
<template #label><SearchLabel>{{ i18n.ts.style }}</SearchLabel></template>
|
<template #label><SearchLabel>{{ i18n.ts.style }} ({{ i18n.ts.emojiPicker }})</SearchLabel></template>
|
||||||
<template #caption>{{ i18n.ts.needReloadToApply }}</template>
|
<option value="auto">{{ i18n.ts.auto }}</option>
|
||||||
|
<option value="popup">{{ i18n.ts.popup }}</option>
|
||||||
|
<option value="drawer">{{ i18n.ts.drawer }}</option>
|
||||||
|
<option value="window">{{ i18n.ts.window }}</option>
|
||||||
|
</MkSelect>
|
||||||
|
</MkPreferenceContainer>
|
||||||
|
</SearchMarker>
|
||||||
|
|
||||||
|
<SearchMarker :keywords="['reaction', 'emoji', 'picker', 'style']">
|
||||||
|
<MkPreferenceContainer k="emojiPickerStyle">
|
||||||
|
<MkSelect v-model="emojiPickerStyle">
|
||||||
|
<template #label><SearchLabel>{{ i18n.ts.style }} ({{ i18n.ts.reactionPicker }})</SearchLabel></template>
|
||||||
<option value="auto">{{ i18n.ts.auto }}</option>
|
<option value="auto">{{ i18n.ts.auto }}</option>
|
||||||
<option value="popup">{{ i18n.ts.popup }}</option>
|
<option value="popup">{{ i18n.ts.popup }}</option>
|
||||||
<option value="drawer">{{ i18n.ts.drawer }}</option>
|
<option value="drawer">{{ i18n.ts.drawer }}</option>
|
||||||
|
@ -133,13 +144,14 @@ import { prefer } from '@/preferences.js';
|
||||||
import MkPreferenceContainer from '@/components/MkPreferenceContainer.vue';
|
import MkPreferenceContainer from '@/components/MkPreferenceContainer.vue';
|
||||||
import MkSwitch from '@/components/MkSwitch.vue';
|
import MkSwitch from '@/components/MkSwitch.vue';
|
||||||
import { emojiPicker } from '@/utility/emoji-picker.js';
|
import { emojiPicker } from '@/utility/emoji-picker.js';
|
||||||
|
import { reloadAsk } from '@/utility/reload-ask.js';
|
||||||
const emojiPaletteForReaction = prefer.model('emojiPaletteForReaction');
|
const emojiPaletteForReaction = prefer.model('emojiPaletteForReaction');
|
||||||
const emojiPaletteForMain = prefer.model('emojiPaletteForMain');
|
const emojiPaletteForMain = prefer.model('emojiPaletteForMain');
|
||||||
const emojiPickerScale = prefer.model('emojiPickerScale');
|
const emojiPickerScale = prefer.model('emojiPickerScale');
|
||||||
const emojiPickerWidth = prefer.model('emojiPickerWidth');
|
const emojiPickerWidth = prefer.model('emojiPickerWidth');
|
||||||
const emojiPickerHeight = prefer.model('emojiPickerHeight');
|
const emojiPickerHeight = prefer.model('emojiPickerHeight');
|
||||||
const emojiPickerStyle = prefer.model('emojiPickerStyle');
|
const emojiPickerStyle = prefer.model('emojiPickerStyle');
|
||||||
|
const reactionPickerStyle = prefer.model('reactionPickerStyle');
|
||||||
|
|
||||||
const palettesSyncEnabled = ref(prefer.isSyncEnabled('emojiPalettes'));
|
const palettesSyncEnabled = ref(prefer.isSyncEnabled('emojiPalettes'));
|
||||||
|
|
||||||
|
@ -214,6 +226,13 @@ function previewPicker(ev: MouseEvent) {
|
||||||
emojiPicker.show(getHTMLElement(ev));
|
emojiPicker.show(getHTMLElement(ev));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
watch([
|
||||||
|
emojiPickerStyle,
|
||||||
|
reactionPickerStyle,
|
||||||
|
], async () => {
|
||||||
|
await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true });
|
||||||
|
});
|
||||||
|
|
||||||
definePage(() => ({
|
definePage(() => ({
|
||||||
title: i18n.ts.emojiPalette,
|
title: i18n.ts.emojiPalette,
|
||||||
icon: 'ti ti-mood-happy',
|
icon: 'ti ti-mood-happy',
|
||||||
|
|
|
@ -230,6 +230,9 @@ export const PREF_DEF = {
|
||||||
default: 3,
|
default: 3,
|
||||||
},
|
},
|
||||||
emojiPickerStyle: {
|
emojiPickerStyle: {
|
||||||
|
default: 'auto' as 'auto' | 'popup' | 'drawer' | 'window',
|
||||||
|
},
|
||||||
|
reactionPickerStyle: {
|
||||||
default: 'auto' as 'auto' | 'popup' | 'drawer',
|
default: 'auto' as 'auto' | 'popup' | 'drawer',
|
||||||
},
|
},
|
||||||
squareAvatars: {
|
squareAvatars: {
|
||||||
|
|
|
@ -312,7 +312,7 @@ export const store = markRaw(new Pizzax('base', {
|
||||||
},
|
},
|
||||||
emojiPickerStyle: {
|
emojiPickerStyle: {
|
||||||
where: 'device',
|
where: 'device',
|
||||||
default: 'auto' as 'auto' | 'popup' | 'drawer',
|
default: 'auto' as 'auto' | 'popup' | 'drawer' | 'window',
|
||||||
},
|
},
|
||||||
reportError: {
|
reportError: {
|
||||||
where: 'device',
|
where: 'device',
|
||||||
|
|
|
@ -61,6 +61,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
:is="popup.component"
|
:is="popup.component"
|
||||||
v-for="popup in popups"
|
v-for="popup in popups"
|
||||||
:key="popup.id"
|
:key="popup.id"
|
||||||
|
:ref="(el: Component | null) => popup.componentRef = el"
|
||||||
v-bind="popup.props"
|
v-bind="popup.props"
|
||||||
v-on="popup.events"
|
v-on="popup.events"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -3,8 +3,9 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { defineAsyncComponent, ref, watch } from 'vue';
|
import { defineAsyncComponent, ref, shallowRef, watch } from 'vue';
|
||||||
import type { Ref } from 'vue';
|
import type { Ref, ShallowRef } from 'vue';
|
||||||
|
import type MkEmojiPickerWindow_TypeOnly from '@/components/MkEmojiPickerWindow.vue';
|
||||||
import { popup } from '@/os.js';
|
import { popup } from '@/os.js';
|
||||||
import { prefer } from '@/preferences.js';
|
import { prefer } from '@/preferences.js';
|
||||||
|
|
||||||
|
@ -16,7 +17,15 @@ import { prefer } from '@/preferences.js';
|
||||||
*/
|
*/
|
||||||
class EmojiPicker {
|
class EmojiPicker {
|
||||||
private src: Ref<HTMLElement | null> = ref(null);
|
private src: Ref<HTMLElement | null> = ref(null);
|
||||||
private manualShowing = ref(false);
|
|
||||||
|
private isWindow: boolean = false;
|
||||||
|
private windowComponentEl: ShallowRef<InstanceType<typeof MkEmojiPickerWindow_TypeOnly> | null> = shallowRef(null);
|
||||||
|
private windowShowing: boolean = false;
|
||||||
|
|
||||||
|
private dialogShowing = ref(false);
|
||||||
|
|
||||||
|
private emojisRef = ref<string[]>([]);
|
||||||
|
|
||||||
private onChosen?: (emoji: string) => void;
|
private onChosen?: (emoji: string) => void;
|
||||||
private onClosed?: () => void;
|
private onClosed?: () => void;
|
||||||
|
|
||||||
|
@ -25,43 +34,74 @@ class EmojiPicker {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async init() {
|
public async init() {
|
||||||
const emojisRef = ref<string[]>([]);
|
|
||||||
|
|
||||||
watch([prefer.r.emojiPaletteForMain, prefer.r.emojiPalettes], () => {
|
watch([prefer.r.emojiPaletteForMain, prefer.r.emojiPalettes], () => {
|
||||||
emojisRef.value = prefer.s.emojiPaletteForMain == null ? prefer.s.emojiPalettes[0].emojis : prefer.s.emojiPalettes.find(palette => palette.id === prefer.s.emojiPaletteForMain)?.emojis ?? [];
|
this.emojisRef.value = prefer.s.emojiPaletteForMain == null ? prefer.s.emojiPalettes[0].emojis : prefer.s.emojiPalettes.find(palette => palette.id === prefer.s.emojiPaletteForMain)?.emojis ?? [];
|
||||||
}, {
|
}, {
|
||||||
immediate: true,
|
immediate: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
await popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), {
|
if (prefer.s.emojiPickerStyle === 'window') {
|
||||||
src: this.src,
|
// init後にemojiPickerStyleが変わった場合、drawer/popup用の初期化をスキップするため、
|
||||||
pinnedEmojis: emojisRef,
|
// 正常に絵文字ピッカーが表示されない。
|
||||||
asReactionPicker: false,
|
// なので一度initされたらwindow表示で固定する(設定を変更したら要リロード)
|
||||||
manualShowing: this.manualShowing,
|
this.isWindow = true;
|
||||||
choseAndClose: false,
|
} else {
|
||||||
}, {
|
await popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), {
|
||||||
done: emoji => {
|
src: this.src,
|
||||||
if (this.onChosen) this.onChosen(emoji);
|
pinnedEmojis: this.emojisRef,
|
||||||
},
|
asReactionPicker: false,
|
||||||
close: () => {
|
manualShowing: this.dialogShowing,
|
||||||
this.manualShowing.value = false;
|
choseAndClose: false,
|
||||||
},
|
}, {
|
||||||
closed: () => {
|
done: emoji => {
|
||||||
this.src.value = null;
|
if (this.onChosen) this.onChosen(emoji);
|
||||||
if (this.onClosed) this.onClosed();
|
},
|
||||||
},
|
close: () => {
|
||||||
});
|
this.dialogShowing.value = false;
|
||||||
|
},
|
||||||
|
closed: () => {
|
||||||
|
this.src.value = null;
|
||||||
|
if (this.onClosed) this.onClosed();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public show(
|
public show(opts: {
|
||||||
src: HTMLElement,
|
src: HTMLElement,
|
||||||
onChosen?: EmojiPicker['onChosen'],
|
onChosen?: EmojiPicker['onChosen'],
|
||||||
onClosed?: EmojiPicker['onClosed'],
|
onClosed?: EmojiPicker['onClosed'],
|
||||||
) {
|
}) {
|
||||||
this.src.value = src;
|
if (this.isWindow) {
|
||||||
this.manualShowing.value = true;
|
if (this.windowShowing) return;
|
||||||
this.onChosen = onChosen;
|
this.windowShowing = true;
|
||||||
this.onClosed = onClosed;
|
const { dispose, componentRef } = popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerWindow.vue')), {
|
||||||
|
src: opts.src,
|
||||||
|
pinnedEmojis: this.emojisRef,
|
||||||
|
asReactionPicker: false,
|
||||||
|
}, {
|
||||||
|
chosen: (emoji) => {
|
||||||
|
if (opts.onChosen) opts.onChosen(emoji);
|
||||||
|
},
|
||||||
|
closed: () => {
|
||||||
|
if (opts.onClosed) opts.onClosed();
|
||||||
|
this.windowShowing = false;
|
||||||
|
dispose();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
this.windowComponentEl.value = componentRef.value;
|
||||||
|
} else {
|
||||||
|
this.src.value = opts.src;
|
||||||
|
this.dialogShowing.value = true;
|
||||||
|
this.onChosen = opts.onChosen;
|
||||||
|
this.onClosed = opts.onClosed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public closeWindow() {
|
||||||
|
if (this.isWindow && this.windowComponentEl.value) {
|
||||||
|
this.windowComponentEl.value.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"name": "misskey-js",
|
"name": "misskey-js",
|
||||||
"version": "2025.5.0-alpha.0",
|
"version": "2025.5.0-alpha.1",
|
||||||
"description": "Misskey SDK for JavaScript",
|
"description": "Misskey SDK for JavaScript",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
|
|
|
@ -736,7 +736,7 @@ importers:
|
||||||
version: 15.1.1
|
version: 15.1.1
|
||||||
'@vitejs/plugin-vue':
|
'@vitejs/plugin-vue':
|
||||||
specifier: 5.2.3
|
specifier: 5.2.3
|
||||||
version: 5.2.3(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))
|
version: 5.2.3(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))
|
||||||
'@vue/compiler-sfc':
|
'@vue/compiler-sfc':
|
||||||
specifier: 3.5.13
|
specifier: 3.5.13
|
||||||
version: 3.5.13
|
version: 3.5.13
|
||||||
|
@ -873,8 +873,8 @@ importers:
|
||||||
specifier: 1.13.1
|
specifier: 1.13.1
|
||||||
version: 1.13.1(vue@3.5.13(typescript@5.8.3))
|
version: 1.13.1(vue@3.5.13(typescript@5.8.3))
|
||||||
vite:
|
vite:
|
||||||
specifier: 6.3.3
|
specifier: 6.3.4
|
||||||
version: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
version: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
vue:
|
vue:
|
||||||
specifier: 3.5.13
|
specifier: 3.5.13
|
||||||
version: 3.5.13(typescript@5.8.3)
|
version: 3.5.13(typescript@5.8.3)
|
||||||
|
@ -926,7 +926,7 @@ importers:
|
||||||
version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(typescript@5.8.3)
|
version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(typescript@5.8.3)
|
||||||
'@storybook/react-vite':
|
'@storybook/react-vite':
|
||||||
specifier: 8.6.12
|
specifier: 8.6.12
|
||||||
version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.40.0)(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(typescript@5.8.3)(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.40.0)(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(typescript@5.8.3)(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
||||||
'@storybook/test':
|
'@storybook/test':
|
||||||
specifier: 8.6.12
|
specifier: 8.6.12
|
||||||
version: 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))
|
version: 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))
|
||||||
|
@ -941,7 +941,7 @@ importers:
|
||||||
version: 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vue@3.5.13(typescript@5.8.3))
|
version: 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vue@3.5.13(typescript@5.8.3))
|
||||||
'@storybook/vue3-vite':
|
'@storybook/vue3-vite':
|
||||||
specifier: 8.6.12
|
specifier: 8.6.12
|
||||||
version: 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))
|
version: 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))
|
||||||
'@testing-library/vue':
|
'@testing-library/vue':
|
||||||
specifier: 8.1.0
|
specifier: 8.1.0
|
||||||
version: 8.1.0(@vue/compiler-sfc@3.5.13)(@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.3)))(vue@3.5.13(typescript@5.8.3))
|
version: 8.1.0(@vue/compiler-sfc@3.5.13)(@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.3)))(vue@3.5.13(typescript@5.8.3))
|
||||||
|
@ -1094,7 +1094,7 @@ importers:
|
||||||
version: 15.1.1
|
version: 15.1.1
|
||||||
'@vitejs/plugin-vue':
|
'@vitejs/plugin-vue':
|
||||||
specifier: 5.2.3
|
specifier: 5.2.3
|
||||||
version: 5.2.3(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))
|
version: 5.2.3(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))
|
||||||
'@vue/compiler-sfc':
|
'@vue/compiler-sfc':
|
||||||
specifier: 3.5.13
|
specifier: 3.5.13
|
||||||
version: 3.5.13
|
version: 3.5.13
|
||||||
|
@ -1147,8 +1147,8 @@ importers:
|
||||||
specifier: 11.1.0
|
specifier: 11.1.0
|
||||||
version: 11.1.0
|
version: 11.1.0
|
||||||
vite:
|
vite:
|
||||||
specifier: 6.3.3
|
specifier: 6.3.4
|
||||||
version: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
version: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
vue:
|
vue:
|
||||||
specifier: 3.5.13
|
specifier: 3.5.13
|
||||||
version: 3.5.13(typescript@5.8.3)
|
version: 3.5.13(typescript@5.8.3)
|
||||||
|
@ -4114,6 +4114,7 @@ packages:
|
||||||
'@swc/core@1.11.22':
|
'@swc/core@1.11.22':
|
||||||
resolution: {integrity: sha512-mjPYbqq8XjwqSE0hEPT9CzaJDyxql97LgK4iyvYlwVSQhdN1uK0DBG4eP9PxYzCS2MUGAXB34WFLegdUj5HGpg==}
|
resolution: {integrity: sha512-mjPYbqq8XjwqSE0hEPT9CzaJDyxql97LgK4iyvYlwVSQhdN1uK0DBG4eP9PxYzCS2MUGAXB34WFLegdUj5HGpg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
deprecated: It has a bug. See https://github.com/swc-project/swc/issues/10413
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@swc/helpers': '>=0.5.17'
|
'@swc/helpers': '>=0.5.17'
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
|
@ -10624,8 +10625,8 @@ packages:
|
||||||
vite-plugin-turbosnap@1.0.3:
|
vite-plugin-turbosnap@1.0.3:
|
||||||
resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==}
|
resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==}
|
||||||
|
|
||||||
vite@6.3.3:
|
vite@6.3.4:
|
||||||
resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==}
|
resolution: {integrity: sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==}
|
||||||
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
|
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
|
@ -12619,12 +12620,12 @@ snapshots:
|
||||||
'@types/yargs': 17.0.19
|
'@types/yargs': 17.0.19
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
|
|
||||||
'@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
'@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
glob: 10.4.5
|
glob: 10.4.5
|
||||||
magic-string: 0.27.0
|
magic-string: 0.27.0
|
||||||
react-docgen-typescript: 2.2.2(typescript@5.8.3)
|
react-docgen-typescript: 2.2.2(typescript@5.8.3)
|
||||||
vite: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.8.3
|
typescript: 5.8.3
|
||||||
|
|
||||||
|
@ -14151,13 +14152,13 @@ snapshots:
|
||||||
react: 19.1.0
|
react: 19.1.0
|
||||||
react-dom: 19.1.0(react@19.1.0)
|
react-dom: 19.1.0(react@19.1.0)
|
||||||
|
|
||||||
'@storybook/builder-vite@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
'@storybook/builder-vite@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@storybook/csf-plugin': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))
|
'@storybook/csf-plugin': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))
|
||||||
browser-assert: 1.2.1
|
browser-assert: 1.2.1
|
||||||
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
||||||
ts-dedent: 2.2.0
|
ts-dedent: 2.2.0
|
||||||
vite: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
|
|
||||||
'@storybook/components@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))':
|
'@storybook/components@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -14220,11 +14221,11 @@ snapshots:
|
||||||
react-dom: 19.1.0(react@19.1.0)
|
react-dom: 19.1.0(react@19.1.0)
|
||||||
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
||||||
|
|
||||||
'@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.40.0)(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(typescript@5.8.3)(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
'@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.40.0)(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(typescript@5.8.3)(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
'@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
||||||
'@rollup/pluginutils': 5.1.4(rollup@4.40.0)
|
'@rollup/pluginutils': 5.1.4(rollup@4.40.0)
|
||||||
'@storybook/builder-vite': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
'@storybook/builder-vite': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
||||||
'@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(typescript@5.8.3)
|
'@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(typescript@5.8.3)
|
||||||
find-up: 5.0.0
|
find-up: 5.0.0
|
||||||
magic-string: 0.30.17
|
magic-string: 0.30.17
|
||||||
|
@ -14234,7 +14235,7 @@ snapshots:
|
||||||
resolve: 1.22.8
|
resolve: 1.22.8
|
||||||
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
||||||
tsconfig-paths: 4.2.0
|
tsconfig-paths: 4.2.0
|
||||||
vite: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@storybook/test': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))
|
'@storybook/test': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -14283,15 +14284,15 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
||||||
|
|
||||||
'@storybook/vue3-vite@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))':
|
'@storybook/vue3-vite@8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@storybook/builder-vite': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
'@storybook/builder-vite': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
||||||
'@storybook/vue3': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vue@3.5.13(typescript@5.8.3))
|
'@storybook/vue3': 8.6.12(storybook@8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5))(vue@3.5.13(typescript@5.8.3))
|
||||||
find-package-json: 1.2.0
|
find-package-json: 1.2.0
|
||||||
magic-string: 0.30.17
|
magic-string: 0.30.17
|
||||||
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
storybook: 8.6.12(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.5)
|
||||||
typescript: 5.8.3
|
typescript: 5.8.3
|
||||||
vite: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
vue-component-meta: 2.0.16(typescript@5.8.3)
|
vue-component-meta: 2.0.16(typescript@5.8.3)
|
||||||
vue-docgen-api: 4.75.1(vue@3.5.13(typescript@5.8.3))
|
vue-docgen-api: 4.75.1(vue@3.5.13(typescript@5.8.3))
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -14996,9 +14997,9 @@ snapshots:
|
||||||
|
|
||||||
'@ungap/structured-clone@1.2.0': {}
|
'@ungap/structured-clone@1.2.0': {}
|
||||||
|
|
||||||
'@vitejs/plugin-vue@5.2.3(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))':
|
'@vitejs/plugin-vue@5.2.3(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))(vue@3.5.13(typescript@5.8.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
vue: 3.5.13(typescript@5.8.3)
|
vue: 3.5.13(typescript@5.8.3)
|
||||||
|
|
||||||
'@vitest/coverage-v8@3.1.2(vitest@3.1.2(@types/debug@4.1.12)(@types/node@22.15.2)(happy-dom@17.4.4)(jsdom@26.1.0(bufferutil@4.0.9)(canvas@3.1.0)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@22.15.2)(typescript@5.8.3))(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
'@vitest/coverage-v8@3.1.2(vitest@3.1.2(@types/debug@4.1.12)(@types/node@22.15.2)(happy-dom@17.4.4)(jsdom@26.1.0(bufferutil@4.0.9)(canvas@3.1.0)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@22.15.2)(typescript@5.8.3))(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
||||||
|
@ -15033,14 +15034,14 @@ snapshots:
|
||||||
chai: 5.2.0
|
chai: 5.2.0
|
||||||
tinyrainbow: 2.0.0
|
tinyrainbow: 2.0.0
|
||||||
|
|
||||||
'@vitest/mocker@3.1.2(msw@2.7.5(@types/node@22.15.2)(typescript@5.8.3))(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
'@vitest/mocker@3.1.2(msw@2.7.5(@types/node@22.15.2)(typescript@5.8.3))(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vitest/spy': 3.1.2
|
'@vitest/spy': 3.1.2
|
||||||
estree-walker: 3.0.3
|
estree-walker: 3.0.3
|
||||||
magic-string: 0.30.17
|
magic-string: 0.30.17
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
msw: 2.7.5(@types/node@22.15.2)(typescript@5.8.3)
|
msw: 2.7.5(@types/node@22.15.2)(typescript@5.8.3)
|
||||||
vite: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
|
|
||||||
'@vitest/pretty-format@2.0.5':
|
'@vitest/pretty-format@2.0.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -22120,7 +22121,7 @@ snapshots:
|
||||||
debug: 4.4.0(supports-color@8.1.1)
|
debug: 4.4.0(supports-color@8.1.1)
|
||||||
es-module-lexer: 1.6.0
|
es-module-lexer: 1.6.0
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
vite: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@types/node'
|
- '@types/node'
|
||||||
- jiti
|
- jiti
|
||||||
|
@ -22137,7 +22138,7 @@ snapshots:
|
||||||
|
|
||||||
vite-plugin-turbosnap@1.0.3: {}
|
vite-plugin-turbosnap@1.0.3: {}
|
||||||
|
|
||||||
vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3):
|
vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild: 0.25.3
|
esbuild: 0.25.3
|
||||||
fdir: 6.4.4(picomatch@4.0.2)
|
fdir: 6.4.4(picomatch@4.0.2)
|
||||||
|
@ -22159,7 +22160,7 @@ snapshots:
|
||||||
vitest@3.1.2(@types/debug@4.1.12)(@types/node@22.15.2)(happy-dom@17.4.4)(jsdom@26.1.0(bufferutil@4.0.9)(canvas@3.1.0)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@22.15.2)(typescript@5.8.3))(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3):
|
vitest@3.1.2(@types/debug@4.1.12)(@types/node@22.15.2)(happy-dom@17.4.4)(jsdom@26.1.0(bufferutil@4.0.9)(canvas@3.1.0)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@22.15.2)(typescript@5.8.3))(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vitest/expect': 3.1.2
|
'@vitest/expect': 3.1.2
|
||||||
'@vitest/mocker': 3.1.2(msw@2.7.5(@types/node@22.15.2)(typescript@5.8.3))(vite@6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
'@vitest/mocker': 3.1.2(msw@2.7.5(@types/node@22.15.2)(typescript@5.8.3))(vite@6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3))
|
||||||
'@vitest/pretty-format': 3.1.2
|
'@vitest/pretty-format': 3.1.2
|
||||||
'@vitest/runner': 3.1.2
|
'@vitest/runner': 3.1.2
|
||||||
'@vitest/snapshot': 3.1.2
|
'@vitest/snapshot': 3.1.2
|
||||||
|
@ -22176,7 +22177,7 @@ snapshots:
|
||||||
tinyglobby: 0.2.13
|
tinyglobby: 0.2.13
|
||||||
tinypool: 1.0.2
|
tinypool: 1.0.2
|
||||||
tinyrainbow: 2.0.0
|
tinyrainbow: 2.0.0
|
||||||
vite: 6.3.3(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite: 6.3.4(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
vite-node: 3.1.2(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
vite-node: 3.1.2(@types/node@22.15.2)(sass@1.87.0)(terser@5.39.0)(tsx@4.19.3)
|
||||||
why-is-node-running: 2.3.0
|
why-is-node-running: 2.3.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
"remark-parse": "11.0.0",
|
"remark-parse": "11.0.0",
|
||||||
"typescript": "5.8.3",
|
"typescript": "5.8.3",
|
||||||
"unified": "11.0.5",
|
"unified": "11.0.5",
|
||||||
"vite": "6.3.3",
|
"vite": "6.3.4",
|
||||||
"vite-node": "3.1.2",
|
"vite-node": "3.1.2",
|
||||||
"vitest": "3.1.2"
|
"vitest": "3.1.2"
|
||||||
}
|
}
|
||||||
|
@ -2785,9 +2785,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "6.3.3",
|
"version": "6.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz",
|
||||||
"integrity": "sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==",
|
"integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
"remark-parse": "11.0.0",
|
"remark-parse": "11.0.0",
|
||||||
"typescript": "5.8.3",
|
"typescript": "5.8.3",
|
||||||
"unified": "11.0.5",
|
"unified": "11.0.5",
|
||||||
"vite": "6.3.3",
|
"vite": "6.3.4",
|
||||||
"vite-node": "3.1.2",
|
"vite-node": "3.1.2",
|
||||||
"vitest": "3.1.2"
|
"vitest": "3.1.2"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue