mirror of
https://github.com/zen-browser/www
synced 2026-04-25 17:14:56 +02:00
280 lines
8.1 KiB
Plaintext
280 lines
8.1 KiB
Plaintext
---
|
|
import InfoIcon from '~/icons/InfoIcon.astro'
|
|
|
|
import { getIntlLocale } from '~/constants/i18n'
|
|
import { releaseNotes as releaseNotesData } from '~/release-notes'
|
|
import { getLocale, getPath, getUI } from '~/utils/i18n'
|
|
import { type ReleaseNote, getReleaseNoteFirefoxVersion } from '../release-notes'
|
|
import ReleaseNoteListItem from './ReleaseNoteListItem.astro'
|
|
export type Props = ReleaseNote
|
|
const { isTwilight, ...props } = Astro.props
|
|
|
|
const locale = getLocale(Astro)
|
|
const getLocalePath = getPath(locale)
|
|
const {
|
|
routes: {
|
|
releaseNotes: {
|
|
components: { releaseNoteItem },
|
|
},
|
|
},
|
|
} = getUI(locale)
|
|
|
|
let date: Date | undefined
|
|
if (props.date) {
|
|
const [day, month, year] = props.date.split('/')
|
|
date = new Date(Date.parse(`${year}-${month}-${day}`))
|
|
}
|
|
|
|
const ffVersion = getReleaseNoteFirefoxVersion(props)
|
|
const currentReleaseIndex = releaseNotesData.findIndex(
|
|
(releaseNote: ReleaseNote) => releaseNote.version === props.version
|
|
)
|
|
const prevReleaseNote = releaseNotesData[currentReleaseIndex + 1]
|
|
let compareLink = ''
|
|
if (prevReleaseNote && !isTwilight) {
|
|
compareLink = `https://github.com/zen-browser/desktop/compare/${prevReleaseNote.version}...${props.version}`
|
|
}
|
|
|
|
const isLatest = currentReleaseIndex === 0
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const listItems = {} as any
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const generateItems = (items: any, type: string) => {
|
|
if (!items) return
|
|
if (!listItems[type]) {
|
|
listItems[type] = []
|
|
}
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
items.forEach((item: any) => {
|
|
switch (type) {
|
|
case 'feature':
|
|
listItems[type].push({
|
|
type: 'feature',
|
|
content: item,
|
|
})
|
|
break
|
|
case 'fix':
|
|
listItems[type].push({
|
|
type: 'fix',
|
|
content: item.description ?? item,
|
|
...(item.issue
|
|
? {
|
|
link: {
|
|
text: `Issue #${item.issue}`,
|
|
href: `https://github.com/zen-browser/desktop/issues/${item.issue}`,
|
|
},
|
|
}
|
|
: {}),
|
|
})
|
|
break
|
|
case 'security':
|
|
listItems[type].push({
|
|
type: 'security',
|
|
link: {
|
|
text: 'Various security fixes.',
|
|
href: item,
|
|
},
|
|
})
|
|
break
|
|
case 'theme':
|
|
listItems[type].push({
|
|
type: 'theme',
|
|
content: item,
|
|
})
|
|
break
|
|
case 'known':
|
|
listItems[type].push({
|
|
type: 'known',
|
|
content: item,
|
|
})
|
|
break
|
|
case 'break':
|
|
listItems[type].push({
|
|
type: 'break',
|
|
content: item,
|
|
})
|
|
break
|
|
case 'change':
|
|
listItems[type].push({
|
|
type: 'change',
|
|
content: item,
|
|
})
|
|
break
|
|
}
|
|
})
|
|
}
|
|
generateItems(props.security ? [props.security] : null, 'security')
|
|
generateItems(props.fixes, 'fix')
|
|
generateItems(props.features, 'feature')
|
|
generateItems(props.changes, 'change')
|
|
generateItems(props.themeChanges, 'theme')
|
|
generateItems(props.breakingChanges, 'break')
|
|
generateItems(props.knownIssues, 'known')
|
|
---
|
|
|
|
<section
|
|
class="release-note-item relative mt-12 flex flex-col pt-24 lg:flex-row"
|
|
id={props.version}
|
|
>
|
|
<div class="flex w-full flex-col gap-2 px-5 md:px-10 md:pr-32">
|
|
{
|
|
isTwilight ? (
|
|
<a
|
|
class="!mb-2 block w-fit rounded-full bg-coral px-3 py-1 text-xs text-paper"
|
|
href={getLocalePath('/download?twilight')}
|
|
>
|
|
{releaseNoteItem.twilight}
|
|
</a>
|
|
) : null
|
|
}
|
|
<div class="w-full justify-between sm:flex">
|
|
<div
|
|
class="flex flex-col gap-1 text-sm font-bold opacity-80 sm:flex-row sm:items-center sm:gap-0"
|
|
>
|
|
{
|
|
isTwilight ? (
|
|
<>
|
|
{releaseNoteItem.twilightChanges}{' '}
|
|
{props.version.replaceAll('{version}', props.version)}
|
|
</>
|
|
) : (
|
|
<>{releaseNoteItem.releaseChanges.replaceAll('{version}', props.version)}</>
|
|
)
|
|
}
|
|
{
|
|
ffVersion ? (
|
|
<>
|
|
<span class="text-muted-foreground mx-3 hidden sm:block">•</span>
|
|
<a
|
|
rel="noopener noreferrer"
|
|
class="text-xs text-coral underline decoration-wavy opacity-80"
|
|
href={`https://www.mozilla.org/en-US/firefox/${ffVersion}/releasenotes/`}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
{releaseNoteItem.firefoxVersion.replace('{version}', ffVersion)}
|
|
</a>
|
|
</>
|
|
) : null
|
|
}
|
|
<span class="text-muted-foreground mx-3 hidden sm:block">•</span>
|
|
<a
|
|
rel="noopener noreferrer"
|
|
class="zen-link whitespace-nowrap text-xs !no-underline opacity-80"
|
|
target="_blank"
|
|
href={`https://github.com/zen-browser/desktop/releases/tag/${isTwilight ? 'twilight-1' : props.version}`}
|
|
>{releaseNoteItem.githubRelease}</a
|
|
>
|
|
{
|
|
!isTwilight ? (
|
|
<>
|
|
<span class="text-muted-foreground mx-3 hidden sm:block">•</span>
|
|
<a
|
|
rel="noopener noreferrer"
|
|
class="zen-link whitespace-nowrap text-xs !no-underline opacity-80"
|
|
target="_blank"
|
|
href={`https://github.com/zen-browser/desktop/actions/runs/${props.workflowId}`}
|
|
>
|
|
{releaseNoteItem.workflowRun}
|
|
</a>
|
|
</>
|
|
) : null
|
|
}
|
|
{
|
|
compareLink !== '' ? (
|
|
<>
|
|
<span class="text-muted-foreground mx-3 hidden sm:block">•</span>
|
|
<a
|
|
rel="noopener noreferrer"
|
|
class="zen-link whitespace-nowrap text-xs !no-underline opacity-80"
|
|
target="_blank"
|
|
href={compareLink}
|
|
>
|
|
{releaseNoteItem.compareChanges}
|
|
</a>
|
|
</>
|
|
) : null
|
|
}
|
|
</div>
|
|
<div class="text-xs font-bold opacity-80">
|
|
{date && date.toLocaleDateString(getIntlLocale(locale), { dateStyle: 'long' })}
|
|
</div>
|
|
</div>
|
|
{
|
|
props.extra?.length ? (
|
|
<p class="text-md text-muted-foreground extra mt-2">
|
|
<Fragment set:html={props.extra.replace(/\n/g, '<br />')} />
|
|
</p>
|
|
) : null
|
|
}
|
|
{
|
|
isTwilight || isLatest ? (
|
|
<div class="text-muted-forground flex text-sm opacity-70">
|
|
{isTwilight ? <InfoIcon class="mx-4 my-0 size-6 text-yellow-500" /> : null}
|
|
<p class="m-0">
|
|
{isTwilight ? <>{releaseNoteItem.twilightWarning}</> : null}
|
|
<span set:html={releaseNoteItem.reportIssues} />
|
|
</p>
|
|
</div>
|
|
) : null
|
|
}
|
|
<div class="mt-4 flex flex-col gap-8">
|
|
{
|
|
Object.keys(listItems).map(type => {
|
|
const items = listItems[type]
|
|
if (items.length === 0) return null
|
|
return (
|
|
<ul class="flex flex-col gap-1">
|
|
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
{items.map((item: any) => (
|
|
<ReleaseNoteListItem type={item.type} content={item.content} link={item.link} />
|
|
))}
|
|
</ul>
|
|
)
|
|
})
|
|
}
|
|
</div>
|
|
</div>
|
|
<style is:global>
|
|
.ac-accordion-item-title {
|
|
@apply !text-dark;
|
|
flex-direction: row-reverse !important;
|
|
|
|
&:hover {
|
|
opacity: 0.8 !important;
|
|
}
|
|
|
|
& > svg {
|
|
color: var(--zen-dark) !important;
|
|
}
|
|
}
|
|
|
|
.ac-accordion-item {
|
|
transition: height 0.2s ease-in-out !important;
|
|
|
|
& li {
|
|
opacity: 0.5;
|
|
}
|
|
}
|
|
.ac-accordion {
|
|
&.ac-accordion--light {
|
|
> * + * {
|
|
border-color: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)) !important;
|
|
width: 100%;
|
|
}
|
|
}
|
|
}
|
|
|
|
.extra {
|
|
& a {
|
|
@apply !text-coral underline underline-offset-4;
|
|
}
|
|
}
|
|
|
|
.release-note-item {
|
|
border-color: light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2));
|
|
}
|
|
</style>
|
|
</section>
|