Files
api/web/components/UpdateOs/Downgrade.vue
T
Eli Bosley 2c62e0ad09 feat: tailwind v4 (#1522)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Streamlined Tailwind CSS integration using Vite plugin, eliminating
the need for separate Tailwind config files.
* Updated theme and color variables for improved consistency and
maintainability.

* **Style**
* Standardized spacing, sizing, and font classes across all components
using Tailwind’s default scale.
* Reduced excessive gaps, padding, and font sizes for a more compact and
cohesive UI.
* Updated gradient, border, and shadow classes to match Tailwind v4
conventions.
* Replaced custom pixel-based classes with Tailwind’s bracketed
arbitrary value syntax where needed.
* Replaced focus outline styles from `outline-none` to `outline-hidden`
for consistent focus handling.
* Updated flex shrink/grow utility classes to use newer shorthand forms.
* Converted several component templates to use self-closing tags for
cleaner markup.
  * Adjusted icon sizes and spacing for improved visual balance.

* **Chores**
* Removed legacy Tailwind/PostCSS configuration files and related
scripts.
* Updated and cleaned up package dependencies for Tailwind v4 and
related plugins.
  * Removed unused or redundant build scripts and configuration exports.
  * Updated documentation to reflect new Tailwind v4 usage.
  * Removed Prettier Tailwind plugin from formatting configurations.
* Removed Nuxt Tailwind module in favor of direct Vite plugin
integration.
  * Cleaned up ESLint config by removing Prettier integration.

* **Bug Fixes**
  * Corrected invalid or outdated Tailwind class names and syntax.
* Fixed issues with max-width and other utility classes for improved
layout consistency.

* **Tests**
* Updated test assertions to match new class names and styling
conventions.

* **Documentation**
* Revised README and internal notes to clarify Tailwind v4 adoption and
configuration changes.
* Added new development notes emphasizing Tailwind v4 usage and
documentation references.

* **UI Components**
* Enhanced BrandButton stories with detailed variant, size, and padding
showcases for better visual testing.
* Improved theme store to apply dark mode class on both `<html>` and
`<body>` elements for compatibility.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-07-21 09:58:02 -04:00

139 lines
4.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script lang="ts" setup>
import {
ArrowTopRightOnSquareIcon,
ArrowUturnDownIcon,
FolderArrowDownIcon,
InformationCircleIcon,
LifebuoyIcon,
} from '@heroicons/vue/24/solid';
import { BrandButton, CardWrapper } from '@unraid/ui';
import useDateTimeHelper from '~/composables/dateTime';
import { FORUMS_BUG_REPORT } from '~/helpers/urls';
import { useServerStore } from '~/store/server';
import { useUpdateOsActionsStore } from '~/store/updateOsActions';
import type { UserProfileLink } from '~/types/userProfile';
import dayjs from 'dayjs';
import { storeToRefs } from 'pinia';
import { ref } from 'vue';
import type { ComposerTranslation } from 'vue-i18n';
const props = defineProps<{
t: ComposerTranslation;
releaseDate: string;
version: string;
}>();
const serverStore = useServerStore();
const updateOsActionsStore = useUpdateOsActionsStore();
const { dateTimeFormat } = storeToRefs(serverStore);
const { outputDateTimeFormatted: formattedReleaseDate } = useDateTimeHelper(
dateTimeFormat.value,
props.t,
true,
dayjs(props.releaseDate, 'YYYY-MM-DD').valueOf()
);
const diagnosticsButton = ref<UserProfileLink | undefined>({
click: () => {
// @ts-expect-error global function provided by the webgui on the update page
downloadDiagnostics();
},
icon: FolderArrowDownIcon,
name: 'download-diagnostics',
text: props.t('Download Diagnostics'),
});
const downgradeButton = ref<UserProfileLink>({
click: () => {
// @ts-expect-error global function provided by the webgui on the update page
confirmDowngrade();
},
name: 'downgrade',
text: props.t('Begin downgrade to {0}', [props.version]),
});
</script>
<template>
<CardWrapper :increased-padding="true">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-5 sm:gap-6">
<div class="grid gap-y-4">
<h3 class="font-semibold leading-normal flex flex-row items-start justify-start gap-2">
<ArrowUturnDownIcon class="w-5 shrink-0" />
<span class="leading-none inline-flex flex-wrap justify-start items-baseline gap-2">
<span class="text-xl">
{{ t('Downgrade Unraid OS to {0}', [version]) }}
</span>
<span
v-if="releaseDate && formattedReleaseDate !== 'Invalid Date'"
class="text-base opacity-75 shrink"
>
{{ t('Original release date {0}', [formattedReleaseDate]) }}
</span>
</span>
</h3>
<div class="prose text-base leading-relaxed opacity-75 whitespace-normal">
<p>{{ t(`Downgrades are only recommended if you're unable to solve a critical issue.`) }}</p>
<p>
{{
t(
'In the rare event you need to downgrade we ask that you please provide us with Diagnostics so we can investigate your issue.'
)
}}
</p>
<p>
{{
t(
'Download the Diagnostics zip then please open a bug report on our forums with a description of the issue along with your diagnostics.'
)
}}
</p>
</div>
</div>
<div v-if="downgradeButton" class="flex flex-col shrink-0 gap-4 grow items-stretch">
<BrandButton
:variant="'underline'"
:icon="InformationCircleIcon"
:text="t('{0} Release Notes', [version])"
@click="
updateOsActionsStore.viewReleaseNotes(
t('{0} Release Notes', [version]),
'/boot/previous/changes.txt'
)
"
/>
<BrandButton
v-if="diagnosticsButton"
:variant="'gray'"
:icon="diagnosticsButton.icon"
:name="diagnosticsButton.name"
:text="diagnosticsButton.text"
@click="diagnosticsButton.click"
/>
<BrandButton
:variant="'gray'"
:external="true"
:href="FORUMS_BUG_REPORT.toString()"
:icon="LifebuoyIcon"
:icon-right="ArrowTopRightOnSquareIcon"
:text="t('Open a bug report')"
/>
<BrandButton
:external="downgradeButton?.external"
:icon="ArrowUturnDownIcon"
:name="downgradeButton?.name"
:text="downgradeButton?.text"
@click="downgradeButton?.click"
/>
</div>
</div>
</CardWrapper>
</template>
<style >
/* Import unraid-ui globals first */
@import '@unraid/ui/styles';
@import '~/assets/main.css';
</style>