mirror of
https://github.com/nexu-io/open-design.git
synced 2026-10-27 09:51:12 +01:00
fix(web): restore share-panel copy and comment-pin visuals per board8
chain1-publish G4: delete the stale "仅支持分享单个文件,内嵌图片等本地
资源暂不支持" sentence from fileViewer.publishSingleFileDescription (19
locales) — it contradicts the current multi-resource share and G4 required
its removal.
chain1-publish S1: add the missing "链接访问" title row + its static
description ("接收者可查看预览和已有评论,不包含对话和代码。") to
ShareTab's public-share section, as new fileViewer.linkAccessTitle /
linkAccessDescription keys (19 locales). No switch added — that control
overlaps the existing "停止分享" button and is left as a 需确认 item.
chain4-owner 4.2b: canvas comment pins go from 20x20/weight 600/2px white
ring/fixed #282828 to 28x28/weight 500/no ring, and now derive their
background/foreground from the same per-author color used by that author's
sidebar avatar (commentAuthorAvatarColor), both pure local CSS/TSX with no
packages/ or protocol change.
chain4-owner O7: formatCommentTime now buckets by calendar day (adds
"昨天", drops the "N 天前/N 周前" buckets, switches the hour bucket to
same-day instead of <24h elapsed, and formats older dates via
toLocaleDateString with year only when it differs from the current year),
and comment-side-time gets a title attribute with the full absolute
timestamp on hover.
Verification: pnpm --filter @open-design/web typecheck passes. Not run
through a real renderer — no pixel-level claim.
This commit is contained in:
@@ -4367,18 +4367,40 @@ function FileVersionManagerModal({
|
||||
);
|
||||
}
|
||||
|
||||
// O7: 刚刚 / N 分钟前 / N 小时前(同一天)/ 昨天 / 短日期(跨年补年份). The hour
|
||||
// bucket is keyed on calendar day, not elapsed duration, so a same-day
|
||||
// comment never reads as "N 天前"; days-ago/weeks-ago buckets are dropped.
|
||||
function formatCommentTime(ts: number, t: TranslateFn): string {
|
||||
const diff = Date.now() - ts;
|
||||
const now = Date.now();
|
||||
const diff = now - ts;
|
||||
if (diff < 60_000) return t('common.justNow');
|
||||
const mins = Math.floor(diff / 60_000);
|
||||
if (mins < 60) return t('common.minutesAgo', { n: mins });
|
||||
const hours = Math.floor(mins / 60);
|
||||
if (hours < 24) return t('common.hoursAgo', { n: hours });
|
||||
const days = Math.floor(hours / 24);
|
||||
if (days < 7) return t('common.daysAgo', { n: days });
|
||||
const weeks = Math.floor(days / 7);
|
||||
if (weeks < 5) return t('common.weeksAgo', { n: weeks });
|
||||
return new Date(ts).toLocaleDateString();
|
||||
const date = new Date(ts);
|
||||
const today = new Date(now);
|
||||
const isSameDay =
|
||||
date.getFullYear() === today.getFullYear() &&
|
||||
date.getMonth() === today.getMonth() &&
|
||||
date.getDate() === today.getDate();
|
||||
if (isSameDay) {
|
||||
return t('common.hoursAgo', { n: Math.floor(diff / 3_600_000) });
|
||||
}
|
||||
const yesterday = new Date(today);
|
||||
yesterday.setDate(yesterday.getDate() - 1);
|
||||
const isYesterday =
|
||||
date.getFullYear() === yesterday.getFullYear() &&
|
||||
date.getMonth() === yesterday.getMonth() &&
|
||||
date.getDate() === yesterday.getDate();
|
||||
if (isYesterday) return t('common.yesterday');
|
||||
const crossYear = date.getFullYear() !== today.getFullYear();
|
||||
try {
|
||||
return date.toLocaleDateString(
|
||||
undefined,
|
||||
crossYear ? { year: 'numeric', month: 'short', day: 'numeric' } : { month: 'short', day: 'numeric' },
|
||||
);
|
||||
} catch {
|
||||
return date.toISOString();
|
||||
}
|
||||
}
|
||||
|
||||
function commentActivityAt(comment: PreviewComment): number {
|
||||
@@ -4443,6 +4465,16 @@ export function commentAuthorAvatarColor(seed: string) {
|
||||
return COMMENT_AUTHOR_AVATAR_COLORS[hash % COMMENT_AUTHOR_AVATAR_COLORS.length] ?? COMMENT_AUTHOR_AVATAR_COLORS[0];
|
||||
}
|
||||
|
||||
// Same author-key precedence as CommentAuthorIdentityContent's seed, minus the
|
||||
// directory-resolved member-id fallback (not available outside that component's
|
||||
// hook): canvas pins pick their color from this so a pin and its author's
|
||||
// sidebar avatar always match.
|
||||
function commentAuthorPinSeed(comment: PreviewComment): string {
|
||||
return comment.authorKind === 'user'
|
||||
? (comment.authorKey ?? comment.authorAppUserId ?? '')
|
||||
: (comment.authorKey ?? comment.authorMemberId ?? '');
|
||||
}
|
||||
|
||||
// First glyph of the display name (code-point aware so a CJK name shows its
|
||||
// first character and an emoji is not split). Falls back to '?'.
|
||||
function commentAuthorInitials(name: string): string {
|
||||
@@ -4877,7 +4909,9 @@ export function CommentSidePanel({
|
||||
displayNumber={displayCommentNumber(comment, index)}
|
||||
t={t}
|
||||
/>
|
||||
<span className="comment-side-time">{formatCommentTime(commentActivityAt(comment), t)}</span>
|
||||
<span className="comment-side-time" title={formatAbsoluteDateTime(commentActivityAt(comment)) ?? undefined}>
|
||||
{formatCommentTime(commentActivityAt(comment), t)}
|
||||
</span>
|
||||
{sendable ? (
|
||||
<button
|
||||
type="button"
|
||||
@@ -6001,6 +6035,9 @@ function CommentPreviewOverlays({
|
||||
const tooltip = drifted
|
||||
? `${markerNumber}. ${label} · ${anchorStateLabel(anchorState, t)}`
|
||||
: `${markerNumber}. ${label}: ${comment.note}`;
|
||||
// 4.2b: the pin carries the same author color as that author's
|
||||
// sidebar avatar (the lost-anchor variant overrides this below).
|
||||
const pinColor = commentAuthorAvatarColor(commentAuthorPinSeed(comment));
|
||||
return (
|
||||
<div
|
||||
key={comment.id}
|
||||
@@ -6019,6 +6056,7 @@ function CommentPreviewOverlays({
|
||||
<button
|
||||
type="button"
|
||||
className="comment-saved-pin od-tooltip tipd"
|
||||
style={anchorState === 'lost' ? undefined : { background: pinColor.bg, color: pinColor.fg }}
|
||||
data-tooltip={tooltip}
|
||||
data-tooltip-placement="top"
|
||||
onClick={(event) => {
|
||||
@@ -6064,7 +6102,15 @@ function CommentPreviewOverlays({
|
||||
{showActivePin && activeTarget ? (
|
||||
<div
|
||||
className="comment-active-pin"
|
||||
style={activeCommentPinStyle(activeTarget, scale, overlayOffset)}
|
||||
style={{
|
||||
...activeCommentPinStyle(activeTarget, scale, overlayOffset),
|
||||
...(activeSavedComment
|
||||
? (() => {
|
||||
const pinColor = commentAuthorAvatarColor(commentAuthorPinSeed(activeSavedComment));
|
||||
return { background: pinColor.bg, color: pinColor.fg };
|
||||
})()
|
||||
: null),
|
||||
}}
|
||||
data-testid="comment-active-pin"
|
||||
aria-hidden="true"
|
||||
>
|
||||
|
||||
@@ -16,10 +16,35 @@
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
/* Publish help remains outside the mutating action, at the trailing edge. */
|
||||
.helpHeading {
|
||||
/* S1/S4: the "链接访问" title row + static description line the panel was
|
||||
missing (板 D-00 固定结构第二/三行). The help "?" tooltip keeps its prior
|
||||
position, at the row's trailing edge. */
|
||||
.linkAccessHeading {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.linkAccessRow {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
min-height: 28px;
|
||||
}
|
||||
|
||||
.linkAccessLabel {
|
||||
color: #333333;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.linkAccessDescription {
|
||||
margin: 0;
|
||||
color: #888888;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
/* S1-T/S4-T: scope explanation stays readable without hover or focus. */
|
||||
|
||||
@@ -121,17 +121,21 @@ export function ShareTab({
|
||||
) : null}
|
||||
{canPublishPublic ? (
|
||||
<>
|
||||
<div className={styles.helpHeading}>
|
||||
<Button
|
||||
type="button"
|
||||
className="share-menu-help od-tooltip"
|
||||
aria-label={t('fileViewer.publishSingleFileDescription')}
|
||||
data-tooltip={t('fileViewer.publishSingleFileDescription')}
|
||||
data-tooltip-placement="top"
|
||||
onClick={event => event.stopPropagation()}
|
||||
>
|
||||
<RemixIcon name="question-line" size={14} />
|
||||
</Button>
|
||||
<div className={styles.linkAccessHeading}>
|
||||
<div className={styles.linkAccessRow}>
|
||||
<span className={styles.linkAccessLabel}>{t('fileViewer.linkAccessTitle')}</span>
|
||||
<Button
|
||||
type="button"
|
||||
className="share-menu-help od-tooltip"
|
||||
aria-label={t('fileViewer.publishSingleFileDescription')}
|
||||
data-tooltip={t('fileViewer.publishSingleFileDescription')}
|
||||
data-tooltip-placement="top"
|
||||
onClick={event => event.stopPropagation()}
|
||||
>
|
||||
<RemixIcon name="question-line" size={14} />
|
||||
</Button>
|
||||
</div>
|
||||
<p className={styles.linkAccessDescription}>{t('fileViewer.linkAccessDescription')}</p>
|
||||
</div>
|
||||
{filePublished && publishProgress !== null ? (
|
||||
<progress max={1} value={publishProgress} aria-label={t('fileViewer.publishingFile')} />
|
||||
|
||||
@@ -273,6 +273,7 @@ export const ar: Dict = {
|
||||
'common.justNow': 'الآن',
|
||||
'common.minutesAgo': 'منذ {n} دقيقة',
|
||||
'common.hoursAgo': 'منذ {n} ساعة',
|
||||
'common.yesterday': 'أمس',
|
||||
'common.daysAgo': 'منذ {n} يوم',
|
||||
'common.weeksAgo': 'قبل {n} أسبوع',
|
||||
'common.now': 'الآن',
|
||||
@@ -3269,7 +3270,9 @@ export const ar: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'إنشاء رابط مشاركة',
|
||||
"fileViewer.generateAndCopyLink": "إنشاء الرابط ونسخه",
|
||||
'fileViewer.publishSingleFileDescription': 'يمكن لأي شخص لديه الرابط عرضه عبر الإنترنت. حاليًا يمكن مشاركة ملف واحد فقط — الموارد المحلية المضمّنة مثل الصور غير مدعومة بعد.',
|
||||
"fileViewer.linkAccessTitle": "الوصول عبر الرابط",
|
||||
"fileViewer.linkAccessDescription": "يمكن للمستلمين عرض المعاينة والتعليقات الحالية، دون المحادثة أو الكود.",
|
||||
'fileViewer.publishSingleFileDescription': 'يمكن لأي شخص لديه الرابط عرضه عبر الإنترنت.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'جارٍ إنشاء الرابط…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const de: Dict = {
|
||||
'common.justNow': 'gerade eben',
|
||||
'common.minutesAgo': 'vor {n} Min.',
|
||||
'common.hoursAgo': 'vor {n} Std.',
|
||||
'common.yesterday': 'Gestern',
|
||||
'common.daysAgo': 'vor {n} T.',
|
||||
'common.weeksAgo': 'vor {n} Wo.',
|
||||
'common.now': 'jetzt',
|
||||
@@ -3269,7 +3270,9 @@ export const de: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Teammitglieder',
|
||||
'fileViewer.publishSingleFileTitle': 'Freigabelink erstellen',
|
||||
"fileViewer.generateAndCopyLink": "Link erstellen und kopieren",
|
||||
'fileViewer.publishSingleFileDescription': 'Jeder mit dem Link kann sie online ansehen. Derzeit kann nur eine einzelne Datei geteilt werden — eingebettete lokale Assets wie Bilder werden noch nicht unterstützt.',
|
||||
"fileViewer.linkAccessTitle": "Linkzugriff",
|
||||
"fileViewer.linkAccessDescription": "Empfänger können die Vorschau und vorhandene Kommentare sehen – nicht die Unterhaltung oder den Code.",
|
||||
'fileViewer.publishSingleFileDescription': 'Jeder mit dem Link kann sie online ansehen.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Link wird erstellt…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const en: Dict = {
|
||||
'common.justNow': 'just now',
|
||||
'common.minutesAgo': '{n}m ago',
|
||||
'common.hoursAgo': '{n}h ago',
|
||||
'common.yesterday': 'Yesterday',
|
||||
'common.daysAgo': '{n}d ago',
|
||||
'common.weeksAgo': '{n}w ago',
|
||||
'common.now': 'now',
|
||||
@@ -3283,7 +3284,9 @@ export const en: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Get a share link',
|
||||
"fileViewer.generateAndCopyLink": "Generate and copy link",
|
||||
'fileViewer.publishSingleFileDescription': 'Anyone with the link can view it online. Only a single file can be shared for now — embedded local assets such as images aren\'t supported yet.',
|
||||
"fileViewer.linkAccessTitle": "Link access",
|
||||
"fileViewer.linkAccessDescription": "Recipients can view the preview and existing comments — not the conversation or code.",
|
||||
'fileViewer.publishSingleFileDescription': 'Anyone with the link can view it online.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Creating link…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const esES: Dict = {
|
||||
'common.justNow': 'justo ahora',
|
||||
'common.minutesAgo': 'hace {n} min',
|
||||
'common.hoursAgo': 'hace {n} h',
|
||||
'common.yesterday': 'Ayer',
|
||||
'common.daysAgo': 'hace {n} d',
|
||||
'common.weeksAgo': 'hace {n} sem',
|
||||
'common.now': 'ahora',
|
||||
@@ -3269,7 +3270,9 @@ export const esES: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Obtener enlace para compartir',
|
||||
"fileViewer.generateAndCopyLink": "Generar y copiar enlace",
|
||||
'fileViewer.publishSingleFileDescription': 'Cualquiera con el enlace puede verlo en línea. Por ahora solo se puede compartir un único archivo; los recursos locales incrustados, como imágenes, aún no son compatibles.',
|
||||
"fileViewer.linkAccessTitle": "Acceso por enlace",
|
||||
"fileViewer.linkAccessDescription": "Los destinatarios pueden ver la vista previa y los comentarios existentes, no la conversación ni el código.",
|
||||
'fileViewer.publishSingleFileDescription': 'Cualquiera con el enlace puede verlo en línea.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Creando enlace…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const fa: Dict = {
|
||||
'common.justNow': 'همین الان',
|
||||
'common.minutesAgo': '{n} دقیقه پیش',
|
||||
'common.hoursAgo': '{n} ساعت پیش',
|
||||
'common.yesterday': 'دیروز',
|
||||
'common.daysAgo': '{n} روز پیش',
|
||||
'common.weeksAgo': '{n} هفته پیش',
|
||||
'common.now': 'الان',
|
||||
@@ -3269,7 +3270,9 @@ export const fa: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'ایجاد پیوند اشتراکگذاری',
|
||||
"fileViewer.generateAndCopyLink": "ایجاد و کپی پیوند",
|
||||
'fileViewer.publishSingleFileDescription': 'هر کسی که پیوند را داشته باشد میتواند آن را آنلاین ببیند. در حال حاضر فقط یک فایل قابل اشتراکگذاری است — منابع محلی جاسازیشده مانند تصاویر هنوز پشتیبانی نمیشوند.',
|
||||
"fileViewer.linkAccessTitle": "دسترسی از طریق پیوند",
|
||||
"fileViewer.linkAccessDescription": "دریافتکنندگان میتوانند پیشنمایش و نظرات موجود را ببینند، نه گفتگو یا کد را.",
|
||||
'fileViewer.publishSingleFileDescription': 'هر کسی که پیوند را داشته باشد میتواند آن را آنلاین ببیند.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'در حال ایجاد پیوند…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const fr: Dict = {
|
||||
'common.justNow': 'à l\'instant',
|
||||
'common.minutesAgo': 'il y a {n} min',
|
||||
'common.hoursAgo': 'il y a {n} h',
|
||||
'common.yesterday': 'Hier',
|
||||
'common.daysAgo': 'il y a {n} j',
|
||||
'common.weeksAgo': 'il y a {n} sem.',
|
||||
'common.now': 'maintenant',
|
||||
@@ -3262,7 +3263,9 @@ export const fr: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Obtenir un lien de partage',
|
||||
"fileViewer.generateAndCopyLink": "Générer et copier le lien",
|
||||
'fileViewer.publishSingleFileDescription': 'Toute personne disposant du lien peut la voir en ligne. Pour l\'instant, seul un fichier unique peut être partagé — les ressources locales intégrées comme les images ne sont pas encore prises en charge.',
|
||||
"fileViewer.linkAccessTitle": "Accès par lien",
|
||||
"fileViewer.linkAccessDescription": "Les destinataires peuvent voir l'aperçu et les commentaires existants, pas la conversation ni le code.",
|
||||
'fileViewer.publishSingleFileDescription': 'Toute personne disposant du lien peut la voir en ligne.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Création du lien…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const hu: Dict = {
|
||||
'common.justNow': 'az imént',
|
||||
'common.minutesAgo': '{n} perce',
|
||||
'common.hoursAgo': '{n} órája',
|
||||
'common.yesterday': 'Tegnap',
|
||||
'common.daysAgo': '{n} napja',
|
||||
'common.weeksAgo': '{n} hete',
|
||||
'common.now': 'most',
|
||||
@@ -3262,7 +3263,9 @@ export const hu: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Megosztási link létrehozása',
|
||||
"fileViewer.generateAndCopyLink": "Link létrehozása és másolása",
|
||||
'fileViewer.publishSingleFileDescription': 'A linkkel bárki megtekintheti online. Egyelőre csak egyetlen fájl osztható meg — a beágyazott helyi erőforrások, például képek, még nem támogatottak.',
|
||||
"fileViewer.linkAccessTitle": "Hozzáférés linkkel",
|
||||
"fileViewer.linkAccessDescription": "A címzettek megtekinthetik az előnézetet és a meglévő megjegyzéseket, de nem a beszélgetést vagy a kódot.",
|
||||
'fileViewer.publishSingleFileDescription': 'A linkkel bárki megtekintheti online.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Link létrehozása…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const id: Dict = {
|
||||
'common.justNow': 'baru saja',
|
||||
'common.minutesAgo': '{n}m lalu',
|
||||
'common.hoursAgo': '{n}j lalu',
|
||||
'common.yesterday': 'Kemarin',
|
||||
'common.daysAgo': '{n}h lalu',
|
||||
'common.weeksAgo': '{n} mgg lalu',
|
||||
'common.now': 'sekarang',
|
||||
@@ -3262,7 +3263,9 @@ export const id: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Dapatkan tautan berbagi',
|
||||
"fileViewer.generateAndCopyLink": "Buat dan salin tautan",
|
||||
'fileViewer.publishSingleFileDescription': 'Siapa pun dengan tautan dapat melihatnya secara online. Saat ini hanya satu file yang dapat dibagikan — aset lokal tersemat seperti gambar belum didukung.',
|
||||
"fileViewer.linkAccessTitle": "Akses tautan",
|
||||
"fileViewer.linkAccessDescription": "Penerima dapat melihat pratinjau dan komentar yang ada, bukan percakapan atau kode.",
|
||||
'fileViewer.publishSingleFileDescription': 'Siapa pun dengan tautan dapat melihatnya secara online.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Membuat tautan…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const it: Dict = {
|
||||
'common.justNow': 'proprio ora',
|
||||
'common.minutesAgo': '{n} min fa',
|
||||
'common.hoursAgo': '{n} h fa',
|
||||
'common.yesterday': 'Ieri',
|
||||
'common.daysAgo': '{n} g fa',
|
||||
'common.weeksAgo': '{n} sett. fa',
|
||||
'common.now': 'ora',
|
||||
@@ -3262,7 +3263,9 @@ export const it: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Ottieni un link di condivisione',
|
||||
"fileViewer.generateAndCopyLink": "Genera e copia il link",
|
||||
'fileViewer.publishSingleFileDescription': 'Chiunque abbia il link può vederlo online. Per ora è possibile condividere solo un singolo file — le risorse locali incorporate come le immagini non sono ancora supportate.',
|
||||
"fileViewer.linkAccessTitle": "Accesso tramite link",
|
||||
"fileViewer.linkAccessDescription": "I destinatari possono vedere l'anteprima e i commenti esistenti, non la conversazione o il codice.",
|
||||
'fileViewer.publishSingleFileDescription': 'Chiunque abbia il link può vederlo online.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Creazione del link…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const ja: Dict = {
|
||||
'common.justNow': 'たった今',
|
||||
'common.minutesAgo': '{n}分前',
|
||||
'common.hoursAgo': '{n}時間前',
|
||||
'common.yesterday': '昨日',
|
||||
'common.daysAgo': '{n}日前',
|
||||
'common.weeksAgo': '{n}週間前',
|
||||
'common.now': '今',
|
||||
@@ -3262,7 +3263,9 @@ export const ja: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': '共有リンクを作成',
|
||||
"fileViewer.generateAndCopyLink": "リンクを作成してコピー",
|
||||
'fileViewer.publishSingleFileDescription': 'リンクを知っている人は誰でもオンラインで閲覧できます。現在は単一ファイルのみ共有でき、画像などの埋め込みローカルアセットには未対応です。',
|
||||
"fileViewer.linkAccessTitle": "リンクアクセス",
|
||||
"fileViewer.linkAccessDescription": "受け取った人はプレビューと既存のコメントを閲覧できます。会話やコードは含まれません。",
|
||||
'fileViewer.publishSingleFileDescription': 'リンクを知っている人は誰でもオンラインで閲覧できます。',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': '作成中…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const ko: Dict = {
|
||||
'common.justNow': '방금 전',
|
||||
'common.minutesAgo': '{n}분 전',
|
||||
'common.hoursAgo': '{n}시간 전',
|
||||
'common.yesterday': '어제',
|
||||
'common.daysAgo': '{n}일 전',
|
||||
'common.weeksAgo': '{n}주 전',
|
||||
'common.now': '지금',
|
||||
@@ -3262,7 +3263,9 @@ export const ko: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': '공유 링크 만들기',
|
||||
"fileViewer.generateAndCopyLink": "링크 생성 및 복사",
|
||||
'fileViewer.publishSingleFileDescription': '링크가 있는 사람은 누구나 온라인으로 볼 수 있습니다. 현재는 단일 파일만 공유할 수 있으며, 이미지 등 내장 로컬 리소스는 아직 지원되지 않습니다.',
|
||||
"fileViewer.linkAccessTitle": "링크 액세스",
|
||||
"fileViewer.linkAccessDescription": "받는 사람은 미리보기와 기존 댓글을 볼 수 있습니다. 대화나 코드는 포함되지 않습니다.",
|
||||
'fileViewer.publishSingleFileDescription': '링크가 있는 사람은 누구나 온라인으로 볼 수 있습니다.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': '만드는 중…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const pl: Dict = {
|
||||
'common.justNow': 'przed chwilą',
|
||||
'common.minutesAgo': '{n} min temu',
|
||||
'common.hoursAgo': '{n} godz. temu',
|
||||
'common.yesterday': 'Wczoraj',
|
||||
'common.daysAgo': '{n} dni temu',
|
||||
'common.weeksAgo': '{n} tyg. temu',
|
||||
'common.now': 'teraz',
|
||||
@@ -3262,7 +3263,9 @@ export const pl: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Uzyskaj link do udostępniania',
|
||||
"fileViewer.generateAndCopyLink": "Wygeneruj i skopiuj link",
|
||||
'fileViewer.publishSingleFileDescription': 'Każdy z linkiem może obejrzeć online. Na razie można udostępnić tylko pojedynczy plik — osadzone zasoby lokalne, np. obrazy, nie są jeszcze obsługiwane.',
|
||||
"fileViewer.linkAccessTitle": "Dostęp przez link",
|
||||
"fileViewer.linkAccessDescription": "Odbiorcy mogą zobaczyć podgląd i istniejące komentarze, ale nie rozmowę ani kod.",
|
||||
'fileViewer.publishSingleFileDescription': 'Każdy z linkiem może obejrzeć online.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Tworzenie linku…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const ptBR: Dict = {
|
||||
'common.justNow': 'agora mesmo',
|
||||
'common.minutesAgo': 'há {n} min',
|
||||
'common.hoursAgo': 'há {n} h',
|
||||
'common.yesterday': 'Ontem',
|
||||
'common.daysAgo': 'há {n} d',
|
||||
'common.weeksAgo': 'há {n}sem',
|
||||
'common.now': 'agora',
|
||||
@@ -3262,7 +3263,9 @@ export const ptBR: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Obter link de compartilhamento',
|
||||
"fileViewer.generateAndCopyLink": "Gerar e copiar link",
|
||||
'fileViewer.publishSingleFileDescription': 'Qualquer pessoa com o link pode vê-lo online. Por enquanto só é possível compartilhar um único arquivo — recursos locais incorporados, como imagens, ainda não são suportados.',
|
||||
"fileViewer.linkAccessTitle": "Acesso por link",
|
||||
"fileViewer.linkAccessDescription": "Os destinatários podem ver a prévia e os comentários existentes, não a conversa nem o código.",
|
||||
'fileViewer.publishSingleFileDescription': 'Qualquer pessoa com o link pode vê-lo online.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Criando link…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const ru: Dict = {
|
||||
'common.justNow': 'только что',
|
||||
'common.minutesAgo': '{n} мин. назад',
|
||||
'common.hoursAgo': '{n} ч. назад',
|
||||
'common.yesterday': 'Вчера',
|
||||
'common.daysAgo': '{n} д. назад',
|
||||
'common.weeksAgo': '{n} нед. назад',
|
||||
'common.now': 'сейчас',
|
||||
@@ -3262,7 +3263,9 @@ export const ru: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Получить ссылку для доступа',
|
||||
"fileViewer.generateAndCopyLink": "Создать и скопировать ссылку",
|
||||
'fileViewer.publishSingleFileDescription': 'Любой, у кого есть ссылка, может открыть её онлайн. Пока можно поделиться только одним файлом — встроенные локальные ресурсы, например изображения, ещё не поддерживаются.',
|
||||
"fileViewer.linkAccessTitle": "Доступ по ссылке",
|
||||
"fileViewer.linkAccessDescription": "Получатели могут видеть предпросмотр и существующие комментарии, но не переписку и не код.",
|
||||
'fileViewer.publishSingleFileDescription': 'Любой, у кого есть ссылка, может открыть её онлайн.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Создание ссылки…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const th: Dict = {
|
||||
'common.justNow': 'เมื่อครู่นี้',
|
||||
'common.minutesAgo': '{n} นาทีที่แล้ว',
|
||||
'common.hoursAgo': '{n} ชั่วโมงที่แล้ว',
|
||||
'common.yesterday': 'เมื่อวาน',
|
||||
'common.daysAgo': '{n} วันที่แล้ว',
|
||||
'common.weeksAgo': '{n} สัปดาห์ที่แล้ว',
|
||||
'common.now': 'ตอนนี้',
|
||||
@@ -3262,7 +3263,9 @@ export const th: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'สร้างลิงก์แชร์',
|
||||
"fileViewer.generateAndCopyLink": "สร้างและคัดลอกลิงก์",
|
||||
'fileViewer.publishSingleFileDescription': 'ทุกคนที่มีลิงก์สามารถดูออนไลน์ได้ ขณะนี้แชร์ได้ครั้งละไฟล์เดียวเท่านั้น ยังไม่รองรับทรัพยากรในเครื่องที่ฝังอยู่ เช่น รูปภาพ',
|
||||
"fileViewer.linkAccessTitle": "การเข้าถึงลิงก์",
|
||||
"fileViewer.linkAccessDescription": "ผู้รับสามารถดูตัวอย่างและความคิดเห็นที่มีอยู่ได้ แต่ไม่รวมบทสนทนาและโค้ด",
|
||||
'fileViewer.publishSingleFileDescription': 'ทุกคนที่มีลิงก์สามารถดูออนไลน์ได้',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'กำลังสร้างลิงก์…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const tr: Dict = {
|
||||
'common.justNow': 'şimdi',
|
||||
'common.minutesAgo': '{n} dakika önce',
|
||||
'common.hoursAgo': '{n} saat önce',
|
||||
'common.yesterday': 'Dün',
|
||||
'common.daysAgo': '{n} gün önce',
|
||||
'common.weeksAgo': '{n}h önce',
|
||||
'common.now': 'şimdi',
|
||||
@@ -3262,7 +3263,9 @@ export const tr: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Paylaşım bağlantısı al',
|
||||
"fileViewer.generateAndCopyLink": "Bağlantı oluştur ve kopyala",
|
||||
'fileViewer.publishSingleFileDescription': 'Bağlantıya sahip olan herkes çevrimiçi görüntüleyebilir. Şimdilik yalnızca tek bir dosya paylaşılabilir; görseller gibi gömülü yerel kaynaklar henüz desteklenmiyor.',
|
||||
"fileViewer.linkAccessTitle": "Bağlantı erişimi",
|
||||
"fileViewer.linkAccessDescription": "Alıcılar önizlemeyi ve mevcut yorumları görebilir; sohbeti veya kodu göremez.",
|
||||
'fileViewer.publishSingleFileDescription': 'Bağlantıya sahip olan herkes çevrimiçi görüntüleyebilir.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Bağlantı oluşturuluyor…',
|
||||
|
||||
@@ -273,6 +273,7 @@ export const uk: Dict = {
|
||||
'common.justNow': 'щойно',
|
||||
'common.minutesAgo': '{n}хв тому',
|
||||
'common.hoursAgo': '{n}г тому',
|
||||
'common.yesterday': 'Вчора',
|
||||
'common.daysAgo': '{n}дн тому',
|
||||
'common.weeksAgo': '{n} тиж. тому',
|
||||
'common.now': 'тепер',
|
||||
@@ -3262,7 +3263,9 @@ export const uk: Dict = {
|
||||
'fileViewer.workspaceAccessMembers': 'Workspace members',
|
||||
'fileViewer.publishSingleFileTitle': 'Отримати посилання для доступу',
|
||||
"fileViewer.generateAndCopyLink": "Створити й скопіювати посилання",
|
||||
'fileViewer.publishSingleFileDescription': 'Будь-хто з посиланням може переглянути онлайн. Наразі можна поділитися лише одним файлом — вбудовані локальні ресурси, як-от зображення, ще не підтримуються.',
|
||||
"fileViewer.linkAccessTitle": "Доступ за посиланням",
|
||||
"fileViewer.linkAccessDescription": "Отримувачі можуть переглядати попередній перегляд і наявні коментарі, але не переписку чи код.",
|
||||
'fileViewer.publishSingleFileDescription': 'Будь-хто з посиланням може переглянути онлайн.',
|
||||
'fileViewer.openFileRequired': 'Open a file to use this.',
|
||||
'fileViewer.publishFile': 'Publish file',
|
||||
'fileViewer.publishingFile': 'Створення посилання…',
|
||||
|
||||
@@ -281,6 +281,7 @@ export const zhCN: Dict = {
|
||||
"common.justNow": "刚刚",
|
||||
"common.minutesAgo": "{n} 分钟前",
|
||||
"common.hoursAgo": "{n} 小时前",
|
||||
"common.yesterday": "昨天",
|
||||
"common.daysAgo": "{n} 天前",
|
||||
"common.weeksAgo": "{n} 周前",
|
||||
"common.now": "刚刚",
|
||||
@@ -3434,7 +3435,9 @@ export const zhCN: Dict = {
|
||||
"fileViewer.workspaceAccessMembers": "团队成员",
|
||||
"fileViewer.publishSingleFileTitle": "生成分享链接",
|
||||
"fileViewer.generateAndCopyLink": "生成并复制链接",
|
||||
"fileViewer.publishSingleFileDescription": "任何拿到链接的人都可在线查看。目前仅支持分享单个文件,内嵌图片等本地资源暂不支持。",
|
||||
"fileViewer.linkAccessTitle": "链接访问",
|
||||
"fileViewer.linkAccessDescription": "接收者可查看预览和已有评论,不包含对话和代码。",
|
||||
"fileViewer.publishSingleFileDescription": "任何拿到链接的人都可在线查看。",
|
||||
"fileViewer.openFileRequired": "打开文件后可用。",
|
||||
"fileViewer.publishFile": "发布文件",
|
||||
"fileViewer.publishingFile": "生成中…",
|
||||
|
||||
@@ -281,6 +281,7 @@ export const zhTW: Dict = {
|
||||
"common.justNow": "剛剛",
|
||||
"common.minutesAgo": "{n} 分鐘前",
|
||||
"common.hoursAgo": "{n} 小時前",
|
||||
"common.yesterday": "昨天",
|
||||
"common.daysAgo": "{n} 天前",
|
||||
"common.weeksAgo": "{n}w ago",
|
||||
"common.now": "剛剛",
|
||||
@@ -3443,7 +3444,9 @@ export const zhTW: Dict = {
|
||||
"fileViewer.workspaceAccessMembers": "團隊成員",
|
||||
"fileViewer.publishSingleFileTitle": "產生分享連結",
|
||||
"fileViewer.generateAndCopyLink": "產生並複製連結",
|
||||
"fileViewer.publishSingleFileDescription": "任何取得連結的人都可以線上查看。目前僅支援分享單一檔案,內嵌圖片等本地資源暫不支援。",
|
||||
"fileViewer.linkAccessTitle": "連結存取",
|
||||
"fileViewer.linkAccessDescription": "收件者可查看預覽與現有留言,不含對話與程式碼。",
|
||||
"fileViewer.publishSingleFileDescription": "任何取得連結的人都可以線上查看。",
|
||||
"fileViewer.openFileRequired": "打开文件后可用。",
|
||||
"fileViewer.publishFile": "發布檔案",
|
||||
"fileViewer.publishingFile": "產生中…",
|
||||
|
||||
@@ -173,6 +173,7 @@ export interface Dict {
|
||||
'common.justNow': string;
|
||||
'common.minutesAgo': string;
|
||||
'common.hoursAgo': string;
|
||||
'common.yesterday': string;
|
||||
'common.daysAgo': string;
|
||||
'common.weeksAgo': string;
|
||||
'common.now': string;
|
||||
@@ -4177,6 +4178,8 @@ export interface Dict {
|
||||
'fileViewer.workspaceAccessMembers': string;
|
||||
'fileViewer.publishSingleFileTitle': string;
|
||||
'fileViewer.generateAndCopyLink': string;
|
||||
'fileViewer.linkAccessTitle': string;
|
||||
'fileViewer.linkAccessDescription': string;
|
||||
'fileViewer.publishSingleFileDescription': string;
|
||||
'fileViewer.openFileRequired': string;
|
||||
'fileViewer.publishFile': string;
|
||||
|
||||
@@ -1673,20 +1673,19 @@
|
||||
left: 0;
|
||||
top: 0;
|
||||
box-sizing: border-box;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
border-radius: 50% 50% 50% 4px;
|
||||
background: #282828;
|
||||
color: #FFFFFF;
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
line-height: 1;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-shadow: 0 0 0 2px #FFFFFF;
|
||||
pointer-events: auto;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
@@ -1704,7 +1703,6 @@
|
||||
}
|
||||
.comment-saved-pin:hover,
|
||||
.comment-active-pin:hover {
|
||||
background: #282828;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
/* The lost marker keeps the exact same geometry as the resolved pin while
|
||||
|
||||
Reference in New Issue
Block a user