릴리스: v1.4.38 최고 관리자 보호 및 프리뷰 셸 정리

This commit is contained in:
2026-04-03 10:08:46 +09:00
parent 764e18c16b
commit 713b07a1de
14 changed files with 118 additions and 142 deletions

View File

@@ -1039,6 +1039,10 @@ const {
const {
setUserAvatarInput,
canManageModalRole,
canEditUserAvatar,
canEditUserInfo,
canResetUserPassword,
canDeleteUser,
isUserEditDirty,
roleLabelOf,
openUserAvatarPicker,
@@ -1795,6 +1799,10 @@ function userAvatarFallback(user) {
:user-display-name="userDisplayName"
:user-avatar-fallback="userAvatarFallback"
:remove-user-avatar="removeUserAvatar"
:can-edit-user-avatar="canEditUserAvatar"
:can-edit-user-info="canEditUserInfo"
:can-reset-user-password="canResetUserPassword"
:can-delete-user="canDeleteUser"
:role-label-of="roleLabelOf"
:fmt="fmt"
:open-user-password-modal="openUserPasswordModal"

View File

@@ -9,7 +9,7 @@ import addRowBelowIcon from '../assets/icons/add_row_below.svg'
import addPhotoAlternateIcon from '../assets/icons/add_photo_alternate.svg'
import shareIcon from '../assets/icons/share.svg'
import { api } from '../lib/api'
import { editorNewPath, editorPath, homePath, loginPath, mePath, topicPath } from '../lib/paths'
import { editorNewPath, editorPath, loginPath, mePath, topicPath } from '../lib/paths'
import { toApiUrl } from '../lib/runtime'
import { useAuthStore } from '../stores/auth'
import { useToast } from '../composables/useToast'
@@ -140,8 +140,6 @@ const shareTierListUrl = computed(() => {
if (typeof window === 'undefined') return editorPath(templateId.value, savedTierListId, { preview: true })
return new URL(editorPath(templateId.value, savedTierListId, { preview: true }), window.location.origin).toString()
})
const previewHomeUrl = computed(() => homePath())
watch(error, (message) => {
if (!message) return
toast.error(message)
@@ -973,13 +971,14 @@ onUnmounted(() => {
<template>
<section v-if="previewMode" class="previewOnly" :style="{ '--thumb-size': `${iconSize}px` }">
<header class="pageHead">
<div class="pageHead__main">
<div class="pageHead__eyebrow">Preview</div>
<h1 class="pageHead__title">{{ effectiveTitle }}</h1>
<p v-if="description" class="pageHead__desc">{{ description }}</p>
</div>
</header>
<div class="previewOnly__sheet">
<a class="previewOnly__brand" :href="previewHomeUrl">
<span class="previewOnly__brandMark">TM</span>
<span class="previewOnly__brandText">Tier Maker</span>
</a>
<div class="previewOnly__title">{{ effectiveTitle }}</div>
<div v-if="description" class="previewOnly__description">{{ description }}</div>
<div v-if="columns.length > 1" class="previewOnly__columns">
<div class="previewOnly__columnsSpacer" aria-hidden="true"></div>
<div class="previewOnly__columnsGrid" :style="{ '--column-count': columns.length }">
@@ -1475,55 +1474,18 @@ onUnmounted(() => {
cursor: pointer;
}
.previewOnly {
min-height: 100vh;
padding: 20px;
box-sizing: border-box;
background:
radial-gradient(circle at top, rgba(96, 165, 250, 0.14), transparent 38%),
var(--theme-shell-bg);
display: grid;
gap: 18px;
}
.previewOnly__sheet {
display: grid;
gap: 16px;
width: 100%;
max-width: 1280px;
margin: 0 auto;
}
.previewOnly__brand {
width: fit-content;
display: inline-flex;
align-items: center;
gap: 10px;
text-decoration: none;
color: var(--theme-text-strong);
}
.previewOnly__brandMark {
width: 34px;
height: 34px;
border-radius: 12px;
display: grid;
place-items: center;
background: var(--theme-accent-bg);
color: var(--theme-accent-text);
font-size: 13px;
font-weight: 900;
letter-spacing: -0.04em;
}
.previewOnly__brandText {
font-size: 14px;
font-weight: 900;
letter-spacing: -0.03em;
}
.previewOnly__title {
font-size: 28px;
font-weight: 900;
letter-spacing: -0.03em;
}
.previewOnly__description {
margin-top: -8px;
font-size: 14px;
line-height: 1.6;
opacity: 0.76;
padding: 18px;
border-radius: 24px;
border: 1px solid var(--theme-card-border);
background: var(--theme-card-bg);
box-shadow: inset 0 1px 0 var(--theme-card-shadow);
}
.previewOnly__columns {
display: grid;