diff --git a/.github/workflows/buildCheck.yml b/.github/workflows/buildCheck.yml index 5508a7a0..9cefbc0a 100644 --- a/.github/workflows/buildCheck.yml +++ b/.github/workflows/buildCheck.yml @@ -17,18 +17,23 @@ jobs: steps: - uses: actions/checkout@v6 + - name: Setup pnpm + uses: pnpm/action-setup@v6 + with: + version: 10 + - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} - cache: 'npm' + cache: 'pnpm' - - name: Install Dependencies from Package-Lock - run: npm ci + - name: Install Dependencies + run: pnpm install --frozen-lockfile - name: Generate Prisma Client - run: npx prisma generate + run: pnpm prisma generate - name: Build Project - run: npm run build + run: pnpm build diff --git a/.gitignore b/.gitignore index b5e89df5..129bf30a 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,10 @@ prisma/generated prisma/dev.db prisma/dev.db-journal + +# Dev seed file +prisma/seed.ts + +# non-pnpm lock files +yarn.lock +package-lock.json diff --git a/app/components/ClassContextSelect.css b/app/components/ClassContextSelect.css new file mode 100644 index 00000000..00aa116d --- /dev/null +++ b/app/components/ClassContextSelect.css @@ -0,0 +1,43 @@ +.class-context-select { + display: flex; + align-items: center; + gap: 0.75rem; +} + +label { + color: #64748b; + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +select { + min-width: 15rem; + padding: 0.7rem 0.9rem; + background: #f8fafc; + border: 1px solid #cbd5e1; + border-radius: 0.65rem; + color: #1e293b; + cursor: pointer; + font: inherit; + font-size: 0.9rem; + font-weight: 700; +} + +select:focus { + border-color: #4f46e5; + outline: none; + box-shadow: 0 0 0 3px rgb(79 70 229 / 12%); +} + +@media (max-width: 800px) { + .class-context-select { + width: 100%; + } + + select { + min-width: 0; + flex: 1; + } +} diff --git a/app/components/ClassContextSelect.vue b/app/components/ClassContextSelect.vue new file mode 100644 index 00000000..8d0fb0c1 --- /dev/null +++ b/app/components/ClassContextSelect.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/app/components/LogoutButton.vue b/app/components/LogoutButton.vue new file mode 100644 index 00000000..39514f33 --- /dev/null +++ b/app/components/LogoutButton.vue @@ -0,0 +1,26 @@ + + + diff --git a/app/components/RichTextEditor.vue b/app/components/RichTextEditor.vue new file mode 100644 index 00000000..098ce217 --- /dev/null +++ b/app/components/RichTextEditor.vue @@ -0,0 +1,601 @@ + + + + + diff --git a/app/composables/useAdmin.ts b/app/composables/useCoach.ts similarity index 90% rename from app/composables/useAdmin.ts rename to app/composables/useCoach.ts index f5c76eb9..40abe82e 100644 --- a/app/composables/useAdmin.ts +++ b/app/composables/useCoach.ts @@ -1,13 +1,24 @@ -// composables/useAdmin.ts -// Place this at: app/composables/useAdmin.ts +// composables/useCoach.ts +// Place this at: app/composables/useCoach.ts import dayjs from 'dayjs' import utc from 'dayjs/plugin/utc' dayjs.extend(utc) -export const useAdmin = () => { +export const useCoach = () => { + const { classId } = useSelectedClass() const callFormApi = async (method: 'GET' | 'POST' | 'PUT' | 'DELETE', params: Record = {}, body?: Record): Promise => { + if (!classId.value) { + throw new Error('Select a class before managing forms') + } + + const scopedParams = { + ...params, + ...(method === 'DELETE' ? body : {}), + classId: classId.value, + } + const scopedBody = { ...body, classId: classId.value } const queryString = method === 'GET' || method === 'DELETE' - ? `?${new URLSearchParams(Object.entries(params).reduce((acc, [key, value]) => { + ? `?${new URLSearchParams(Object.entries(scopedParams).reduce((acc, [key, value]) => { if (value !== undefined && value !== null) { acc[key] = String(value) } @@ -18,7 +29,7 @@ export const useAdmin = () => { return await $fetch(`/api/form${queryString}`, { method, - body: method === 'GET' ? undefined : body, + body: method === 'GET' || method === 'DELETE' ? undefined : scopedBody, }) } @@ -215,6 +226,11 @@ export const useAdmin = () => { ) const loadPublishedForms = async () => { + if (!classId.value) { + publishedForms.value = [] + return + } + try { const forms = await callFormApi('GET', { action: 'listForms', @@ -227,6 +243,12 @@ export const useAdmin = () => { } const syncGroupRangeFromWeeklyDate = async () => { + if (!classId.value) { + historyGroupStartDate.value = '' + historyGroupEndDate.value = '' + return + } + if (!historyWeekStart.value) { historyGroupStartDate.value = '' historyGroupEndDate.value = '' @@ -262,8 +284,11 @@ export const useAdmin = () => { } watch( - historyWeekStart, + [historyWeekStart, classId], async () => { + publishedForms.value = [] + selectedFormDetails.value = null + editingFormId.value = null await syncGroupRangeFromWeeklyDate() await loadPublishedForms() }, @@ -433,7 +458,7 @@ export const useAdmin = () => { questions.value = JSON.parse(JSON.stringify(form.questions)) editingFormId.value = form.id builderSubTab.value = 'creation' - navigateTo('/admin/builder') + navigateTo({ path: '/coach/builder', query: { class: classId.value } }) } const toggleFormPublish = async (form: any) => { @@ -442,9 +467,10 @@ export const useAdmin = () => { form.status = form.status === 'Active' ? 'Unpublished' : 'Active' const newStatus = form.status === 'Active' ? true : false - await useFetch(`/api/form/${form.id}`, { - method: 'PUT', - body: {published: newStatus} + await callFormApi('PUT', {}, { + action: 'updateForm', + id: form.id, + published: newStatus, }) } @@ -453,11 +479,49 @@ export const useAdmin = () => { } // ── Students / Progress ── - const students = useState('adminStudents', () => [ - { id: 1, name: 'Aiden Smith', initials: 'AS', email: 'aiden@school.edu', tickets: 12, streak: 4, lastActive: '2 hours ago' }, - { id: 2, name: 'Nevin Kumar', initials: 'NK', email: 'nevin@school.edu', tickets: 14, streak: 5, lastActive: 'Just now' }, - { id: 3, name: 'Swarna Jay', initials: 'SJ', email: 'swarna@school.edu',tickets: 8, streak: 2, lastActive: 'Yesterday' }, - ]) + const students = useState('coachStudents', () => []) + + const loadStudents = async () => { + if (!classId.value) { + students.value = [] + return + } + + const classStudents = await $fetch>( + '/api/student', + { + method: 'GET', + query: { classId: classId.value }, + } + ) + + students.value = classStudents.map((student) => ({ + ...student, + initials: student.name + .split(/\s+/) + .filter(Boolean) + .slice(0, 2) + .map((part) => part[0]?.toUpperCase()) + .join(''), + tickets: student.exp, + streak: 0, + lastActive: '', + })) + } + + watch( + classId, + async () => { + students.value = [] + + try { + await loadStudents() + } catch (error) { + console.error('Failed to load class students', error) + } + }, + { immediate: true } + ) const searchStudent = useState('searchStudent', () => '') const sortStudent = useState('sortStudent', () => 'tickets') diff --git a/app/composables/useCurrentFormGroup.ts b/app/composables/useCurrentFormGroup.ts index 7d445688..4985c2ad 100644 --- a/app/composables/useCurrentFormGroup.ts +++ b/app/composables/useCurrentFormGroup.ts @@ -27,19 +27,22 @@ export const useCurrentFormGroup = () => { const loadActiveFormGroup = async () => { try { - const formGroupAPIResponse = await $fetch('/api/formGroup?active=true') - - const activeFg = Array.isArray(formGroupAPIResponse) ? formGroupAPIResponse[0] : formGroupAPIResponse + const activeFormGroups = await $fetch('/api/formGroup?active=true') + const activeFg = activeFormGroups[0] if (activeFg) { FormGroup.value.activeFormGroup = activeFg try { - const formsAPIResponse = await $fetch('/api/form', { - query: { action: 'getOnlyActiveFormsinGroup', formGroup: activeFg.id } - }) + const formResponses = await Promise.all( + activeFormGroups.map((formGroup) => + $fetch('/api/form', { + query: { action: 'getOnlyActiveFormsinGroup', formGroup: formGroup.id } + }) + ) + ) - FormGroup.value.forms = Array.isArray(formsAPIResponse) ? formsAPIResponse : [] + FormGroup.value.forms = formResponses.flat() // Load form components for each form in parallel FormGroup.value.formComponents = {} @@ -72,4 +75,4 @@ export const useCurrentFormGroup = () => { loadFormComponents, totalFormsInGroup } -} \ No newline at end of file +} diff --git a/app/composables/useRaffleSpin.ts b/app/composables/useRaffleSpin.ts index 041c80f8..a5d00ff0 100644 --- a/app/composables/useRaffleSpin.ts +++ b/app/composables/useRaffleSpin.ts @@ -1,5 +1,6 @@ import type { Student, FormGroup, Form, FormSubmission } from '~~/prisma/generated/client' export const useRaffleSpin = () => { + const { classId } = useSelectedClass() const raffleWeekStart = ref(new Date()) @@ -10,9 +11,17 @@ export const useRaffleSpin = () => { const spinCount = ref(0) const loadRaffleFormGroup = async () => { + if (!classId.value) { + raffleFormGroup.value = null + return + } + const val = raffleWeekStart.value const dateStr = val instanceof Date ? val.toISOString().split('T')[0] : String(val).split('T')[0] - const data = await $fetch(`/api/formGroup?date=${dateStr}`, { method: 'GET' }) + const data = await $fetch('/api/formGroup', { + method: 'GET', + query: { date: dateStr, classId: classId.value }, + }) raffleFormGroup.value = data || null } @@ -21,7 +30,14 @@ export const useRaffleSpin = () => { raffleForms.value = [] return } - const data = await $fetch(`/api/form?action=listForms&formGroup=${raffleFormGroup.value.id}`, { method: 'GET' }) + const data = await $fetch('/api/form', { + method: 'GET', + query: { + action: 'listForms', + formGroup: raffleFormGroup.value.id, + classId: classId.value, + }, + }) raffleForms.value = data || [] } @@ -30,7 +46,10 @@ export const useRaffleSpin = () => { raffleSubmissions.value = [] return } - const data = await $fetch(`/api/formSubmission?formGroup=${raffleFormGroup.value.id}`, { method: 'GET' }) + const data = await $fetch('/api/formSubmission', { + method: 'GET', + query: { formGroup: raffleFormGroup.value.id, classId: classId.value }, + }) raffleSubmissions.value = data || [] } @@ -63,7 +82,8 @@ export const useRaffleSpin = () => { method: 'PUT', body: { id: raffleFormGroup.value.id, - raffleWinner: studentId + raffleWinner: studentId, + classId: classId.value, } }) await loadRaffleData() @@ -73,6 +93,14 @@ export const useRaffleSpin = () => { } } + watch(classId, async () => { + raffleFormGroup.value = null + raffleForms.value = [] + raffleSubmissions.value = [] + raffleWinner.value = null + await loadRaffleData() + }) + return { raffleWinner, raffleFormGroup, @@ -83,4 +111,4 @@ export const useRaffleSpin = () => { loadRaffleData, spinCount } -} \ No newline at end of file +} diff --git a/app/composables/useSelectedClass.ts b/app/composables/useSelectedClass.ts new file mode 100644 index 00000000..a38cfca4 --- /dev/null +++ b/app/composables/useSelectedClass.ts @@ -0,0 +1,18 @@ +export const useSelectedClass = () => { + const route = useRoute() + const storedClassId = useCookie('selected-class-token', { + sameSite: 'lax', + }) + + const classId = computed(() => { + const queryClassId = route.query.class + const normalizedQueryClassId = Array.isArray(queryClassId) ? queryClassId[0] : queryClassId + + return normalizedQueryClassId || storedClassId.value || null + }) + + return { + classId, + storedClassId, + } +} diff --git a/app/layouts/admin.css b/app/layouts/admin.css index 33ec929b..1b7abf41 100644 --- a/app/layouts/admin.css +++ b/app/layouts/admin.css @@ -1,235 +1,263 @@ -html, body { margin: 0; padding: 0; height: 100%; } -#__nuxt { height: 100%; } +html, +body, +#__nuxt { + width: 100%; + height: 100%; + margin: 0; + overflow: hidden; + background: #eef2f7; + color: #1e293b; + font-family: Quicksand, system-ui, sans-serif; +} + +* { + box-sizing: border-box; +} -/* ── Shell ── */ -.rh-admin-wrap { +.portal-layout { display: flex; + width: 100%; height: 100vh; overflow: hidden; - background: #f8fafc; - font-family: 'Quicksand', system-ui, sans-serif; - color: #1e293b; + background: #eef2f7; } -/* ── Sidebar ── */ -.rh-sidebar { +.portal-sidebar { width: 18rem; + height: 100vh; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: space-between; + overflow: hidden; + background: #f8fafc; + border-right: 1px solid #dbe3ec; +} + +.portal-sidebar-content { + padding: 1.5rem; +} + +.portal-logo { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 2rem; + color: inherit; + text-decoration: none; +} + +.portal-logo-icon { + width: 2.5rem; + height: 2.5rem; + display: flex; + align-items: center; + justify-content: center; flex-shrink: 0; - background: #ffffff; - border-right: 1px solid #e2e8f0; + background: #4f46e5; + border-radius: 0.5rem; + color: #ffffff; + font-size: 1.25rem; + font-weight: 700; +} + +.portal-logo-title { + color: #0f172a; + font-size: 1.1rem; + font-weight: 700; +} + +.portal-logo-title span { + color: #4f46e5; +} + +.portal-logo-subtitle { + margin-top: 0.2rem; + color: #14b8a6; + font-size: 0.62rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.portal-nav-label { + margin: 0 0 1rem; + color: #94a3b8; + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.portal-navigation { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.portal-nav-link { + padding: 0.75rem 1rem; + border-left: 4px solid transparent; + border-radius: 0 0.75rem 0.75rem 0; + color: #64748b; + font-size: 0.95rem; + font-weight: 600; + text-decoration: none; + transition: + background 0.15s ease, + color 0.15s ease, + border-color 0.15s ease; +} + +.portal-nav-link:hover { + background: #eef2f7; + color: #334155; +} + +.portal-nav-link-active { + background: #e7eafe; + border-left-color: #4f46e5; + color: #4338ca; +} + +.portal-sidebar-footer { + padding: 1.5rem; +} + +.portal-logout { + color: #94a3b8; + font-size: 0.875rem; + font-weight: 600; + text-decoration: none; +} + +.portal-logout:hover { + color: #64748b; +} + +.portal-workspace { + min-width: 0; + height: 100vh; + flex: 1; display: flex; flex-direction: column; - overflow-y: auto; -} -.rh-sidebar-inner { padding: 24px 24px 0; flex: 1; } - -.rh-logo { display:flex; align-items:center; gap:12px; margin-bottom:32px; } -.rh-logo-icon { width:40px; height:40px; background:#4f46e5; border-radius:8px; display:flex; align-items:center; justify-content:center; color:white; font-weight:700; font-size:1.25rem; } -.rh-logo-name { font-weight:700; font-size:1.1rem; color:#0f172a; line-height:1; } -.rh-logo-accent { color:#4f46e5; } -.rh-logo-sub { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.1em; color:#2dd4bf; margin-top:2px; } - -.rh-nav-label { font-size:12px; font-weight:500; color:#94a3b8; text-transform:uppercase; letter-spacing:.1em; margin-bottom:16px; } -.rh-nav { display:flex; flex-direction:column; gap:4px; } - -.rh-nav-btn { - display:flex; align-items:center; width:100%; - padding:12px 16px; font-weight:500; font-size:15px; - border-radius:0 12px 12px 0; border-left:4px solid transparent; - color:#64748b; cursor:pointer; transition:all .15s; - background:transparent; text-align:left; - border-top:none; border-right:none; border-bottom:none; -} -.rh-nav-btn:hover { background:#f8fafc; } -.rh-nav-active { background:#eef2ff !important; color:#4338ca !important; border-left-color:#4f46e5 !important; font-weight:600 !important; } - -.rh-sidebar-footer { padding:24px; } -.rh-back-link { font-size:14px; color:#94a3b8; font-weight:500; text-decoration:none; } -.rh-back-link:hover { color:#64748b; } - -/* ── Main ── */ -.rh-main { flex:1; overflow-y:auto; padding:24px 32px; } -.rh-tab-content { max-width:56rem; margin:0 auto; } - -/* ── Spacing helpers ── */ -.rh-space-y-3 > * + * { margin-top:12px; } -.rh-space-y-4 > * + * { margin-top:16px; } -.rh-space-y-5 > * + * { margin-top:20px; } -.rh-space-y-6 > * + * { margin-top:24px; } - -/* ── Cards ── */ -.rh-card { - background:white; padding:20px; border-radius:8px; - border:1px solid #e2e8f0; box-shadow:0 1px 3px rgba(0,0,0,.06); - display:flex; flex-direction:column; gap:16px; -} - -/* ── Buttons ── */ -.rh-btn-ghost { padding:12px 24px; border-radius:8px; font-weight:500; background:white; border:2px solid #e5e7eb; color:#6b7280; cursor:pointer; transition:background .15s; } -.rh-btn-ghost:hover { background:#f9fafb; } -.rh-btn-indigo { padding:12px 24px; border-radius:8px; font-weight:500; background:#4f46e5; color:white; border:none; cursor:pointer; transition:background .15s; box-shadow:0 4px 14px rgba(99,102,241,.3); } -.rh-btn-indigo:hover { background:#4338ca; } -.rh-btn-indigo:active { transform:scale(.97); } -.rh-btn-dark { padding:16px 32px; border-radius:8px; font-weight:700; font-size:1.1rem; background:#111827; color:white; border:none; cursor:pointer; } -.rh-btn-dark:hover { background:black; } - -.rh-btn-sm { padding:8px 16px; border-radius:8px; font-size:14px; font-weight:500; border:none; cursor:pointer; } -.rh-btn-sm-indigo { padding:8px 16px; border-radius:8px; font-size:14px; font-weight:500; border:none; cursor:pointer; background:#eef2ff; color:#4f46e5; } -.rh-btn-sm-indigo:hover { background:#e0e7ff; } -.rh-btn-sm-danger { background:white; color:#6b7280; } -.rh-btn-sm-danger:hover { background:#fef2f2; color:#ef4444; } -.rh-btn-sm-success { background:#f0fdf4; color:#16a34a; } -.rh-btn-sm-success:hover { background:#dcfce7; } - -.rh-flex-gap { display:flex; gap:8px; } - -/* ── Creation bar ── */ -.rh-creation-bar { display:flex; justify-content:space-between; align-items:center; background:#eef2ff; padding:24px; border-radius:8px; border:1px solid #e0e7ff; font-style:italic; } -.rh-creation-title { font-size:1.25rem; font-weight:500; color:#3730a3; } - -/* ── Week row ── */ -.rh-week-row { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center; gap:16px; background:rgba(238,242,255,.5); padding:16px; border-radius:8px; border:1px solid rgba(224,231,255,.5); } -.rh-week-title { font-size:1.1rem; font-weight:500; color:#1e1b4b; } -.rh-tiny-label { font-size:10px; font-weight:500; color:#94a3b8; text-transform:uppercase; letter-spacing:.05em; } - -/* ── Inputs ── */ -.rh-input { font-size:16px; font-weight:500; color:#1f2937; border:2px solid #f1f5f9; border-radius:8px; padding:8px 16px; outline:none; transition:border-color .15s; background:white; width:100%; box-sizing:border-box; } -.rh-input:focus { border-color:#6366f1; } -.rh-title-input { font-size:1.5rem; font-weight:500; color:#1f2937; border:none; border-bottom:2px solid #f1f5f9; outline:none; transition:border-color .15s; padding:8px 0; background:transparent; width:100%; } -.rh-title-input:focus { border-bottom-color:#6366f1; } -.rh-field-input { font-weight:500; color:#1f2937; border:2px solid #f8fafc; background:#f8fafc; border-radius:8px; padding:12px 16px; outline:none; transition:all .15s; font-size:16px; width:100%; box-sizing:border-box; } -.rh-field-input:focus { background:white; border-color:#c7d2fe; } - -/* ── Day pills ── */ -.rh-day-pills { display:flex; flex-wrap:wrap; gap:8px; } -.rh-day-pill { padding:8px 16px; border-radius:8px; font-weight:500; font-size:14px; border:2px solid transparent; background:#f8fafc; color:#94a3b8; cursor:pointer; transition:all .15s; } -.rh-day-pill:hover:not(.rh-day-active) { background:#f1f5f9; } -.rh-day-active { background:#e0e7ff !important; color:#4338ca !important; border-color:#a5b4fc !important; box-shadow:inset 0 1px 3px rgba(0,0,0,.1); } - -/* ── Title row ── */ -.rh-title-row { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:24px; padding-top:16px; border-top:1px solid #f8fafc; } -.rh-preview-date { background:#eef2ff; padding:16px 24px; border-radius:8px; text-align:center; min-width:200px; } - -/* ── Q type buttons ── */ -.rh-q-btns { display:flex; gap:16px; flex-wrap:wrap; } -.rh-q-btn { flex:1; font-weight:500; padding:16px; border-radius:8px; cursor:pointer; min-width:140px; transition:background .15s; } -.rh-q-btn-blue { background:#eff6ff; color:#4f46e5; border:1px dashed #bfdbfe; } -.rh-q-btn-blue:hover { background:#dbeafe; } -.rh-q-btn-gray { background:white; color:#6b7280; border:1px dashed #e5e7eb; } -.rh-q-btn-gray:hover { background:#f9fafb; } -.rh-q-btn-gray2 { background:#f9fafb; color:#4b5563; border:1px dashed #e5e7eb; } -.rh-q-btn-gray2:hover { background:#f3f4f6; } - -/* ── Question card ── */ -.rh-empty { text-align:center; padding:48px 0; color:#9ca3af; border:4px dashed #f3f4f6; border-radius:8px; background:white; } -.rh-q-card { background:white; border:2px solid #f3f4f6; border-radius:8px; padding:24px; position:relative; cursor:move; box-shadow:0 1px 3px rgba(0,0,0,.05); transition:border-color .15s; } -.rh-q-card:hover { border-color:#e0e7ff; } -.rh-q-drag-handle { position:absolute; top:16px; left:16px; color:#d1d5db; } -.rh-q-card:hover .rh-q-drag-handle { color:#818cf8; } -.rh-q-remove { position:absolute; top:16px; right:16px; background:none; border:none; color:#d1d5db; cursor:pointer; font-size:1.1rem; } -.rh-q-remove:hover { color:#ef4444; } - -.rh-q-badge { font-size:12px; font-weight:500; text-transform:uppercase; letter-spacing:.05em; padding:4px 12px; border-radius:9999px; } -.rh-badge-blue { background:#dbeafe; color:#4338ca; } -.rh-badge-green { background:#d1fae5; color:#065f46; } -.rh-badge-red { background:#fee2e2; color:#991b1b; } -.rh-badge-gray { background:#f3f4f6; color:#374151; } - -.rh-grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:16px; } -@media (max-width:768px) { .rh-grid-2 { grid-template-columns:1fr; } } - -/* ── MCQ ── */ -.rh-choice-row { display:flex; align-items:center; gap:12px; } -.rh-choice-letter { width:32px; height:32px; border-radius:9999px; display:flex; align-items:center; justify-content:center; font-weight:700; font-size:14px; flex-shrink:0; background:#f3f4f6; color:#6b7280; } -.rh-choice-correct { background:#10b981; color:white; } -.rh-set-correct { padding:8px 12px; border-radius:8px; font-weight:500; font-size:12px; border:none; cursor:pointer; background:#f3f4f6; color:#9ca3af; } -.rh-set-correct:hover { background:#d1fae5; color:#059669; } -.rh-set-correct-active { background:#10b981; color:white; } -.rh-add-choice { width:100%; padding:12px; border:2px dashed #a7f3d0; color:#10b981; font-weight:500; border-radius:8px; background:transparent; cursor:pointer; } -.rh-add-choice:hover { background:#ecfdf5; } - -/* ── History form rows ── */ -.rh-form-row { background:white; padding:20px 24px; border-radius:24px; border:1px solid #e2e8f0; display:flex; align-items:center; gap:20px; transition:all .2s; } -.rh-form-row:hover { border-color:#a5b4fc; box-shadow:0 2px 8px rgba(99,102,241,.08); } -.rh-unpublished { opacity:.6; } -.rh-week-badge { background:#eef2ff; color:#4338ca; padding:12px; border-radius:8px; display:flex; flex-direction:column; align-items:center; min-width:90px; border:1px solid #e0e7ff; flex-shrink:0; font-size:11px; font-weight:500; } -.rh-day-badge { font-size:11px; font-weight:500; text-transform:uppercase; background:#4f46e5; color:white; padding:2px 8px; border-radius:6px; margin-top:4px; } -.rh-form-actions { display:flex; gap:8px; align-items:center; flex-shrink:0; } -.rh-status-pill { font-size:10px; font-weight:500; text-transform:uppercase; letter-spacing:.1em; padding:6px 12px; border-radius:9999px; } -.rh-active { background:#dcfce7; color:#15803d; } -.rh-inactive { background:#f3f4f6; color:#6b7280; } - -/* ── Progress table ── */ -.rh-th { padding:16px; font-size:12px; font-weight:500; color:#9ca3af; text-transform:uppercase; letter-spacing:.05em; } -.rh-tr { border-bottom:1px solid #f3f4f6; transition:background .15s; } -.rh-tr:hover { background:rgba(238,242,255,.5); } -.rh-tr:last-child { border-bottom:none; } -.rh-td { padding:16px; } -.rh-avatar { width:32px; height:32px; border-radius:9999px; background:#e0e7ff; color:#4338ca; display:flex; align-items:center; justify-content:center; font-size:12px; font-weight:700; box-shadow:0 1px 3px rgba(0,0,0,.1); flex-shrink:0; } -.rh-badge-pill { display:inline-flex; align-items:center; gap:8px; padding:4px 12px; border-radius:8px; font-weight:500; background:#f3f4f6; color:#374151; } - -/* ── Raffle ── */ -.rh-raffle-card { background:white; border-radius:8px; box-shadow:0 25px 50px rgba(0,0,0,.12); padding:48px; max-width:36rem; margin:0 auto; border-bottom:8px solid #818cf8; } -.rh-spin-btn { background:#4f46e5; color:white; font-size:1.5rem; font-weight:500; padding:20px 64px; border-radius:9999px; border:none; cursor:pointer; box-shadow:0 10px 25px rgba(99,102,241,.3); transition:all .2s; } -.rh-spin-btn:hover { background:#4338ca; } -.rh-spin-btn:active { transform:scale(.95); } -@keyframes rhSpin { from { transform:rotate(0deg); } to { transform:rotate(360deg); } } -.rh-spin-emoji { display:inline-block; font-size:6rem; animation:rhSpin .8s linear infinite; margin-bottom:24px; } -@keyframes rhBounce { 0%,100% { transform:translateY(0); } 50% { transform:translateY(-16px); } } -.rh-bounce-emoji { display:inline-block; font-size:6rem; animation:rhBounce 1s ease-in-out infinite; margin-bottom:24px; } - -/* ── Announcements ── */ -.rh-subtab-switch { display:flex; background:#eef2ff; padding:6px; border-radius:8px; border:1px solid #e0e7ff; } -.rh-subtab-btn { padding:10px 24px; border-radius:6px; font-weight:500; border:none; cursor:pointer; transition:all .3s; background:transparent; color:#818cf8; } -.rh-subtab-btn:hover { color:#4f46e5; } -.rh-subtab-active { background:white !important; color:#3730a3 !important; box-shadow:0 2px 8px rgba(0,0,0,.1) !important; } - -.rh-ann-grid { display:grid; grid-template-columns:1fr 1fr; gap:24px; } -@media (max-width:1024px) { .rh-ann-grid { grid-template-columns:1fr; } } - -.rh-btn-post { width:100%; padding:16px; background:#4f46e5; color:white; border:none; border-radius:8px; font-weight:500; font-size:1.2rem; cursor:pointer; box-shadow:0 10px 25px rgba(99,102,241,.25); } -.rh-btn-post:hover { background:#4338ca; } - -.rh-preview-panel { background:rgba(238,242,255,.3); padding:32px; border-radius:8px; border:2px dashed #e0e7ff; display:flex; flex-direction:column; justify-content:center; } -.rh-preview-card { background:white; padding:24px; border-radius:40px; border:1px solid #f3f4f6; box-shadow:0 10px 25px rgba(0,0,0,.08); display:flex; gap:24px; align-items:flex-start; } -.rh-preview-icon { padding:16px; background:#eef2ff; border-radius:16px; font-size:2.5rem; flex-shrink:0; border:1px solid #e0e7ff; display:flex; align-items:center; justify-content:center; min-width:80px; min-height:80px; } - -.rh-ann-item { padding:20px; border-radius:12px; border:2px solid; display:flex; gap:20px; align-items:flex-start; transition:all .2s; } -.rh-ann-active { background:white; border-color:#a5b4fc; } -.rh-ann-active:hover { border-color:#6366f1; } -.rh-ann-expired { background:#f9fafb; border-color:#f3f4f6; opacity:.7; } -.rh-ann-expired:hover { opacity:1; } -.rh-ann-icon { padding:16px; border-radius:12px; font-size:1.875rem; flex-shrink:0; border:1px solid; display:flex; align-items:center; justify-content:center; min-width:80px; min-height:80px; } -.rh-ann-icon-active { background:#eef2ff; border-color:#e0e7ff; } -.rh-ann-icon-expired { background:#f3f4f6; border-color:#e5e7eb; } -.rh-ann-pill { padding:2px 8px; border-radius:9999px; font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; } -.rh-ann-pill-green { background:#dcfce7; color:#15803d; border:1px solid #bbf7d0; } -.rh-ann-pill-gray { background:#e5e7eb; color:#6b7280; border:1px solid #d1d5db; } -.rh-ann-pill-neutral { background:#f3f4f6; color:#4b5563; } - -/* ── Modal ── */ -.rh-modal-backdrop { position:fixed; inset:0; z-index:300; display:flex; align-items:center; justify-content:center; padding:24px; } -.rh-modal-overlay { position:absolute; inset:0; background:rgba(15,23,42,.4); backdrop-filter:blur(4px); } -.rh-modal-box { position:relative; background:white; width:100%; max-width:42rem; border-radius:8px; box-shadow:0 25px 50px rgba(0,0,0,.25); display:flex; flex-direction:column; max-height:90vh; border-bottom:8px solid #4f46e5; overflow:hidden; } -.rh-modal-head { padding:24px; background:#eef2ff; border-bottom:1px solid #e0e7ff; display:flex; justify-content:space-between; align-items:center; } -.rh-modal-title { font-size:1.5rem; font-weight:900; color:#111827; } -.rh-modal-meta { font-size:12px; color:#9ca3af; font-weight:700; text-transform:uppercase; letter-spacing:.1em; margin-top:4px; } -.rh-modal-close { width:48px; height:48px; border-radius:8px; background:white; color:#9ca3af; display:flex; align-items:center; justify-content:center; border:none; cursor:pointer; } -.rh-modal-close:hover { color:#111827; transform:scale(1.1); } -.rh-modal-body { padding:24px; overflow-y:auto; display:flex; flex-direction:column; gap:24px; } -.rh-modal-foot { padding:24px; background:#f9fafb; border-top:1px solid #f3f4f6; display:flex; justify-content:flex-end; } -.rh-modal-step { padding:24px; border-radius:8px; border:2px solid #f9fafb; background:rgba(249,250,251,.5); display:flex; flex-direction:column; gap:12px; } -.rh-step-badge { display:inline-block; background:white; padding:4px 12px; border-radius:6px; font-size:10px; font-weight:900; text-transform:uppercase; letter-spacing:.1em; color:#6366f1; box-shadow:0 1px 3px rgba(0,0,0,.1); width:fit-content; } -.rh-step-text { font-size:1.1rem; font-weight:700; color:#111827; line-height:1.4; } -.rh-step-es { font-size:1rem; color:#6b7280; font-style:italic; font-weight:500; } -.rh-step-ref { padding:16px; background:white; border-radius:6px; border:1px solid #f3f4f6; } -.rh-step-ref-label { font-size:10px; font-weight:900; color:#d1d5db; text-transform:uppercase; letter-spacing:.1em; margin-bottom:4px; } -.rh-step-ref-val { font-size:14px; font-weight:700; color:#6366f1; } -.rh-step-choices { display:grid; grid-template-columns:1fr 1fr; gap:8px; } -.rh-step-choice { padding:12px; border-radius:8px; border:2px solid #f3f4f6; font-size:14px; font-weight:700; background:white; color:#9ca3af; opacity:.6; } -.rh-correct { background:#f0fdf4; border-color:#bbf7d0; color:#15803d; opacity:1; } -.rh-step-url code { font-size:12px; background:#f3f4f6; padding:4px 8px; border-radius:4px; color:#6b7280; word-break:break-all; } - -/* ── Transitions ── */ -.rh-fade-enter-active, .rh-fade-leave-active { transition:opacity .25s ease; } -.rh-fade-enter-from, .rh-fade-leave-to { opacity:0; } \ No newline at end of file + overflow: hidden; + background: #eef2f7; +} + +.portal-header { + min-height: 5.5rem; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1.5rem; + padding: 1rem 2rem; + background: #f8fafc; + border-bottom: 1px solid #dbe3ec; +} + +.portal-header-label { + margin: 0 0 0.2rem; + color: #94a3b8; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.portal-header-title { + margin: 0; + color: #0f172a; + font-size: 1.35rem; + font-weight: 600; +} + +.portal-context { + display: flex; + align-items: center; + gap: 0.75rem; +} + +.portal-context label { + color: #64748b; + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.portal-context select { + min-width: 15rem; + padding: 0.7rem 0.9rem; + background: #f8fafc; + border: 1px solid #cbd5e1; + border-radius: 0.65rem; + color: #1e293b; + font: inherit; + font-size: 0.9rem; + font-weight: 700; + cursor: pointer; +} + +.portal-context select:focus { + border-color: #4f46e5; + outline: none; + box-shadow: 0 0 0 3px rgb(79 70 229 / 12%); +} + +.portal-main { + width: 100%; + min-width: 0; + flex: 1; + min-height: 0; + display: flex; + overflow: hidden; + padding: 1.5rem 2rem; + background: #eef2f7; +} + +@media (max-width: 800px) { + .portal-layout { + display: block; + overflow-y: auto; + } + + .portal-sidebar { + width: 100%; + height: auto; + } + + .portal-navigation { + display: grid; + grid-template-columns: repeat(3, 1fr); + } + + .portal-sidebar-footer { + display: none; + } + + .portal-workspace { + height: auto; + min-height: calc(100vh - 12rem); + } + + .portal-header { + align-items: flex-start; + flex-direction: column; + } + + .portal-context { + width: 100%; + } + + .portal-context select { + flex: 1; + min-width: 0; + } + + .portal-main { + overflow: visible; + padding: 1rem; + } +} diff --git a/app/layouts/admin.vue b/app/layouts/admin.vue index 24b0275b..172ebbcb 100644 --- a/app/layouts/admin.vue +++ b/app/layouts/admin.vue @@ -1,41 +1,83 @@ - - - \ No newline at end of file diff --git a/app/layouts/coach.css b/app/layouts/coach.css new file mode 100644 index 00000000..5f4d66cf --- /dev/null +++ b/app/layouts/coach.css @@ -0,0 +1,251 @@ +html, body { margin: 0; padding: 0; height: 100%; } +#__nuxt { height: 100%; } + +/* ── Shell ── */ +.rh-coach-wrap { + display: flex; + height: 100vh; + overflow: hidden; + background: #f8fafc; + font-family: 'Quicksand', system-ui, sans-serif; + color: #1e293b; +} + +/* ── Sidebar ── */ +.rh-sidebar { + width: 18rem; + flex-shrink: 0; + background: #ffffff; + border-right: 1px solid #e2e8f0; + display: flex; + flex-direction: column; + overflow-y: auto; +} +.rh-sidebar-inner { padding: 24px 24px 0; flex: 1; } + +.rh-logo { display:flex; align-items:center; gap:12px; margin-bottom:32px; } +.rh-logo-icon { width:40px; height:40px; background:#4f46e5; border-radius:8px; display:flex; align-items:center; justify-content:center; color:white; font-weight:700; font-size:1.25rem; } +.rh-logo-name { font-weight:700; font-size:1.1rem; color:#0f172a; line-height:1; } +.rh-logo-accent { color:#4f46e5; } +.rh-logo-sub { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.1em; color:#2dd4bf; margin-top:2px; } + +.rh-nav-label { font-size:12px; font-weight:500; color:#94a3b8; text-transform:uppercase; letter-spacing:.1em; margin-bottom:16px; } +.rh-nav { display:flex; flex-direction:column; gap:4px; } + +.rh-nav-btn { + display:flex; align-items:center; width:100%; + padding:12px 16px; font-weight:500; font-size:15px; + border-radius:0 12px 12px 0; border-left:4px solid transparent; + color:#64748b; cursor:pointer; transition:all .15s; + background:transparent; text-align:left; + border-top:none; border-right:none; border-bottom:none; +} +.rh-nav-btn:hover { background:#f8fafc; } +.rh-nav-active { background:#eef2ff !important; color:#4338ca !important; border-left-color:#4f46e5 !important; font-weight:600 !important; } + +.rh-sidebar-footer { padding:24px; } +.rh-back-link { font-size:14px; color:#94a3b8; font-weight:500; text-decoration:none; } +.rh-back-link:hover { color:#64748b; } +.rh-logout-link { display:block; margin-top:12px; font-size:14px; color:#94a3b8; font-weight:500; background:none; border:none; padding:0; cursor:pointer; font-family:inherit; } +.rh-logout-link:hover { color:#ef4444; } + +/* ── Main ── */ +.rh-workspace { min-width:0; flex:1; display:flex; flex-direction:column; overflow:hidden; } +.rh-header { min-height:5.5rem; flex-shrink:0; display:flex; align-items:center; justify-content:space-between; gap:1.5rem; padding:1rem 2rem; background:#f8fafc; border-bottom:1px solid #dbe3ec; } +.rh-header-label { margin:0 0 .2rem; color:#94a3b8; font-size:.7rem; font-weight:700; letter-spacing:.1em; text-transform:uppercase; } +.rh-header-title { margin:0; color:#0f172a; font-size:1.35rem; font-weight:600; } +.rh-verified-badge, .rh-pending-badge { display:inline-flex; margin-top:6px; padding:4px 8px; border-radius:999px; font-size:11px; font-weight:700; } +.rh-verified-badge { background:#dcfce7; color:#15803d; } +.rh-pending-badge { background:#fef3c7; color:#b45309; } +.rh-main { min-height:0; flex:1; overflow-y:auto; padding:24px 32px; } +.rh-tab-content { max-width:56rem; margin:0 auto; } + +@media (max-width:800px) { + .rh-coach-wrap { height:auto; min-height:100vh; flex-direction:column; overflow:visible; } + .rh-sidebar { width:100%; } + .rh-workspace { overflow:visible; } + .rh-header { align-items:flex-start; flex-direction:column; } +} + +/* ── Spacing helpers ── */ +.rh-space-y-3 > * + * { margin-top:12px; } +.rh-space-y-4 > * + * { margin-top:16px; } +.rh-space-y-5 > * + * { margin-top:20px; } +.rh-space-y-6 > * + * { margin-top:24px; } + +/* ── Cards ── */ +.rh-card { + background:white; padding:20px; border-radius:8px; + border:1px solid #e2e8f0; box-shadow:0 1px 3px rgba(0,0,0,.06); + display:flex; flex-direction:column; gap:16px; +} + +/* ── Buttons ── */ +.rh-btn-ghost { padding:12px 24px; border-radius:8px; font-weight:500; background:white; border:2px solid #e5e7eb; color:#6b7280; cursor:pointer; transition:background .15s; } +.rh-btn-ghost:hover { background:#f9fafb; } +.rh-btn-indigo { padding:12px 24px; border-radius:8px; font-weight:500; background:#4f46e5; color:white; border:none; cursor:pointer; transition:background .15s; box-shadow:0 4px 14px rgba(99,102,241,.3); } +.rh-btn-indigo:hover { background:#4338ca; } +.rh-btn-indigo:active { transform:scale(.97); } +.rh-btn-dark { padding:16px 32px; border-radius:8px; font-weight:700; font-size:1.1rem; background:#111827; color:white; border:none; cursor:pointer; } +.rh-btn-dark:hover { background:black; } + +.rh-btn-sm { padding:8px 16px; border-radius:8px; font-size:14px; font-weight:500; border:none; cursor:pointer; } +.rh-btn-sm-indigo { padding:8px 16px; border-radius:8px; font-size:14px; font-weight:500; border:none; cursor:pointer; background:#eef2ff; color:#4f46e5; } +.rh-btn-sm-indigo:hover { background:#e0e7ff; } +.rh-btn-sm-danger { background:white; color:#6b7280; } +.rh-btn-sm-danger:hover { background:#fef2f2; color:#ef4444; } +.rh-btn-sm-success { background:#f0fdf4; color:#16a34a; } +.rh-btn-sm-success:hover { background:#dcfce7; } + +.rh-flex-gap { display:flex; gap:8px; } + +/* ── Creation bar ── */ +.rh-creation-bar { display:flex; justify-content:space-between; align-items:center; background:#eef2ff; padding:24px; border-radius:8px; border:1px solid #e0e7ff; font-style:italic; } +.rh-creation-title { font-size:1.25rem; font-weight:500; color:#3730a3; } + +/* ── Week row ── */ +.rh-week-row { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center; gap:16px; background:rgba(238,242,255,.5); padding:16px; border-radius:8px; border:1px solid rgba(224,231,255,.5); } +.rh-week-title { font-size:1.1rem; font-weight:500; color:#1e1b4b; } +.rh-tiny-label { font-size:10px; font-weight:500; color:#94a3b8; text-transform:uppercase; letter-spacing:.05em; } + +/* ── Inputs ── */ +.rh-input { font-size:16px; font-weight:500; color:#1f2937; border:2px solid #f1f5f9; border-radius:8px; padding:8px 16px; outline:none; transition:border-color .15s; background:white; width:100%; box-sizing:border-box; } +.rh-input:focus { border-color:#6366f1; } +.rh-title-input { font-size:1.5rem; font-weight:500; color:#1f2937; border:none; border-bottom:2px solid #f1f5f9; outline:none; transition:border-color .15s; padding:8px 0; background:transparent; width:100%; } +.rh-title-input:focus { border-bottom-color:#6366f1; } +.rh-field-input { font-weight:500; color:#1f2937; border:2px solid #f8fafc; background:#f8fafc; border-radius:8px; padding:12px 16px; outline:none; transition:all .15s; font-size:16px; width:100%; box-sizing:border-box; } +.rh-field-input:focus { background:white; border-color:#c7d2fe; } + +/* ── Day pills ── */ +.rh-day-pills { display:flex; flex-wrap:wrap; gap:8px; } +.rh-day-pill { padding:8px 16px; border-radius:8px; font-weight:500; font-size:14px; border:2px solid transparent; background:#f8fafc; color:#94a3b8; cursor:pointer; transition:all .15s; } +.rh-day-pill:hover:not(.rh-day-active) { background:#f1f5f9; } +.rh-day-active { background:#e0e7ff !important; color:#4338ca !important; border-color:#a5b4fc !important; box-shadow:inset 0 1px 3px rgba(0,0,0,.1); } + +/* ── Title row ── */ +.rh-title-row { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:24px; padding-top:16px; border-top:1px solid #f8fafc; } +.rh-preview-date { background:#eef2ff; padding:16px 24px; border-radius:8px; text-align:center; min-width:200px; } + +/* ── Q type buttons ── */ +.rh-q-btns { display:flex; gap:16px; flex-wrap:wrap; } +.rh-q-btn { flex:1; font-weight:500; padding:16px; border-radius:8px; cursor:pointer; min-width:140px; transition:background .15s; } +.rh-q-btn-blue { background:#eff6ff; color:#4f46e5; border:1px dashed #bfdbfe; } +.rh-q-btn-blue:hover { background:#dbeafe; } +.rh-q-btn-gray { background:white; color:#6b7280; border:1px dashed #e5e7eb; } +.rh-q-btn-gray:hover { background:#f9fafb; } +.rh-q-btn-gray2 { background:#f9fafb; color:#4b5563; border:1px dashed #e5e7eb; } +.rh-q-btn-gray2:hover { background:#f3f4f6; } + +/* ── Question card ── */ +.rh-empty { text-align:center; padding:48px 0; color:#9ca3af; border:4px dashed #f3f4f6; border-radius:8px; background:white; } +.rh-q-card { background:white; border:2px solid #f3f4f6; border-radius:8px; padding:24px; position:relative; cursor:move; box-shadow:0 1px 3px rgba(0,0,0,.05); transition:border-color .15s; } +.rh-q-card:hover { border-color:#e0e7ff; } +.rh-q-drag-handle { position:absolute; top:16px; left:16px; color:#d1d5db; } +.rh-q-card:hover .rh-q-drag-handle { color:#818cf8; } +.rh-q-remove { position:absolute; top:16px; right:16px; background:none; border:none; color:#d1d5db; cursor:pointer; font-size:1.1rem; } +.rh-q-remove:hover { color:#ef4444; } + +.rh-q-badge { font-size:12px; font-weight:500; text-transform:uppercase; letter-spacing:.05em; padding:4px 12px; border-radius:9999px; } +.rh-badge-blue { background:#dbeafe; color:#4338ca; } +.rh-badge-green { background:#d1fae5; color:#065f46; } +.rh-badge-red { background:#fee2e2; color:#991b1b; } +.rh-badge-gray { background:#f3f4f6; color:#374151; } + +.rh-grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:16px; } +@media (max-width:768px) { .rh-grid-2 { grid-template-columns:1fr; } } + +/* ── MCQ ── */ +.rh-choice-row { display:flex; align-items:center; gap:12px; } +.rh-choice-letter { width:32px; height:32px; border-radius:9999px; display:flex; align-items:center; justify-content:center; font-weight:700; font-size:14px; flex-shrink:0; background:#f3f4f6; color:#6b7280; } +.rh-choice-correct { background:#10b981; color:white; } +.rh-set-correct { padding:8px 12px; border-radius:8px; font-weight:500; font-size:12px; border:none; cursor:pointer; background:#f3f4f6; color:#9ca3af; } +.rh-set-correct:hover { background:#d1fae5; color:#059669; } +.rh-set-correct-active { background:#10b981; color:white; } +.rh-add-choice { width:100%; padding:12px; border:2px dashed #a7f3d0; color:#10b981; font-weight:500; border-radius:8px; background:transparent; cursor:pointer; } +.rh-add-choice:hover { background:#ecfdf5; } + +/* ── History form rows ── */ +.rh-form-row { background:white; padding:20px 24px; border-radius:24px; border:1px solid #e2e8f0; display:flex; align-items:center; gap:20px; transition:all .2s; } +.rh-form-row:hover { border-color:#a5b4fc; box-shadow:0 2px 8px rgba(99,102,241,.08); } +.rh-unpublished { opacity:.6; } +.rh-week-badge { background:#eef2ff; color:#4338ca; padding:12px; border-radius:8px; display:flex; flex-direction:column; align-items:center; min-width:90px; border:1px solid #e0e7ff; flex-shrink:0; font-size:11px; font-weight:500; } +.rh-day-badge { font-size:11px; font-weight:500; text-transform:uppercase; background:#4f46e5; color:white; padding:2px 8px; border-radius:6px; margin-top:4px; } +.rh-form-actions { display:flex; gap:8px; align-items:center; flex-shrink:0; } +.rh-status-pill { font-size:10px; font-weight:500; text-transform:uppercase; letter-spacing:.1em; padding:6px 12px; border-radius:9999px; } +.rh-active { background:#dcfce7; color:#15803d; } +.rh-inactive { background:#f3f4f6; color:#6b7280; } + +/* ── Progress table ── */ +.rh-th { padding:16px; font-size:12px; font-weight:500; color:#9ca3af; text-transform:uppercase; letter-spacing:.05em; } +.rh-tr { border-bottom:1px solid #f3f4f6; transition:background .15s; } +.rh-tr:hover { background:rgba(238,242,255,.5); } +.rh-tr:last-child { border-bottom:none; } +.rh-td { padding:16px; } +.rh-avatar { width:32px; height:32px; border-radius:9999px; background:#e0e7ff; color:#4338ca; display:flex; align-items:center; justify-content:center; font-size:12px; font-weight:700; box-shadow:0 1px 3px rgba(0,0,0,.1); flex-shrink:0; } +.rh-badge-pill { display:inline-flex; align-items:center; gap:8px; padding:4px 12px; border-radius:8px; font-weight:500; background:#f3f4f6; color:#374151; } + +/* ── Raffle ── */ +.rh-raffle-card { background:white; border-radius:8px; box-shadow:0 25px 50px rgba(0,0,0,.12); padding:48px; max-width:36rem; margin:0 auto; border-bottom:8px solid #818cf8; } +.rh-spin-btn { background:#4f46e5; color:white; font-size:1.5rem; font-weight:500; padding:20px 64px; border-radius:9999px; border:none; cursor:pointer; box-shadow:0 10px 25px rgba(99,102,241,.3); transition:all .2s; } +.rh-spin-btn:hover { background:#4338ca; } +.rh-spin-btn:active { transform:scale(.95); } +@keyframes rhSpin { from { transform:rotate(0deg); } to { transform:rotate(360deg); } } +.rh-spin-emoji { display:inline-block; font-size:6rem; animation:rhSpin .8s linear infinite; margin-bottom:24px; } +@keyframes rhBounce { 0%,100% { transform:translateY(0); } 50% { transform:translateY(-16px); } } +.rh-bounce-emoji { display:inline-block; font-size:6rem; animation:rhBounce 1s ease-in-out infinite; margin-bottom:24px; } + +/* ── Announcements ── */ +.rh-subtab-switch { display:flex; background:#eef2ff; padding:6px; border-radius:8px; border:1px solid #e0e7ff; } +.rh-subtab-btn { padding:10px 24px; border-radius:6px; font-weight:500; border:none; cursor:pointer; transition:all .3s; background:transparent; color:#818cf8; } +.rh-subtab-btn:hover { color:#4f46e5; } +.rh-subtab-active { background:white !important; color:#3730a3 !important; box-shadow:0 2px 8px rgba(0,0,0,.1) !important; } + +.rh-ann-grid { display:grid; grid-template-columns:1fr 1fr; gap:24px; } +@media (max-width:1024px) { .rh-ann-grid { grid-template-columns:1fr; } } + +.rh-btn-post { width:100%; padding:16px; background:#4f46e5; color:white; border:none; border-radius:8px; font-weight:500; font-size:1.2rem; cursor:pointer; box-shadow:0 10px 25px rgba(99,102,241,.25); } +.rh-btn-post:hover { background:#4338ca; } + +.rh-preview-panel { background:rgba(238,242,255,.3); padding:32px; border-radius:8px; border:2px dashed #e0e7ff; display:flex; flex-direction:column; justify-content:center; } +.rh-preview-card { background:white; padding:24px; border-radius:40px; border:1px solid #f3f4f6; box-shadow:0 10px 25px rgba(0,0,0,.08); display:flex; gap:24px; align-items:flex-start; } +.rh-preview-icon { padding:16px; background:#eef2ff; border-radius:16px; font-size:2.5rem; flex-shrink:0; border:1px solid #e0e7ff; display:flex; align-items:center; justify-content:center; min-width:80px; min-height:80px; } + +.rh-ann-item { padding:20px; border-radius:12px; border:2px solid; display:flex; gap:20px; align-items:flex-start; transition:all .2s; } +.rh-ann-active { background:white; border-color:#a5b4fc; } +.rh-ann-active:hover { border-color:#6366f1; } +.rh-ann-expired { background:#f9fafb; border-color:#f3f4f6; opacity:.7; } +.rh-ann-expired:hover { opacity:1; } +.rh-ann-icon { padding:16px; border-radius:12px; font-size:1.875rem; flex-shrink:0; border:1px solid; display:flex; align-items:center; justify-content:center; min-width:80px; min-height:80px; } +.rh-ann-icon-active { background:#eef2ff; border-color:#e0e7ff; } +.rh-ann-icon-expired { background:#f3f4f6; border-color:#e5e7eb; } +.rh-ann-pill { padding:2px 8px; border-radius:9999px; font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; } +.rh-ann-pill-green { background:#dcfce7; color:#15803d; border:1px solid #bbf7d0; } +.rh-ann-pill-gray { background:#e5e7eb; color:#6b7280; border:1px solid #d1d5db; } +.rh-ann-pill-neutral { background:#f3f4f6; color:#4b5563; } + +/* ── Modal ── */ +.rh-modal-backdrop { position:fixed; inset:0; z-index:300; display:flex; align-items:center; justify-content:center; padding:24px; } +.rh-modal-overlay { position:absolute; inset:0; background:rgba(15,23,42,.4); backdrop-filter:blur(4px); } +.rh-modal-box { position:relative; background:white; width:100%; max-width:42rem; border-radius:8px; box-shadow:0 25px 50px rgba(0,0,0,.25); display:flex; flex-direction:column; max-height:90vh; border-bottom:8px solid #4f46e5; overflow:hidden; } +.rh-modal-head { padding:24px; background:#eef2ff; border-bottom:1px solid #e0e7ff; display:flex; justify-content:space-between; align-items:center; } +.rh-modal-title { font-size:1.5rem; font-weight:900; color:#111827; } +.rh-modal-meta { font-size:12px; color:#9ca3af; font-weight:700; text-transform:uppercase; letter-spacing:.1em; margin-top:4px; } +.rh-modal-close { width:48px; height:48px; border-radius:8px; background:white; color:#9ca3af; display:flex; align-items:center; justify-content:center; border:none; cursor:pointer; } +.rh-modal-close:hover { color:#111827; transform:scale(1.1); } +.rh-modal-body { padding:24px; overflow-y:auto; display:flex; flex-direction:column; gap:24px; } +.rh-modal-foot { padding:24px; background:#f9fafb; border-top:1px solid #f3f4f6; display:flex; justify-content:flex-end; } +.rh-modal-step { padding:24px; border-radius:8px; border:2px solid #f9fafb; background:rgba(249,250,251,.5); display:flex; flex-direction:column; gap:12px; } +.rh-step-badge { display:inline-block; background:white; padding:4px 12px; border-radius:6px; font-size:10px; font-weight:900; text-transform:uppercase; letter-spacing:.1em; color:#6366f1; box-shadow:0 1px 3px rgba(0,0,0,.1); width:fit-content; } +.rh-step-text { font-size:1.1rem; font-weight:700; color:#111827; line-height:1.4; } +.rh-step-es { font-size:1rem; color:#6b7280; font-style:italic; font-weight:500; } +.rh-step-ref { padding:16px; background:white; border-radius:6px; border:1px solid #f3f4f6; } +.rh-step-ref-label { font-size:10px; font-weight:900; color:#d1d5db; text-transform:uppercase; letter-spacing:.1em; margin-bottom:4px; } +.rh-step-ref-val { font-size:14px; font-weight:700; color:#6366f1; } +.rh-step-choices { display:grid; grid-template-columns:1fr 1fr; gap:8px; } +.rh-step-choice { padding:12px; border-radius:8px; border:2px solid #f3f4f6; font-size:14px; font-weight:700; background:white; color:#9ca3af; opacity:.6; } +.rh-correct { background:#f0fdf4; border-color:#bbf7d0; color:#15803d; opacity:1; } +.rh-step-url code { font-size:12px; background:#f3f4f6; padding:4px 8px; border-radius:4px; color:#6b7280; word-break:break-all; } + +/* ── Transitions ── */ +.rh-fade-enter-active, .rh-fade-leave-active { transition:opacity .25s ease; } +.rh-fade-enter-from, .rh-fade-leave-to { opacity:0; } diff --git a/app/layouts/coach.vue b/app/layouts/coach.vue new file mode 100644 index 00000000..6f9cd6ba --- /dev/null +++ b/app/layouts/coach.vue @@ -0,0 +1,78 @@ + + + + + + diff --git a/app/middleware/auth.global.ts b/app/middleware/auth.global.ts index de995ab1..bc0b8e42 100644 --- a/app/middleware/auth.global.ts +++ b/app/middleware/auth.global.ts @@ -7,9 +7,10 @@ export default defineNuxtRouteMiddleware(async (to) => { const userRole = session.value?.user?.role const isAdminRoute = to.path.startsWith('/admin') + const isCoachRoute = to.path.startsWith('/coach') const isReaderRoute = to.path.startsWith('/reader') - if (!isLoggedIn && (isAdminRoute || isReaderRoute)) { + if (!isLoggedIn && (isAdminRoute || isCoachRoute || isReaderRoute)) { return navigateTo('/auth') } @@ -20,18 +21,48 @@ export default defineNuxtRouteMiddleware(async (to) => { if (to.path === '/auth') { const requestedRole = Array.isArray(to.query.role) ? to.query.role[0] : to.query.role - if (requestedRole === 'admin') { - return navigateTo(userRole === 'admin' ? '/admin' : '/reader/profile') + if (requestedRole === 'reader') { + return navigateTo('/reader') } - if (requestedRole === 'reader') { - return navigateTo('/reader/profile') + if (userRole === 'admin') { + return navigateTo('/admin') } - return navigateTo(userRole === 'admin' ? '/admin' : '/reader/profile') + if (userRole === 'coach') { + return navigateTo('/coach') + } + + return navigateTo('/reader/profile') } if (isAdminRoute && userRole !== 'admin') { + return navigateTo(userRole === 'coach' ? '/coach' : '/reader/profile') + } + + if (isCoachRoute && userRole !== 'admin' && userRole !== 'coach') { return navigateTo('/reader/profile') } -}) \ No newline at end of file + + if (isCoachRoute && userRole === 'coach') { + const requestFetch = useRequestFetch() + const coach = await requestFetch<{ id: string } | null>('/api/coach/profile') + + if (!coach && to.path !== '/coach/onboarding') { + return navigateTo('/coach/onboarding') + } + + if (coach && to.path === '/coach/onboarding') { + return navigateTo('/coach') + } + } + + if (isCoachRoute && to.path !== '/coach/create-class' && to.path !== '/coach/onboarding' && userRole === 'coach') { + const requestFetch = useRequestFetch() + const classes = await requestFetch>('/api/admin/classes') + + if (classes.length === 0) { + return navigateTo('/coach/create-class') + } + } +}) diff --git a/app/pages/admin/data.vue b/app/pages/admin/data.vue new file mode 100644 index 00000000..6a8d2174 --- /dev/null +++ b/app/pages/admin/data.vue @@ -0,0 +1,1000 @@ + + + + + diff --git a/app/pages/admin/index.vue b/app/pages/admin/index.vue index c124586b..cde0a929 100644 --- a/app/pages/admin/index.vue +++ b/app/pages/admin/index.vue @@ -1,65 +1,500 @@ diff --git a/app/pages/admin/teacher-verification.vue b/app/pages/admin/teacher-verification.vue new file mode 100644 index 00000000..fad96f64 --- /dev/null +++ b/app/pages/admin/teacher-verification.vue @@ -0,0 +1,866 @@ + + + + + diff --git a/app/pages/auth.vue b/app/pages/auth.vue index 5844ecca..a57c6435 100644 --- a/app/pages/auth.vue +++ b/app/pages/auth.vue @@ -4,6 +4,7 @@ definePageMeta({ ssr: false }) import { z } from 'zod' import type { FormSubmitEvent } from '@nuxt/ui' import { authClient } from '~/utils/auth-client' +import { getUserErrorMessage } from '~/utils/user-error' import { onMounted } from 'vue' const toast = useToast() @@ -41,14 +42,14 @@ onMounted(() => { }) const loginRole = computed(() => { - return route.query.role === 'admin' ? 'admin' : 'reader' + return route.query.role === 'coach' ? 'coach' : 'reader' }) const isNewUser = ref(false) const checkingEmail = ref(false) const schema = computed(() => { - if (isNewUser.value && loginRole.value === 'reader') { + if (isNewUser.value) { return z.object({ email: z.string().email('Invalid email'), name: z.string().min(1, 'Name is required'), @@ -74,7 +75,7 @@ async function sendMagicLink(callbackURL: string) { if (error) { toast.add({ title: 'Error', - description: error.message, + description: 'We could not send the magic link. Please try again.', color: 'error', }) return false @@ -84,20 +85,21 @@ async function sendMagicLink(callbackURL: string) { } async function handleSubmit(_event: FormSubmitEvent) { - const callbackURL = loginRole.value === 'admin' ? '/admin' : '/reader/profile' + const callbackURL = loginRole.value === 'coach' ? '/auth?role=coach' : '/reader/profile' - // New reader flow: create account first, then send magic link - if (isNewUser.value && loginRole.value === 'reader') { + // New user flow: create account first, then send magic link + if (isNewUser.value) { const signupResult = await $fetch('/api/users/signup', { method: 'POST', body: { email: state.email, name: state.name, + role: loginRole.value, }, }).catch((error) => { toast.add({ title: 'Error', - description: error?.data?.statusMessage || 'Failed to create account', + description: getUserErrorMessage(error, 'We could not create your account. Please try again.'), color: 'error', }) return null @@ -131,7 +133,7 @@ async function handleSubmit(_event: FormSubmitEvent) { }).catch((error) => { toast.add({ title: 'Error', - description: error?.data?.statusMessage || 'Failed to check email', + description: getUserErrorMessage(error, 'We could not check that email. Please try again.'), color: 'error', }) return null @@ -157,17 +159,7 @@ async function handleSubmit(_event: FormSubmitEvent) { return } - // New admins are not allowed through public signup - if (loginRole.value === 'admin') { - toast.add({ - title: 'Error', - description: 'Admin account not found.', - color: 'error', - }) - return - } - - // New reader: reveal name field + // New user: reveal name field isNewUser.value = true toast.add({ @@ -202,7 +194,7 @@ async function handleSubmit(_event: FormSubmitEvent) {

Signing in as: - {{ loginRole === 'admin' ? 'Faculty & Admin' : 'Reading Buddy' }} + {{ loginRole === 'coach' ? 'Reading Coach' : 'Reading Buddy' }}

@@ -224,7 +216,7 @@ async function handleSubmit(_event: FormSubmitEvent) { ) { size="xl" class="w-full justify-center rounded-2xl h-14 text-xl font-black bg-[#0d1735] hover:bg-[#132149] text-white shadow-xl" > - {{ isNewUser && loginRole === 'reader' ? 'Create Account ✨' : 'Send Magic Link 🪄' }} + {{ isNewUser ? 'Create Account ✨' : 'Send Magic Link 🪄' }} @@ -262,4 +254,4 @@ async function handleSubmit(_event: FormSubmitEvent) { - \ No newline at end of file + diff --git a/app/pages/admin/announcements.vue b/app/pages/coach/announcements.vue similarity index 92% rename from app/pages/admin/announcements.vue rename to app/pages/coach/announcements.vue index 694f2536..13e214ef 100644 --- a/app/pages/admin/announcements.vue +++ b/app/pages/coach/announcements.vue @@ -1,5 +1,6 @@ + + + + diff --git a/app/pages/coach/index.vue b/app/pages/coach/index.vue new file mode 100644 index 00000000..c2b55718 --- /dev/null +++ b/app/pages/coach/index.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/app/pages/coach/onboarding.vue b/app/pages/coach/onboarding.vue new file mode 100644 index 00000000..c85a13e3 --- /dev/null +++ b/app/pages/coach/onboarding.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/app/pages/admin/progress.vue b/app/pages/coach/progress.vue similarity index 96% rename from app/pages/admin/progress.vue rename to app/pages/coach/progress.vue index 7d72e92e..3f4c7dc5 100644 --- a/app/pages/admin/progress.vue +++ b/app/pages/coach/progress.vue @@ -1,5 +1,7 @@ - - - - \ No newline at end of file diff --git a/app/pages/reader/index.vue b/app/pages/reader/index.vue index f7c54adf..3b76a1a6 100644 --- a/app/pages/reader/index.vue +++ b/app/pages/reader/index.vue @@ -1,102 +1,291 @@ diff --git a/app/pages/reader/profile.vue b/app/pages/reader/profile.vue index f850758e..b47e4b81 100644 --- a/app/pages/reader/profile.vue +++ b/app/pages/reader/profile.vue @@ -51,7 +51,7 @@ function getCardColor(index: number) { async function selectStudent(selectedStudent: Student) { setStudent(selectedStudent) - await navigateTo('/reader/home') + await navigateTo('/reader') } async function createStudent() { @@ -74,7 +74,7 @@ async function createStudent() { name.value = '' newStudentLanguage.value = 'en' showCreateForm.value = false - await navigateTo('/reader/home') + await navigateTo('/reader') } catch (error) { console.error('Failed to create student', error) } finally { @@ -222,4 +222,4 @@ onMounted(() => { - \ No newline at end of file + diff --git a/app/pages/reader/settings.vue b/app/pages/reader/settings.vue index 3ec98880..450626ee 100644 --- a/app/pages/reader/settings.vue +++ b/app/pages/reader/settings.vue @@ -122,7 +122,7 @@ watch(settings, (newSettings) => { class="absolute top-4 left-0 right-0 w-full max-w-4xl mx-auto flex justify-end items-center px-6 z-[200]" > 🏠 @@ -327,4 +327,4 @@ watch(settings, (newSettings) => { - \ No newline at end of file + diff --git a/app/utils/user-error.ts b/app/utils/user-error.ts new file mode 100644 index 00000000..29dba69d --- /dev/null +++ b/app/utils/user-error.ts @@ -0,0 +1,23 @@ +type ApiError = { + data?: { + statusMessage?: unknown + } +} + +export function getUserErrorMessage(error: unknown, fallback: string) { + if (!error || typeof error !== 'object') { + return fallback + } + + const statusMessage = (error as ApiError).data?.statusMessage + + if ( + typeof statusMessage !== 'string' || + !statusMessage.trim() || + /^(internal )?server error$/i.test(statusMessage.trim()) + ) { + return fallback + } + + return statusMessage +} diff --git a/package.json b/package.json index 512aa10e..6118ca06 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,13 @@ "zod": "^4.2.1" }, "devDependencies": { + "@tailwindcss/vite": "^4.3.2", "@types/better-sqlite3": "^7.6.13", "concurrently": "^9.2.1", "prettier": "3.7.4", "prettier-plugin-tailwindcss": "^0.7.2", "prisma": "^7.5.0", + "tailwindcss": "^4.3.2", "tsx": "^4.21.0" }, "prisma": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26f56da3..9a8540e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,10 +16,10 @@ importers: version: 10.3.0 '@nuxt/image': specifier: 2.0.0 - version: 2.0.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.17) + version: 2.0.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.22) '@nuxt/ui': specifier: ^4.4.0 - version: 4.9.0(0323eb8694725dcf265b82e0ce589dea) + version: 4.9.0(bc491f4d0a191011a92771b27ca117df) '@prisma/adapter-better-sqlite3': specifier: ^7.5.0 version: 7.8.0 @@ -34,7 +34,7 @@ importers: version: 7.0.12 better-auth: specifier: ^1.4.7 - version: 1.6.22(@prisma/client@7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3))(better-sqlite3@12.11.1)(mysql2@3.15.3)(pg@8.22.0)(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.39(typescript@6.0.3)) + version: 1.6.23(@prisma/client@7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3))(better-sqlite3@12.11.1)(mysql2@3.15.3)(pg@8.22.0)(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.39(typescript@6.0.3)) better-sqlite3: specifier: ^12.6.2 version: 12.11.1 @@ -52,7 +52,7 @@ importers: version: 7.0.13 nuxt: specifier: ^4.3.1 - version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.0.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(yaml@2.9.0) + version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(yaml@2.9.0) pg: specifier: ^8.20.0 version: 8.22.0 @@ -66,12 +66,15 @@ importers: specifier: ^4.2.1 version: 4.4.3 devDependencies: + '@tailwindcss/vite': + specifier: ^4.3.2 + version: 4.3.2(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) '@types/better-sqlite3': specifier: ^7.6.13 version: 7.6.13 concurrently: specifier: ^9.2.1 - version: 9.2.3 + version: 9.2.4 prettier: specifier: 3.7.4 version: 3.7.4 @@ -81,9 +84,12 @@ importers: prisma: specifier: ^7.5.0 version: 7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3) + tailwindcss: + specifier: ^4.3.2 + version: 4.3.2 tsx: specifier: ^4.21.0 - version: 4.22.4 + version: 4.23.1 packages: @@ -176,8 +182,8 @@ packages: resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@8.0.2': - resolution: {integrity: sha512-9Fr9QeyCAyi1BR1jKZ6uYQ24EIhQUx5ReHfQU7drOE+TPOb+w11/dsqLkMOT2U29OdCT71XajrOT8xDc1C7orA==} + '@babel/helper-validator-identifier@8.0.4': + resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-validator-option@7.29.7': @@ -193,8 +199,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@8.0.0': - resolution: {integrity: sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==} + '@babel/parser@8.0.4': + resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} engines: {node: ^22.18.0 || >=24.11.0} hasBin: true @@ -228,12 +234,12 @@ packages: resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - '@babel/types@8.0.0': - resolution: {integrity: sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==} + '@babel/types@8.0.4': + resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} engines: {node: ^22.18.0 || >=24.11.0} - '@better-auth/core@1.6.22': - resolution: {integrity: sha512-aFH/5nzmR501jAJPKjJfiVg4BrkcjVCqq9WS9JnhTruE/2PIWopv1QGMiRIRqxXaPbHczri7cqRdhep3Lg5PMw==} + '@better-auth/core@1.6.23': + resolution: {integrity: sha512-beEhOs0uVeOxYOZKUfIEBd/nQV2Bd4/6wyLxZ0OFkn6CMTK2Vi+hXuZLnyPBeB6RdHpebEoJWiHqwHxBIxgPDQ==} peerDependencies: '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -249,46 +255,46 @@ packages: '@opentelemetry/api': optional: true - '@better-auth/drizzle-adapter@1.6.22': - resolution: {integrity: sha512-uNa9qH53CfxBmuKP8kbLWxY90oIRwUPn5BcHhO+szK05e2yh6EYwSNNivDSqV3YG5HPfjtPHulklInjq1wtm3w==} + '@better-auth/drizzle-adapter@1.6.23': + resolution: {integrity: sha512-2+/PTVfIP9E7iz6af8TB3lhnowHUj9ljC66kECmHaFEdUqPgzHoWux9epotKwO7XDg2ui4ttWQ8CMeNFLvQeKQ==} peerDependencies: - '@better-auth/core': ^1.6.22 + '@better-auth/core': ^1.6.23 '@better-auth/utils': 0.4.2 drizzle-orm: ^0.45.2 peerDependenciesMeta: drizzle-orm: optional: true - '@better-auth/kysely-adapter@1.6.22': - resolution: {integrity: sha512-4k/07lPRizlQi+B+uOE5CwTfH3w+Lq8ZDX1nDN1+e+glRVKAIfHoLvC9cfAVcCbio3DDrl0RTbwjLwjEhG0LxA==} + '@better-auth/kysely-adapter@1.6.23': + resolution: {integrity: sha512-zbNJsMbG09exfkGyvFqBLLqWoMPAUWjxCuUnEK5AsjbYoZeIjj/QGZgdf4CapVWryKxjA9Q6Jlr6fbiPpC3VAg==} peerDependencies: - '@better-auth/core': ^1.6.22 + '@better-auth/core': ^1.6.23 '@better-auth/utils': 0.4.2 kysely: ^0.28.17 || ^0.29.0 peerDependenciesMeta: kysely: optional: true - '@better-auth/memory-adapter@1.6.22': - resolution: {integrity: sha512-rbepe/gHhWs0aF4fAu6+l+wNPJxT9XN4U+Hqa1Y/5HhjtT9y5evo3INrSWlkIOymsMaQ0cBPrSL5pm9Z195hcA==} + '@better-auth/memory-adapter@1.6.23': + resolution: {integrity: sha512-krIiR0pIVkaKlAzm690n5bcMW4NGbqeMg0HQSD9fz/KcQF/eWLqcq9gG/BhHTj2i/y96qH+W5JWPmaSOS5iTgQ==} peerDependencies: - '@better-auth/core': ^1.6.22 + '@better-auth/core': ^1.6.23 '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.6.22': - resolution: {integrity: sha512-OYnfySHlVkIx7y6XNBsCHjKhl6IYGprRkFwifc/TAuPBVjoRKhLKRAXuzMdWTQYFt4FYb6holbhjNUrXxPIWcw==} + '@better-auth/mongo-adapter@1.6.23': + resolution: {integrity: sha512-7+QdevitGlKBbP6JbiSk5SBnzPsKV/mDrQBGBn8hwByQLeJwqpqbuBPw7ZI8vzUlFfAAnyFiqwP3Eb8mxnp7pA==} peerDependencies: - '@better-auth/core': ^1.6.22 + '@better-auth/core': ^1.6.23 '@better-auth/utils': 0.4.2 mongodb: ^6.0.0 || ^7.0.0 peerDependenciesMeta: mongodb: optional: true - '@better-auth/prisma-adapter@1.6.22': - resolution: {integrity: sha512-I6lWQwLva732V600u5dLM2kRcQ94pRZOVVfZ87+Ow9RBxMUnV+I+YQ5h2yggdN2tmsmITacZTy1DSZbDxGu0LQ==} + '@better-auth/prisma-adapter@1.6.23': + resolution: {integrity: sha512-2qSdzidq4tkb1eS5TTqb4Nzg0mdZWm3Qky9SYeXeb8PpVQbC2sxqJhEM5mK7y12uU6I8hc64wO9f7AFVNL+6UQ==} peerDependencies: - '@better-auth/core': ^1.6.22 + '@better-auth/core': ^1.6.23 '@better-auth/utils': 0.4.2 '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -298,10 +304,10 @@ packages: prisma: optional: true - '@better-auth/telemetry@1.6.22': - resolution: {integrity: sha512-glq/oEk9qP+zGh9k/WUH5+pwvBCMolNNhaAVBCtYQrkADFee2gP3VoPs1YeO9coNuOmBhc+AYSIHs+fL9DoJnw==} + '@better-auth/telemetry@1.6.23': + resolution: {integrity: sha512-/R2Kb+z2BpDOOWwVHqOk+c0VNpuwfCv4Hp5Yr9003WIZPax/zyNraGLB9CFE8qF2gZW8Dsz419k4I8CPrGzpDA==} peerDependencies: - '@better-auth/core': ^1.6.22 + '@better-auth/core': ^1.6.23 '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -311,13 +317,13 @@ packages: '@better-fetch/fetch@1.3.1': resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==} - '@bomb.sh/tab@0.0.17': - resolution: {integrity: sha512-rGhqfWwaSF6qN5Gm5P9EH9eybrwLEowHTkV+wsRgFewT6aQCQWVWXLclVk0McgVIlWCGX+W9mYYC1Egsg+Znsw==} + '@bomb.sh/tab@0.0.19': + resolution: {integrity: sha512-dTRfo9Q9B+lbLG3JCu8a/AGQSfD2XXcFcnakQzVjSOX+VvR/s9zpsH8TlqV3iHqazniRn1Ypwd1hcRlXcu/4BA==} hasBin: true peerDependencies: cac: ^6.7.14 citty: ^0.1.6 || ^0.2.0 - commander: ^13.1.0 + commander: ^13.1.0 || ^14.0.0 || ^15.0.0 peerDependenciesMeta: cac: optional: true @@ -330,12 +336,12 @@ packages: resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} engines: {node: '>=18'} - '@clack/core@1.4.2': - resolution: {integrity: sha512-0Ty/1Gfm+Kb07sXcuESjyKfwEhSy4Ns1AgeEisHb/bDY5fWme0tTeTkU14T1Gmcs17YIjB/teiDe4uaCghbYqQ==} + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} engines: {node: '>= 20.12.0'} - '@clack/prompts@1.6.0': - resolution: {integrity: sha512-EYlRokl8szrP9Z25qT5aepMdBjzBvHF9ZEhzIiUBc9guz/T31EqRgvD0QSgZcpE93xiwrr+OkB4nz0BZyF6fSA==} + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} engines: {node: '>= 20.12.0'} '@cloudflare/kv-asset-handler@0.4.2': @@ -376,8 +382,8 @@ packages: '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -704,14 +710,14 @@ packages: '@fastify/accept-negotiator@2.0.1': resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} '@floating-ui/vue@1.1.11': resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} @@ -722,14 +728,14 @@ packages: peerDependencies: hono: ^4 - '@iconify/collections@1.0.702': - resolution: {integrity: sha512-m7h8TtCgpXJMb8Yt5bFiFyc8K7LZYI4UQIlBBd6A3GY0iPA9RoOI+8zSHp+9qN+ffcKxC3ePcLtKcJ0p9DWNEA==} + '@iconify/collections@1.0.709': + resolution: {integrity: sha512-OlZYlcoErs1ZTxzSCGxBQuARNSagjgATh2qB4Vx0yt0o+D2zsdNZvDZ4ifqfEt+2UbQNLnlLYLnz5t4zQ8uCgw==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.3': - resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==} + '@iconify/utils@3.1.4': + resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} '@iconify/vue@5.0.1': resolution: {integrity: sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==} @@ -965,8 +971,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nuxt/cli@3.36.1': - resolution: {integrity: sha512-qu0LLFjOr1alMSrcVb3k3fWYXGeETeOIN5UoGoGEjwWVtf+KxQbN5IAzdXb7ip5D3pfKLcrAOTbIGf9XFmeGFQ==} + '@nuxt/cli@3.37.0': + resolution: {integrity: sha512-Zj9NwHjEBzVrgezsgMFjpMhNqwNgROk9DzNi/dyfk1mCbXIRigV11br2xOl0Satek30bmv7oZAfMtCnDe6Ip0Q==} engines: {node: ^16.14.0 || >=18.0.0} hasBin: true peerDependencies: @@ -1000,8 +1006,8 @@ packages: '@nuxt/fonts@0.14.0': resolution: {integrity: sha512-4uXQl9fa5F4ibdgU8zomoOcyMdnwgdem+Pi8JEqeDYI5yPR32Kam6HnuRr47dTb97CstaepAvXPWQUUHMtjsFQ==} - '@nuxt/icon@2.2.4': - resolution: {integrity: sha512-qbiEpTJ7ZSJrO9eJ1HPeZLYClDFfEdphe0llMr6A7lPSXOMFDWJ28VVS5VEuIwmZsQJ4AoLIt7EAHkqevA5Rkw==} + '@nuxt/icon@2.3.1': + resolution: {integrity: sha512-ebx7Zp08eR0Mw3zFAh3aT+t5zC4RoI0Xf0wLEfbv23LIPUQ9fvxYpofNiNZdG9m96Fvc3pQu6v+NaCRbRYRRog==} '@nuxt/image@2.0.0': resolution: {integrity: sha512-otHi6gAoYXKLrp8m27ZjX1PjxOPaltQ4OiUs/BhkW995mF/vXf8SWQTw68fww+Uric0v+XgoVrP9icDi+yT6zw==} @@ -1117,8 +1123,8 @@ packages: '@nuxtjs/color-mode@4.0.1': resolution: {integrity: sha512-eiA7hWXi5zNHaYKyJFCGF6i0wFZtuvR7KDXZ6jiSvwxjCpRFwphrw0MOSmNfArTSSsT1wpW+/2H92cejeVfUlg==} - '@opentelemetry/semantic-conventions@1.41.1': - resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} engines: {node: '>=14'} '@oxc-minify/binding-android-arm-eabi@0.133.0': @@ -1991,69 +1997,69 @@ packages: '@swc/helpers@0.5.23': resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} - '@tailwindcss/node@4.3.1': - resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==} + '@tailwindcss/node@4.3.2': + resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==} - '@tailwindcss/oxide-android-arm64@4.3.1': - resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==} + '@tailwindcss/oxide-android-arm64@4.3.2': + resolution: {integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.3.1': - resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==} + '@tailwindcss/oxide-darwin-arm64@4.3.2': + resolution: {integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.3.1': - resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==} + '@tailwindcss/oxide-darwin-x64@4.3.2': + resolution: {integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.3.1': - resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==} + '@tailwindcss/oxide-freebsd-x64@4.3.2': + resolution: {integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1': - resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': + resolution: {integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.3.1': - resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': + resolution: {integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.3.1': - resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.2': + resolution: {integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.3.1': - resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.2': + resolution: {integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.3.1': - resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==} + '@tailwindcss/oxide-linux-x64-musl@4.3.2': + resolution: {integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.3.1': - resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==} + '@tailwindcss/oxide-wasm32-wasi@4.3.2': + resolution: {integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -2064,27 +2070,27 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.3.1': - resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': + resolution: {integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.3.1': - resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.2': + resolution: {integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.3.1': - resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==} + '@tailwindcss/oxide@4.3.2': + resolution: {integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==} engines: {node: '>= 20'} - '@tailwindcss/postcss@4.3.1': - resolution: {integrity: sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A==} + '@tailwindcss/postcss@4.3.2': + resolution: {integrity: sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==} - '@tailwindcss/vite@4.3.1': - resolution: {integrity: sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==} + '@tailwindcss/vite@4.3.2': + resolution: {integrity: sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 @@ -2092,8 +2098,8 @@ packages: resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} - '@tanstack/virtual-core@3.17.2': - resolution: {integrity: sha512-w43MvWvmShpb6kIC9MOoLyUkLmRTLPjt61bHWs+X29hACSpX+n8DvgZ3qM7cUfflKlRRcHR9KVJE6TmcqnQvcA==} + '@tanstack/virtual-core@3.17.4': + resolution: {integrity: sha512-nGm5KteqxasUdThLc2izl6dHUqLv0LQj7Nuyo5gYalTPf/U8a9ermvsl7reT+6ioBW1l8WfpP/mcU338nLXpqw==} '@tanstack/vue-table@8.21.3': resolution: {integrity: sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==} @@ -2101,221 +2107,222 @@ packages: peerDependencies: vue: '>=3.2' - '@tanstack/vue-virtual@3.13.30': - resolution: {integrity: sha512-5IpTZf5US81z9CHaRm2imVC44WDU1V/pd8mN1OIvIerRmo6C179UN+vnzlO/dx9Fpt9X7Rjl7fyvolPhPgtfqg==} + '@tanstack/vue-virtual@3.13.32': + resolution: {integrity: sha512-E8OCutx7QnwZdvpJijz0Q2PHsYDWBWjnGr3TvgWiqxTU35jB1kVhtkd93scRV7tTFuId2tg3x2iFiw+IE4evjQ==} peerDependencies: vue: ^2.7.0 || ^3.0.0 - '@tiptap/core@3.27.1': - resolution: {integrity: sha512-rV6Qn4wmC6BxfF+4mu6bqGWj9vA4oXXhsrpXaJL2uhjxeHAGofjwcHof2X84VYzeyXgdlsGmqKie4TAppVXZUQ==} + '@tiptap/core@3.27.4': + resolution: {integrity: sha512-8W/GwlEn0JwNdpyVfTWcXwHYUpj9BWwO++YxtizmgjJzlwigSh7/xLVJMwVykuQHQ2fCq5rkUvmBRtpHOMLUQA==} peerDependencies: - '@tiptap/pm': 3.27.1 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-blockquote@3.27.1': - resolution: {integrity: sha512-VMF7xJx6qEGiX6DTKNiL31NLqypOcd/4sNjFSe8rb41PwejBJh/nOqVIbBvWkiT6NMGFLxMhj7zJ8/zPo1hXeg==} + '@tiptap/extension-blockquote@3.27.4': + resolution: {integrity: sha512-d1tOHgP3R5cOE+Ot8qL/dkLXRByajgn+j6cCXHqDtmJO2wsK9knmbKQ0SEjbKrU6OgHrTnY/EotNxBEBW9HGoA==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-bold@3.27.1': - resolution: {integrity: sha512-TlC5bsS+pqETTrlz4CZz9RO/cKBYtELGIxwtKeivUn3eNfnOxQbbu4WDsiwIfzRFyd0OMnKl6BPM2KnYEehoEQ==} + '@tiptap/extension-bold@3.27.4': + resolution: {integrity: sha512-wTtJUUAxCAZ01ICH2DNlOBzzHKRQ1ZST8aRYtIhBPzqEUhnJaKGcjnDB4X49fqPi48iXaPxzhsInDl+rVUujWg==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-bubble-menu@3.27.1': - resolution: {integrity: sha512-j/j8Qp9Z5nViade2m7zjrO/CYH/Ca80Qj7aqo0eUaei6FZQ5izlF9o4XQU5EFMAutV6mwynsPUp8FVo5sCuYfw==} + '@tiptap/extension-bubble-menu@3.27.4': + resolution: {integrity: sha512-Poy7xwcD3POG5ew/TW7mYXv7m++vCchvHxPUqIfnTxBxvvvqDZkPYFWZS1lvPrSBtm1DcfUTQAgVutM5NDZ99Q==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-bullet-list@3.27.1': - resolution: {integrity: sha512-faCUHnRP47o9Zh9VZZX6EX/569udw9Vopm2PgEKPWuKLE2qaS5WBuUVU0iItdJmKUqaWiOZkpoW4jvnDmj0dfg==} + '@tiptap/extension-bullet-list@3.27.4': + resolution: {integrity: sha512-rvja0N1RnwGJAVwDdbUfDIJ4NoT+KjPFaZudKiPuEMfMHfbqe4xcbbC2hsfs61JNcl2xmx+ohV6lzD9YxxJl1w==} peerDependencies: - '@tiptap/extension-list': 3.27.1 + '@tiptap/extension-list': 3.27.4 - '@tiptap/extension-code-block@3.27.1': - resolution: {integrity: sha512-pHlzmZx2OlHfyQ0yRlT5UL4mGokz947DthZuYefN1OleVqOkHpWBG+2JQwqoNq6bmzMne92zbH32rhcJUEYSjA==} + '@tiptap/extension-code-block@3.27.4': + resolution: {integrity: sha512-a5caWfWN6Z6usy48vzJDDOhWoA6+rFFCHGpQM7jXn/7rRzYPcvBzTZUGptjEbltj4YqtrQ2tVwTJcCtbb+mknA==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-code@3.27.1': - resolution: {integrity: sha512-epOUpFfEmBzjvnqvjv2qHX7NAuLo5dlOGV690lWu+sAYMjibuJBeVvAiKPyFCfRCCTUxdbDB3jbaOA1yEcEJ7w==} + '@tiptap/extension-code@3.27.4': + resolution: {integrity: sha512-aPc7opCR1ylK4m4c2lsjLsGpEBD1fLQQKWd5PbZiJvrTF8gkdGZlYLt9A6VukpxeJyHhb22Jaj4fxgKmGMeTtw==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-collaboration@3.27.1': - resolution: {integrity: sha512-Da7WeKNIaLsbcHBWlgexMgm5ygoA1mhRroFND1vweLNsWIPxvyjci7jrq/uDN1tSnpqMlJsdyW0tXzbVGYTpMw==} + '@tiptap/extension-collaboration@3.27.4': + resolution: {integrity: sha512-l3jmzFhuzCgE1upc2GeO/jDueijeE/RIdSWfnWr8uVyB+chzfeaZjz/aDl25i43UC5Q0XBkYYh5QlVH+5rVXcw==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 - '@tiptap/y-tiptap': ^3.0.5 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 + '@tiptap/y-tiptap': ^3.0.6 yjs: ^13 - '@tiptap/extension-document@3.27.1': - resolution: {integrity: sha512-8FbBTkfnRP4iVaoj+2h3iWa+H0eGDD3yTyVCwrmue/sQTkqUNUoSuAZa3GDG4Sd41xdPwTJxl9nUWGgM1qDCnw==} + '@tiptap/extension-document@3.27.4': + resolution: {integrity: sha512-7nAqgfkgb9HADBeCTnOHuTiyZuxfxvMPT3nH4OZeY+cmtkI1On3QffqlmtcUPvNbkhT3o9ehA1hVfCnQ1Ye4LQ==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-drag-handle-vue-3@3.27.1': - resolution: {integrity: sha512-ccVg6gsv1Tsf2Vio8t3xRSLBigr7INO11cF2VEI8K4A4JCE8ZrhOr5bMA76XHHwxejb/e5NE/tFhdLUjPnLS2g==} + '@tiptap/extension-drag-handle-vue-3@3.27.4': + resolution: {integrity: sha512-yDwkwJU1Mujf94NIwudSKMIoP87d4VfUI0rElD6uH2wlqSYgeLWTtqllgvzNFTQ1SgZFwJ6L2uW47O6yX0p1mg==} peerDependencies: - '@tiptap/extension-drag-handle': 3.27.1 - '@tiptap/pm': 3.27.1 - '@tiptap/vue-3': 3.27.1 + '@tiptap/extension-drag-handle': 3.27.4 + '@tiptap/pm': 3.27.4 + '@tiptap/vue-3': 3.27.4 vue: ^3.0.0 - '@tiptap/extension-drag-handle@3.27.1': - resolution: {integrity: sha512-DGzthoQEgPPbbwy/tY314AF1SV/1gIGQYlU/R6GWxegc7h/5/Qp1SopjguyuZwoO5BPwyBZXa9J/f58MeHQOWw==} + '@tiptap/extension-drag-handle@3.27.4': + resolution: {integrity: sha512-iHnpBq1RU1TWLfKzyKwEVJ68wCoRcX/4IvQqaTFapwdTuIk2ytwsyPqU2zXY4P4/mNojk6BuIYLSprzO8C2IVw==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/extension-collaboration': 3.27.1 - '@tiptap/extension-node-range': 3.27.1 - '@tiptap/pm': 3.27.1 - '@tiptap/y-tiptap': ^3.0.5 + '@tiptap/core': 3.27.4 + '@tiptap/extension-collaboration': 3.27.4 + '@tiptap/extension-node-range': 3.27.4 + '@tiptap/pm': 3.27.4 + '@tiptap/y-tiptap': ^3.0.6 - '@tiptap/extension-dropcursor@3.27.1': - resolution: {integrity: sha512-blFf9x9RG0Qr7P3FoAH/033ffa+mMLZn34trVs8Vi0Ppk6FmJAg5HpYFOtmYoeREdNDJ5rHJKV7SoACbOHgskQ==} + '@tiptap/extension-dropcursor@3.27.4': + resolution: {integrity: sha512-RiZasQJuUTUO3aME16Bn8eJH7cYnvhT5JCFDFq0ya/1iFI9wUQA2NJC5tb5TrZ74+sQwkYU9VzexnchM481Y9w==} peerDependencies: - '@tiptap/extensions': 3.27.1 + '@tiptap/extensions': 3.27.4 - '@tiptap/extension-floating-menu@3.27.1': - resolution: {integrity: sha512-BmJF1VqB7dSJkgAalrpVFj88WLhxKjcWPuWHOqf2ITrUU2832BhKLXKmxjWUy1gqV8PfNNVWtGfIERy7I0y0+Q==} + '@tiptap/extension-floating-menu@3.27.4': + resolution: {integrity: sha512-tnZywwoNDuEcUZmYYIztXl3PpIKUq+gKeaYPuZhpYEVTThU44tzK3ZuFOmd+qf2aAa1MQwxKWqUuLpNK77bwNw==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-gapcursor@3.27.1': - resolution: {integrity: sha512-QoezN0wdvXIwLQ4ee2ccWDaX3RG0lzgQpIMpMz55oPDhpUVax1+19ApsS53LkcktpS4EbnPL4xO4DaJk0Vp7PQ==} + '@tiptap/extension-gapcursor@3.27.4': + resolution: {integrity: sha512-svLwSKcFhzpcJeXvxxKkRFuQpykmXrQefVhEsaXq0L95yJIIAGKMRmQC3mxKdzL2j0P9cY7V41bNVSyOAyvclw==} peerDependencies: - '@tiptap/extensions': 3.27.1 + '@tiptap/extensions': 3.27.4 - '@tiptap/extension-hard-break@3.27.1': - resolution: {integrity: sha512-iv/m9hzl6jfSj9Q8UEjAxONvCoUDaP7M9SRCPx3PaLNxA230TTD6RE0Ye4zFJ8ze7ZVoJJMAqg9Qpq1iYg2JOQ==} + '@tiptap/extension-hard-break@3.27.4': + resolution: {integrity: sha512-W+Z9pmDgqjbdu3NeZOQrzA15iM4w60Yd8l2CYzxcdApPVIfYzb2S3a7+u1RqW9wnTYb6xyZjASmFNfxXS4P4cg==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-heading@3.27.1': - resolution: {integrity: sha512-SrC4l1kEIyv9ZXFaI/8LQqU2MyMmjczw7XXsWUQOTN4YXv0JyVgMNR3cI/wz0d2xsTfBdZ1N85Tdng+Ga1t0Sg==} + '@tiptap/extension-heading@3.27.4': + resolution: {integrity: sha512-RgvpxzuYk6QEK+az+eiXpWvGlUso42zNcGnjyUrvskoZjS47MbhSg8ylRYQSRtXE0ETlXhAx4J7iGlGr72kyIw==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-horizontal-rule@3.27.1': - resolution: {integrity: sha512-QlKE7qn5qMnIGVGhXQlvYedvLtNJ9z0dmit5w8vPb8tKzW4Spk6M7N2kruprrDA8GBwHfeR5wmF+njfUm34qxg==} + '@tiptap/extension-horizontal-rule@3.27.4': + resolution: {integrity: sha512-2eQU/55nE5mhMJHALtLMuBL3dcVJUDVVT7n+uZYMaYE63BtCvC4VS08YLFSR7JZSVJIlgVAmdt5nAw0B+rEPNA==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-image@3.27.1': - resolution: {integrity: sha512-+JTahgQT+NxiGjduaB3qJVyhU/wh4m3pVkht1Earioku2bm/apj5Lb8rSowa/NJYP3B+oQgV/V4YLw5dtDgBoA==} + '@tiptap/extension-image@3.27.4': + resolution: {integrity: sha512-yQ8CazyOL4z1/NbV1NLGv6DvchVhOXHH3uQ7md5VX/IGZruFpnm8IpF9MDpdAUxUFmTsXJDYyO2lWGO1PYWG8A==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-italic@3.27.1': - resolution: {integrity: sha512-jGGeyn9uRUnNjSTHpbqhiGsp6KaYTSbV09jDXPJI9cDwfV9hpugLvpaCZd0BMBbhU1B1W6kOfX0BE15qX/HQfA==} + '@tiptap/extension-italic@3.27.4': + resolution: {integrity: sha512-PeZT4XbyxAp7Lqo/hfA1k5LI27g1RlgS+YgXp2CeHXIrUfSpO5HlZXh02Bvb0pOdl3RFw2tEKtlHzjt8Y1+Nwg==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-link@3.27.1': - resolution: {integrity: sha512-/2jBfsxBZUDGJmpZifqRQPz7f1E5qpS1BckTZ39TADzUJX+feKy7RJ3DtQ02+8y6SSMzvP9loGVjrk6zEMTk4g==} + '@tiptap/extension-link@3.27.4': + resolution: {integrity: sha512-6K/FkNwMLWWQbNWKlycrUPTN7YcyVFdFwZncoBXe5WyarRjLTGw7ywafnCI9PDIWSq7ttzVL4NgjN2IN8kBXww==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-list-item@3.27.1': - resolution: {integrity: sha512-zwRl01ETfCkWUvtvK5fw9bXtAajMPkvlkE3Cq6JvH3LF7XXJwDtNj5Tj7exacMpCaSZmlNc43vFb2rAYnrnwMA==} + '@tiptap/extension-list-item@3.27.4': + resolution: {integrity: sha512-z5TVuPw2mkK0B/x+gFg3uUV7tBdaElDFg0zVgnXZCqlSVTLfIyInOOnG5LTWoAd9BdzBjGrzE3PohDcLVDDGBQ==} peerDependencies: - '@tiptap/extension-list': 3.27.1 + '@tiptap/extension-list': 3.27.4 - '@tiptap/extension-list-keymap@3.27.1': - resolution: {integrity: sha512-OIMZNlzPSO8WRd4ic73Fxckzl4N1tesjjLL2XApaNA/uMpO0LoF6WSRPAWv+Z24Wp92ARRJAnRP7iZoI5+Jxig==} + '@tiptap/extension-list-keymap@3.27.4': + resolution: {integrity: sha512-on7JNDi7Eqz7UdZeZdiO83bQHo0flVDHzjmtR+v/nrCGW9H15D3CHs5+4ozLDiCvTK8tbkBuut/l9AWNxcCE/Q==} peerDependencies: - '@tiptap/extension-list': 3.27.1 + '@tiptap/extension-list': 3.27.4 - '@tiptap/extension-list@3.27.1': - resolution: {integrity: sha512-c2Upru7lj0/ZV/Ibww6cNz6sUS8m6Dp/9uygFhYcZOd3X8M0xBIEk42c6m6SQehkPziVA8QOgNJz7sMqsbz1OQ==} + '@tiptap/extension-list@3.27.4': + resolution: {integrity: sha512-A0BgmRO1RE0yLCx9w7GQITtKfS9wLE5cdngSYDiSpwulcXJhJjKm5mZ4OUZmks2VN4HO5jMl2BWCGt2NSDhA+w==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-mention@3.27.1': - resolution: {integrity: sha512-QfaKdl8PET01JvEFrIjMcOC1iYrBm2tsZEn07J1AaCqClW9iWcg/nCAdkdFhVir1fC54SLuaui43xslBawQRFg==} + '@tiptap/extension-mention@3.27.4': + resolution: {integrity: sha512-xtUQYpCaXWIGwn6qYOZiW3Udx5XPI30yC/KX4yzPtgKYYfbK5jUaHZ4hz4vXPj5jO4b0fgKFusV7I7iqnbeLJw==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 - '@tiptap/suggestion': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 + '@tiptap/suggestion': 3.27.4 - '@tiptap/extension-node-range@3.27.1': - resolution: {integrity: sha512-30OkvZA2+mtupOSihSyRyRAgoVP+RHXs0AT/2DCWc3NHwg+SHo/OrB/S5zsOW9p74Q+6V3hd1K3Nw6Qp9F9M0Q==} + '@tiptap/extension-node-range@3.27.4': + resolution: {integrity: sha512-kACXIhn1mK3dRQGfyeLt75dEEVq5Ji2NdWjqXMozhn6TGVP7nmswDmP5wyp02L2F4wjwrOu+J+7cOILqnwHvjA==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-ordered-list@3.27.1': - resolution: {integrity: sha512-GYrKqD//9nHJ2r80uXqbDMzRnFpGzbaEQRTSGaO/SH7DvXWFMow8evkOdjQ7PCQO07jNjJo75+A85Jwu3Ov3AA==} + '@tiptap/extension-ordered-list@3.27.4': + resolution: {integrity: sha512-bHwLiof0FqJfWzB0act7oEKMTZatEKQ4IYCvmyF5EktjMs4kxEatkPp4Yx/1LSYSjLy1MMT7oLELyaz2FFYyXA==} peerDependencies: - '@tiptap/extension-list': 3.27.1 + '@tiptap/extension-list': 3.27.4 - '@tiptap/extension-paragraph@3.27.1': - resolution: {integrity: sha512-7K7eo1gruOgAsnbK+GCV23AUVUI0cL1bTig8HaPneoFMVbig7vddk8jNLKBWO8TXVbG7TuHdnDN4F98vdtwh5Q==} + '@tiptap/extension-paragraph@3.27.4': + resolution: {integrity: sha512-8Dnr1J5s/s4XYYuEF3b784NnCxLjXOlQpmGyXRxTAzW7JaOP08tIUJWVNvSMekfXc2vXa33HUbqjxyyWZEQ6LQ==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-placeholder@3.27.1': - resolution: {integrity: sha512-lhcNDcczQ75yJOSywCHb58Hmtg1aPL/2TdYmeLPxVrP048D7rRs133sfONcgyyw0AvhnfmPOkHLTv3QtKSowhw==} + '@tiptap/extension-placeholder@3.27.4': + resolution: {integrity: sha512-7hBoFLeddCv1WzkqB0x3coZ1Hp9WZ9wLoRXIUtUhRKMpzFq2IlTtW1iw88g9pTJnL98bCCElN4DZ4mYtaQvmgA==} peerDependencies: - '@tiptap/extensions': 3.27.1 + '@tiptap/extensions': 3.27.4 - '@tiptap/extension-strike@3.27.1': - resolution: {integrity: sha512-Y3DW1jlSlCNCyMGHP3+3qBNNPS83wuFz4RTYGjZtvRRTCRh7apZme9XRWMq1rN5mJ2Cr7fKocA2/5Bs13KgN6Q==} + '@tiptap/extension-strike@3.27.4': + resolution: {integrity: sha512-8OXwcPKuV3ToBBgyvDxH1jQdObK5FIKCGiyIim6qNWiOpi9BhM3XYD+aO1khjv8qIjtoI/DYbizF4ewj09fX2g==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-text@3.27.1': - resolution: {integrity: sha512-6ZwaZwSrDh+KFFv6V1J79oO37yPs7y1bFxvk1/9Ih2rn3Xr5AWz+eMS+n8RpH3djBVVAQpdIAeYQgcn+VCSsTg==} + '@tiptap/extension-text@3.27.4': + resolution: {integrity: sha512-lKQH/hP4FBXsziHypd6Ywj8JFvMLM5GVkK1xsH6yApNuXbHq95rd42ZOYWpYILIBib7tlaz93z61d74UrJiuiw==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extension-underline@3.27.1': - resolution: {integrity: sha512-N889J4nXN/TPfVt8uF9N1A0SY82E90zwc1y26lqOcw6KWNLmQrlhMh/9OD4ikLDbekmFpOBq/UicpHf/6S8hbQ==} + '@tiptap/extension-underline@3.27.4': + resolution: {integrity: sha512-nRJGvRyEXDtINlHTW+C2oWcL3vmX1URVxAPpkD3Zwn5Rb/vEeOU/pk/w97I0iid816MR4iVbvl1XhbUVegK9gQ==} peerDependencies: - '@tiptap/core': 3.27.1 + '@tiptap/core': 3.27.4 - '@tiptap/extensions@3.27.1': - resolution: {integrity: sha512-1Tdx9faw8k0/83V6X+xCDVhV8yElGt95JxeW3YMkKQJI56QdlPz0xOdJPlMiSGJKinPyVier+x9LJD/YZUZIaw==} + '@tiptap/extensions@3.27.4': + resolution: {integrity: sha512-d8opkg2iGtVwJmNGIqv0blfRxnvWOJp1brz+Z8CsP4ojSS2ZtaE46d6JSQ5OeJ7nMpjhT+9wh4UQcA7OSEO59w==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/markdown@3.27.1': - resolution: {integrity: sha512-4m2LZcj/uN0uLlGnXr3i7sfdxbQNNmeMn4wFyFrP2xpshcKPL5WujUAcqT2rgKfaDjKQ8gIK/GpgSQKuRENFwg==} + '@tiptap/markdown@3.27.4': + resolution: {integrity: sha512-0TqNpVQ5W3FGpK/zej8ZPSp+xepqH3ihmH3Fv+nsCOf9tQazKJadpNXwFfhUj6PDIpTJmjxbQhTUAlxSNPEkRA==} peerDependencies: - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/pm@3.27.1': - resolution: {integrity: sha512-Ffjx+vimmBU7zH/KrpXzJid3+pziCe/VL2aexSTP63cyQwKQ65LkFkCKaIsSpFdQQuakVZBGWjCA5RoBV852pw==} + '@tiptap/pm@3.27.4': + resolution: {integrity: sha512-UB8lcyomfWk7YGI2PZKNqcYXfyRA+PFj+QntlsUXyrsiA5JJIaE8SHKYjxKlGG/xtW3EtPm1b0p38T9Mk4xiFw==} - '@tiptap/starter-kit@3.27.1': - resolution: {integrity: sha512-vfxRsqW8rCc0k4pzo0ilU3wobVi2wqVj88VZI2SlgZlNnUAkrDGDIAph7CTa9k9fshV+O1ivpEgPC5yC046jow==} + '@tiptap/starter-kit@3.27.4': + resolution: {integrity: sha512-/sb6rFxNt5BO4hWpUwvHh+Yh1kNyCQuuz3oDpGef5HUUjSdu9p9rfNiHWIUKBadK8VXuw5es7N+UlZ4hma+gvA==} - '@tiptap/suggestion@3.27.1': - resolution: {integrity: sha512-GNBPRav+lAfXzqmmUAS6ylRAn3G8JfsP6XosjoORxJIQJLx1ktDqwp6tm1Vgz9aGIM2TrBxLS1uBbI1Gb2/1VA==} + '@tiptap/suggestion@3.27.4': + resolution: {integrity: sha512-cughtzjjRdLu62Ioani4hMcFDQk98v9rGiNINrp8HEK9hKcs1kkygFzDLZjHxabdC97pqQDkjllJ8EwK3RvCRg==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 - '@tiptap/vue-3@3.27.1': - resolution: {integrity: sha512-o5GB6hfUnyf9sCB306rHWmaIYRL+02ROX657EkuY8tEWKHMTuMjHWl2AqHMP47wz0W9DaMOJLvcPpYdAEKq3Mw==} + '@tiptap/vue-3@3.27.4': + resolution: {integrity: sha512-fTz21viWZlpZz7PPdHJde+kzYmgRXBivVLoC2KGEeltqsREa8JR0v/eUDbzeMjj6AIajlNDtmn96I3h14gZJLg==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.27.1 - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4 + '@tiptap/pm': 3.27.4 vue: ^3.0.0 - '@tiptap/y-tiptap@3.0.5': - resolution: {integrity: sha512-WoK5z3jMW+9nzumcWAxEDRCSC7yQmdq4NN0157MaxQBl9dGWwjxJx3+11mb+WAqR37oDeAMKMmSNy+/hm2XGlA==} + '@tiptap/y-tiptap@3.0.7': + resolution: {integrity: sha512-3VG01F7i2JDghWsBZSBKi7ypMiN5UVVSyD18IwoXx7ilm0ZynrTS+XNpmgxfuiSBjdauWk7tUlP04xfM8Bw4Vw==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: prosemirror-model: ^1.7.1 @@ -2336,8 +2343,8 @@ packages: '@types/jsesc@2.5.1': resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} - '@types/node@26.0.1': - resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==} + '@types/node@26.1.1': + resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} '@types/nodemailer@7.0.12': resolution: {integrity: sha512-80vKwiIsVSyFA1rRovH59jNPLBOuc6dRZIHEu40gXTkBkZnQv8vog1xSGEb9j5q/tdMAs5ivvDR2pLTU0hGHXA==} @@ -2374,15 +2381,15 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.0.0 - '@vitejs/plugin-vue@6.0.7': - resolution: {integrity: sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==} + '@vitejs/plugin-vue@6.0.8': + resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.2.25 - '@vue-macros/common@3.1.2': - resolution: {integrity: sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==} + '@vue-macros/common@3.1.3': + resolution: {integrity: sha512-pphnexn8CDKugcA4TYSKlg1XanBYPbILST+eZK9ZGqG8sVbNR5L0kXEpRqs8+iSznosHt/Jo2k1FGl0tnWIpyg==} engines: {node: '>=20.19.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 @@ -2591,8 +2598,8 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - autoprefixer@10.5.2: - resolution: {integrity: sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==} + autoprefixer@10.5.3: + resolution: {integrity: sha512-bJRzflk8GgE4JX+iZNEwz9f9p460NCHnU7bd+CZ9vIjIlZuTkt6F3WSl2oNO8StZBFx17nLEsiQ6H2wcZiY7nA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2625,8 +2632,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.7.2: - resolution: {integrity: sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==} + bare-fs@4.7.4: + resolution: {integrity: sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -2634,12 +2641,8 @@ packages: bare-buffer: optional: true - bare-os@3.9.2: - resolution: {integrity: sha512-h530JsrkYi8518ZfR57GHaLoI5YzXkGGEV0Y+mf4KYPBn4OnNajiznwkDq7FgE+Vnmyss9Utnzi44y7sowiAXA==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.1: - resolution: {integrity: sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==} + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} bare-stream@2.13.3: resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} @@ -2661,13 +2664,13 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.40: - resolution: {integrity: sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==} + baseline-browser-mapping@2.10.43: + resolution: {integrity: sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==} engines: {node: '>=6.0.0'} hasBin: true - better-auth@1.6.22: - resolution: {integrity: sha512-B5s6+lPsDWp8rGLRnvNyr5h9tftG9zLRjNrlkEJdYRhcuhPhJiw9b8o6ibgxEFpSAdUqoDaP5/FLqfu8QsXIVg==} + better-auth@1.6.23: + resolution: {integrity: sha512-4vOaRd9UiKGKm9R+ej0jjU1es3MiJIiNc9Qq3VCnYqOZ4/nb5272QqTxWYoDxyUXl5x6A2x2we5KZKQO9teTQQ==} peerDependencies: '@lynx-js/react': '*' '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -2758,19 +2761,19 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@2.1.1: - resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + brace-expansion@2.1.2: + resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} - brace-expansion@5.0.6: - resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.4: - resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} + browserslist@4.28.6: + resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2806,8 +2809,8 @@ packages: caniuse-api@4.0.0: resolution: {integrity: sha512-B0hQ1OLyJuHTQSOWXvwibWqM6DCoqJdvBA6X1S/53bd4XU7LJ1yurIPlrsouol3mw1jh9pGI4ivubSpmJeIqCA==} - caniuse-lite@1.0.30001799: - resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + caniuse-lite@1.0.30001805: + resolution: {integrity: sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -2873,8 +2876,8 @@ packages: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} engines: {node: '>= 14'} - concurrently@9.2.3: - resolution: {integrity: sha512-ihjs0E2SxvDgq/MK418hX6YycQgKhsqxpbZuZbHo0yKfqDWdymWMjWYIpCIzqDDLLKClHlXev8whW/8WXmJ0BA==} + concurrently@9.2.4: + resolution: {integrity: sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==} engines: {node: '>=18'} hasBin: true @@ -2923,8 +2926,8 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - crossws@0.4.6: - resolution: {integrity: sha512-/Wxe9Z007EbJ496j88nToZEvyPZ8PY/wjZJ18Agh/GCA9cYHyLbxtrpdFlFzAw3TV20F0SUYGl0g6PzChbwUrg==} + crossws@0.4.10: + resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==} peerDependencies: srvx: '>=0.11.5' peerDependenciesMeta: @@ -3100,8 +3103,8 @@ packages: effect@3.20.0: resolution: {integrity: sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==} - electron-to-chromium@1.5.380: - resolution: {integrity: sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==} + electron-to-chromium@1.5.389: + resolution: {integrity: sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==} embla-carousel-auto-height@8.6.0: resolution: {integrity: sha512-/HrJQOEM6aol/oF33gd2QlINcXy3e19fJWvHDuHWp2bpyTa+2dm9tVVJak30m2Qy6QyQ6Fc8DkImtv7pxWOJUQ==} @@ -3196,8 +3199,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} @@ -3276,8 +3279,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-uri@3.1.3: + resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -3325,8 +3328,8 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.42.0: - resolution: {integrity: sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==} + framer-motion@12.42.2: + resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -3354,8 +3357,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - fuse.js@7.4.2: - resolution: {integrity: sha512-LVbzjD4WA6UP5B1UnP8wuaXJiLnqMdM/E4fiJXTJ5haJ5b/MBNsK29h2fm6swEoQaVQjvYFWKLE2RanyZIoRVQ==} + fuse.js@7.5.0: + resolution: {integrity: sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==} engines: {node: '>=10'} fzf@0.5.2: @@ -3407,15 +3410,15 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} - globby@16.2.0: - resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==} + globby@16.2.1: + resolution: {integrity: sha512-JmsqJalahxxgW8V2ecSQ2G7UjPlI9cpKdrkG9KoNiXhd/YslXOTEB0cViENWUznuovIuNT+FkMbraDGjr4FCUg==} engines: {node: '>=20'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grammex@3.1.12: - resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==} + grammex@3.1.13: + resolution: {integrity: sha512-LnPnhOBLEJEVKS8WFDVaA397L9Kq55Q9oSITJiVLHVdhAclfUkWzQv74KhvZHKL2Q09Pb1XdsrOsZ4LfTFFTEg==} graphmatch@1.1.1: resolution: {integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==} @@ -3438,8 +3441,8 @@ packages: hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - hono@4.12.27: - resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} + hono@4.12.30: + resolution: {integrity: sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog==} engines: {node: '>=16.9.0'} hookable@5.5.3: @@ -3463,22 +3466,22 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - httpxy@0.5.3: - resolution: {integrity: sha512-SMS9V6Sn7VWaS11lYhoAr0ceoaiolTWf4jYdJn0NJhCdKMu9R2H9Fh0LBDWBHQF6HRLI1PmaePYsjanSpE5PEw==} + httpxy@0.5.5: + resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==} human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} engines: {node: '>= 4'} image-meta@0.2.2: @@ -3627,8 +3630,8 @@ packages: knitwork@1.3.0: resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} - kysely@0.29.2: - resolution: {integrity: sha512-s6WVJyEZrbm6jhBpiKHsGHyePMrVQKJ85wZCFCr9W4QHv6WTjWIrdvTmO9hDEA3bNK0xkrE2DqrHsXMLWuZpQg==} + kysely@0.29.3: + resolution: {integrity: sha512-VHtBdW6XB/pgoTSqraM3UAa2rYoYdNXqnNPpX+8XXP+cwYbVEFuAp3HyPt1vpNfU9l7Y2kpUrA9QDPsy8uUqOQ==} engines: {node: '>=22.0.0'} launch-editor@2.14.1: @@ -3741,8 +3744,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.5.1: - resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -3843,8 +3846,8 @@ packages: mocked-exports@0.1.1: resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} - motion-dom@12.42.0: - resolution: {integrity: sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==} + motion-dom@12.42.2: + resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} motion-utils@12.39.0: resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} @@ -3873,8 +3876,8 @@ packages: resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} engines: {node: '>=8.0.0'} - nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3898,8 +3901,8 @@ packages: xml2js: optional: true - node-abi@3.92.0: - resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==} + node-abi@3.94.0: + resolution: {integrity: sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==} engines: {node: '>=10'} node-addon-api@7.1.1: @@ -3928,8 +3931,8 @@ packages: node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} - node-releases@2.0.50: - resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} engines: {node: '>=18'} nodemailer@7.0.13: @@ -4035,8 +4038,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + package-manager-detector@1.7.0: + resolution: {integrity: sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -4111,8 +4114,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pkg-types@1.3.1: @@ -4290,12 +4293,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.5.16: - resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} + postcss@8.5.19: + resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -4425,8 +4424,8 @@ packages: prosemirror-commands@1.7.1: resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} - prosemirror-dropcursor@1.8.2: - resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + prosemirror-dropcursor@1.8.3: + resolution: {integrity: sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==} prosemirror-gapcursor@1.4.1: resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} @@ -4440,8 +4439,8 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-model@1.25.9: - resolution: {integrity: sha512-pRTklkDDMMRopyoAcrr9wV/8g/RYgrLHBuJAb5hlEuYZRdm5yqmPjWId83fpBwPpSFqEdja0H7Dfd7z1X/npcA==} + prosemirror-model@1.25.11: + resolution: {integrity: sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==} prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -4455,8 +4454,8 @@ packages: prosemirror-transform@1.12.0: resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} - prosemirror-view@1.41.9: - resolution: {integrity: sha512-clTunTX+eaLbr87L1V1QPheRlEQJyTlL3gXe9x3jQIk3rL0RVWxviDGz8tFaydwIVm+hKhYCyr+R/zBtWr9s6A==} + prosemirror-view@1.42.1: + resolution: {integrity: sha512-rRqzZnRgkyh69XoOMrfFJHwauHscLBmHbq772kwbic1ymQAM8gXjzEbJse5j1ep2UO2HRIAQL0bY3kZ/RoqjVw==} pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} @@ -4628,12 +4627,12 @@ packages: seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - serialize-javascript@7.0.6: - resolution: {integrity: sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==} + serialize-javascript@7.0.7: + resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} engines: {node: '>=20.0.0'} - seroval@1.5.4: - resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} + seroval@1.5.5: + resolution: {integrity: sha512-bSjOuPcwPKLSJNhr9+bZxA20nQxVle5J5MNsYRVE6cIg7KpRLXGupymePavu0jrxlPiPsr4xGZSB8yUY2sH2sw==} engines: {node: '>=10'} serve-placeholder@2.0.2: @@ -4643,8 +4642,8 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - set-cookie-parser@3.1.1: - resolution: {integrity: sha512-vM9SUhjsUYs6UeJUmygc5Ofm5eQGe85riob5ju6XCgFGJI5PLV4nrDAQpQjd+LkFBpAkADn5BQQpZ9EUNkyLuA==} + set-cookie-parser@3.1.2: + resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -4661,8 +4660,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.4: - resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} engines: {node: '>= 0.4'} shell-quote@1.9.0: @@ -4723,8 +4722,8 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} - srvx@0.11.17: - resolution: {integrity: sha512-43yM4luKfCJamyCMhrUeHUPOrf8TdZe7kN8s5zayZCH5OeprYqi49Aso5ZvHXR4aB+DHaRNO/diNFgZSMNG8Xw==} + srvx@0.11.22: + resolution: {integrity: sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==} engines: {node: '>=20.16.0'} hasBin: true @@ -4738,8 +4737,8 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} streamx@2.28.0: resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} @@ -4806,8 +4805,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svgo@4.0.1: - resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + svgo@4.0.2: + resolution: {integrity: sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==} engines: {node: '>=16'} hasBin: true @@ -4828,8 +4827,8 @@ packages: tailwind-merge: optional: true - tailwindcss@4.3.1: - resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==} + tailwindcss@4.3.2: + resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} @@ -4845,15 +4844,15 @@ packages: tar-stream@3.2.0: resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} - tar@7.5.19: - resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==} + tar@7.5.20: + resolution: {integrity: sha512-9FcyK4PA6+WbzlTM9WhQm6vB5W7cP7dUiPsv1g7YDwEQnQ1CGpK3MGlKk/ITVWMk05kHZuBhmVhiv8LZoy/PFQ==} engines: {node: '>=18'} teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - terser@5.48.0: - resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + terser@5.49.0: + resolution: {integrity: sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==} engines: {node: '>=10'} hasBin: true @@ -4900,16 +4899,16 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.22.4: - resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + tsx@4.23.1: + resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} engines: {node: '>=18.0.0'} hasBin: true tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - type-fest@5.7.0: - resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} engines: {node: '>=20'} type-level-regexp@0.1.17: @@ -4923,8 +4922,8 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - ultrahtml@1.6.0: - resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -4980,8 +4979,8 @@ packages: '@vueuse/core': optional: true - unplugin-utils@0.3.1: - resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} engines: {node: '>=20.19.0'} unplugin-vue-components@32.1.0: @@ -4998,8 +4997,8 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} - unplugin@3.2.0: - resolution: {integrity: sha512-6nGlT7EHsS+tTcTdAkYFqXIUwDrMJyJvHFNYGSr4x2/2ySIcV4f5e1RAJUeDyfOJPR8TF0auE8l+82PLhKjqsA==} + unplugin@3.3.0: + resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@farmfe/core': '*' @@ -5238,8 +5237,8 @@ packages: vue-bundle-renderer@2.3.1: resolution: {integrity: sha512-7F4LNMopUw5RgYWo4zCmVUHCc6aQRC6dCKHUYkM/n+fux4AUGdL1x6m5A515WWyFysRRN7cx3hBzVqoisfRfzw==} - vue-component-type-helpers@3.3.5: - resolution: {integrity: sha512-Fe1jyPJoUGpJOYKOri44jduR7My4yYINOMJISuMAbmrs+L5LbIDUc8NTWZYY3EJLK0yPLuCmcd5zoCsE4k2/KA==} + vue-component-type-helpers@3.3.7: + resolution: {integrity: sha512-Skkhw9agYSgsWqv7bxSOGJZa9SaiJbZVGdXuFWnrzKaQYHnw9qbjD630rw6RyMqDbp54nfLCLw5SZA55if7JLg==} vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} @@ -5327,8 +5326,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.1: + resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5416,7 +5415,7 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 1.6.0 + package-manager-detector: 1.7.0 tinyexec: 1.2.4 '@babel/code-frame@7.29.7': @@ -5457,8 +5456,8 @@ snapshots: '@babel/generator@8.0.0': dependencies: - '@babel/parser': 8.0.0 - '@babel/types': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 '@types/jsesc': 2.5.1 @@ -5472,7 +5471,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.4 + browserslist: 4.28.6 lru-cache: 5.1.1 semver: 6.3.1 @@ -5542,7 +5541,7 @@ snapshots: '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-identifier@8.0.2': {} + '@babel/helper-validator-identifier@8.0.4': {} '@babel/helper-validator-option@7.29.7': {} @@ -5555,9 +5554,9 @@ snapshots: dependencies: '@babel/types': 7.29.7 - '@babel/parser@8.0.0': + '@babel/parser@8.0.4': dependencies: - '@babel/types': 8.0.0 + '@babel/types': 8.0.4 '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: @@ -5603,56 +5602,56 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/types@8.0.0': + '@babel/types@8.0.4': dependencies: '@babel/helper-string-parser': 8.0.0 - '@babel/helper-validator-identifier': 8.0.2 + '@babel/helper-validator-identifier': 8.0.4 - '@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0)': + '@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0)': dependencies: '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - '@opentelemetry/semantic-conventions': 1.41.1 + '@opentelemetry/semantic-conventions': 1.43.0 '@standard-schema/spec': 1.1.0 better-call: 1.3.7(zod@4.4.3) jose: 6.2.3 - kysely: 0.29.2 + kysely: 0.29.3 nanostores: 1.4.0 zod: 4.4.3 - '@better-auth/drizzle-adapter@1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)': + '@better-auth/drizzle-adapter@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0) + '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0) '@better-auth/utils': 0.4.2 - '@better-auth/kysely-adapter@1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(kysely@0.29.2)': + '@better-auth/kysely-adapter@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(kysely@0.29.3)': dependencies: - '@better-auth/core': 1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0) + '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0) '@better-auth/utils': 0.4.2 optionalDependencies: - kysely: 0.29.2 + kysely: 0.29.3 - '@better-auth/memory-adapter@1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)': + '@better-auth/memory-adapter@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0) + '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0) '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)': + '@better-auth/mongo-adapter@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0) + '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0) '@better-auth/utils': 0.4.2 - '@better-auth/prisma-adapter@1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(@prisma/client@7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3))(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))': + '@better-auth/prisma-adapter@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(@prisma/client@7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3))(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))': dependencies: - '@better-auth/core': 1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0) + '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0) '@better-auth/utils': 0.4.2 optionalDependencies: '@prisma/client': 7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3) prisma: 7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3) - '@better-auth/telemetry@1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': + '@better-auth/telemetry@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': dependencies: - '@better-auth/core': 1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0) + '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -5662,7 +5661,7 @@ snapshots: '@better-fetch/fetch@1.3.1': {} - '@bomb.sh/tab@0.0.17(cac@6.7.14)(citty@0.2.2)': + '@bomb.sh/tab@0.0.19(cac@6.7.14)(citty@0.2.2)': optionalDependencies: cac: 6.7.14 citty: 0.2.2 @@ -5671,14 +5670,14 @@ snapshots: dependencies: fontkitten: 1.0.3 - '@clack/core@1.4.2': + '@clack/core@1.4.3': dependencies: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@1.6.0': + '@clack/prompts@1.7.0': dependencies: - '@clack/core': 1.4.2 + '@clack/core': 1.4.3 fast-string-width: 3.0.2 fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 @@ -5722,7 +5721,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.11.1': + '@emnapi/runtime@1.11.2': dependencies: tslib: 2.8.1 optional: true @@ -5895,37 +5894,37 @@ snapshots: '@fastify/accept-negotiator@2.0.1': optional: true - '@floating-ui/core@1.7.5': + '@floating-ui/core@1.8.0': dependencies: - '@floating-ui/utils': 0.2.11 + '@floating-ui/utils': 0.2.12 - '@floating-ui/dom@1.7.6': + '@floating-ui/dom@1.8.0': dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 - '@floating-ui/utils@0.2.11': {} + '@floating-ui/utils@0.2.12': {} '@floating-ui/vue@1.1.11(vue@3.5.39(typescript@6.0.3))': dependencies: - '@floating-ui/dom': 1.7.6 - '@floating-ui/utils': 0.2.11 + '@floating-ui/dom': 1.8.0 + '@floating-ui/utils': 0.2.12 vue-demi: 0.14.10(vue@3.5.39(typescript@6.0.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@hono/node-server@1.19.11(hono@4.12.27)': + '@hono/node-server@1.19.11(hono@4.12.30)': dependencies: - hono: 4.12.27 + hono: 4.12.30 - '@iconify/collections@1.0.702': + '@iconify/collections@1.0.709': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.3': + '@iconify/utils@3.1.4': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 @@ -6021,7 +6020,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.11.1 + '@emnapi/runtime': 1.11.2 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -6098,7 +6097,7 @@ snapshots: node-fetch: 2.7.0 nopt: 8.1.0 semver: 7.8.5 - tar: 7.5.19 + tar: 7.5.20 transitivePeerDependencies: - encoding - supports-color @@ -6126,10 +6125,10 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nuxt/cli@3.36.1(@nuxt/schema@4.4.8)(cac@6.7.14)(magicast@0.5.3)': + '@nuxt/cli@3.37.0(@nuxt/schema@4.4.8)(cac@6.7.14)(magicast@0.5.3)': dependencies: - '@bomb.sh/tab': 0.0.17(cac@6.7.14)(citty@0.2.2) - '@clack/prompts': 1.6.0 + '@bomb.sh/tab': 0.0.19(cac@6.7.14)(citty@0.2.2) + '@clack/prompts': 1.7.0 c12: 3.3.4(magicast@0.5.3) citty: 0.2.2 confbox: 0.2.4 @@ -6137,11 +6136,11 @@ snapshots: debug: 4.4.3 defu: 6.1.7 exsolve: 1.1.0 - fuse.js: 7.4.2 + fuse.js: 7.5.0 fzf: 0.5.2 giget: 3.3.0 jiti: 2.7.0 - listhen: 1.10.0(srvx@0.11.17) + listhen: 1.10.0(srvx@0.11.22) nypm: 0.6.8 ofetch: 1.5.1 ohash: 2.0.11 @@ -6150,8 +6149,8 @@ snapshots: pkg-types: 2.3.1 scule: 1.3.0 semver: 7.8.5 - srvx: 0.11.17 - std-env: 4.1.0 + srvx: 0.11.22 + std-env: 4.2.0 tinyclip: 0.1.15 tinyexec: 1.2.4 ufo: 1.6.4 @@ -6166,17 +6165,17 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': + '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) execa: 8.0.1 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - magicast '@nuxt/devtools-wizard@3.2.4': dependencies: - '@clack/prompts': 1.6.0 + '@clack/prompts': 1.7.0 consola: 3.4.2 diff: 8.0.4 execa: 8.0.1 @@ -6185,9 +6184,9 @@ snapshots: pkg-types: 2.3.1 semver: 7.8.5 - '@nuxt/devtools@3.2.4(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': + '@nuxt/devtools@3.2.4(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/devtools-wizard': 3.2.4 '@nuxt/kit': 4.4.8(magicast@0.5.3) '@vue/devtools-core': 8.1.5(vue@3.5.39(typescript@6.0.3)) @@ -6215,24 +6214,24 @@ snapshots: sirv: 3.0.2 structured-clone-es: 2.0.0 tinyglobby: 0.2.17 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) - vite-plugin-inspect: 11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - vite-plugin-vue-tracer: 1.4.0(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-plugin-inspect: 11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + vite-plugin-vue-tracer: 1.4.0(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) which: 6.0.1 - ws: 8.21.0 + ws: 8.21.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - vue - '@nuxt/fonts@0.14.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': + '@nuxt/fonts@0.14.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 - fontless: 0.2.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + fontless: 0.2.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) h3: 1.15.11 magic-regexp: 0.10.0 ofetch: 1.5.1 @@ -6241,7 +6240,7 @@ snapshots: tinyglobby: 0.2.17 ufo: 1.6.4 unifont: 0.7.4 - unplugin: 3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1) transitivePeerDependencies: - '@azure/app-configuration' @@ -6274,20 +6273,20 @@ snapshots: - vite - webpack - '@nuxt/icon@2.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': + '@nuxt/icon@2.3.1(magicast@0.5.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': dependencies: - '@iconify/collections': 1.0.702 + '@iconify/collections': 1.0.709 '@iconify/types': 2.0.0 - '@iconify/utils': 3.1.3 + '@iconify/utils': 3.1.4 '@iconify/vue': 5.0.1(vue@3.5.39(typescript@6.0.3)) - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) consola: 3.4.2 local-pkg: 1.2.1 mlly: 1.8.2 ohash: 2.0.11 - picomatch: 4.0.4 - std-env: 4.1.0 + picomatch: 4.0.5 + std-env: 4.2.0 tinyglobby: 0.2.17 ufo: 1.6.4 transitivePeerDependencies: @@ -6295,7 +6294,7 @@ snapshots: - vite - vue - '@nuxt/image@2.0.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.17)': + '@nuxt/image@2.0.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(magicast@0.5.3)(srvx@0.11.22)': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) consola: 3.4.2 @@ -6308,7 +6307,7 @@ snapshots: std-env: 3.10.0 ufo: 1.6.4 optionalDependencies: - ipx: 3.1.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(srvx@0.11.17) + ipx: 3.1.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(srvx@0.11.22) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6340,7 +6339,7 @@ snapshots: destr: 2.0.5 errx: 0.1.0 exsolve: 1.1.0 - ignore: 7.0.5 + ignore: 7.0.6 jiti: 2.7.0 klona: 2.0.6 mlly: 1.8.2 @@ -6357,7 +6356,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.4.8(bc443d7867de717f2b59d52eacee6d61)': + '@nuxt/nitro-server@4.4.8(6599755f0421871d46b05d168504eba3)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.8(magicast@0.5.3) @@ -6371,16 +6370,16 @@ snapshots: escape-string-regexp: 5.0.0 exsolve: 1.1.0 h3: 1.15.11 - impound: 1.1.5(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + impound: 1.1.5(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.13.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3)(oxc-parser@0.133.0)(srvx@0.11.17)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.0.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(yaml@2.9.0) + nitropack: 2.13.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3)(oxc-parser@0.133.0)(srvx@0.11.22)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(yaml@2.9.0) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 rou3: 0.8.1 - std-env: 4.1.0 + std-env: 4.2.0 ufo: 1.6.4 unctx: 2.5.0 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1) @@ -6441,7 +6440,7 @@ snapshots: defu: 6.1.7 pathe: 2.0.3 pkg-types: 2.3.1 - std-env: 4.1.0 + std-env: 4.2.0 '@nuxt/telemetry@2.8.0(@nuxt/kit@4.4.8(magicast@0.5.3))': dependencies: @@ -6450,42 +6449,42 @@ snapshots: consola: 3.4.2 ofetch: 2.0.0-alpha.3 rc9: 3.0.1 - std-env: 4.1.0 + std-env: 4.2.0 - '@nuxt/ui@4.9.0(0323eb8694725dcf265b82e0ce589dea)': + '@nuxt/ui@4.9.0(bc491f4d0a191011a92771b27ca117df)': dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.8.0 '@iconify/vue': 5.0.1(vue@3.5.39(typescript@6.0.3)) - '@nuxt/fonts': 0.14.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - '@nuxt/icon': 2.2.4(magicast@0.5.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + '@nuxt/fonts': 0.14.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(magicast@0.5.3)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + '@nuxt/icon': 2.3.1(magicast@0.5.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) '@nuxt/kit': 4.4.8(magicast@0.5.3) '@nuxt/schema': 4.4.8 '@nuxtjs/color-mode': 4.0.1(magicast@0.5.3) '@standard-schema/spec': 1.1.0 - '@tailwindcss/postcss': 4.3.1 - '@tailwindcss/vite': 4.3.1(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + '@tailwindcss/postcss': 4.3.2 + '@tailwindcss/vite': 4.3.2(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) '@tanstack/vue-table': 8.21.3(vue@3.5.39(typescript@6.0.3)) - '@tanstack/vue-virtual': 3.13.30(vue@3.5.39(typescript@6.0.3)) - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/extension-bubble-menu': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-code': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-collaboration': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31) - '@tiptap/extension-drag-handle': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/extension-collaboration@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)) - '@tiptap/extension-drag-handle-vue-3': 3.27.1(@tiptap/extension-drag-handle@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/extension-collaboration@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)))(@tiptap/pm@3.27.1)(@tiptap/vue-3@3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3)) - '@tiptap/extension-floating-menu': 3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-horizontal-rule': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-image': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-mention': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/suggestion@3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)) - '@tiptap/extension-node-range': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-placeholder': 3.27.1(@tiptap/extensions@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)) - '@tiptap/markdown': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 - '@tiptap/starter-kit': 3.27.1 - '@tiptap/suggestion': 3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/vue-3': 3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(vue@3.5.39(typescript@6.0.3)) + '@tanstack/vue-virtual': 3.13.32(vue@3.5.39(typescript@6.0.3)) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/extension-bubble-menu': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-code': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-collaboration': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31) + '@tiptap/extension-drag-handle': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/extension-collaboration@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)) + '@tiptap/extension-drag-handle-vue-3': 3.27.4(@tiptap/extension-drag-handle@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/extension-collaboration@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)))(@tiptap/pm@3.27.4)(@tiptap/vue-3@3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3)) + '@tiptap/extension-floating-menu': 3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-horizontal-rule': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-image': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-mention': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/suggestion@3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)) + '@tiptap/extension-node-range': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-placeholder': 3.27.4(@tiptap/extensions@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)) + '@tiptap/markdown': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 + '@tiptap/starter-kit': 3.27.4 + '@tiptap/suggestion': 3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/vue-3': 3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(vue@3.5.39(typescript@6.0.3)) '@unhead/vue': 2.1.15(vue@3.5.39(typescript@6.0.3)) '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) - '@vueuse/integrations': 14.3.0(fuse.js@7.4.2)(vue@3.5.39(typescript@6.0.3)) + '@vueuse/integrations': 14.3.0(fuse.js@7.5.0)(vue@3.5.39(typescript@6.0.3)) '@vueuse/shared': 14.3.0(vue@3.5.39(typescript@6.0.3)) colortranslator: 5.0.0 consola: 3.4.2 @@ -6497,7 +6496,7 @@ snapshots: embla-carousel-fade: 8.6.0(embla-carousel@8.6.0) embla-carousel-vue: 8.6.0(vue@3.5.39(typescript@6.0.3)) embla-carousel-wheel-gestures: 8.1.0(embla-carousel@8.6.0) - fuse.js: 7.4.2 + fuse.js: 7.5.0 hookable: 6.1.1 knitwork: 1.3.0 magic-string: 0.30.21 @@ -6508,16 +6507,16 @@ snapshots: reka-ui: 2.9.10(vue@3.5.39(typescript@6.0.3)) scule: 1.3.0 tailwind-merge: 3.6.0 - tailwind-variants: 3.2.2(tailwind-merge@3.6.0)(tailwindcss@4.3.1) - tailwindcss: 4.3.1 + tailwind-variants: 3.2.2(tailwind-merge@3.6.0)(tailwindcss@4.3.2) + tailwindcss: 4.3.2 tinyglobby: 0.2.17 typescript: 6.0.3 ufo: 1.6.4 - unplugin: 3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.8(magicast@0.5.3))(@vueuse/core@14.3.0(vue@3.5.39(typescript@6.0.3))) - unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) vaul-vue: 0.4.1(reka-ui@2.9.10(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3)) - vue-component-type-helpers: 3.3.5 + vue-component-type-helpers: 3.3.7 optionalDependencies: '@internationalized/date': 3.12.2 '@internationalized/number': 3.6.7 @@ -6571,15 +6570,15 @@ snapshots: - vue - webpack - '@nuxt/vite-builder@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@26.0.1)(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.0.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(yaml@2.9.0))(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3))(yaml@2.9.0)': + '@nuxt/vite-builder@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@26.1.1)(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(yaml@2.9.0))(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3))(yaml@2.9.0)': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) '@rollup/plugin-replace': 6.0.3(rollup@4.62.2) - '@vitejs/plugin-vue': 6.0.7(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) - '@vitejs/plugin-vue-jsx': 5.1.6(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) - autoprefixer: 10.5.2(postcss@8.5.16) + '@vitejs/plugin-vue': 6.0.8(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + autoprefixer: 10.5.3(postcss@8.5.19) consola: 3.4.2 - cssnano: 8.0.2(postcss@8.5.16) + cssnano: 8.0.2(postcss@8.5.19) defu: 6.1.7 escape-string-regexp: 5.0.0 exsolve: 1.1.0 @@ -6589,18 +6588,18 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.0.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(yaml@2.9.0) + nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(yaml@2.9.0) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 - postcss: 8.5.16 - seroval: 1.5.4 - std-env: 4.1.0 + postcss: 8.5.19 + seroval: 1.5.5 + std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) - vite-plugin-checker: 0.14.4(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 5.3.0(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-plugin-checker: 0.14.4(typescript@6.0.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) vue: 3.5.39(typescript@6.0.3) vue-bundle-renderer: 2.3.1 optionalDependencies: @@ -6639,7 +6638,7 @@ snapshots: transitivePeerDependencies: - magicast - '@opentelemetry/semantic-conventions@1.41.1': {} + '@opentelemetry/semantic-conventions@1.43.0': {} '@oxc-minify/binding-android-arm-eabi@0.133.0': optional: true @@ -6868,7 +6867,7 @@ snapshots: '@parcel/watcher-wasm@2.5.6': dependencies: is-glob: 4.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 '@parcel/watcher-win32-arm64@2.5.6': optional: true @@ -6884,7 +6883,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -6958,13 +6957,13 @@ snapshots: '@electric-sql/pglite': 0.4.1 '@electric-sql/pglite-socket': 0.1.1(@electric-sql/pglite@0.4.1) '@electric-sql/pglite-tools': 0.3.1(@electric-sql/pglite@0.4.1) - '@hono/node-server': 1.19.11(hono@4.12.27) + '@hono/node-server': 1.19.11(hono@4.12.30) '@prisma/get-platform': 7.2.0 '@prisma/query-plan-executor': 7.2.0 '@prisma/streams-local': 0.1.2 foreground-child: 3.3.1 get-port-please: 3.2.0 - hono: 4.12.27 + hono: 4.12.30 http-status-codes: 2.3.0 pathe: 2.0.3 proper-lockfile: 4.1.2 @@ -7086,10 +7085,10 @@ snapshots: '@rollup/pluginutils': 5.4.0(rollup@4.62.2) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.62.2 @@ -7126,9 +7125,9 @@ snapshots: '@rollup/plugin-terser@1.0.0(rollup@4.62.2)': dependencies: - serialize-javascript: 7.0.6 + serialize-javascript: 7.0.7 smob: 1.6.2 - terser: 5.48.0 + terser: 5.49.0 optionalDependencies: rollup: 4.62.2 @@ -7136,7 +7135,7 @@ snapshots: dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.62.2 @@ -7233,7 +7232,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.3.1': + '@tailwindcss/node@4.3.2': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.21.6 @@ -7241,311 +7240,312 @@ snapshots: lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.3.1 + tailwindcss: 4.3.2 - '@tailwindcss/oxide-android-arm64@4.3.1': + '@tailwindcss/oxide-android-arm64@4.3.2': optional: true - '@tailwindcss/oxide-darwin-arm64@4.3.1': + '@tailwindcss/oxide-darwin-arm64@4.3.2': optional: true - '@tailwindcss/oxide-darwin-x64@4.3.1': + '@tailwindcss/oxide-darwin-x64@4.3.2': optional: true - '@tailwindcss/oxide-freebsd-x64@4.3.1': + '@tailwindcss/oxide-freebsd-x64@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.3.1': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.3.1': + '@tailwindcss/oxide-linux-arm64-musl@4.3.2': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.3.1': + '@tailwindcss/oxide-linux-x64-gnu@4.3.2': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.3.1': + '@tailwindcss/oxide-linux-x64-musl@4.3.2': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.3.1': + '@tailwindcss/oxide-wasm32-wasi@4.3.2': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.3.1': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.3.1': + '@tailwindcss/oxide-win32-x64-msvc@4.3.2': optional: true - '@tailwindcss/oxide@4.3.1': + '@tailwindcss/oxide@4.3.2': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.1 - '@tailwindcss/oxide-darwin-arm64': 4.3.1 - '@tailwindcss/oxide-darwin-x64': 4.3.1 - '@tailwindcss/oxide-freebsd-x64': 4.3.1 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.1 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.1 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.1 - '@tailwindcss/oxide-linux-x64-musl': 4.3.1 - '@tailwindcss/oxide-wasm32-wasi': 4.3.1 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.1 - - '@tailwindcss/postcss@4.3.1': + '@tailwindcss/oxide-android-arm64': 4.3.2 + '@tailwindcss/oxide-darwin-arm64': 4.3.2 + '@tailwindcss/oxide-darwin-x64': 4.3.2 + '@tailwindcss/oxide-freebsd-x64': 4.3.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.2 + '@tailwindcss/oxide-linux-x64-musl': 4.3.2 + '@tailwindcss/oxide-wasm32-wasi': 4.3.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.2 + + '@tailwindcss/postcss@4.3.2': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.3.1 - '@tailwindcss/oxide': 4.3.1 - postcss: 8.5.15 - tailwindcss: 4.3.1 + '@tailwindcss/node': 4.3.2 + '@tailwindcss/oxide': 4.3.2 + postcss: 8.5.19 + tailwindcss: 4.3.2 - '@tailwindcss/vite@4.3.1(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.2(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@tailwindcss/node': 4.3.1 - '@tailwindcss/oxide': 4.3.1 - tailwindcss: 4.3.1 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + '@tailwindcss/node': 4.3.2 + '@tailwindcss/oxide': 4.3.2 + tailwindcss: 4.3.2 + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) '@tanstack/table-core@8.21.3': {} - '@tanstack/virtual-core@3.17.2': {} + '@tanstack/virtual-core@3.17.4': {} '@tanstack/vue-table@8.21.3(vue@3.5.39(typescript@6.0.3))': dependencies: '@tanstack/table-core': 8.21.3 vue: 3.5.39(typescript@6.0.3) - '@tanstack/vue-virtual@3.13.30(vue@3.5.39(typescript@6.0.3))': + '@tanstack/vue-virtual@3.13.32(vue@3.5.39(typescript@6.0.3))': dependencies: - '@tanstack/virtual-core': 3.17.2 + '@tanstack/virtual-core': 3.17.4 vue: 3.5.39(typescript@6.0.3) - '@tiptap/core@3.27.1(@tiptap/pm@3.27.1)': + '@tiptap/core@3.27.4(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/pm': 3.27.1 + '@tiptap/pm': 3.27.4 - '@tiptap/extension-blockquote@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-blockquote@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 - '@tiptap/extension-bold@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-bold@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-bubble-menu@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/extension-bubble-menu@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 - '@tiptap/extension-bullet-list@3.27.1(@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))': + '@tiptap/extension-bullet-list@3.27.4(@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/extension-list': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/extension-code-block@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/extension-code-block@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 - '@tiptap/extension-code@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-code@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-collaboration@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31)': + '@tiptap/extension-collaboration@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 - '@tiptap/y-tiptap': 3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 + '@tiptap/y-tiptap': 3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31) yjs: 13.6.31 - '@tiptap/extension-document@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-document@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-drag-handle-vue-3@3.27.1(@tiptap/extension-drag-handle@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/extension-collaboration@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)))(@tiptap/pm@3.27.1)(@tiptap/vue-3@3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3))': + '@tiptap/extension-drag-handle-vue-3@3.27.4(@tiptap/extension-drag-handle@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/extension-collaboration@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)))(@tiptap/pm@3.27.4)(@tiptap/vue-3@3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3))': dependencies: - '@tiptap/extension-drag-handle': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/extension-collaboration@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)) - '@tiptap/pm': 3.27.1 - '@tiptap/vue-3': 3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(vue@3.5.39(typescript@6.0.3)) + '@tiptap/extension-drag-handle': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/extension-collaboration@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)) + '@tiptap/pm': 3.27.4 + '@tiptap/vue-3': 3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(vue@3.5.39(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) - '@tiptap/extension-drag-handle@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/extension-collaboration@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))': + '@tiptap/extension-drag-handle@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/extension-collaboration@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31))(@tiptap/extension-node-range@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))': dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/extension-collaboration': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31) - '@tiptap/extension-node-range': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 - '@tiptap/y-tiptap': 3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31) + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/extension-collaboration': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31))(yjs@13.6.31) + '@tiptap/extension-node-range': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 + '@tiptap/y-tiptap': 3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31) - '@tiptap/extension-dropcursor@3.27.1(@tiptap/extensions@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))': + '@tiptap/extension-dropcursor@3.27.4(@tiptap/extensions@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/extensions': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/extensions': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/extension-floating-menu@3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/extension-floating-menu@3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 - '@tiptap/extension-gapcursor@3.27.1(@tiptap/extensions@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))': + '@tiptap/extension-gapcursor@3.27.4(@tiptap/extensions@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/extensions': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/extensions': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/extension-hard-break@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-hard-break@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-heading@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-heading@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-horizontal-rule@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/extension-horizontal-rule@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 - '@tiptap/extension-image@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-image@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-italic@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-italic@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-link@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/extension-link@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 linkifyjs: 4.3.3 - '@tiptap/extension-list-item@3.27.1(@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))': + '@tiptap/extension-list-item@3.27.4(@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/extension-list': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/extension-list-keymap@3.27.1(@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))': + '@tiptap/extension-list-keymap@3.27.4(@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/extension-list': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 - '@tiptap/extension-mention@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(@tiptap/suggestion@3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))': + '@tiptap/extension-mention@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(@tiptap/suggestion@3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 - '@tiptap/suggestion': 3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 + '@tiptap/suggestion': 3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/extension-node-range@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/extension-node-range@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 - '@tiptap/extension-ordered-list@3.27.1(@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))': + '@tiptap/extension-ordered-list@3.27.4(@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/extension-list': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/extension-paragraph@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-paragraph@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-placeholder@3.27.1(@tiptap/extensions@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1))': + '@tiptap/extension-placeholder@3.27.4(@tiptap/extensions@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/extensions': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/extensions': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/extension-strike@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-strike@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-text@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-text@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extension-underline@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))': + '@tiptap/extension-underline@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) - '@tiptap/extensions@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/extensions@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 - '@tiptap/markdown@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': + '@tiptap/markdown@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 marked: 17.0.6 - '@tiptap/pm@3.27.1': + '@tiptap/pm@3.27.4': dependencies: prosemirror-changeset: 2.4.1 prosemirror-commands: 1.7.1 - prosemirror-dropcursor: 1.8.2 + prosemirror-dropcursor: 1.8.3 prosemirror-gapcursor: 1.4.1 prosemirror-history: 1.5.0 prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.9 - - '@tiptap/starter-kit@3.27.1': - dependencies: - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/extension-blockquote': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-bold': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-bullet-list': 3.27.1(@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)) - '@tiptap/extension-code': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-code-block': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-document': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-dropcursor': 3.27.1(@tiptap/extensions@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)) - '@tiptap/extension-gapcursor': 3.27.1(@tiptap/extensions@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)) - '@tiptap/extension-hard-break': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-heading': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-horizontal-rule': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-italic': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-link': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-list-item': 3.27.1(@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)) - '@tiptap/extension-list-keymap': 3.27.1(@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)) - '@tiptap/extension-ordered-list': 3.27.1(@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)) - '@tiptap/extension-paragraph': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-strike': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-text': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extension-underline': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1)) - '@tiptap/extensions': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 - - '@tiptap/suggestion@3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)': - dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 - - '@tiptap/vue-3@3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1)(vue@3.5.39(typescript@6.0.3))': - dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) - '@tiptap/pm': 3.27.1 + prosemirror-view: 1.42.1 + + '@tiptap/starter-kit@3.27.4': + dependencies: + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/extension-blockquote': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-bold': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-bullet-list': 3.27.4(@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)) + '@tiptap/extension-code': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-code-block': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-document': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-dropcursor': 3.27.4(@tiptap/extensions@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)) + '@tiptap/extension-gapcursor': 3.27.4(@tiptap/extensions@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)) + '@tiptap/extension-hard-break': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-heading': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-horizontal-rule': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-italic': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-link': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-list': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-list-item': 3.27.4(@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)) + '@tiptap/extension-list-keymap': 3.27.4(@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)) + '@tiptap/extension-ordered-list': 3.27.4(@tiptap/extension-list@3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)) + '@tiptap/extension-paragraph': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-strike': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-text': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extension-underline': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4)) + '@tiptap/extensions': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 + + '@tiptap/suggestion@3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)': + dependencies: + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 + + '@tiptap/vue-3@3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4)(vue@3.5.39(typescript@6.0.3))': + dependencies: + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.27.4(@tiptap/pm@3.27.4) + '@tiptap/pm': 3.27.4 vue: 3.5.39(typescript@6.0.3) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.27.1(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) - '@tiptap/extension-floating-menu': 3.27.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.27.1(@tiptap/pm@3.27.1))(@tiptap/pm@3.27.1) + '@tiptap/extension-bubble-menu': 3.27.4(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) + '@tiptap/extension-floating-menu': 3.27.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.27.4(@tiptap/pm@3.27.4))(@tiptap/pm@3.27.4) - '@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.9)(prosemirror-state@1.4.4)(prosemirror-view@1.41.9)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)': + '@tiptap/y-tiptap@3.0.7(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.1)(y-protocols@1.0.7(yjs@13.6.31))(yjs@13.6.31)': dependencies: lib0: 0.2.117 - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.9 + prosemirror-view: 1.42.1 y-protocols: 1.0.7(yjs@13.6.31) yjs: 13.6.31 @@ -7556,23 +7556,23 @@ snapshots: '@types/better-sqlite3@7.6.13': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.1.1 '@types/estree@1.0.9': {} '@types/jsesc@2.5.1': {} - '@types/node@26.0.1': + '@types/node@26.1.1': dependencies: undici-types: 8.3.0 '@types/nodemailer@7.0.12': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.1.1 '@types/pg@8.20.0': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.1.1 pg-protocol: 1.15.0 pg-types: 2.2.0 @@ -7604,38 +7604,38 @@ snapshots: glob: 13.0.6 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.4 + picomatch: 4.0.5 resolve-from: 5.0.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vitejs/plugin-vue-jsx@5.1.6(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': + '@vitejs/plugin-vue-jsx@5.1.6(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.7(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.8(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) - '@vue-macros/common@3.1.2(vue@3.5.39(typescript@6.0.3))': + '@vue-macros/common@3.1.3(vue@3.5.39(typescript@6.0.3))': dependencies: '@vue/compiler-sfc': 3.5.39 ast-kit: 2.2.0 local-pkg: 1.2.1 magic-string-ast: 1.0.3 - unplugin-utils: 0.3.1 + unplugin-utils: 0.3.2 optionalDependencies: vue: 3.5.39(typescript@6.0.3) @@ -7690,7 +7690,7 @@ snapshots: '@vue/shared': 3.5.39 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.16 + postcss: 8.5.19 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.39': @@ -7760,13 +7760,13 @@ snapshots: '@vueuse/shared': 14.3.0(vue@3.5.39(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) - '@vueuse/integrations@14.3.0(fuse.js@7.4.2)(vue@3.5.39(typescript@6.0.3))': + '@vueuse/integrations@14.3.0(fuse.js@7.5.0)(vue@3.5.39(typescript@6.0.3))': dependencies: '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) '@vueuse/shared': 14.3.0(vue@3.5.39(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) optionalDependencies: - fuse.js: 7.4.2 + fuse.js: 7.5.0 '@vueuse/metadata@10.11.1': {} @@ -7800,7 +7800,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 + fast-uri: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -7864,13 +7864,13 @@ snapshots: async@3.2.6: {} - autoprefixer@10.5.2(postcss@8.5.16): + autoprefixer@10.5.3(postcss@8.5.19): dependencies: - browserslist: 4.28.4 - caniuse-lite: 1.0.30001799 + browserslist: 4.28.6 + caniuse-lite: 1.0.30001805 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 aws-ssl-profiles@1.1.2: {} @@ -7883,10 +7883,10 @@ snapshots: bare-events@2.9.1: {} - bare-fs@4.7.2: + bare-fs@4.7.4: dependencies: bare-events: 2.9.1 - bare-path: 3.0.1 + bare-path: 3.1.1 bare-stream: 2.13.3(bare-events@2.9.1) bare-url: 2.4.5 fast-fifo: 1.3.2 @@ -7894,11 +7894,7 @@ snapshots: - bare-abort-controller - react-native-b4a - bare-os@3.9.2: {} - - bare-path@3.0.1: - dependencies: - bare-os: 3.9.2 + bare-path@3.1.1: {} bare-stream@2.13.3(bare-events@2.9.1): dependencies: @@ -7912,21 +7908,21 @@ snapshots: bare-url@2.4.5: dependencies: - bare-path: 3.0.1 + bare-path: 3.1.1 base64-js@1.5.1: {} - baseline-browser-mapping@2.10.40: {} + baseline-browser-mapping@2.10.43: {} - better-auth@1.6.22(@prisma/client@7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3))(better-sqlite3@12.11.1)(mysql2@3.15.3)(pg@8.22.0)(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.39(typescript@6.0.3)): + better-auth@1.6.23(@prisma/client@7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3))(better-sqlite3@12.11.1)(mysql2@3.15.3)(pg@8.22.0)(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.39(typescript@6.0.3)): dependencies: - '@better-auth/core': 1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0) - '@better-auth/drizzle-adapter': 1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2) - '@better-auth/kysely-adapter': 1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(kysely@0.29.2) - '@better-auth/memory-adapter': 1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2) - '@better-auth/mongo-adapter': 1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2) - '@better-auth/prisma-adapter': 1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(@prisma/client@7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3))(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3)) - '@better-auth/telemetry': 1.6.22(@better-auth/core@1.6.22(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0) + '@better-auth/drizzle-adapter': 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(kysely@0.29.3) + '@better-auth/memory-adapter': 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2) + '@better-auth/prisma-adapter': 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(@prisma/client@7.8.0(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3))(typescript@6.0.3))(prisma@7.8.0(@types/react@19.2.17)(better-sqlite3@12.11.1)(magicast@0.5.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3)) + '@better-auth/telemetry': 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.3)(kysely@0.29.3)(nanostores@1.4.0))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@noble/ciphers': 2.2.0 @@ -7934,7 +7930,7 @@ snapshots: better-call: 1.3.7(zod@4.4.3) defu: 6.1.7 jose: 6.2.3 - kysely: 0.29.2 + kysely: 0.29.3 nanostores: 1.4.0 zod: 4.4.3 optionalDependencies: @@ -7955,7 +7951,7 @@ snapshots: '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 rou3: 0.7.12 - set-cookie-parser: 3.1.1 + set-cookie-parser: 3.1.2 optionalDependencies: zod: 4.4.3 @@ -7982,11 +7978,11 @@ snapshots: boolbase@1.0.0: {} - brace-expansion@2.1.1: + brace-expansion@2.1.2: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.6: + brace-expansion@5.0.7: dependencies: balanced-match: 4.0.4 @@ -7994,13 +7990,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.4: + browserslist@4.28.6: dependencies: - baseline-browser-mapping: 2.10.40 - caniuse-lite: 1.0.30001799 - electron-to-chromium: 1.5.380 - node-releases: 2.0.50 - update-browserslist-db: 1.2.3(browserslist@4.28.4) + baseline-browser-mapping: 2.10.43 + caniuse-lite: 1.0.30001805 + electron-to-chromium: 1.5.389 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.6) buffer-crc32@1.0.0: {} @@ -8041,10 +8037,10 @@ snapshots: caniuse-api@4.0.0: dependencies: - browserslist: 4.28.4 - caniuse-lite: 1.0.30001799 + browserslist: 4.28.6 + caniuse-lite: 1.0.30001805 - caniuse-lite@1.0.30001799: {} + caniuse-lite@1.0.30001805: {} chalk@4.1.2: dependencies: @@ -8107,11 +8103,11 @@ snapshots: normalize-path: 3.0.0 readable-stream: 4.7.0 - concurrently@9.2.3: + concurrently@9.2.4: dependencies: chalk: 4.1.2 rxjs: 7.8.2 - shell-quote: 1.8.4 + shell-quote: 1.9.0 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -8151,9 +8147,9 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.6(srvx@0.11.17): + crossws@0.4.10(srvx@0.11.22): optionalDependencies: - srvx: 0.11.17 + srvx: 0.11.22 css-select@5.2.2: dependencies: @@ -8180,48 +8176,48 @@ snapshots: cssfilter@0.0.10: optional: true - cssnano-preset-default@8.0.2(postcss@8.5.16): - dependencies: - browserslist: 4.28.4 - cssnano-utils: 6.0.1(postcss@8.5.16) - postcss: 8.5.16 - postcss-calc: 10.1.1(postcss@8.5.16) - postcss-colormin: 8.0.1(postcss@8.5.16) - postcss-convert-values: 8.0.1(postcss@8.5.16) - postcss-discard-comments: 8.0.1(postcss@8.5.16) - postcss-discard-duplicates: 8.0.1(postcss@8.5.16) - postcss-discard-empty: 8.0.1(postcss@8.5.16) - postcss-discard-overridden: 8.0.1(postcss@8.5.16) - postcss-merge-longhand: 8.0.1(postcss@8.5.16) - postcss-merge-rules: 8.0.1(postcss@8.5.16) - postcss-minify-font-values: 8.0.1(postcss@8.5.16) - postcss-minify-gradients: 8.0.1(postcss@8.5.16) - postcss-minify-params: 8.0.1(postcss@8.5.16) - postcss-minify-selectors: 8.0.2(postcss@8.5.16) - postcss-normalize-charset: 8.0.1(postcss@8.5.16) - postcss-normalize-display-values: 8.0.1(postcss@8.5.16) - postcss-normalize-positions: 8.0.1(postcss@8.5.16) - postcss-normalize-repeat-style: 8.0.1(postcss@8.5.16) - postcss-normalize-string: 8.0.1(postcss@8.5.16) - postcss-normalize-timing-functions: 8.0.1(postcss@8.5.16) - postcss-normalize-unicode: 8.0.1(postcss@8.5.16) - postcss-normalize-url: 8.0.1(postcss@8.5.16) - postcss-normalize-whitespace: 8.0.1(postcss@8.5.16) - postcss-ordered-values: 8.0.1(postcss@8.5.16) - postcss-reduce-initial: 8.0.1(postcss@8.5.16) - postcss-reduce-transforms: 8.0.1(postcss@8.5.16) - postcss-svgo: 8.0.1(postcss@8.5.16) - postcss-unique-selectors: 8.0.1(postcss@8.5.16) - - cssnano-utils@6.0.1(postcss@8.5.16): - dependencies: - postcss: 8.5.16 - - cssnano@8.0.2(postcss@8.5.16): - dependencies: - cssnano-preset-default: 8.0.2(postcss@8.5.16) + cssnano-preset-default@8.0.2(postcss@8.5.19): + dependencies: + browserslist: 4.28.6 + cssnano-utils: 6.0.1(postcss@8.5.19) + postcss: 8.5.19 + postcss-calc: 10.1.1(postcss@8.5.19) + postcss-colormin: 8.0.1(postcss@8.5.19) + postcss-convert-values: 8.0.1(postcss@8.5.19) + postcss-discard-comments: 8.0.1(postcss@8.5.19) + postcss-discard-duplicates: 8.0.1(postcss@8.5.19) + postcss-discard-empty: 8.0.1(postcss@8.5.19) + postcss-discard-overridden: 8.0.1(postcss@8.5.19) + postcss-merge-longhand: 8.0.1(postcss@8.5.19) + postcss-merge-rules: 8.0.1(postcss@8.5.19) + postcss-minify-font-values: 8.0.1(postcss@8.5.19) + postcss-minify-gradients: 8.0.1(postcss@8.5.19) + postcss-minify-params: 8.0.1(postcss@8.5.19) + postcss-minify-selectors: 8.0.2(postcss@8.5.19) + postcss-normalize-charset: 8.0.1(postcss@8.5.19) + postcss-normalize-display-values: 8.0.1(postcss@8.5.19) + postcss-normalize-positions: 8.0.1(postcss@8.5.19) + postcss-normalize-repeat-style: 8.0.1(postcss@8.5.19) + postcss-normalize-string: 8.0.1(postcss@8.5.19) + postcss-normalize-timing-functions: 8.0.1(postcss@8.5.19) + postcss-normalize-unicode: 8.0.1(postcss@8.5.19) + postcss-normalize-url: 8.0.1(postcss@8.5.19) + postcss-normalize-whitespace: 8.0.1(postcss@8.5.19) + postcss-ordered-values: 8.0.1(postcss@8.5.19) + postcss-reduce-initial: 8.0.1(postcss@8.5.19) + postcss-reduce-transforms: 8.0.1(postcss@8.5.19) + postcss-svgo: 8.0.1(postcss@8.5.19) + postcss-unique-selectors: 8.0.1(postcss@8.5.19) + + cssnano-utils@6.0.1(postcss@8.5.19): + dependencies: + postcss: 8.5.19 + + cssnano@8.0.2(postcss@8.5.19): + dependencies: + cssnano-preset-default: 8.0.2(postcss@8.5.19) lilconfig: 3.1.3 - postcss: 8.5.16 + postcss: 8.5.19 csso@5.0.5: dependencies: @@ -8294,7 +8290,7 @@ snapshots: dot-prop@10.1.0: dependencies: - type-fest: 5.7.0 + type-fest: 5.8.0 dotenv@17.4.2: {} @@ -8309,7 +8305,7 @@ snapshots: '@standard-schema/spec': 1.1.0 fast-check: 3.23.2 - electron-to-chromium@1.5.380: {} + electron-to-chromium@1.5.389: {} embla-carousel-auto-height@8.6.0(embla-carousel@8.6.0): dependencies: @@ -8381,7 +8377,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@2.1.0: {} + es-module-lexer@2.3.1: {} esbuild@0.27.7: optionalDependencies: @@ -8505,7 +8501,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.2: {} + fast-uri@3.1.3: {} fast-wrap-ansi@0.2.2: dependencies: @@ -8515,9 +8511,9 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 file-uri-to-path@1.0.0: {} @@ -8539,7 +8535,7 @@ snapshots: dependencies: tiny-inflate: 1.0.3 - fontless@0.2.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + fontless@0.2.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: consola: 3.4.2 css-tree: 3.2.1 @@ -8555,7 +8551,7 @@ snapshots: unifont: 0.7.4 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1) optionalDependencies: - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -8584,9 +8580,9 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.42.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + framer-motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - motion-dom: 12.42.0 + motion-dom: 12.42.2 motion-utils: 12.39.0 tslib: 2.8.1 optionalDependencies: @@ -8602,7 +8598,7 @@ snapshots: function-bind@1.1.2: {} - fuse.js@7.4.2: {} + fuse.js@7.5.0: {} fzf@0.5.2: {} @@ -8647,18 +8643,18 @@ snapshots: dependencies: ini: 4.1.1 - globby@16.2.0: + globby@16.2.1: dependencies: '@sindresorhus/merge-streams': 4.0.0 fast-glob: 3.3.3 - ignore: 7.0.5 + ignore: 7.0.6 is-path-inside: 4.0.0 slash: 5.1.0 unicorn-magic: 0.4.0 graceful-fs@4.2.11: {} - grammex@3.1.12: {} + grammex@3.1.13: {} graphmatch@1.1.1: {} @@ -8686,7 +8682,7 @@ snapshots: hey-listen@1.0.8: {} - hono@4.12.27: {} + hono@4.12.30: {} hookable@5.5.3: {} @@ -8711,29 +8707,29 @@ snapshots: transitivePeerDependencies: - supports-color - httpxy@0.5.3: {} + httpxy@0.5.5: {} human-signals@5.0.0: {} - iconv-lite@0.7.2: + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 ieee754@1.2.1: {} - ignore@7.0.5: {} + ignore@7.0.6: {} image-meta@0.2.2: {} import-meta-resolve@4.2.0: {} - impound@1.1.5(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + impound@1.1.5(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@jridgewell/trace-mapping': 0.3.31 - es-module-lexer: 2.1.0 + es-module-lexer: 2.3.1 pathe: 2.0.3 - unplugin: 3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - unplugin-utils: 0.3.1 + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + unplugin-utils: 0.3.2 transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -8763,7 +8759,7 @@ snapshots: transitivePeerDependencies: - supports-color - ipx@3.1.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(srvx@0.11.17): + ipx@3.1.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1)(srvx@0.11.22): dependencies: '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 @@ -8773,11 +8769,11 @@ snapshots: etag: 1.8.1 h3: 1.15.11 image-meta: 0.2.2 - listhen: 1.10.0(srvx@0.11.17) + listhen: 1.10.0(srvx@0.11.22) ofetch: 1.5.1 pathe: 2.0.3 sharp: 0.34.5 - svgo: 4.0.1 + svgo: 4.0.2 ufo: 1.6.4 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1) xss: 1.0.15 @@ -8885,12 +8881,12 @@ snapshots: knitwork@1.3.0: {} - kysely@0.29.2: {} + kysely@0.29.3: {} launch-editor@2.14.1: dependencies: picocolors: 1.1.1 - shell-quote: 1.9.0 + shell-quote: 1.10.0 lazystream@1.0.1: dependencies: @@ -8953,13 +8949,13 @@ snapshots: linkifyjs@4.3.3: {} - listhen@1.10.0(srvx@0.11.17): + listhen@1.10.0(srvx@0.11.22): dependencies: '@parcel/watcher': 2.5.6 '@parcel/watcher-wasm': 2.5.6 citty: 0.2.2 consola: 3.4.2 - crossws: 0.4.6(srvx@0.11.17) + crossws: 0.4.10(srvx@0.11.22) defu: 6.1.7 get-port-please: 3.2.0 h3: 1.15.11 @@ -8968,7 +8964,7 @@ snapshots: mlly: 1.8.2 node-forge: 1.4.0 pathe: 2.0.3 - std-env: 4.1.0 + std-env: 4.2.0 tinyclip: 0.1.15 ufo: 1.6.4 untun: 0.1.3 @@ -8988,7 +8984,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.5.1: {} + lru-cache@11.5.2: {} lru-cache@5.1.1: dependencies: @@ -9006,12 +9002,12 @@ snapshots: ufo: 1.6.4 unplugin: 2.3.11 - magic-regexp@0.11.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + magic-regexp@0.11.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: magic-string: 0.30.21 regexp-tree: 0.1.27 type-level-regexp: 0.1.17 - unplugin: 3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -9066,15 +9062,15 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.6 + brace-expansion: 5.0.7 minimatch@5.1.9: dependencies: - brace-expansion: 2.1.1 + brace-expansion: 2.1.2 minimatch@9.0.9: dependencies: - brace-expansion: 2.1.1 + brace-expansion: 2.1.2 minimist@1.2.8: {} @@ -9095,7 +9091,7 @@ snapshots: mocked-exports@0.1.1: {} - motion-dom@12.42.0: + motion-dom@12.42.2: dependencies: motion-utils: 12.39.0 @@ -9104,9 +9100,9 @@ snapshots: motion-v@2.3.0(@vueuse/core@14.3.0(vue@3.5.39(typescript@6.0.3)))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.39(typescript@6.0.3)): dependencies: '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) - framer-motion: 12.42.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + framer-motion: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) hey-listen: 1.0.8 - motion-dom: 12.42.0 + motion-dom: 12.42.2 motion-utils: 12.39.0 vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: @@ -9125,7 +9121,7 @@ snapshots: aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 long: 5.3.2 lru.min: 1.1.4 named-placeholders: 1.1.6 @@ -9136,7 +9132,7 @@ snapshots: dependencies: lru.min: 1.1.4 - nanoid@3.3.15: {} + nanoid@3.3.16: {} nanostores@1.4.0: {} @@ -9144,7 +9140,7 @@ snapshots: napi-build-utils@2.0.0: {} - nitropack@2.13.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3)(oxc-parser@0.133.0)(srvx@0.11.17)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + nitropack@2.13.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3)(oxc-parser@0.133.0)(srvx@0.11.22)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.62.2) @@ -9173,16 +9169,16 @@ snapshots: escape-string-regexp: 5.0.0 etag: 1.8.1 exsolve: 1.1.0 - globby: 16.2.0 + globby: 16.2.1 gzip-size: 7.0.0 h3: 1.15.11 hookable: 5.5.3 - httpxy: 0.5.3 + httpxy: 0.5.5 ioredis: 5.11.1 jiti: 2.7.0 klona: 2.0.6 knitwork: 1.3.0 - listhen: 1.10.0(srvx@0.11.17) + listhen: 1.10.0(srvx@0.11.22) magic-string: 0.30.21 magicast: 0.5.3 mime: 4.1.0 @@ -9203,14 +9199,14 @@ snapshots: serve-placeholder: 2.0.2 serve-static: 2.2.1 source-map: 0.7.6 - std-env: 4.1.0 + std-env: 4.2.0 ufo: 1.6.4 - ultrahtml: 1.6.0 + ultrahtml: 1.7.0 uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.3.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - unplugin-utils: 0.3.1 + unimport: 6.3.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + unplugin-utils: 0.3.2 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(ioredis@5.11.1) untyped: 2.0.0 unwasm: 0.5.3 @@ -9255,7 +9251,7 @@ snapshots: - vite - webpack - node-abi@3.92.0: + node-abi@3.94.0: dependencies: semver: 7.8.5 @@ -9273,7 +9269,7 @@ snapshots: node-mock-http@1.0.4: {} - node-releases@2.0.50: {} + node-releases@2.0.51: {} nodemailer@7.0.13: {} @@ -9296,16 +9292,16 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.0.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(yaml@2.9.0): + nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(yaml@2.9.0): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@6.0.3) - '@nuxt/cli': 3.36.1(@nuxt/schema@4.4.8)(cac@6.7.14)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + '@nuxt/cli': 3.37.0(@nuxt/schema@4.4.8)(cac@6.7.14)(magicast@0.5.3) + '@nuxt/devtools': 3.2.4(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.8(bc443d7867de717f2b59d52eacee6d61) + '@nuxt/nitro-server': 4.4.8(6599755f0421871d46b05d168504eba3) '@nuxt/schema': 4.4.8 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.8(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@26.0.1)(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.0.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(yaml@2.9.0))(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3))(yaml@2.9.0) + '@nuxt/vite-builder': 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@types/node@26.1.1)(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@electric-sql/pglite@0.4.1)(@parcel/watcher@2.5.6)(@types/node@26.1.1)(@vue/compiler-sfc@3.5.39)(better-sqlite3@12.11.1)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(better-sqlite3@12.11.1)(mysql2@3.15.3))(esbuild@0.28.1)(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.22)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(yaml@2.9.0))(rollup-plugin-visualizer@7.0.1(rollup@4.62.2))(rollup@4.62.2)(terser@5.49.0)(tsx@4.23.1)(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3))(yaml@2.9.0) '@unhead/vue': 2.1.15(vue@3.5.39(typescript@6.0.3)) '@vue/shared': 3.5.39 chokidar: 5.0.0 @@ -9318,8 +9314,8 @@ snapshots: escape-string-regexp: 5.0.0 exsolve: 1.1.0 hookable: 6.1.1 - ignore: 7.0.5 - impound: 1.1.5(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + ignore: 7.0.6 + impound: 1.1.5(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) jiti: 2.7.0 klona: 2.0.6 knitwork: 1.3.0 @@ -9333,30 +9329,30 @@ snapshots: oxc-minify: 0.133.0 oxc-parser: 0.133.0 oxc-transform: 0.133.0 - oxc-walker: 1.0.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + oxc-walker: 1.0.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) pathe: 2.0.3 perfect-debounce: 2.1.0 - picomatch: 4.0.4 + picomatch: 4.0.5 pkg-types: 2.3.1 rou3: 0.8.1 scule: 1.3.0 semver: 7.8.5 - std-env: 4.1.0 + std-env: 4.2.0 tinyglobby: 0.2.17 ufo: 1.6.4 - ultrahtml: 1.6.0 + ultrahtml: 1.7.0 uncrypto: 0.1.3 unctx: 2.5.0 unhead: 2.1.15 - unimport: 6.3.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - unplugin: 3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + unimport: 6.3.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) unrouting: 0.1.7 untyped: 2.0.0 vue: 3.5.39(typescript@6.0.3) - vue-router: 5.1.0(@vue/compiler-sfc@3.5.39)(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + vue-router: 5.1.0(@vue/compiler-sfc@3.5.39)(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) optionalDependencies: '@parcel/watcher': 2.5.6 - '@types/node': 26.0.1 + '@types/node': 26.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9545,9 +9541,9 @@ snapshots: '@oxc-transform/binding-win32-ia32-msvc': 0.133.0 '@oxc-transform/binding-win32-x64-msvc': 0.133.0 - oxc-walker@1.0.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + oxc-walker@1.0.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: - magic-regexp: 0.11.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + magic-regexp: 0.11.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) optionalDependencies: oxc-parser: 0.133.0 transitivePeerDependencies: @@ -9562,7 +9558,7 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@1.6.0: {} + package-manager-detector@1.7.0: {} parseurl@1.3.3: {} @@ -9579,7 +9575,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.5.1 + lru-cache: 11.5.2 minipass: 7.1.3 pathe@1.1.2: {} @@ -9627,7 +9623,7 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pkg-types@1.3.1: dependencies: @@ -9641,144 +9637,144 @@ snapshots: exsolve: 1.1.0 pathe: 2.0.3 - postcss-calc@10.1.1(postcss@8.5.16): + postcss-calc@10.1.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-selector-parser: 7.1.4 postcss-value-parser: 4.2.0 - postcss-colormin@8.0.1(postcss@8.5.16): + postcss-colormin@8.0.1(postcss@8.5.19): dependencies: '@colordx/core': 5.5.0 - browserslist: 4.28.4 + browserslist: 4.28.6 caniuse-api: 4.0.0 - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-convert-values@8.0.1(postcss@8.5.16): + postcss-convert-values@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.4 - postcss: 8.5.16 + browserslist: 4.28.6 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-discard-comments@8.0.1(postcss@8.5.16): + postcss-discard-comments@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-selector-parser: 7.1.4 - postcss-discard-duplicates@8.0.1(postcss@8.5.16): + postcss-discard-duplicates@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 - postcss-discard-empty@8.0.1(postcss@8.5.16): + postcss-discard-empty@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 - postcss-discard-overridden@8.0.1(postcss@8.5.16): + postcss-discard-overridden@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 - postcss-merge-longhand@8.0.1(postcss@8.5.16): + postcss-merge-longhand@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - stylehacks: 8.0.1(postcss@8.5.16) + stylehacks: 8.0.1(postcss@8.5.19) - postcss-merge-rules@8.0.1(postcss@8.5.16): + postcss-merge-rules@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.4 + browserslist: 4.28.6 caniuse-api: 4.0.0 - cssnano-utils: 6.0.1(postcss@8.5.16) - postcss: 8.5.16 + cssnano-utils: 6.0.1(postcss@8.5.19) + postcss: 8.5.19 postcss-selector-parser: 7.1.4 - postcss-minify-font-values@8.0.1(postcss@8.5.16): + postcss-minify-font-values@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-minify-gradients@8.0.1(postcss@8.5.16): + postcss-minify-gradients@8.0.1(postcss@8.5.19): dependencies: '@colordx/core': 5.5.0 - cssnano-utils: 6.0.1(postcss@8.5.16) - postcss: 8.5.16 + cssnano-utils: 6.0.1(postcss@8.5.19) + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-minify-params@8.0.1(postcss@8.5.16): + postcss-minify-params@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.4 - cssnano-utils: 6.0.1(postcss@8.5.16) - postcss: 8.5.16 + browserslist: 4.28.6 + cssnano-utils: 6.0.1(postcss@8.5.19) + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-minify-selectors@8.0.2(postcss@8.5.16): + postcss-minify-selectors@8.0.2(postcss@8.5.19): dependencies: - browserslist: 4.28.4 + browserslist: 4.28.6 caniuse-api: 4.0.0 cssesc: 3.0.0 - postcss: 8.5.16 + postcss: 8.5.19 postcss-selector-parser: 7.1.4 - postcss-normalize-charset@8.0.1(postcss@8.5.16): + postcss-normalize-charset@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 - postcss-normalize-display-values@8.0.1(postcss@8.5.16): + postcss-normalize-display-values@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-normalize-positions@8.0.1(postcss@8.5.16): + postcss-normalize-positions@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@8.0.1(postcss@8.5.16): + postcss-normalize-repeat-style@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-normalize-string@8.0.1(postcss@8.5.16): + postcss-normalize-string@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@8.0.1(postcss@8.5.16): + postcss-normalize-timing-functions@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@8.0.1(postcss@8.5.16): + postcss-normalize-unicode@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.4 - postcss: 8.5.16 + browserslist: 4.28.6 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-normalize-url@8.0.1(postcss@8.5.16): + postcss-normalize-url@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@8.0.1(postcss@8.5.16): + postcss-normalize-whitespace@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-ordered-values@8.0.1(postcss@8.5.16): + postcss-ordered-values@8.0.1(postcss@8.5.19): dependencies: - cssnano-utils: 6.0.1(postcss@8.5.16) - postcss: 8.5.16 + cssnano-utils: 6.0.1(postcss@8.5.19) + postcss: 8.5.19 postcss-value-parser: 4.2.0 - postcss-reduce-initial@8.0.1(postcss@8.5.16): + postcss-reduce-initial@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.4 + browserslist: 4.28.6 caniuse-api: 4.0.0 - postcss: 8.5.16 + postcss: 8.5.19 - postcss-reduce-transforms@8.0.1(postcss@8.5.16): + postcss-reduce-transforms@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 postcss-selector-parser@7.1.4: @@ -9786,28 +9782,22 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-svgo@8.0.1(postcss@8.5.16): + postcss-svgo@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-value-parser: 4.2.0 - svgo: 4.0.1 + svgo: 4.0.2 - postcss-unique-selectors@8.0.1(postcss@8.5.16): + postcss-unique-selectors@8.0.1(postcss@8.5.19): dependencies: - postcss: 8.5.16 + postcss: 8.5.19 postcss-selector-parser: 7.1.4 postcss-value-parser@4.2.0: {} - postcss@8.5.15: - dependencies: - nanoid: 3.3.15 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - postcss@8.5.16: + postcss@8.5.19: dependencies: - nanoid: 3.3.15 + nanoid: 3.3.16 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -9835,7 +9825,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.92.0 + node-abi: 3.94.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 @@ -9884,28 +9874,28 @@ snapshots: prosemirror-commands@1.7.1: dependencies: - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-dropcursor@1.8.2: + prosemirror-dropcursor@1.8.3: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.9 + prosemirror-view: 1.42.1 prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.9 + prosemirror-view: 1.42.1 prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.9 + prosemirror-view: 1.42.1 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: @@ -9918,37 +9908,37 @@ snapshots: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-model@1.25.9: + prosemirror-model@1.25.11: dependencies: orderedmap: 2.1.1 prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 prosemirror-state@1.4.4: dependencies: - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.9 + prosemirror-view: 1.42.1 prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.9 + prosemirror-view: 1.42.1 prosemirror-transform@1.12.0: dependencies: - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 - prosemirror-view@1.41.9: + prosemirror-view@1.42.1: dependencies: - prosemirror-model: 1.25.9 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 @@ -10026,11 +10016,11 @@ snapshots: reka-ui@2.9.10(vue@3.5.39(typescript@6.0.3)): dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.8.0 '@floating-ui/vue': 1.1.11(vue@3.5.39(typescript@6.0.3)) '@internationalized/date': 3.12.2 '@internationalized/number': 3.6.7 - '@tanstack/vue-virtual': 3.13.30(vue@3.5.39(typescript@6.0.3)) + '@tanstack/vue-virtual': 3.13.32(vue@3.5.39(typescript@6.0.3)) '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) '@vueuse/shared': 14.3.0(vue@3.5.39(typescript@6.0.3)) aria-hidden: 1.2.6 @@ -10062,7 +10052,7 @@ snapshots: rollup-plugin-visualizer@7.0.1(rollup@4.62.2): dependencies: open: 11.0.0 - picomatch: 4.0.4 + picomatch: 4.0.5 source-map: 0.7.6 yargs: 18.0.0 optionalDependencies: @@ -10149,9 +10139,9 @@ snapshots: seq-queue@0.0.5: {} - serialize-javascript@7.0.6: {} + serialize-javascript@7.0.7: {} - seroval@1.5.4: {} + seroval@1.5.5: {} serve-placeholder@2.0.2: dependencies: @@ -10166,7 +10156,7 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@3.1.1: {} + set-cookie-parser@3.1.2: {} setprototypeof@1.2.0: {} @@ -10208,7 +10198,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.4: {} + shell-quote@1.10.0: {} shell-quote@1.9.0: {} @@ -10261,7 +10251,7 @@ snapshots: sqlstring@2.3.3: {} - srvx@0.11.17: {} + srvx@0.11.22: {} standard-as-callback@2.1.0: {} @@ -10269,7 +10259,7 @@ snapshots: std-env@3.10.0: {} - std-env@4.1.0: {} + std-env@4.2.0: {} streamx@2.28.0: dependencies: @@ -10324,10 +10314,10 @@ snapshots: structured-clone-es@2.0.0: {} - stylehacks@8.0.1(postcss@8.5.16): + stylehacks@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.4 - postcss: 8.5.16 + browserslist: 4.28.6 + postcss: 8.5.19 postcss-selector-parser: 7.1.4 supports-color@10.2.2: {} @@ -10342,7 +10332,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svgo@4.0.1: + svgo@4.0.2: dependencies: commander: 11.1.0 css-select: 5.2.2 @@ -10356,13 +10346,13 @@ snapshots: tailwind-merge@3.6.0: {} - tailwind-variants@3.2.2(tailwind-merge@3.6.0)(tailwindcss@4.3.1): + tailwind-variants@3.2.2(tailwind-merge@3.6.0)(tailwindcss@4.3.2): dependencies: - tailwindcss: 4.3.1 + tailwindcss: 4.3.2 optionalDependencies: tailwind-merge: 3.6.0 - tailwindcss@4.3.1: {} + tailwindcss@4.3.2: {} tapable@2.3.3: {} @@ -10384,7 +10374,7 @@ snapshots: tar-stream@3.2.0: dependencies: b4a: 1.8.1 - bare-fs: 4.7.2 + bare-fs: 4.7.4 fast-fifo: 1.3.2 streamx: 2.28.0 transitivePeerDependencies: @@ -10392,7 +10382,7 @@ snapshots: - bare-buffer - react-native-b4a - tar@7.5.19: + tar@7.5.20: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -10407,7 +10397,7 @@ snapshots: - bare-abort-controller - react-native-b4a - terser@5.48.0: + terser@5.49.0: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.17.0 @@ -10430,8 +10420,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 to-regex-range@5.0.1: dependencies: @@ -10447,7 +10437,7 @@ snapshots: tslib@2.8.1: {} - tsx@4.22.4: + tsx@4.23.1: dependencies: esbuild: 0.28.1 optionalDependencies: @@ -10457,7 +10447,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - type-fest@5.7.0: + type-fest@5.8.0: dependencies: tagged-tag: 1.0.0 @@ -10467,7 +10457,7 @@ snapshots: ufo@1.6.4: {} - ultrahtml@1.6.0: {} + ultrahtml@1.7.0: {} uncrypto@0.1.3: {} @@ -10507,15 +10497,15 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 pkg-types: 2.3.1 scule: 1.3.0 strip-literal: 3.1.0 tinyglobby: 0.2.17 unplugin: 2.3.11 - unplugin-utils: 0.3.1 + unplugin-utils: 0.3.2 - unimport@6.3.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + unimport@6.3.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: acorn: 8.17.0 escape-string-regexp: 5.0.0 @@ -10524,13 +10514,13 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 pkg-types: 2.3.1 scule: 1.3.0 strip-literal: 3.1.0 tinyglobby: 0.2.17 - unplugin: 3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - unplugin-utils: 0.3.1 + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + unplugin-utils: 0.3.2 optionalDependencies: oxc-parser: 0.133.0 transitivePeerDependencies: @@ -10547,30 +10537,30 @@ snapshots: dependencies: local-pkg: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.5 unimport: 5.7.0 unplugin: 2.3.11 - unplugin-utils: 0.3.1 + unplugin-utils: 0.3.2 optionalDependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) - unplugin-utils@0.3.1: + unplugin-utils@0.3.2: dependencies: pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 - unplugin-vue-components@32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)): + unplugin-vue-components@32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)): dependencies: chokidar: 5.0.0 local-pkg: 1.2.1 magic-string: 0.30.21 mlly: 1.8.2 obug: 2.1.3 - picomatch: 4.0.4 + picomatch: 4.0.5 tinyglobby: 0.2.17 - unplugin: 3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - unplugin-utils: 0.3.1 + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + unplugin-utils: 0.3.2 vue: 3.5.39(typescript@6.0.3) optionalDependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) @@ -10589,18 +10579,18 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.17.0 - picomatch: 4.0.4 + picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 - unplugin@3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + unplugin@3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.4 + picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 optionalDependencies: esbuild: 0.28.1 rollup: 4.62.2 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) unrouting@0.1.7: dependencies: @@ -10613,7 +10603,7 @@ snapshots: chokidar: 5.0.0 destr: 2.0.5 h3: 1.15.11 - lru-cache: 11.5.1 + lru-cache: 11.5.2 node-fetch-native: 1.6.7 ofetch: 1.5.1 ufo: 1.6.4 @@ -10644,9 +10634,9 @@ snapshots: pathe: 2.0.3 pkg-types: 2.3.1 - update-browserslist-db@1.2.3(browserslist@4.28.4): + update-browserslist-db@1.2.3(browserslist@4.28.6): dependencies: - browserslist: 4.28.4 + browserslist: 4.28.6 escalade: 3.2.0 picocolors: 1.1.1 @@ -10666,23 +10656,23 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' - vite-dev-rpc@2.0.0(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + vite-dev-rpc@2.0.0(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: birpc: 4.0.0 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) - vite-hot-client: 2.2.0(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-hot-client: 2.2.0(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) - vite-hot-client@2.2.0(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + vite-hot-client@2.2.0(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) - vite-node@5.3.0(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0): + vite-node@5.3.0(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): dependencies: cac: 6.7.14 - es-module-lexer: 2.1.0 + es-module-lexer: 2.3.1 obug: 2.1.3 pathe: 2.0.3 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -10696,20 +10686,20 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.14.4(typescript@6.0.3)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + vite-plugin-checker@0.14.4(typescript@6.0.3)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@babel/code-frame': 7.29.7 chokidar: 5.0.0 npm-run-path: 6.0.0 picocolors: 1.1.1 - picomatch: 4.0.4 + picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) optionalDependencies: typescript: 6.0.3 - vite-plugin-inspect@11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)): + vite-plugin-inspect@11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: ansis: 4.3.1 error-stack-parser-es: 1.0.5 @@ -10718,44 +10708,44 @@ snapshots: open: 11.0.0 perfect-debounce: 2.1.0 sirv: 3.0.2 - unplugin-utils: 0.3.1 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) - vite-dev-rpc: 2.0.0(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) + unplugin-utils: 0.3.2 + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) + vite-dev-rpc: 2.0.0(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) optionalDependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) - vite-plugin-vue-tracer@1.4.0(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)): + vite-plugin-vue-tracer@1.4.0(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.1.0 magic-string: 0.30.21 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.39(typescript@6.0.3) - vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0): + vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0): dependencies: esbuild: 0.28.1 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.16 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + postcss: 8.5.19 rollup: 4.62.2 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.0.1 + '@types/node': 26.1.1 fsevents: 2.3.3 jiti: 2.7.0 lightningcss: 1.32.0 - terser: 5.48.0 - tsx: 4.22.4 + terser: 5.49.0 + tsx: 4.23.1 yaml: 2.9.0 vue-bundle-renderer@2.3.1: dependencies: ufo: 1.6.4 - vue-component-type-helpers@3.3.5: {} + vue-component-type-helpers@3.3.7: {} vue-demi@0.14.10(vue@3.5.39(typescript@6.0.3)): dependencies: @@ -10768,10 +10758,10 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.39(typescript@6.0.3) - vue-router@5.1.0(@vue/compiler-sfc@3.5.39)(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)): + vue-router@5.1.0(@vue/compiler-sfc@3.5.39)(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)): dependencies: '@babel/generator': 8.0.0 - '@vue-macros/common': 3.1.2(vue@3.5.39(typescript@6.0.3)) + '@vue-macros/common': 3.1.3(vue@3.5.39(typescript@6.0.3)) '@vue/devtools-api': 8.1.5 ast-walker-scope: 0.9.0 chokidar: 5.0.0 @@ -10781,16 +10771,16 @@ snapshots: mlly: 1.8.2 muggle-string: 0.4.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 scule: 1.3.0 tinyglobby: 0.2.17 - unplugin: 3.2.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) - unplugin-utils: 0.3.1 + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0)) + unplugin-utils: 0.3.2 vue: 3.5.39(typescript@6.0.3) yaml: 2.9.0 optionalDependencies: '@vue/compiler-sfc': 3.5.39 - vite: 7.3.6(@types/node@26.0.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -10852,7 +10842,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.21.0: {} + ws@8.21.1: {} wsl-utils@0.3.1: dependencies: @@ -10922,7 +10912,7 @@ snapshots: zeptomatch@2.1.0: dependencies: - grammex: 3.1.12 + grammex: 3.1.13 graphmatch: 1.1.1 zip-stream@6.0.1: diff --git a/prisma/migrations/20260718052448_poster_to_user_and_unused_admin_boolean_gone/migration.sql b/prisma/migrations/20260718052448_poster_to_user_and_unused_admin_boolean_gone/migration.sql new file mode 100644 index 00000000..a8dee113 --- /dev/null +++ b/prisma/migrations/20260718052448_poster_to_user_and_unused_admin_boolean_gone/migration.sql @@ -0,0 +1,52 @@ +/* + Warnings: + + - You are about to drop the column `admin` on the `user` table. All the data in the column will be lost. + - Added the required column `userId` to the `Poster` table without a default value. This is not possible if the table is not empty. + +*/ +-- RedefineTables +PRAGMA defer_foreign_keys=ON; +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_Poster" ( + "id" TEXT NOT NULL PRIMARY KEY, + "tag" TEXT NOT NULL DEFAULT 'other', + "verified" BOOLEAN NOT NULL DEFAULT false, + "school" TEXT, + "district" TEXT, + "zipcode" TEXT, + "userId" TEXT NOT NULL, + CONSTRAINT "Poster_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); +INSERT INTO "new_Poster" ("district", "id", "school", "tag", "verified", "zipcode") SELECT "district", "id", "school", "tag", "verified", "zipcode" FROM "Poster"; +DROP TABLE "Poster"; +ALTER TABLE "new_Poster" RENAME TO "Poster"; +CREATE UNIQUE INDEX "Poster_userId_key" ON "Poster"("userId"); +CREATE INDEX "Poster_tag_idx" ON "Poster"("tag"); +CREATE INDEX "Poster_verified_idx" ON "Poster"("verified"); +CREATE INDEX "Poster_school_idx" ON "Poster"("school"); +CREATE INDEX "Poster_district_idx" ON "Poster"("district"); +CREATE INDEX "Poster_zipcode_idx" ON "Poster"("zipcode"); +CREATE TABLE "new_user" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "emailVerified" BOOLEAN NOT NULL DEFAULT false, + "role" TEXT NOT NULL DEFAULT 'reader', + "raffleOptIn" BOOLEAN NOT NULL DEFAULT true, + "publicityConsent" BOOLEAN NOT NULL DEFAULT false, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); +INSERT INTO "new_user" ("createdAt", "email", "emailVerified", "id", "name", "publicityConsent", "raffleOptIn", "role", "updatedAt") SELECT "createdAt", "email", "emailVerified", "id", "name", "publicityConsent", "raffleOptIn", "role", "updatedAt" FROM "user"; +DROP TABLE "user"; +ALTER TABLE "new_user" RENAME TO "user"; +CREATE UNIQUE INDEX "user_email_key" ON "user"("email"); +PRAGMA foreign_keys=ON; +PRAGMA defer_foreign_keys=OFF; + +-- CreateIndex +CREATE INDEX "Announcement_class_idx" ON "Announcement"("class"); + +-- CreateIndex +CREATE INDEX "Class_joinToken_idx" ON "Class"("joinToken"); diff --git a/prisma/migrations/20260719190000_rename_poster_to_coach/migration.sql b/prisma/migrations/20260719190000_rename_poster_to_coach/migration.sql new file mode 100644 index 00000000..2d267a9e --- /dev/null +++ b/prisma/migrations/20260719190000_rename_poster_to_coach/migration.sql @@ -0,0 +1,20 @@ +ALTER TABLE "Poster" RENAME TO "Coach"; +ALTER TABLE "_ClassToPoster" RENAME TO "_ClassToCoach"; + +DROP INDEX "Poster_tag_idx"; +DROP INDEX "Poster_verified_idx"; +DROP INDEX "Poster_school_idx"; +DROP INDEX "Poster_district_idx"; +DROP INDEX "Poster_zipcode_idx"; +DROP INDEX "_ClassToPoster_AB_unique"; +DROP INDEX "_ClassToPoster_B_index"; + +CREATE INDEX "Coach_tag_idx" ON "Coach"("tag"); +CREATE INDEX "Coach_verified_idx" ON "Coach"("verified"); +CREATE INDEX "Coach_school_idx" ON "Coach"("school"); +CREATE INDEX "Coach_district_idx" ON "Coach"("district"); +CREATE INDEX "Coach_zipcode_idx" ON "Coach"("zipcode"); +CREATE UNIQUE INDEX "_ClassToCoach_AB_unique" ON "_ClassToCoach"("A", "B"); +CREATE INDEX "_ClassToCoach_B_index" ON "_ClassToCoach"("B"); + +UPDATE "user" SET "role" = 'coach' WHERE "role" = 'poster'; diff --git a/prisma/migrations/20260727190000_rename_coach_user_id_index/migration.sql b/prisma/migrations/20260727190000_rename_coach_user_id_index/migration.sql new file mode 100644 index 00000000..81e3faf1 --- /dev/null +++ b/prisma/migrations/20260727190000_rename_coach_user_id_index/migration.sql @@ -0,0 +1,3 @@ +DROP INDEX "Poster_userId_key"; + +CREATE UNIQUE INDEX "Coach_userId_key" ON "Coach"("userId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9db41e6c..c661a3ac 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -15,10 +15,11 @@ model User { role String @default("reader") raffleOptIn Boolean @default(true) publicityConsent Boolean @default(false) - admin Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + sessions Session[] + coach Coach? accounts Account[] students Student[] pendingEmailChanges PendingEmailChange? @@ -72,14 +73,16 @@ model Verification { @@map("verification") } -model Poster { +model Coach { id String @id @default(uuid()) tag String @default("other") //enum: "teacher", "personal", "studygroup", "other" verified Boolean @default(false) school String? district String? zipcode String? + userId String @unique + User User @relation(fields: [userId], references: [id], onDelete: Cascade) Classes Class[] announcements Announcement[] @@index([tag]) @@ -110,7 +113,7 @@ model Class { name String Students Student[] - Posters Poster[] + Coach Coach[] Announcements Announcement[] FormGroups FormGroup[] @@index([joinToken]) @@ -124,7 +127,7 @@ model Announcement { author String class String - Author Poster @relation(fields: [author], references: [id], onDelete: Cascade) + Author Coach @relation(fields: [author], references: [id], onDelete: Cascade) Class Class @relation(fields: [class], references: [id], onDelete: Cascade) @@index([postDate]) @@index([expiryDate]) diff --git a/prisma/seed.ts b/prisma/seed.ts index fa9dc225..e04e5c50 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -9,11 +9,9 @@ async function main() { const seededEmails = [ 'parent1@example.com', 'parent2@gmail.com', - 'rae@readinghuddle.com', - 'asloran23@gmail.com', - 'nevins321@gmail.com', - 'sxg230203@utdallas.edu' + '[Admin email here]' ] + const seededAdminName = '[Admin name here]' await prisma.user.deleteMany({ where: { @@ -25,21 +23,20 @@ async function main() { await prisma.user.create({ data: { - id: 'seed_user_1', - name: 'Oryx', - email: 'parent1@example.com', + name: 'Oryx (TEST PARENT)', + email: seededEmails[0], emailVerified: true, role: 'reader', accounts: { create: { id: 'seed_account_1', - accountId: 'parent1@example.com', + accountId: seededEmails[0], providerId: 'magic-link', }, }, students: { create: { - name: 'Crota', + name: 'Crota (TEST STUDENT)', exp: 5000, settings: { dyslexiaFont: true, @@ -53,23 +50,22 @@ async function main() { await prisma.user.create({ data: { - id: 'seed_user_2', - name: 'Richard Watterson', - email: 'parent2@gmail.com', + name: 'Richard Watterson (TEST PARENT)', + email: seededEmails[1], emailVerified: true, role: 'reader', accounts: { create: { id: 'seed_account_2', - accountId: 'parent2@gmail.com', + accountId: seededEmails[1], providerId: 'magic-link', }, }, students: { create: [ - { name: 'Gumball' }, - { name: 'Darwin' }, - { name: 'Anais' }, + { name: 'Gumball (TEST STUDENT)' }, + { name: 'Darwin (TEST STUDENT)' }, + { name: 'Anais (TEST STUDENT)' }, ], }, }, @@ -77,94 +73,18 @@ async function main() { await prisma.user.create({ data: { - id: 'seed_user_3', - name: 'Rae', - email: 'rae@readinghuddle.com', - emailVerified: true, - role: 'admin', - accounts: { - create: { - id: 'seed_account_3', - accountId: 'rae@readinghuddle.com', - providerId: 'magic-link', - }, - }, - admin: { - create: {}, - }, - }, - }) - - await prisma.user.create({ - data: { - id: 'seed_user_4', - name: 'Nevin', - email: 'nevins321@gmail.com', - emailVerified: true, - role: 'admin', - accounts: { - create: { - id: 'seed_account_4', - accountId: 'nevins321@gmail.com', - providerId: 'magic-link', - }, - }, - admin: { - create: {}, - }, - }, - }) - - await prisma.user.create({ - data: { - id: 'seed_user_5', - name: 'Swarna', - email: 'sxg230203@utdallas.edu', - emailVerified: true, - role: 'admin', - accounts: { - create: { - id: 'seed_account_5', - accountId: 'sxg230203@utdallas.edu', - providerId: 'magic-link', - }, - }, - admin: { - create: { - settings: { - dyslexiaFont: true, - fontSize: 1, - language: 'en', - }, - }, - }, - }, - }) - - await prisma.user.create({ - data: { - id: 'seed_user_6', - name: 'Aidan', - email: 'asloran23@gmail.com', + name: seededAdminName, + email: seededEmails[2], emailVerified: true, role: 'admin', accounts: { create: { id: 'seed_account_6', - accountId: 'asloran23@gmail.com', + accountId: seededEmails[2], providerId: 'magic-link', - }, - }, - admin: { - create: { - settings: { - dyslexiaFont: true, - fontSize: 1, - language: 'en', - }, - }, - }, - }, + } + } + } }) // Clean old progress-testing data @@ -173,31 +93,39 @@ async function main() { await prisma.formComponent.deleteMany() await prisma.form.deleteMany() await prisma.formGroup.deleteMany() + await prisma.class.deleteMany() // Pull seeded students - const crota = await prisma.student.findFirst({ where: { name: 'Crota' } }) - const gumball = await prisma.student.findFirst({ where: { name: 'Gumball' } }) - const darwin = await prisma.student.findFirst({ where: { name: 'Darwin' } }) - const anais = await prisma.student.findFirst({ where: { name: 'Anais' } }) + const crota = await prisma.student.findFirst({ where: { name: 'Crota (TEST STUDENT)' } }) + const gumball = await prisma.student.findFirst({ where: { name: 'Gumball (TEST STUDENT)' } }) + const darwin = await prisma.student.findFirst({ where: { name: 'Darwin (TEST STUDENT)' } }) + const anais = await prisma.student.findFirst({ where: { name: 'Anais (TEST STUDENT)' } }) if (!crota || !gumball || !darwin || !anais) { throw new Error('Seed students not found') } - // Get one admin to author forms - const nevinAdmin = await prisma.admin.findFirst({ - where: { userId: 'seed_user_4' }, + // Create a class for testing + const testClass = await prisma.class.create({ + data: { + name: 'Reading Class (TEST)', + Students: { + connect: [ + { id: crota.id }, + { id: gumball.id }, + { id: darwin.id }, + { id: anais.id } + ] + } + } }) - if (!nevinAdmin) { - throw new Error('Admin seed record for Nevin not found') - } - // Form Groups (weeks) const week1 = await prisma.formGroup.create({ data: { startDate: makeLocalDate('2026-04-20'), endDate: makeLocalDate('2026-04-26'), + class: testClass.id, }, }) @@ -205,6 +133,7 @@ async function main() { data: { startDate: makeLocalDate('2026-04-27'), endDate: makeLocalDate('2026-05-03'), + class: testClass.id }, }) @@ -212,6 +141,7 @@ async function main() { data: { startDate: makeLocalDate('2026-05-04'), endDate: makeLocalDate('2026-05-10'), + class: testClass.id }, }) @@ -221,7 +151,6 @@ async function main() { order: 0, startDate: makeLocalDate('2026-04-20'), published: true, - author: nevinAdmin.id, formGroup: week1.id, title: 'Monday Story Reflection', }, @@ -232,7 +161,6 @@ async function main() { order: 1, startDate: makeLocalDate('2026-04-21'), published: true, - author: nevinAdmin.id, formGroup: week1.id, title: 'Tuesday Reading Check', }, @@ -243,7 +171,6 @@ async function main() { order: 2, startDate: makeLocalDate('2026-04-23'), published: true, - author: nevinAdmin.id, formGroup: week1.id, title: 'Thursday Comprehension', }, @@ -254,7 +181,6 @@ async function main() { order: 3, startDate: makeLocalDate('2026-04-25'), published: true, - author: nevinAdmin.id, formGroup: week1.id, title: 'Saturday Family Reading', }, @@ -266,7 +192,6 @@ async function main() { order: 0, startDate: makeLocalDate('2026-04-27'), published: true, - author: nevinAdmin.id, formGroup: week2.id, title: 'Monday Vocabulary Builder', }, @@ -277,7 +202,6 @@ async function main() { order: 1, startDate: makeLocalDate('2026-04-29'), published: true, - author: nevinAdmin.id, formGroup: week2.id, title: 'Wednesday Book Talk', }, @@ -288,7 +212,6 @@ async function main() { order: 2, startDate: makeLocalDate('2026-05-01'), published: true, - author: nevinAdmin.id, formGroup: week2.id, title: 'Friday Quiz Time', }, @@ -299,7 +222,6 @@ async function main() { order: 3, startDate: makeLocalDate('2026-05-03'), published: true, - author: nevinAdmin.id, formGroup: week2.id, title: 'Sunday Reading Wrap-Up', }, @@ -311,7 +233,6 @@ async function main() { order: 0, startDate: makeLocalDate('2026-05-04'), published: true, - author: nevinAdmin.id, formGroup: week3.id, title: 'Monday Reading Log', }, @@ -322,7 +243,6 @@ async function main() { order: 1, startDate: makeLocalDate('2026-05-06'), published: true, - author: nevinAdmin.id, formGroup: week3.id, title: 'Wednesday Critical Thinking', }, @@ -333,7 +253,6 @@ async function main() { order: 2, startDate: makeLocalDate('2026-05-08'), published: true, - author: nevinAdmin.id, formGroup: week3.id, title: 'Friday Reading Reflection', }, @@ -344,7 +263,6 @@ async function main() { order: 3, startDate: makeLocalDate('2026-05-10'), published: true, - author: nevinAdmin.id, formGroup: week3.id, title: 'Sunday Story Summary', }, diff --git a/server/api/admin/classes.get.ts b/server/api/admin/classes.get.ts new file mode 100644 index 00000000..49df6477 --- /dev/null +++ b/server/api/admin/classes.get.ts @@ -0,0 +1,23 @@ +import { prisma } from '../../utils/prisma' +import { requireCoach } from '../../utils/require-session' + +export default defineEventHandler(async (event) => { + const session = await requireCoach(event) + + return await prisma.class.findMany({ + where: { + Coach: { + some: { + userId: session.user.id, + }, + }, + }, + orderBy: { + name: 'asc', + }, + select: { + joinToken: true, + name: true, + }, + }) +}) diff --git a/server/api/admin/classes.post.ts b/server/api/admin/classes.post.ts new file mode 100644 index 00000000..7717e7af --- /dev/null +++ b/server/api/admin/classes.post.ts @@ -0,0 +1,62 @@ +import { prisma } from '../../utils/prisma' +import { requireCoach } from '../../utils/require-session' +import { classCreateSchema } from '../../utils/schemas' + +const coachTagByClassType = { + Teacher: 'teacher', + 'Study Group': 'studygroup', + 'Community Group': 'other', + Other: 'other', +} as const + +export default defineEventHandler(async (event) => { + const session = await requireCoach(event) + + const parsed = classCreateSchema.safeParse(await readBody(event)) + + if (!parsed.success) { + throw createError({ + statusCode: 400, + statusMessage: parsed.error.issues[0]?.message ?? 'Invalid class information', + }) + } + + const data = parsed.data + const coachData = { + tag: coachTagByClassType[data.type], + school: data.school || null, + district: data.district || null, + zipcode: data.zipcode || null, + } + + return await prisma.$transaction(async (transaction) => { + const coach = await transaction.coach.upsert({ + where: { + userId: session.user.id, + }, + update: {}, + create: { + ...coachData, + userId: session.user.id, + }, + select: { + id: true, + }, + }) + + return await transaction.class.create({ + data: { + name: data.name, + Coach: { + connect: { + id: coach.id, + }, + }, + }, + select: { + joinToken: true, + name: true, + }, + }) + }) +}) diff --git a/server/api/admin/teacher-verification.get.ts b/server/api/admin/teacher-verification.get.ts new file mode 100644 index 00000000..e6478f6f --- /dev/null +++ b/server/api/admin/teacher-verification.get.ts @@ -0,0 +1,29 @@ +import { prisma } from '../../utils/prisma' +import { requireAdmin } from '../../utils/require-session' + +export default defineEventHandler(async (event) => { + await requireAdmin(event) + + const applications = await prisma.coach.findMany({ + where: { tag: { in: ['teacher', 'teacher_denied'] } }, + include: { + User: { + select: { name: true, email: true, createdAt: true }, + }, + }, + }) + + return applications.map(application => ({ + id: application.id, + name: application.User.name, + email: application.User.email, + role: 'Teacher', + school: application.school ?? '', + district: application.district ?? '', + zipcode: application.zipcode ?? '', + requestedAt: application.User.createdAt, + status: application.tag === 'teacher_denied' + ? 'Denied' + : application.verified ? 'Approved' : 'Pending', + })) +}) diff --git a/server/api/admin/teacher-verification/[id].patch.ts b/server/api/admin/teacher-verification/[id].patch.ts new file mode 100644 index 00000000..0dd88405 --- /dev/null +++ b/server/api/admin/teacher-verification/[id].patch.ts @@ -0,0 +1,40 @@ +import { z } from 'zod' +import { prisma } from '../../../utils/prisma' +import { requireAdmin } from '../../../utils/require-session' + +const verificationUpdateSchema = z.object({ + status: z.enum(['Approved', 'Denied']).optional(), + school: z.string().trim().min(1).max(160).optional(), + district: z.string().trim().min(1).max(160).optional(), + zipcode: z.string().trim().regex(/^\d{5}(?:-\d{4})?$/).optional(), +}) + +export default defineEventHandler(async (event) => { + await requireAdmin(event) + const id = getRouterParam(event, 'id') + const parsed = verificationUpdateSchema.safeParse(await readBody(event)) + + if (!id || !parsed.success) { + throw createError({ statusCode: 400, statusMessage: 'Invalid verification update' }) + } + + const application = await prisma.coach.findUnique({ + where: { id }, + select: { tag: true }, + }) + + if (!application || !['teacher', 'teacher_denied'].includes(application.tag)) { + throw createError({ statusCode: 404, statusMessage: 'Teacher application not found' }) + } + + return await prisma.coach.update({ + where: { id }, + data: { + school: parsed.data.school, + district: parsed.data.district, + zipcode: parsed.data.zipcode, + ...(parsed.data.status === 'Approved' ? { tag: 'teacher', verified: true } : {}), + ...(parsed.data.status === 'Denied' ? { tag: 'teacher_denied', verified: false } : {}), + }, + }) +}) diff --git a/server/api/announcement/[id].ts b/server/api/announcement/[id].ts index 1929d007..674261f2 100644 --- a/server/api/announcement/[id].ts +++ b/server/api/announcement/[id].ts @@ -1,12 +1,19 @@ import { prisma } from '../../utils/prisma' -import { requireAdmin } from '../../utils/require-session' +import { requireClassAccess } from '../../utils/require-session' import { createError } from 'h3' export default defineEventHandler(async (event) => { const method = event.node.req.method if (method === 'DELETE') { - await requireAdmin(event) + const query = getQuery(event) + const classToken = typeof query.classId === 'string' ? query.classId : '' + + if (!classToken) { + throw createError({ statusCode: 400, statusMessage: 'classId is required' }) + } + + const { classId } = await requireClassAccess(event, classToken) const id = event.context.params?.id @@ -21,9 +28,22 @@ export default defineEventHandler(async (event) => { } try { - await prisma.announcement.delete({ where: { id: numericId } }) + const announcement = await prisma.announcement.findFirst({ + where: { id: numericId, class: classId }, + select: { id: true }, + }) + + if (!announcement) { + throw createError({ statusCode: 404, statusMessage: 'Announcement not found in this class' }) + } + + await prisma.announcement.delete({ where: { id: announcement.id } }) return { success: true } } catch (e: any) { + if (e?.statusCode) { + throw e + } + if (e?.code === 'P2025') { throw createError({ statusCode: 404, diff --git a/server/api/announcement/index.ts b/server/api/announcement/index.ts index 49182252..762596a1 100644 --- a/server/api/announcement/index.ts +++ b/server/api/announcement/index.ts @@ -1,6 +1,6 @@ import { prisma } from '../../utils/prisma' import { getQuery, createError } from 'h3' -import { requireAdmin, requireSession } from '../../utils/require-session' +import { requireClassAccess, requireSession } from '../../utils/require-session' import { announcementCreateSchema } from '../../utils/schemas' // GET /api/announcement?active=true to get only active announcements @@ -8,38 +8,59 @@ export default defineEventHandler(async (event) => { const method = event.node.req.method const query = getQuery(event) const now = new Date() + const classToken = typeof query.classId === 'string' ? query.classId : null if (method === 'GET') { - await requireSession(event) + let classId: string | null = null + + if (classToken) { + classId = (await requireClassAccess(event, classToken)).classId + } else { + await requireSession(event) + } + + const activeWhere = query.active === 'true' + ? { + postDate: { lte: now }, + OR: [{ expiryDate: null }, { expiryDate: { gte: now } }], + } + : {} return await prisma.announcement.findMany({ - where: query.active === 'true' ? { - postDate: { lte: now }, - OR: [ - { expiryDate: null }, - { expiryDate: { gte: now } } - ] - } : {} + where: { + ...activeWhere, + ...(classId ? { class: classId } : {}), + }, + orderBy: { postDate: 'desc' }, }) } if (method === 'POST') { + const rawBody = await readBody(event) + const requestedClassId = typeof rawBody?.classId === 'string' ? rawBody.classId : '' - const session = await requireAdmin(event) + if (!requestedClassId) { + throw createError({ statusCode: 400, statusMessage: 'classId is required' }) + } - const body = announcementCreateSchema.safeParse(await readBody(event)) + const { classId, coachId } = await requireClassAccess(event, requestedClassId) + const body = announcementCreateSchema.safeParse(rawBody) if (!body.success) { - throw createError({ statusCode: 400, message: body.error.message }) + throw createError({ + statusCode: 400, + statusMessage: body.error.issues[0]?.message ?? 'Invalid announcement information', + }) } return await prisma.announcement.create({ data: { content: body.data.content, - postDate: new Date(body.data.postDate), - expiryDate: body.data.expiryDate ? new Date(body.data.expiryDate) : null, - author: body.data.author, - } + postDate: body.data.postDate, + expiryDate: body.data.expiryDate ?? null, + author: coachId, + class: classId, + }, }) } }) diff --git a/server/api/admin/class-progress.get.ts b/server/api/coach/class-progress.get.ts similarity index 87% rename from server/api/admin/class-progress.get.ts rename to server/api/coach/class-progress.get.ts index c52daa56..7af85a8f 100644 --- a/server/api/admin/class-progress.get.ts +++ b/server/api/coach/class-progress.get.ts @@ -1,6 +1,6 @@ import { prisma } from '../../utils/prisma' -import { auth } from '../../utils/auth' import { getQuery } from 'h3' +import { requireClassAccess } from '../../utils/require-session' /// Standardizes a UTC date into YYYY-MM-DD string const formatYmdUtc = (date: Date) => { @@ -54,13 +54,16 @@ const getWeekBoundsDates = (dateString: string) => { // HELPER: Fetches a standard list of individual completed records. // Queries db directly without pulling extra arrays into memory. async function getCompletedRecords(queryState: any) { - const { search, selectedDate, selectedFormIds, sortKey, sortDirection, page, pageSize } = queryState + const { classId, search, selectedDate, selectedFormIds, sortKey, sortDirection, page, pageSize } = queryState - const where: any = {} + const where: any = { + Form: { FormGroup: { class: classId } }, + Student: { Classes: { some: { id: classId } } }, + } // Apply textual search filter directly in db if (search) { - where.Student = { name: { contains: search } } + where.Student = { ...where.Student, name: { contains: search } } } // Filter specific forms requested @@ -130,13 +133,18 @@ async function getCompletedRecords(queryState: any) { // HELPER: Fetches aggregated count of completions per student. // Uses native Prisma groupBy over pulling all submissions to minimize overhead. async function getGroupedRecords(queryState: any) { - const { search, selectedDate, selectedFormIds, sortKey, sortDirection, page, pageSize } = queryState + const { classId, search, selectedDate, selectedFormIds, sortKey, sortDirection, page, pageSize } = queryState - const submissionWhere: any = {} + const submissionWhere: any = { Form: { FormGroup: { class: classId } } } if (selectedDate) { const { mondayDate, sundayDate } = getWeekBoundsDates(selectedDate) - submissionWhere.Form = { FormGroup: { startDate: { gte: mondayDate, lte: sundayDate } } } + submissionWhere.Form = { + FormGroup: { + class: classId, + startDate: { gte: mondayDate, lte: sundayDate }, + }, + } } if (selectedFormIds.length > 0) { @@ -148,7 +156,10 @@ async function getGroupedRecords(queryState: any) { by: ['student'], where: { ...submissionWhere, - ...(search ? { Student: { name: { contains: search } } } : {}) + Student: { + Classes: { some: { id: classId } }, + ...(search ? { name: { contains: search } } : {}), + }, }, _count: { id: true }, _max: { submissionDate: true }, @@ -193,7 +204,7 @@ async function getGroupedRecords(queryState: any) { // HELPER: Evaluates expected forms against submitted forms to find what is missing. async function getMissingRecords(queryState: any) { - const { search, selectedDate, sortKey, sortDirection, page, pageSize } = queryState + const { classId, search, selectedDate, sortKey, sortDirection, page, pageSize } = queryState if (!selectedDate) { return { mode: 'missing', rows: [], totalCount: 0 } @@ -202,7 +213,12 @@ async function getMissingRecords(queryState: any) { // Calculate only forms that are expected in this specific week const { mondayDate, sundayDate } = getWeekBoundsDates(selectedDate) const expectedForms = await prisma.form.findMany({ - where: { FormGroup: { startDate: { gte: mondayDate, lte: sundayDate } } }, + where: { + FormGroup: { + class: classId, + startDate: { gte: mondayDate, lte: sundayDate }, + }, + }, select: { id: true, title: true } }) @@ -212,7 +228,7 @@ async function getMissingRecords(queryState: any) { const expectedFormIds = expectedForms.map((f) => f.id) - const studentWhere: any = {} + const studentWhere: any = { Classes: { some: { id: classId } } } if (search) { studentWhere.name = { contains: search } } @@ -270,24 +286,15 @@ async function getMissingRecords(queryState: any) { } export default defineEventHandler(async (event) => { - // Admin Authentication Check - const session = await auth.api.getSession({ headers: event.headers }) - - if (!session?.user) { - throw createError({ statusCode: 401, statusMessage: 'Unauthorized' }) - } - - const user = await prisma.user.findUnique({ - where: { id: session.user.id }, - select: { role: true }, - }) + // Parse Filters and Configs from Frontend + const query = getQuery(event) + const classToken = typeof query.classId === 'string' ? query.classId.trim() : '' - if (!user || user.role !== 'admin') { - throw createError({ statusCode: 403, statusMessage: 'Forbidden' }) + if (!classToken) { + throw createError({ statusCode: 400, statusMessage: 'classId is required' }) } - // Parse Filters and Configs from Frontend - const query = getQuery(event) + const { classId } = await requireClassAccess(event, classToken) const mode = query.mode === 'missing' ? 'missing' : 'completed' const selectedDate = typeof query.date === 'string' && query.date.trim() ? query.date.trim() : '' const search = typeof query.search === 'string' ? query.search.trim().toLowerCase() : '' @@ -302,7 +309,7 @@ export default defineEventHandler(async (event) => { selectedFormIds = query.formIds.split(',').map((value) => Number(value.trim())).filter((value) => Number.isInteger(value)) } - const queryState = { search, selectedDate, selectedFormIds, sortKey, sortDirection, page, pageSize } + const queryState = { classId, search, selectedDate, selectedFormIds, sortKey, sortDirection, page, pageSize } // Process Requests to Appropriate Flow let result @@ -320,4 +327,4 @@ export default defineEventHandler(async (event) => { pageSize, totalPages: Math.max(1, Math.ceil(result.totalCount / pageSize)), } -}) \ No newline at end of file +}) diff --git a/server/api/coach/profile.get.ts b/server/api/coach/profile.get.ts new file mode 100644 index 00000000..046d326e --- /dev/null +++ b/server/api/coach/profile.get.ts @@ -0,0 +1,18 @@ +import { prisma } from '../../utils/prisma' +import { requireCoach } from '../../utils/require-session' + +export default defineEventHandler(async (event) => { + const session = await requireCoach(event) + + return await prisma.coach.findUnique({ + where: { userId: session.user.id }, + select: { + id: true, + tag: true, + verified: true, + school: true, + district: true, + zipcode: true, + }, + }) +}) diff --git a/server/api/coach/profile.post.ts b/server/api/coach/profile.post.ts new file mode 100644 index 00000000..2a6bf5eb --- /dev/null +++ b/server/api/coach/profile.post.ts @@ -0,0 +1,41 @@ +import { z } from 'zod' +import { prisma } from '../../utils/prisma' +import { requireCoach } from '../../utils/require-session' + +const coachProfileSchema = z.object({ + purpose: z.enum(['teacher', 'studygroup', 'other']), + school: z.string().trim().max(160).optional(), + district: z.string().trim().max(160).optional(), + zipcode: z.string().trim().regex(/^\d{5}(?:-\d{4})?$/).optional(), +}).superRefine((data, context) => { + if (data.purpose !== 'teacher') return + + if (!data.school) context.addIssue({ code: 'custom', path: ['school'], message: 'School is required' }) + if (!data.district) context.addIssue({ code: 'custom', path: ['district'], message: 'School district is required' }) + if (!data.zipcode) context.addIssue({ code: 'custom', path: ['zipcode'], message: 'ZIP code is required' }) +}) + +export default defineEventHandler(async (event) => { + const session = await requireCoach(event) + const parsed = coachProfileSchema.safeParse(await readBody(event)) + + if (!parsed.success) { + throw createError({ + statusCode: 400, + statusMessage: parsed.error.issues[0]?.message ?? 'Invalid coach information', + }) + } + + const teacher = parsed.data.purpose === 'teacher' + + return await prisma.coach.create({ + data: { + userId: session.user.id, + tag: parsed.data.purpose, + verified: false, + school: teacher ? parsed.data.school : null, + district: teacher ? parsed.data.district : null, + zipcode: teacher ? parsed.data.zipcode : null, + }, + }) +}) diff --git a/server/api/form/[id].put.ts b/server/api/form/[id].put.ts index e21c7a1f..f9839b7d 100644 --- a/server/api/form/[id].put.ts +++ b/server/api/form/[id].put.ts @@ -1,13 +1,17 @@ -import { Prisma } from '~~/prisma/generated/client' -import { auth } from '~~/server/utils/auth' import { prisma } from '~~/server/utils/prisma' -import { getQuery, setResponseStatus, type H3Event } from 'h3' +import { requireClassAccess } from '~~/server/utils/require-session' import { formUpdateSchema } from '~~/server/utils/schemas' import { z } from 'zod' export default eventHandler(async (event) => { + const query = getQuery(event) + const classToken = typeof query.classId === 'string' ? query.classId : '' - //require sessions + if (!classToken) { + throw createError({ statusCode: 400, statusMessage: 'classId is required' }) + } + + const { classId } = await requireClassAccess(event, classToken) const body = formUpdateSchema.safeParse(await readBody(event)) if (!body.success) {throw createError({ statusCode: 400, message: body.error.message })} @@ -15,8 +19,17 @@ export default eventHandler(async (event) => { if (!id.success || !id.data) {throw createError({ statusCode: 400, message: 'Missing or Invalid form ID'})} + const form = await prisma.form.findFirst({ + where: { id: id.data, FormGroup: { class: classId } }, + select: { id: true }, + }) + + if (!form) { + throw createError({ statusCode: 404, statusMessage: 'Form not found in this class' }) + } + return await prisma.form.update({ - where: { id: id.data }, + where: { id: form.id }, data: body.data }) - }) \ No newline at end of file + }) diff --git a/server/api/form/index.ts b/server/api/form/index.ts index 4fe717cf..4c07c17d 100644 --- a/server/api/form/index.ts +++ b/server/api/form/index.ts @@ -1,6 +1,11 @@ import { Prisma } from '~~/prisma/generated/client' -import { auth } from '~~/server/utils/auth' import { prisma } from '~~/server/utils/prisma' +import { requireClassAccess } from '~~/server/utils/require-session' +import { + requireComponentInClass, + requireFormGroupInClass, + requireFormInClass, +} from '~~/server/utils/require-form-resource' import { getQuery, setResponseStatus, type H3Event } from 'h3' type ActionName = @@ -143,11 +148,12 @@ const getWeekBoundsUtc = (date: Date) => { return { monday, sunday } } -const findOrCreateWeeklyFormGroup = async (date: Date) => { +const findOrCreateWeeklyFormGroup = async (date: Date, classId: string) => { const { monday, sunday } = getWeekBoundsUtc(date) const existingGroup = await prisma.formGroup.findFirst({ where: { + class: classId, OR: [ { startDate: monday, @@ -170,6 +176,7 @@ const findOrCreateWeeklyFormGroup = async (date: Date) => { data: { startDate: monday, endDate: sunday, + class: classId, }, select: { id: true }, }) @@ -177,9 +184,10 @@ const findOrCreateWeeklyFormGroup = async (date: Date) => { return createdGroup.id } -const findMatchingFormGroupByDate = async (date: Date) => { +const findMatchingFormGroupByDate = async (date: Date, classId?: string) => { return await prisma.formGroup.findFirst({ where: { + ...(classId ? { class: classId } : {}), startDate: { lte: date }, OR: [ { endDate: null }, @@ -196,49 +204,6 @@ const getAction = (event: H3Event, body: Record | null) => { return (query.action ?? body?.action) as ActionName | undefined } -const isFormApiDevBypassEnabled = () => - process.env.NODE_ENV !== 'production' || process.env.FORM_API_DEV_BYPASS === 'true' - -const requireAdminSession = async (event: H3Event) => { - const session = await auth.api.getSession({ - headers: event.headers, - }) - - if (!session) { - if (isFormApiDevBypassEnabled()) { - return { session: null, userId: null, admin: null, bypassed: true } - } - - throw createError({ - statusCode: 401, - statusMessage: 'Unauthorized: no active session. Log in, or set FORM_API_DEV_BYPASS=true for local testing only.', - }) - } - - const userId = normalizeScalar(session.user.id) - - if (!userId || typeof userId !== 'string') { - throw createError({ statusCode: 400, statusMessage: 'Invalid session user id' }) - } - - const admin = await prisma.admin.findUnique({ - where: { userId }, - }) - - if (!admin) { - if (isFormApiDevBypassEnabled()) { - return { session, userId, admin: null, bypassed: true } - } - - throw createError({ - statusCode: 403, - statusMessage: 'Forbidden: current user is not an admin.', - }) - } - - return { session, userId, admin, bypassed: false } -} - const mapComponent = (component: { id: number form: number @@ -265,7 +230,6 @@ const mapForm = ( startDate: Date endDate: Date | null published: boolean - author: string formGroup: number title: string Components?: Array<{ @@ -288,7 +252,6 @@ const mapForm = ( startDate: formatIsoDate(startDate), endDate: formatIsoDate(form.endDate), published: form.published, - author: form.author, formGroup: form.formGroup, status: form.published ? 'Active' : 'Unpublished', day: formatDayName(startDate), @@ -325,14 +288,23 @@ export default defineEventHandler(async (event) => { const method = event.node.req.method ?? 'GET' const body = method === 'GET' ? null : ((await readBody(event).catch(() => null)) as Record | null) const action = getAction(event, body) + const query = getQuery(event) + const rawClassToken = normalizeScalar(query.classId ?? body?.classId) + const classToken = typeof rawClassToken === 'string' && rawClassToken.trim() ? rawClassToken.trim() : null + const classId = classToken ? (await requireClassAccess(event, classToken)).classId : null if (method !== 'GET' && !action) { throw createError({ statusCode: 400, statusMessage: 'Missing action' }) } + if (!classId && method !== 'GET') { + throw createError({ statusCode: 400, statusMessage: 'classId is required' }) + } + if (method === 'GET') { const selectedAction = action ?? 'listFormGroups' if (selectedAction === 'listFormGroups') { const groups = await prisma.formGroup.findMany({ + where: classId ? { class: classId } : undefined, orderBy: [{ startDate: 'desc' }, { id: 'desc' }], include: formGroupInclude, }) @@ -350,8 +322,11 @@ export default defineEventHandler(async (event) => { if (selectedAction === 'getFormGroup') { const groupId = toInt(getQuery(event).id, 'id') - const group = await prisma.formGroup.findUnique({ - where: { id: groupId as number }, + const group = await prisma.formGroup.findFirst({ + where: { + id: groupId as number, + ...(classId ? { class: classId } : {}), + }, include: formGroupInclude, }) @@ -370,19 +345,20 @@ export default defineEventHandler(async (event) => { } if (selectedAction === 'listForms') { - const query = getQuery(event) const formGroupId = query.formGroup !== undefined ? toInt(query.formGroup, 'formGroup', false) : null const weeklyDate = !!query.weeklyDate ? (toDate(query.weeklyDate, 'weeklyDate') as Date) : null - const where: Prisma.FormWhereInput = {} + const where: Prisma.FormWhereInput = classId + ? { FormGroup: { class: classId } } + : {} if (formGroupId !== null) { where.formGroup = formGroupId } if (weeklyDate) { - const matchingGroup = await findMatchingFormGroupByDate(weeklyDate) + const matchingGroup = await findMatchingFormGroupByDate(weeklyDate, classId ?? undefined) if (!matchingGroup) { return [] @@ -407,7 +383,7 @@ export default defineEventHandler(async (event) => { if (selectedAction === 'resolveFormGroupRangeByDate') { const weeklyDate = toDate(getQuery(event).weeklyDate, 'weeklyDate') as Date - const matchingGroup = await findMatchingFormGroupByDate(weeklyDate) + const matchingGroup = await findMatchingFormGroupByDate(weeklyDate, classId ?? undefined) if (!matchingGroup) { return { @@ -430,7 +406,10 @@ export default defineEventHandler(async (event) => { const formGroupId = toInt(getQuery(event).formGroupId, 'formGroupId') const forms = await prisma.form.findMany({ - where: { formGroup: formGroupId as number }, + where: { + formGroup: formGroupId as number, + ...(classId ? { FormGroup: { class: classId } } : {}), + }, select: { id: true }, }) @@ -462,8 +441,9 @@ export default defineEventHandler(async (event) => { } if (selectedAction === 'getOnlyActiveFormsinGroup') { - const query = getQuery(event) - const where: Prisma.FormWhereInput = {} + const where: Prisma.FormWhereInput = classId + ? { FormGroup: { class: classId } } + : {} if (query.formGroup !== null) { where.formGroup = Number(query.formGroup) } where.published = true @@ -480,8 +460,6 @@ export default defineEventHandler(async (event) => { - const { admin } = await requireAdminSession(event) - if (method === 'POST') { if (action === 'createFormGroup') { const startDate = toDate(body?.startDate, 'startDate') @@ -489,8 +467,11 @@ export default defineEventHandler(async (event) => { const raffleWinner = hasOwnField(body, 'raffleWinner') ? toInt(body?.raffleWinner, 'raffleWinner', false) : null if (raffleWinner !== null) { - const student = await prisma.student.findUnique({ - where: { id: raffleWinner }, + const student = await prisma.student.findFirst({ + where: { + id: raffleWinner, + Classes: { some: { id: classId as string } }, + }, select: { id: true }, }) @@ -504,6 +485,7 @@ export default defineEventHandler(async (event) => { startDate: startDate as Date, endDate, raffleWinner, + class: classId as string, }, include: formGroupInclude, }) @@ -537,16 +519,16 @@ export default defineEventHandler(async (event) => { let resolvedFormGroupId: number if (requestedGroupId !== null) { - const requestedGroup = await prisma.formGroup.findUnique({ - where: { id: requestedGroupId }, + const requestedGroup = await prisma.formGroup.findFirst({ + where: { id: requestedGroupId, class: classId as string }, select: { id: true }, }) resolvedFormGroupId = requestedGroup ? requestedGroup.id - : await findOrCreateWeeklyFormGroup(startDate) + : await findOrCreateWeeklyFormGroup(startDate, classId as string) } else { - resolvedFormGroupId = await findOrCreateWeeklyFormGroup(startDate) + resolvedFormGroupId = await findOrCreateWeeklyFormGroup(startDate, classId as string) } const existingMax = await prisma.form.aggregate({ @@ -560,7 +542,6 @@ export default defineEventHandler(async (event) => { endDate, published, order: explicitOrder ?? ((existingMax._max.order ?? -1) + 1), - author: admin?.id ?? null, } if (title) { @@ -594,14 +575,7 @@ export default defineEventHandler(async (event) => { throw createError({ statusCode: 400, statusMessage: 'questionText is required' }) } - const parentForm = await prisma.form.findUnique({ - where: { id: form as number }, - select: { id: true }, - }) - - if (!parentForm) { - throw createError({ statusCode: 404, statusMessage: 'Form not found' }) - } + await requireFormInClass(form as number, classId as string) const explicitOrder = hasOwnField(body, 'order') ? toInt(body?.order, 'order', false) : null @@ -635,6 +609,7 @@ export default defineEventHandler(async (event) => { if (method === 'PUT') { if (action === 'updateFormGroup') { const id = toInt(body?.id, 'id') + await requireFormGroupInClass(id as number, classId as string) const data: { startDate?: Date endDate?: Date | null @@ -653,8 +628,11 @@ export default defineEventHandler(async (event) => { const raffleWinner = toInt(body?.raffleWinner, 'raffleWinner', false) if (raffleWinner !== null) { - const student = await prisma.student.findUnique({ - where: { id: raffleWinner }, + const student = await prisma.student.findFirst({ + where: { + id: raffleWinner, + Classes: { some: { id: classId as string } }, + }, select: { id: true }, }) @@ -688,6 +666,7 @@ export default defineEventHandler(async (event) => { if (action === 'updateForm') { const id = toInt(body?.id, 'id') + await requireFormInClass(id as number, classId as string) const data: { formGroup?: number startDate?: Date @@ -699,14 +678,7 @@ export default defineEventHandler(async (event) => { if (hasOwnField(body, 'formGroup')) { const formGroup = toInt(body?.formGroup, 'formGroup') - const group = await prisma.formGroup.findUnique({ - where: { id: formGroup as number }, - select: { id: true }, - }) - - if (!group) { - throw createError({ statusCode: 404, statusMessage: 'Form group not found' }) - } + await requireFormGroupInClass(formGroup as number, classId as string) data.formGroup = formGroup as number } @@ -747,18 +719,12 @@ export default defineEventHandler(async (event) => { if (action === 'updateComponent') { const id = toInt(body?.id, 'id') + await requireComponentInClass(id as number, classId as string) const data: Prisma.FormComponentUpdateInput = {} if (hasOwnField(body, 'form')) { const form = toInt(body?.form, 'form') - const parentForm = await prisma.form.findUnique({ - where: { id: form as number }, - select: { id: true }, - }) - - if (!parentForm) { - throw createError({ statusCode: 404, statusMessage: 'Form not found' }) - } + await requireFormInClass(form as number, classId as string) data.Form = { connect: { id: form as number }, @@ -811,6 +777,7 @@ export default defineEventHandler(async (event) => { if (method === 'DELETE') { if (action === 'deleteFormGroup') { const id = toInt(body?.id ?? getQuery(event).id, 'id') + await requireFormGroupInClass(id as number, classId as string) await prisma.formGroup.delete({ where: { id: id as number }, @@ -824,6 +791,7 @@ export default defineEventHandler(async (event) => { if (action === 'deleteForm') { const id = toInt(body?.id ?? getQuery(event).id, 'id') + await requireFormInClass(id as number, classId as string) await prisma.form.delete({ where: { id: id as number }, @@ -837,6 +805,7 @@ export default defineEventHandler(async (event) => { if (action === 'deleteComponent') { const id = toInt(body?.id ?? getQuery(event).id, 'id') + await requireComponentInClass(id as number, classId as string) await prisma.formComponent.delete({ where: { id: id as number }, diff --git a/server/api/formGroup/index.ts b/server/api/formGroup/index.ts index e64b1433..d5922c17 100644 --- a/server/api/formGroup/index.ts +++ b/server/api/formGroup/index.ts @@ -1,21 +1,36 @@ import { prisma } from '../../utils/prisma' import { getQuery, createError } from 'h3' -import { requireAdmin, requireSession } from '../../utils/require-session' +import { requireClassAccess, requireSession } from '../../utils/require-session' export default defineEventHandler(async (event) => { const method = event.node.req.method const query = getQuery(event) const now = new Date() + const classToken = typeof query.classId === 'string' ? query.classId : null //Get /api/formGroup?active=true to get only active form groups if (method === 'GET') { - await requireSession(event) + let classId: string | null = null + + if (classToken) { + classId = (await requireClassAccess(event, classToken)).classId + } else { + await requireSession(event) + } + + const activeWhere = query.active === 'true' + ? { + startDate: { lte: now }, + OR: [{ endDate: null }, { endDate: { gte: now } }], + } + : {} if (query.date) { const targetDate = new Date(String(query.date)) return await prisma.formGroup.findFirst({ where: { + ...(classId ? { class: classId } : {}), startDate: { lte: targetDate }, OR: [ { endDate: null }, @@ -33,19 +48,22 @@ export default defineEventHandler(async (event) => { } return await prisma.formGroup.findMany({ - where: query.active === 'true' ? { - startDate: { lte: now }, - OR: [ - { endDate: null }, - { endDate: { gte: now } } ] - } : {} + where: { + ...activeWhere, + ...(classId ? { class: classId } : {}), + }, }) } if (method === 'PUT') { - await requireAdmin(event) - const body = await readBody(event) + const requestedClassId = typeof body?.classId === 'string' ? body.classId : '' + + if (!requestedClassId) { + throw createError({ statusCode: 400, statusMessage: 'classId is required' }) + } + + const { classId } = await requireClassAccess(event, requestedClassId) if (!body.id) { throw createError({ @@ -54,8 +72,31 @@ export default defineEventHandler(async (event) => { }) } + const formGroup = await prisma.formGroup.findFirst({ + where: { id: Number(body.id), class: classId }, + select: { id: true }, + }) + + if (!formGroup) { + throw createError({ statusCode: 404, statusMessage: 'Form group not found' }) + } + + if (body.raffleWinner !== null) { + const studentInClass = await prisma.student.findFirst({ + where: { + id: Number(body.raffleWinner), + Classes: { some: { id: classId } }, + }, + select: { id: true }, + }) + + if (!studentInClass) { + throw createError({ statusCode: 400, statusMessage: 'Raffle winner is not in this class' }) + } + } + return await prisma.formGroup.update({ - where: { id: Number(body.id) }, + where: { id: formGroup.id }, data: { raffleWinner: body.raffleWinner === null ? null @@ -63,4 +104,4 @@ export default defineEventHandler(async (event) => { }, }) } -}) \ No newline at end of file +}) diff --git a/server/api/formSubmission/index.ts b/server/api/formSubmission/index.ts index 6f9b3904..e1ae9422 100644 --- a/server/api/formSubmission/index.ts +++ b/server/api/formSubmission/index.ts @@ -3,6 +3,7 @@ import { prisma } from '../../utils/prisma' import { getQuery } from 'h3' import { z } from 'zod' import { formSubmissionCreateSchema } from '../../utils/schemas' +import { requireClassAccess } from '../../utils/require-session' export default defineEventHandler(async (event) => { const method = event.node.req.method @@ -10,6 +11,13 @@ export default defineEventHandler(async (event) => { if (method === 'GET') { const where: Prisma.FormSubmissionWhereInput = {} + const classToken = typeof query.classId === 'string' ? query.classId : null + + if (classToken) { + const { classId } = await requireClassAccess(event, classToken) + where.Form = { FormGroup: { class: classId } } + where.Student = { Classes: { some: { id: classId } } } + } if (query.form) { where.form = Number(query.form) @@ -19,7 +27,8 @@ export default defineEventHandler(async (event) => { } if (query.formGroup) { where.Form = { - formGroup: Number(query.formGroup) + ...where.Form, + formGroup: Number(query.formGroup), } } @@ -45,4 +54,4 @@ export default defineEventHandler(async (event) => { } }) } -}) \ No newline at end of file +}) diff --git a/server/api/student/index.get.ts b/server/api/student/index.get.ts new file mode 100644 index 00000000..aaa42252 --- /dev/null +++ b/server/api/student/index.get.ts @@ -0,0 +1,34 @@ +import { prisma } from '../../utils/prisma' +import { requireClassAccess, requireSession } from '../../utils/require-session' + +export default defineEventHandler(async (event) => { + const query = getQuery(event) + const classToken = typeof query.classId === 'string' ? query.classId : '' + + if (classToken) { + const { classId } = await requireClassAccess(event, classToken) + const classroom = await prisma.class.findUnique({ + where: { id: classId }, + select: { + Students: { + orderBy: { name: 'asc' }, + select: { + id: true, + name: true, + exp: true, + }, + }, + }, + }) + + return classroom?.Students ?? [] + } + + const session = await requireSession(event) + + return await prisma.student.findMany({ + where: { + parentUserId: session.user.id, + }, + }) +}) diff --git a/server/api/student/index.post.ts b/server/api/student/index.post.ts new file mode 100644 index 00000000..daa30130 --- /dev/null +++ b/server/api/student/index.post.ts @@ -0,0 +1,23 @@ +import { prisma } from '../../utils/prisma' +import { studentCreateSchema } from '../../utils/schemas' +import { requireSession } from '../../utils/require-session' + +export default defineEventHandler(async (event) => { + const session = await requireSession(event) + const body = studentCreateSchema.safeParse(await readBody(event)) + + if (!body.success) { + throw createError({ + statusCode: 400, + statusMessage: body.error.message, + }) + } + + return await prisma.student.create({ + data: { + name: body.data.name, + parentUserId: session.user.id, + settings: { dyslexiaFont: false, language: 'en', fontSize: 1 }, + }, + }) +}) diff --git a/server/api/student/index.ts b/server/api/student/index.ts deleted file mode 100644 index 077a72da..00000000 --- a/server/api/student/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { prisma } from '../../utils/prisma' -import { auth } from '../../utils/auth' -import { studentCreateSchema } from '../../utils/schemas' - -export default defineEventHandler(async (event) => { - const method = event.node.req.method - - const session = await auth.api.getSession({ - headers: event.headers, - }) - - if (!session?.user) { - throw createError({ - statusCode: 401, - statusMessage: 'Unauthorized', - }) - } - - if (method === 'GET') { - const students = await prisma.student.findMany({ - where: { - parentUserId: session.user.id, - }, - }) - - return students - } else if (method === 'POST') { - const body = studentCreateSchema.safeParse(await readBody(event)) - - if (!body.success) { - throw createError({ - statusCode: 400, - statusMessage: body.error.message, - }) - } - - const student = await prisma.student.create({ - data: { - name: body.data.name, - parentUserId: session.user.id, - settings: { dyslexiaFont: false, language: 'en', fontSize: 1 }, - }, - }) - - return student - } - - throw createError({ - statusCode: 405, - statusMessage: 'Method not allowed', - }) -}) \ No newline at end of file diff --git a/server/utils/require-form-resource.ts b/server/utils/require-form-resource.ts new file mode 100644 index 00000000..ce8907c7 --- /dev/null +++ b/server/utils/require-form-resource.ts @@ -0,0 +1,40 @@ +import { prisma } from './prisma' + +export async function requireFormGroupInClass(formGroupId: number, classId: string) { + const formGroup = await prisma.formGroup.findFirst({ + where: { id: formGroupId, class: classId }, + select: { id: true }, + }) + + if (!formGroup) { + throw createError({ statusCode: 404, statusMessage: 'Form group not found in this class' }) + } + + return formGroup +} + +export async function requireFormInClass(formId: number, classId: string) { + const form = await prisma.form.findFirst({ + where: { id: formId, FormGroup: { class: classId } }, + select: { id: true }, + }) + + if (!form) { + throw createError({ statusCode: 404, statusMessage: 'Form not found in this class' }) + } + + return form +} + +export async function requireComponentInClass(componentId: number, classId: string) { + const component = await prisma.formComponent.findFirst({ + where: { id: componentId, Form: { FormGroup: { class: classId } } }, + select: { id: true }, + }) + + if (!component) { + throw createError({ statusCode: 404, statusMessage: 'Form component not found in this class' }) + } + + return component +} diff --git a/server/utils/require-session.ts b/server/utils/require-session.ts index 4c145a9e..2430a056 100644 --- a/server/utils/require-session.ts +++ b/server/utils/require-session.ts @@ -1,6 +1,7 @@ import type { H3Event } from 'h3' import { createError } from 'h3' import { auth } from './auth' +import { prisma } from './prisma' export async function requireSession(event: H3Event) { const session = await auth.api.getSession({ headers: event.headers }) @@ -26,4 +27,50 @@ export async function requireAdmin(event: H3Event) { } return session -} \ No newline at end of file +} + +export async function requireCoach(event: H3Event) { + const session = await requireSession(event) + + if (session.user.role !== 'coach' && session.user.role !== 'admin') { + throw createError({ + statusCode: 403, + statusMessage: 'Forbidden', + }) + } + + return session +} +export async function requireClassAccess(event: H3Event, classToken: string) { + const session = await requireCoach(event) + + const classroom = await prisma.class.findFirst({ + where: { + joinToken: classToken, + Coach: { + some: { + userId: session.user.id, + }, + }, + }, + select: { + id: true, + Coach: { + where: { userId: session.user.id }, + select: { id: true }, + take: 1, + }, + }, + }) + + const coachId = classroom?.Coach[0]?.id + + if (!classroom || !coachId) { + throw createError({ + statusCode: 403, + statusMessage: 'You do not have access to this class', + }) + } + + return { session, classId: classroom.id, coachId } +} diff --git a/server/utils/schemas.ts b/server/utils/schemas.ts index 4817faa8..ac7226c5 100644 --- a/server/utils/schemas.ts +++ b/server/utils/schemas.ts @@ -1,32 +1,46 @@ -import { z } from "zod"; +import { z } from 'zod' export const emailSchema = z.email({ pattern: z.regexes.html5Email }).trim().toLowerCase() export const userCreateSchema = z.object({ name: z.string().min(1).max(100), email: emailSchema, - role: z.enum(["admin", "reader"]).default("reader"), - raffleOptIn: z.boolean().optional().default(false), + role: z.enum(['coach', 'reader']).default('reader'), + raffleOptIn: z.boolean().optional().default(false), publicityConsent: z.boolean().optional().default(false), }) -export const adminCreateSchema = z.object({ - settings: z.object({}).optional() +export const classCreateSchema = z.object({ + name: z.string().trim().min(1).max(120), + type: z.enum(['Teacher', 'Study Group', 'Community Group', 'Other']), + school: z.string().trim().max(160).optional(), + district: z.string().trim().max(160).optional(), + zipcode: z.string().trim().max(10).optional(), +}) + +export const coachCreateSchema = z.object({ + settings: z.object({}).optional(), }) export const studentCreateSchema = z.object({ - name: z.string("Invalid Name").min(1).max(35) + name: z.string('Invalid Name').min(1).max(35), }) -export const studentUpdateSchema = studentCreateSchema.partial().extend({ - settings: z.object({ - dyslexiaFont: z.boolean().optional(), - fontSize: z.number().min(1).max(1.5).optional(), - language: z.enum(["en", "es"]).optional(), - raffleOptIn: z.boolean().optional(), - publicityConsent: z.boolean().optional() - }, "Invalid Settings").optional(), - exp: z.int("Invalid EXP").max(100000, "Max EXP").min(0, "Min EXP").optional(), +export const studentUpdateSchema = z.object({ + name: z.string('Invalid Name').min(1).max(35).optional(), + settings: z + .object( + { + dyslexiaFont: z.boolean().optional(), + fontSize: z.number().min(1).max(1.5).optional(), + language: z.enum(['en', 'es']).optional(), + raffleOptIn: z.boolean().optional(), + publicityConsent: z.boolean().optional(), + }, + 'Invalid Settings' + ) + .optional(), + exp: z.int('Invalid EXP').max(100000, 'Max EXP').min(0, 'Min EXP').optional(), }) export const announcementCreateSchema = z.object({ @@ -36,8 +50,8 @@ export const announcementCreateSchema = z.object({ content: z.object({ icon: z.string().max(8), title: z.string().min(1).max(250), - body: z.string().min(1).max(5000) - }) + body: z.string().min(1).max(5000), + }), }) export const formGroupCreateSchema = z.object({ @@ -47,7 +61,7 @@ export const formGroupCreateSchema = z.object({ export const formCreateSchema = z.object({ order: z.int(), - startDate: z.coerce.date(), + startDate: z.coerce.date(), endDate: z.coerce.date(), published: z.boolean(), author: z.cuid2(), @@ -57,7 +71,7 @@ export const formCreateSchema = z.object({ export const formUpdateSchema = z.object({ order: z.int().optional(), - startDate: z.coerce.date().optional(), + startDate: z.coerce.date().optional(), endDate: z.coerce.date().nullish(), published: z.boolean().optional(), author: z.cuid2().nullish(), @@ -68,29 +82,29 @@ export const formUpdateSchema = z.object({ export const formComponentCreateSchema = z.object({ form: z.int(), order: z.int().min(0), - questionType: z.enum(["mcq", "text", "context", "video"]), + questionType: z.enum(['mcq', 'text', 'context', 'video']), questionText: z.string().min(1).max(2500), questionOptions: z.object({ - choices: z.array(z.object({text: z.string().min(1), correct: z.boolean()})).optional(), - video: z.string().optional() - }) + choices: z.array(z.object({ text: z.string().min(1), correct: z.boolean() })).optional(), + video: z.string().optional(), + }), }) export const formSubmissionCreateSchema = z.object({ student: z.int(), form: z.int(), - submissionDate: z.coerce.date().optional() + submissionDate: z.coerce.date().optional(), }) export const submissionResponseCreateSchema = z.object({ submission: z.int(), formComponent: z.int(), - response: z.string().min(1).max(5000) + response: z.string().min(1).max(5000), }) export type Email = z.infer export type UserCreate = z.infer -export type AdminCreate = z.infer +export type CoachCreate = z.infer export type StudentCreate = z.infer export type StudentUpdate = z.infer export type AnnouncementCreate = z.infer @@ -99,4 +113,4 @@ export type FormUpdate = z.infer export type FormGroupCreate = z.infer export type FormComponentCreate = z.infer export type FormSubmissionCreate = z.infer -export type SubmissionResponseCreate = z.infer \ No newline at end of file +export type SubmissionResponseCreate = z.infer