Compare commits

...

25 Commits

Author SHA1 Message Date
Bram Suurd
d5f8d0af2c Updated tailwindcss to 4 2025-10-06 19:17:12 +02:00
Bram Suurd
4b9809dd70 Remove unused dependencies from package.json and package-lock.json, including jsdom and related packages, to streamline the project. 2025-10-06 19:12:57 +02:00
community-scripts-pr-app[bot]
a475eff11e Update CHANGELOG.md (#8149)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 13:01:13 +00:00
Slaviša Arežina
7245af7208 Update glpi-install.sh (#8148) 2025-10-06 15:00:50 +02:00
community-scripts-pr-app[bot]
c3a75d8a5d Update versions.json (#8147)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 14:07:40 +02:00
community-scripts-pr-app[bot]
3b81c36e75 Update CHANGELOG.md (#8146)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 11:47:41 +00:00
community-scripts-pr-app[bot]
588cebad26 Update CHANGELOG.md (#8145)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 11:47:34 +00:00
community-scripts-pr-app[bot]
830b2d9e37 Update CHANGELOG.md (#8144)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 11:47:18 +00:00
CanbiZ
2092c5bdce Node-Red: bump to Debian 13 (#8141) 2025-10-06 13:47:14 +02:00
CanbiZ
e87dc5dbbc NocoDB: bump to Debian 13 (#8140) 2025-10-06 13:46:57 +02:00
community-scripts-pr-app[bot]
479ce977e6 Update CHANGELOG.md (#8143)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 11:08:26 +00:00
CanbiZ
a2057d4302 Navidrome: Bump to Debian 13 (#8139) 2025-10-06 13:08:02 +02:00
community-scripts-pr-app[bot]
bbe509c334 Update CHANGELOG.md (#8142)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 10:41:32 +00:00
CanbiZ
563a69e68b pve-scripts-local: add update function (#8138) 2025-10-06 12:41:06 +02:00
community-scripts-pr-app[bot]
7ab2bcbb40 Update CHANGELOG.md (#8132)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 00:13:31 +00:00
community-scripts-pr-app[bot]
57031bdaad Update versions.json (#8131)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 02:13:10 +02:00
community-scripts-pr-app[bot]
833a369f61 Update CHANGELOG.md (#8130)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 22:12:08 +00:00
CanbiZ
8f8eb7aba5 ActualBudget: bump to debian 13 (#8124) 2025-10-06 00:11:49 +02:00
community-scripts-pr-app[bot]
942ff02d37 Update CHANGELOG.md (#8129)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 20:30:06 +00:00
CanbiZ
3e1753b3c7 2fauth: bump to debian 13 (#8123) 2025-10-05 22:29:43 +02:00
community-scripts-pr-app[bot]
6863c774fa Update CHANGELOG.md (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 20:28:49 +00:00
CanbiZ
965b8cb33e adventurelog: bump to debian 13 (#8125) 2025-10-05 22:28:23 +02:00
community-scripts-pr-app[bot]
0768456b2c Update CHANGELOG.md (#8121)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 15:41:02 +00:00
Gerhard Burger
9f531ef4a7 Update cockpit to Debian 13 (#8119) 2025-10-05 17:40:42 +02:00
community-scripts-pr-app[bot]
6491ec3f09 Update versions.json (#8120)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 14:04:25 +02:00
61 changed files with 1135 additions and 1971 deletions

View File

@@ -10,8 +10,32 @@
> [!CAUTION] > [!CAUTION]
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes. Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
## 2025-10-06
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- GLPI: Revert fix for v11 [@tremor021](https://github.com/tremor021) ([#8148](https://github.com/community-scripts/ProxmoxVE/pull/8148))
- #### ✨ New Features
- Node-Red: bump to Debian 13 [@MickLesk](https://github.com/MickLesk) ([#8141](https://github.com/community-scripts/ProxmoxVE/pull/8141))
- NocoDB: bump to Debian 13 [@MickLesk](https://github.com/MickLesk) ([#8140](https://github.com/community-scripts/ProxmoxVE/pull/8140))
- Navidrome: bump to Debian 13 [@MickLesk](https://github.com/MickLesk) ([#8139](https://github.com/community-scripts/ProxmoxVE/pull/8139))
- pve-scripts-local: add update function [@MickLesk](https://github.com/MickLesk) ([#8138](https://github.com/community-scripts/ProxmoxVE/pull/8138))
## 2025-10-05 ## 2025-10-05
### 🚀 Updated Scripts
- #### ✨ New Features
- ActualBudget: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8124](https://github.com/community-scripts/ProxmoxVE/pull/8124))
- 2fauth: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8123](https://github.com/community-scripts/ProxmoxVE/pull/8123))
- AdventureLog: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8125](https://github.com/community-scripts/ProxmoxVE/pull/8125))
- Update cockpit to Debian 13 [@burgerga](https://github.com/burgerga) ([#8119](https://github.com/community-scripts/ProxmoxVE/pull/8119))
## 2025-10-04 ## 2025-10-04
### 🚀 Updated Scripts ### 🚀 Updated Scripts

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}" var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}" var_disk="${var_disk:-2}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"
@@ -29,8 +29,8 @@ function update_script() {
exit exit
fi fi
if check_for_gh_release "2fauth" "Bubka/2FAuth"; then if check_for_gh_release "2fauth" "Bubka/2FAuth"; then
$STD apt-get update $STD apt update
$STD apt-get -y upgrade $STD apt -y upgrade
msg_info "Creating Backup" msg_info "Creating Backup"
mv "/opt/2fauth" "/opt/2fauth-backup" mv "/opt/2fauth" "/opt/2fauth-backup"
@@ -60,10 +60,11 @@ function update_script() {
msg_info "Cleaning Up" msg_info "Cleaning Up"
if dpkg -l | grep -q 'php8.2'; then if dpkg -l | grep -q 'php8.2'; then
$STD apt-get remove --purge -y php8.2* $STD apt remove --purge -y php8.2*
fi fi
$STD apt-get -y autoremove $STD apt -y autoremove
$STD apt-get -y autoclean $STD apt -y autoclean
$STD apt -y clean
msg_ok "Cleanup Completed" msg_ok "Cleanup Completed"
msg_ok "Updated Successfully" msg_ok "Updated Successfully"
fi fi

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}" var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}" var_disk="${var_disk:-4}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"
@@ -28,8 +28,7 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
NODE_VERSION="22" NODE_VERSION="22" setup_nodejs
setup_nodejs
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ -f /opt/actualbudget-data/config.json ]]; then if [[ -f /opt/actualbudget-data/config.json ]]; then
if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then

View File

@@ -11,7 +11,7 @@ var_disk="${var_disk:-7}"
var_cpu="${var_cpu:-2}" var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}" var_ram="${var_ram:-2048}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"
@@ -28,8 +28,8 @@ function update_script() {
exit exit
fi fi
if ! command -v memcached >/dev/null 2>&1; then if ! command -v memcached >/dev/null 2>&1; then
$STD apt-get update $STD apt update
$STD apt-get install -y memcached libmemcached-tools $STD apt install -y memcached libmemcached-tools
fi fi
if check_for_gh_release "adventurelog" "seanmorley15/adventurelog"; then if check_for_gh_release "adventurelog" "seanmorley15/adventurelog"; then
msg_info "Stopping Services" msg_info "Stopping Services"
@@ -43,12 +43,12 @@ function update_script() {
msg_ok "Backup done" msg_ok "Backup done"
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog" fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog"
PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.13" setup_uv
msg_info "Updating ${APP}" msg_info "Updating ${APP}"
cp /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env cp /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
cp -r /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media cp -r /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
cd /opt/adventurelog/backend/server cd /opt/adventurelog/backend/server || exit
if [[ ! -x .venv/bin/python ]]; then if [[ ! -x .venv/bin/python ]]; then
$STD uv venv .venv $STD uv venv .venv
$STD .venv/bin/python -m ensurepip --upgrade $STD .venv/bin/python -m ensurepip --upgrade
@@ -59,7 +59,7 @@ function update_script() {
$STD .venv/bin/python -m manage migrate $STD .venv/bin/python -m manage migrate
cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
cd /opt/adventurelog/frontend cd /opt/adventurelog/frontend || exit
$STD pnpm i $STD pnpm i
$STD pnpm build $STD pnpm build
msg_ok "Updated ${APP}" msg_ok "Updated ${APP}"

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}" var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}" var_disk="${var_disk:-4}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"
@@ -36,15 +36,15 @@ function update_script() {
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
msg_info "Updating ${APP} LXC" msg_info "Updating ${APP} LXC"
$STD apt-get update $STD apt update
$STD apt-get -y upgrade $STD apt -y upgrade
msg_ok "Updated ${APP} LXC" msg_ok "Updated ${APP} LXC"
exit exit
fi fi
if [ "$UPD" == "2" ]; then if [ "$UPD" == "2" ]; then
msg_info "Installing dependencies (patience)" msg_info "Installing dependencies (patience)"
$STD apt-get install -y \ $STD apt install -y \
attr \ attr \
nfs-kernel-server \ nfs-kernel-server \
samba \ samba \
@@ -56,7 +56,7 @@ function update_script() {
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4) URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
FILE=$(basename "$URL") FILE=$(basename "$URL")
curl -fsSL "$URL" -o "$FILE" curl -fsSL "$URL" -o "$FILE"
$STD dpkg -i "$FILE" || $STD apt-get install -f -y $STD dpkg -i "$FILE" || $STD apt install -f -y
rm -f "$FILE" rm -f "$FILE"
msg_ok "Installed Cockpit file sharing" msg_ok "Installed Cockpit file sharing"
exit exit
@@ -64,7 +64,7 @@ function update_script() {
if [ "$UPD" == "3" ]; then if [ "$UPD" == "3" ]; then
msg_info "Installing dependencies (patience)" msg_info "Installing dependencies (patience)"
$STD apt-get install -y \ $STD apt install -y \
psmisc \ psmisc \
samba \ samba \
samba-common-bin samba-common-bin
@@ -73,7 +73,7 @@ function update_script() {
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4) URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
FILE=$(basename "$URL") FILE=$(basename "$URL")
curl -fsSL "$URL" -o "$FILE" curl -fsSL "$URL" -o "$FILE"
$STD dpkg -i "$FILE" || $STD apt-get install -f -y $STD dpkg -i "$FILE" || $STD apt install -f -y
rm -f "$FILE" rm -f "$FILE"
msg_ok "Installed Cockpit identities" msg_ok "Installed Cockpit identities"
exit exit
@@ -81,7 +81,7 @@ function update_script() {
if [ "$UPD" == "4" ]; then if [ "$UPD" == "4" ]; then
msg_info "Installing dependencies" msg_info "Installing dependencies"
$STD apt-get install -y \ $STD apt install -y \
rsync \ rsync \
zip zip
msg_ok "Installed dependencies" msg_ok "Installed dependencies"
@@ -89,7 +89,7 @@ function update_script() {
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4) URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
FILE=$(basename "$URL") FILE=$(basename "$URL")
curl -fsSL "$URL" -o "$FILE" curl -fsSL "$URL" -o "$FILE"
$STD dpkg -i "$FILE" || $STD apt-get install -f -y $STD dpkg -i "$FILE" || $STD apt install -f -y
rm -f "$FILE" rm -f "$FILE"
msg_ok "Installed Cockpit navigator" msg_ok "Installed Cockpit navigator"
exit exit

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}" var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}" var_disk="${var_disk:-4}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}" var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}" var_disk="${var_disk:-4}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}" var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}" var_disk="${var_disk:-4}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"
@@ -32,25 +32,20 @@ function update_script() {
"2" "Install Themes" OFF \ "2" "Install Themes" OFF \
3>&1 1>&2 2>&3) 3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then NODE_VERSION="22" setup_nodejs
if ! command -v npm >/dev/null 2>&1; then
msg_info "Installing NPM" msg_info "Stopping Service"
$STD apt-get install -y npm
msg_ok "Installed NPM"
fi
fi
msg_info "Stopping ${APP}"
systemctl stop nodered systemctl stop nodered
msg_ok "Stopped ${APP}" msg_ok "Stopped Service"
msg_info "Updating ${APP}" msg_info "Updating Node-Red"
$STD npm install -g --unsafe-perm node-red $STD npm install -g --unsafe-perm node-red
msg_ok "Updated ${APP}" msg_ok "Updated Node-Red"
msg_info "Starting ${APP}" msg_info "Starting Service"
systemctl start nodered systemctl start nodered
msg_ok "Started ${APP}" msg_ok "Started Service"
msg_ok "Update Successful" msg_ok "Update Successfully!"
exit exit
fi fi
if [ "$UPD" == "2" ]; then if [ "$UPD" == "2" ]; then
@@ -99,4 +94,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:1880${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:1880${CL}"

View File

@@ -23,11 +23,45 @@ function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /var ]]; then if [[ ! -d /opt/ProxmoxVE-Local ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
msg_info "No Update function implementd"
if check_for_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"; then
msg_info "Stopping Services"
systemctl stop pvescriptslocal
msg_ok "Stopped Services"
msg_info "Backup Data"
cp /opt/ProxmoxVE-Local/.env /opt/.env.bak
cp -r /opt/ProxmoxVE-Local/data /opt/data.bak
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"
msg_info "Restoring Data"
if [[ -f /opt/.env.bak ]]; then
mv /opt/.env.bak /opt/ProxmoxVE-Local/.env
fi
if [[ -d /opt/data.bak ]]; then
rm -rf /opt/ProxmoxVE-Local/data
mv /opt/data.bak /opt/ProxmoxVE-Local/data
fi
msg_ok "Restored Data"
msg_info "Updating PVE Scripts local"
cd /opt/ProxmoxVE-Local
chmod 755 data
$STD npm install
$STD npm run build
msg_ok "Updated PVE Scripts local"
msg_info "Starting Services"
systemctl start pvescriptslocal
msg_ok "Started Services"
msg_ok "Updated Successfully"
fi
exit exit
} }

File diff suppressed because it is too large Load Diff

9
frontend/package.json generated
View File

@@ -65,6 +65,7 @@
"@antfu/eslint-config": "^4.16.1", "@antfu/eslint-config": "^4.16.1",
"@eslint-react/eslint-plugin": "^1.52.2", "@eslint-react/eslint-plugin": "^1.52.2",
"@next/eslint-plugin-next": "^15.3.4", "@next/eslint-plugin-next": "^15.3.4",
"@tailwindcss/postcss": "^4.1.14",
"@tanstack/eslint-plugin-query": "^5.68.0", "@tanstack/eslint-plugin-query": "^5.68.0",
"@types/node": "^22.13.16", "@types/node": "^22.13.16",
"@types/react": "npm:types-react@19.0.0-rc.1", "@types/react": "npm:types-react@19.0.0-rc.1",
@@ -77,15 +78,13 @@
"eslint-plugin-format": "^1.0.1", "eslint-plugin-format": "^1.0.1",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20", "eslint-plugin-react-refresh": "^0.4.20",
"jsdom": "^25.0.1",
"postcss": "^8.5.3", "postcss": "^8.5.3",
"prettier": "^3.5.3", "prettier": "^3.5.3",
"prettier-plugin-tailwindcss": "^0.6.11", "prettier-plugin-tailwindcss": "^0.6.14",
"tailwindcss": "^3.4.17", "tailwindcss": "^4.1.14",
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "^1.0.7",
"tailwindcss-animated": "^1.1.2", "tailwindcss-animated": "^1.1.2",
"typescript": "^5.8.2", "typescript": "^5.8.2"
"vite-tsconfig-paths": "^5.1.4"
}, },
"overrides": { "overrides": {
"@types/react": "npm:types-react@19.0.0-rc.1", "@types/react": "npm:types-react@19.0.0-rc.1",

View File

@@ -1,7 +1,7 @@
/** @type {import('postcss-load-config').Config} */ /** @type {import('postcss-load-config').Config} */
const config = { const config = {
plugins: { plugins: {
tailwindcss: {}, '@tailwindcss/postcss': {},
}, },
}; };

View File

@@ -23,7 +23,7 @@
"ram": 512, "ram": 512,
"hdd": 2, "hdd": 2,
"os": "debian", "os": "debian",
"version": "12" "version": "13"
} }
} }
], ],

View File

@@ -23,7 +23,7 @@
"ram": 2048, "ram": 2048,
"hdd": 4, "hdd": 4,
"os": "debian", "os": "debian",
"version": "12" "version": "13"
} }
} }
], ],

View File

@@ -23,7 +23,7 @@
"ram": 2048, "ram": 2048,
"hdd": 7, "hdd": 7,
"os": "debian", "os": "debian",
"version": "12" "version": "13"
} }
} }
], ],

View File

@@ -23,7 +23,7 @@
"ram": 1024, "ram": 1024,
"hdd": 4, "hdd": 4,
"os": "debian", "os": "debian",
"version": "12" "version": "13"
} }
} }
], ],

View File

@@ -23,7 +23,7 @@
"ram": 1024, "ram": 1024,
"hdd": 4, "hdd": 4,
"os": "debian", "os": "debian",
"version": "12" "version": "13"
} }
} }
], ],

View File

@@ -23,7 +23,7 @@
"ram": 1024, "ram": 1024,
"hdd": 4, "hdd": 4,
"os": "debian", "os": "debian",
"version": "12" "version": "13"
} }
} }
], ],

View File

@@ -23,7 +23,7 @@
"ram": 1024, "ram": 1024,
"hdd": 4, "hdd": 4,
"os": "debian", "os": "debian",
"version": "12" "version": "13"
} }
}, },
{ {

View File

@@ -1,6 +1,6 @@
{ {
"name": "Outline", "name": "Outline",
"slug": "outline", "slug": "outline-solid",
"categories": [ "categories": [
12 12
], ],

View File

@@ -6,13 +6,13 @@
], ],
"date_created": "2025-10-03", "date_created": "2025-10-03",
"type": "ct", "type": "ct",
"updateable": false, "updateable": true,
"privileged": false, "privileged": false,
"interface_port": 3000, "interface_port": 3000,
"documentation": "https://github.com/community-scripts/ProxmoxVE-Local", "documentation": "https://github.com/community-scripts/ProxmoxVE-Local",
"config_path": "/opt/PVEScripts-Local/.env", "config_path": "/opt/PVEScripts-Local/.env",
"website": "https://community-scripts.github.io/ProxmoxVE", "website": "https://community-scripts.github.io/ProxmoxVE",
"logo": "https://community-scripts.github.io/ProxmoxVE/logo.png", "logo": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE-Local/refs/heads/main/.github/logo.png",
"description": "A modern web-based management interface for Proxmox VE (PVE) helper scripts. This tool provides a user-friendly way to discover, download, and execute community-sourced Proxmox scripts locally with real-time terminal output streaming.", "description": "A modern web-based management interface for Proxmox VE (PVE) helper scripts. This tool provides a user-friendly way to discover, download, and execute community-sourced Proxmox scripts locally with real-time terminal output streaming.",
"install_methods": [ "install_methods": [
{ {

View File

@@ -1,8 +1,163 @@
[ [
{
"name": "Graylog2/graylog2-server",
"version": "7.0.0-beta.3",
"date": "2025-10-06T11:25:12Z"
},
{
"name": "inventree/InvenTree",
"version": "1.0.4",
"date": "2025-10-06T11:12:04Z"
},
{
"name": "wizarrrr/wizarr",
"version": "v2025.10.2",
"date": "2025-10-06T11:10:37Z"
},
{
"name": "mattermost/mattermost",
"version": "mattermost-redux@10.12.0",
"date": "2025-09-18T20:15:19Z"
},
{
"name": "jordan-dalby/ByteStash",
"version": "v1.5.9",
"date": "2025-10-06T08:34:01Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.82",
"date": "2025-10-06T07:56:13Z"
},
{
"name": "dgtlmoon/changedetection.io",
"version": "0.50.15",
"date": "2025-10-06T07:15:01Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.4.0",
"date": "2025-09-13T16:38:21Z"
},
{
"name": "moghtech/komodo",
"version": "v1.19.5",
"date": "2025-09-27T20:59:46Z"
},
{
"name": "henrygd/beszel",
"version": "v0.13.1",
"date": "2025-10-06T01:27:46Z"
},
{
"name": "hyperion-project/hyperion.ng",
"version": "2.1.1",
"date": "2025-06-14T17:45:06Z"
},
{
"name": "jeedom/core",
"version": "4.4.20",
"date": "2025-10-06T00:27:06Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v3.6.2",
"date": "2025-07-17T12:08:03Z"
},
{
"name": "9001/copyparty",
"version": "v1.19.16",
"date": "2025-10-05T23:28:59Z"
},
{
"name": "sabnzbd/sabnzbd",
"version": "4.5.3",
"date": "2025-08-25T13:59:56Z"
},
{
"name": "outline/outline",
"version": "v1.0.0-0",
"date": "2025-10-05T20:30:31Z"
},
{
"name": "plankanban/planka",
"version": "planka-1.0.5",
"date": "2025-10-05T18:54:25Z"
},
{
"name": "msgbyte/tianji",
"version": "v1.27.6",
"date": "2025-10-05T17:27:46Z"
},
{
"name": "pocket-id/pocket-id",
"version": "v1.13.0",
"date": "2025-10-05T15:41:31Z"
},
{
"name": "BookStackApp/BookStack",
"version": "v25.07.3",
"date": "2025-10-05T14:47:20Z"
},
{
"name": "runtipi/runtipi",
"version": "v4.4.0",
"date": "2025-09-02T19:26:18Z"
},
{
"name": "Prowlarr/Prowlarr",
"version": "v2.0.5.5160",
"date": "2025-08-23T21:23:11Z"
},
{
"name": "chrisvel/tududi",
"version": "v0.82-rc5",
"date": "2025-09-23T07:31:12Z"
},
{
"name": "TandoorRecipes/recipes",
"version": "2.3.0",
"date": "2025-10-05T11:13:58Z"
},
{
"name": "Radarr/Radarr",
"version": "v5.27.5.10198",
"date": "2025-09-03T12:08:43Z"
},
{
"name": "Lidarr/Lidarr",
"version": "v2.13.3.4711",
"date": "2025-08-28T20:06:24Z"
},
{
"name": "seriousm4x/UpSnap",
"version": "5.2.2",
"date": "2025-10-05T09:12:17Z"
},
{
"name": "evcc-io/evcc",
"version": "0.209.0",
"date": "2025-10-05T07:45:18Z"
},
{
"name": "pommee/goaway",
"version": "v0.62.11",
"date": "2025-10-05T07:31:57Z"
},
{
"name": "YunoHost/yunohost",
"version": "debian/12.1.27",
"date": "2025-10-05T02:16:42Z"
},
{ {
"name": "BerriAI/litellm", "name": "BerriAI/litellm",
"version": "v1.77.5-stable", "version": "v1.77.7-nightly",
"date": "2025-10-04T23:34:11Z" "date": "2025-10-05T01:43:25Z"
},
{
"name": "webmin/webmin",
"version": "2.520",
"date": "2025-10-05T00:51:34Z"
}, },
{ {
"name": "Ombi-app/Ombi", "name": "Ombi-app/Ombi",
@@ -11,13 +166,8 @@
}, },
{ {
"name": "ollama/ollama", "name": "ollama/ollama",
"version": "v0.12.4-rc6", "version": "v0.12.4-rc5",
"date": "2025-10-04T18:46:45Z" "date": "2025-10-04T16:18:42Z"
},
{
"name": "wizarrrr/wizarr",
"version": "v2025.10.1",
"date": "2025-10-04T16:59:38Z"
}, },
{ {
"name": "SigNoz/signoz", "name": "SigNoz/signoz",
@@ -34,46 +184,16 @@
"version": "2.1.7", "version": "2.1.7",
"date": "2025-10-04T13:41:43Z" "date": "2025-10-04T13:41:43Z"
}, },
{
"name": "msgbyte/tianji",
"version": "v1.27.5",
"date": "2025-10-04T11:35:50Z"
},
{ {
"name": "globaleaks/globaleaks-whistleblowing-software", "name": "globaleaks/globaleaks-whistleblowing-software",
"version": "v5.0.84", "version": "v5.0.84",
"date": "2025-10-04T08:06:12Z" "date": "2025-10-04T08:06:12Z"
}, },
{
"name": "Jackett/Jackett",
"version": "v0.24.37",
"date": "2025-10-04T05:44:18Z"
},
{
"name": "pommee/goaway",
"version": "v0.62.10",
"date": "2025-10-04T04:41:19Z"
},
{ {
"name": "ErsatzTV/ErsatzTV", "name": "ErsatzTV/ErsatzTV",
"version": "v25.7.0", "version": "v25.7.0",
"date": "2025-10-04T00:36:45Z" "date": "2025-10-04T00:36:45Z"
}, },
{
"name": "jeedom/core",
"version": "4.4.20",
"date": "2025-10-04T00:27:10Z"
},
{
"name": "hyperion-project/hyperion.ng",
"version": "2.1.1",
"date": "2025-06-14T17:45:06Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v3.6.2",
"date": "2025-07-17T12:08:03Z"
},
{ {
"name": "rcourtman/Pulse", "name": "rcourtman/Pulse",
"version": "v4.21.0", "version": "v4.21.0",
@@ -94,16 +214,16 @@
"version": "v1.40.0", "version": "v1.40.0",
"date": "2025-10-03T19:14:46Z" "date": "2025-10-03T19:14:46Z"
}, },
{
"name": "wazuh/wazuh",
"version": "coverity-w41-4.14.0",
"date": "2025-10-03T18:56:57Z"
},
{ {
"name": "home-assistant/core", "name": "home-assistant/core",
"version": "2025.10.1", "version": "2025.10.1",
"date": "2025-10-03T18:10:59Z" "date": "2025-10-03T18:10:59Z"
}, },
{
"name": "henrygd/beszel",
"version": "v0.13.0",
"date": "2025-10-03T18:04:07Z"
},
{ {
"name": "fuma-nama/fumadocs", "name": "fuma-nama/fumadocs",
"version": "@fumadocs/mdx-remote@1.4.2", "version": "@fumadocs/mdx-remote@1.4.2",
@@ -119,11 +239,6 @@
"version": "v2.0.1", "version": "v2.0.1",
"date": "2025-10-03T16:32:01Z" "date": "2025-10-03T16:32:01Z"
}, },
{
"name": "Lidarr/Lidarr",
"version": "v2.13.3.4711",
"date": "2025-08-28T20:06:24Z"
},
{ {
"name": "duplicati/duplicati", "name": "duplicati/duplicati",
"version": "v2.1.1.104-2.1.1.104_canary_2025-10-03", "version": "v2.1.1.104-2.1.1.104_canary_2025-10-03",
@@ -134,16 +249,6 @@
"version": "v2.40.0", "version": "v2.40.0",
"date": "2025-10-03T12:56:38Z" "date": "2025-10-03T12:56:38Z"
}, },
{
"name": "mattermost/mattermost",
"version": "mattermost-redux@10.12.0",
"date": "2025-09-18T20:15:19Z"
},
{
"name": "pocket-id/pocket-id",
"version": "v1.12.0",
"date": "2025-10-03T10:11:17Z"
},
{ {
"name": "nzbgetcom/nzbget", "name": "nzbgetcom/nzbget",
"version": "v25.3", "version": "v25.3",
@@ -164,11 +269,6 @@
"version": "8.2.2", "version": "8.2.2",
"date": "2025-10-03T06:22:38Z" "date": "2025-10-03T06:22:38Z"
}, },
{
"name": "firefly-iii/firefly-iii",
"version": "v6.4.0",
"date": "2025-09-13T16:38:21Z"
},
{ {
"name": "mealie-recipes/mealie", "name": "mealie-recipes/mealie",
"version": "v3.3.1", "version": "v3.3.1",
@@ -179,6 +279,11 @@
"version": "v0.9.95", "version": "v0.9.95",
"date": "2025-10-02T16:07:18Z" "date": "2025-10-02T16:07:18Z"
}, },
{
"name": "meilisearch/meilisearch",
"version": "prototype-shorten-snapshot-creation-0",
"date": "2025-10-02T15:16:05Z"
},
{ {
"name": "n8n-io/n8n", "name": "n8n-io/n8n",
"version": "n8n@1.112.6", "version": "n8n@1.112.6",
@@ -199,11 +304,6 @@
"version": "v3.2.3-beta", "version": "v3.2.3-beta",
"date": "2025-10-02T13:48:14Z" "date": "2025-10-02T13:48:14Z"
}, },
{
"name": "meilisearch/meilisearch",
"version": "prototype-docker-alpine-3-22-v2",
"date": "2025-10-02T13:11:08Z"
},
{ {
"name": "apache/tomcat", "name": "apache/tomcat",
"version": "10.1.47", "version": "10.1.47",
@@ -239,16 +339,6 @@
"version": "2.6.2", "version": "2.6.2",
"date": "2025-10-01T17:51:09Z" "date": "2025-10-01T17:51:09Z"
}, },
{
"name": "runtipi/runtipi",
"version": "v4.4.0",
"date": "2025-09-02T19:26:18Z"
},
{
"name": "Graylog2/graylog2-server",
"version": "6.1.16",
"date": "2025-10-01T14:58:20Z"
},
{ {
"name": "glpi-project/glpi", "name": "glpi-project/glpi",
"version": "11.0.0", "version": "11.0.0",
@@ -314,11 +404,6 @@
"version": "v2.33.0", "version": "v2.33.0",
"date": "2025-09-30T16:18:10Z" "date": "2025-09-30T16:18:10Z"
}, },
{
"name": "wazuh/wazuh",
"version": "coverity-w40-4.14.0",
"date": "2025-09-30T15:35:54Z"
},
{ {
"name": "gristlabs/grist-core", "name": "gristlabs/grist-core",
"version": "v1.7.4", "version": "v1.7.4",
@@ -339,11 +424,6 @@
"version": "e6.0.0", "version": "e6.0.0",
"date": "2025-09-30T12:04:20Z" "date": "2025-09-30T12:04:20Z"
}, },
{
"name": "chrisvel/tududi",
"version": "v0.82-rc5",
"date": "2025-09-23T07:31:12Z"
},
{ {
"name": "zitadel/zitadel", "name": "zitadel/zitadel",
"version": "v4.3.0", "version": "v4.3.0",
@@ -359,11 +439,6 @@
"version": "version/2025.8.4", "version": "version/2025.8.4",
"date": "2025-09-30T00:03:11Z" "date": "2025-09-30T00:03:11Z"
}, },
{
"name": "9001/copyparty",
"version": "v1.19.15",
"date": "2025-09-29T23:42:38Z"
},
{ {
"name": "verdaccio/verdaccio", "name": "verdaccio/verdaccio",
"version": "v6.2.0", "version": "v6.2.0",
@@ -414,21 +489,11 @@
"version": "v0.6.32", "version": "v0.6.32",
"date": "2025-09-29T06:13:12Z" "date": "2025-09-29T06:13:12Z"
}, },
{
"name": "inventree/InvenTree",
"version": "1.0.2",
"date": "2025-09-29T04:02:44Z"
},
{ {
"name": "autobrr/autobrr", "name": "autobrr/autobrr",
"version": "v1.67.0", "version": "v1.67.0",
"date": "2025-09-28T20:49:34Z" "date": "2025-09-28T20:49:34Z"
}, },
{
"name": "Radarr/Radarr",
"version": "v5.27.5.10198",
"date": "2025-09-03T12:08:43Z"
},
{ {
"name": "lazy-media/Reactive-Resume", "name": "lazy-media/Reactive-Resume",
"version": "v1.2.6", "version": "v1.2.6",
@@ -439,11 +504,6 @@
"version": "v10.10.7", "version": "v10.10.7",
"date": "2025-04-05T19:14:59Z" "date": "2025-04-05T19:14:59Z"
}, },
{
"name": "YunoHost/yunohost",
"version": "debian/12.1.26",
"date": "2025-09-28T14:50:47Z"
},
{ {
"name": "karlomikus/bar-assistant", "name": "karlomikus/bar-assistant",
"version": "v5.8.1", "version": "v5.8.1",
@@ -459,11 +519,6 @@
"version": "v1.5.3", "version": "v1.5.3",
"date": "2025-09-20T12:12:33Z" "date": "2025-09-20T12:12:33Z"
}, },
{
"name": "moghtech/komodo",
"version": "v1.19.5",
"date": "2025-09-27T20:59:46Z"
},
{ {
"name": "raydak-labs/configarr", "name": "raydak-labs/configarr",
"version": "v1.16.0", "version": "v1.16.0",
@@ -479,15 +534,10 @@
"version": "1.27.1", "version": "1.27.1",
"date": "2025-09-27T13:07:26Z" "date": "2025-09-27T13:07:26Z"
}, },
{
"name": "evcc-io/evcc",
"version": "0.208.1",
"date": "2025-09-27T12:57:22Z"
},
{ {
"name": "javedh-dev/tracktor", "name": "javedh-dev/tracktor",
"version": "0.3.18", "version": "0.3.17",
"date": "2025-09-27T10:32:09Z" "date": "2025-09-27T07:00:36Z"
}, },
{ {
"name": "Dolibarr/dolibarr", "name": "Dolibarr/dolibarr",
@@ -524,11 +574,6 @@
"version": "v1.7.0", "version": "v1.7.0",
"date": "2025-09-01T10:10:34Z" "date": "2025-09-01T10:10:34Z"
}, },
{
"name": "TandoorRecipes/recipes",
"version": "2.2.7",
"date": "2025-09-25T19:04:38Z"
},
{ {
"name": "Threadfin/Threadfin", "name": "Threadfin/Threadfin",
"version": "1.2.39", "version": "1.2.39",
@@ -624,11 +669,6 @@
"version": "2025.9.1", "version": "2025.9.1",
"date": "2025-09-22T13:32:14Z" "date": "2025-09-22T13:32:14Z"
}, },
{
"name": "sabnzbd/sabnzbd",
"version": "4.5.3",
"date": "2025-08-25T13:59:56Z"
},
{ {
"name": "itsmng/itsm-ng", "name": "itsmng/itsm-ng",
"version": "v2.1.0", "version": "v2.1.0",
@@ -644,11 +684,6 @@
"version": "5.11.1", "version": "5.11.1",
"date": "2025-09-22T02:21:27Z" "date": "2025-09-22T02:21:27Z"
}, },
{
"name": "Prowlarr/Prowlarr",
"version": "v2.0.5.5160",
"date": "2025-08-23T21:23:11Z"
},
{ {
"name": "openhab/openhab-core", "name": "openhab/openhab-core",
"version": "5.1.0.M1", "version": "5.1.0.M1",
@@ -694,11 +729,6 @@
"version": "release-1.24.0", "version": "release-1.24.0",
"date": "2025-09-18T08:36:55Z" "date": "2025-09-18T08:36:55Z"
}, },
{
"name": "outline/outline",
"version": "v0.87.4",
"date": "2025-09-18T00:47:08Z"
},
{ {
"name": "TasmoAdmin/TasmoAdmin", "name": "TasmoAdmin/TasmoAdmin",
"version": "v4.3.1", "version": "v4.3.1",
@@ -714,11 +744,6 @@
"version": "2.10.0", "version": "2.10.0",
"date": "2025-09-17T14:47:00Z" "date": "2025-09-17T14:47:00Z"
}, },
{
"name": "dgtlmoon/changedetection.io",
"version": "0.50.14",
"date": "2025-09-17T11:44:22Z"
},
{ {
"name": "icereed/paperless-gpt", "name": "icereed/paperless-gpt",
"version": "v0.23.0", "version": "v0.23.0",
@@ -734,11 +759,6 @@
"version": "v4.3.0.1", "version": "v4.3.0.1",
"date": "2025-09-17T08:50:39Z" "date": "2025-09-17T08:50:39Z"
}, },
{
"name": "webmin/webmin",
"version": "2.510",
"date": "2025-09-16T20:28:37Z"
},
{ {
"name": "tobychui/zoraxy", "name": "tobychui/zoraxy",
"version": "v3.2.5r2", "version": "v3.2.5r2",
@@ -759,11 +779,6 @@
"version": "2.1.1", "version": "2.1.1",
"date": "2025-09-16T06:21:32Z" "date": "2025-09-16T06:21:32Z"
}, },
{
"name": "seriousm4x/UpSnap",
"version": "5.2.1",
"date": "2025-09-15T21:26:25Z"
},
{ {
"name": "Paymenter/Paymenter", "name": "Paymenter/Paymenter",
"version": "v1.3.4", "version": "v1.3.4",
@@ -904,11 +919,6 @@
"version": "v1.0.0-beta17", "version": "v1.0.0-beta17",
"date": "2025-09-04T21:30:14Z" "date": "2025-09-04T21:30:14Z"
}, },
{
"name": "plankanban/planka",
"version": "planka-1.0.4",
"date": "2025-09-04T13:49:40Z"
},
{ {
"name": "blakeblackshear/frigate", "name": "blakeblackshear/frigate",
"version": "v0.14.1", "version": "v0.14.1",
@@ -954,11 +964,6 @@
"version": "1.7.0", "version": "1.7.0",
"date": "2025-08-28T18:10:59Z" "date": "2025-08-28T18:10:59Z"
}, },
{
"name": "BookStackApp/BookStack",
"version": "v25.07.2",
"date": "2025-08-28T16:46:05Z"
},
{ {
"name": "garethgeorge/backrest", "name": "garethgeorge/backrest",
"version": "v1.9.2", "version": "v1.9.2",
@@ -1254,11 +1259,6 @@
"version": "v0.8.4", "version": "v0.8.4",
"date": "2025-06-10T07:57:14Z" "date": "2025-06-10T07:57:14Z"
}, },
{
"name": "jordan-dalby/ByteStash",
"version": "v1.5.8",
"date": "2025-06-07T11:39:10Z"
},
{ {
"name": "juanfont/headscale", "name": "juanfont/headscale",
"version": "v0.26.1", "version": "v0.26.1",

View File

@@ -315,7 +315,7 @@ export default function JSONGenerator() {
</Button> </Button>
</div> </div>
<pre className="mt-4 p-4 bg-secondary rounded shadow overflow-x-scroll"> <pre className="mt-4 p-4 bg-secondary rounded shadow-sm overflow-x-scroll">
{JSON.stringify(script, null, 2)} {JSON.stringify(script, null, 2)}
</pre> </pre>
</div> </div>

View File

@@ -47,8 +47,8 @@ export default function Page() {
<AnimatedGradientText> <AnimatedGradientText>
<div <div
className={cn( className={cn(
`absolute inset-0 block size-full animate-gradient bg-gradient-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-[length:var(--bg-size)_100%] [border-radius:inherit] [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]`, `absolute inset-0 block size-full animate-gradient bg-linear-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-size-[var(--bg-size)_100%] rounded-[inherit] [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]`,
`p-px ![mask-composite:subtract]`, `p-px mask-subtract!`,
)} )}
/> />
@@ -56,7 +56,7 @@ export default function Page() {
<Separator className="mx-2 h-4" orientation="vertical" /> <Separator className="mx-2 h-4" orientation="vertical" />
<span <span
className={cn( className={cn(
`animate-gradient bg-gradient-to-r from-[#ffaa40] via-[#9c40ff] to-[#ffaa40] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent`, `animate-gradient bg-linear-to-r from-[#ffaa40] via-[#9c40ff] to-[#ffaa40] bg-size-[var(--bg-size)_100%] bg-clip-text text-transparent`,
`inline`, `inline`,
)} )}
> >

View File

@@ -120,7 +120,7 @@ export default function ScriptAccordion({
query: { id: script.slug, category: category.name }, query: { id: script.slug, category: category.name },
}} }}
prefetch={false} prefetch={false}
className={`flex cursor-pointer items-center justify-between gap-1 px-1 py-1 text-muted-foreground hover:rounded-lg hover:bg-accent/60 hover:dark:bg-accent/20 ${selectedScript === script.slug className={`flex cursor-pointer items-center justify-between gap-1 px-1 py-1 text-muted-foreground hover:rounded-lg hover:bg-accent/60 dark:hover:bg-accent/20 ${selectedScript === script.slug
? "rounded-lg bg-accent font-semibold dark:bg-accent/30 dark:text-white" ? "rounded-lg bg-accent font-semibold dark:bg-accent/30 dark:text-white"
: "" : ""
}`} }`}

View File

@@ -84,7 +84,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
)} )}
<div className="min-w flex w-full flex-row flex-wrap gap-4"> <div className="min-w flex w-full flex-row flex-wrap gap-4">
{latestScripts.slice(startIndex, endIndex).map(script => ( {latestScripts.slice(startIndex, endIndex).map(script => (
<Card key={script.slug} className="min-w-[250px] flex-1 flex-grow bg-accent/30"> <Card key={script.slug} className="min-w-[250px] flex-1 grow bg-accent/30">
<CardHeader> <CardHeader>
<CardTitle className="flex items-center gap-3"> <CardTitle className="flex items-center gap-3">
<div className="flex h-16 w-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1"> <div className="flex h-16 w-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1">
@@ -148,7 +148,7 @@ export function MostViewedScripts({ items }: { items: Category[] }) {
)} )}
<div className="min-w flex w-full flex-row flex-wrap gap-4"> <div className="min-w flex w-full flex-row flex-wrap gap-4">
{mostViewedScripts.map(script => ( {mostViewedScripts.map(script => (
<Card key={script.slug} className="min-w-[250px] flex-1 flex-grow bg-accent/30"> <Card key={script.slug} className="min-w-[250px] flex-1 grow bg-accent/30">
<CardHeader> <CardHeader>
<CardTitle className="flex items-center gap-3"> <CardTitle className="flex items-center gap-3">
<div className="flex size-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1"> <div className="flex size-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1">

View File

@@ -35,10 +35,10 @@ function ScriptHeader({ item }: { item: Script }) {
return ( return (
<div className="flex flex-col lg:flex-row gap-6 w-full"> <div className="flex flex-col lg:flex-row gap-6 w-full">
<div className="flex flex-col md:flex-row gap-6 flex-grow"> <div className="flex flex-col md:flex-row gap-6 grow">
<div className="flex-shrink-0"> <div className="shrink-0">
<Image <Image
className="h-32 w-32 rounded-xl bg-gradient-to-br from-accent/40 to-accent/60 object-contain p-3 shadow-lg transition-transform hover:scale-105" className="h-32 w-32 rounded-xl bg-linear-to-br from-accent/40 to-accent/60 object-contain p-3 shadow-lg transition-transform hover:scale-105"
src={item.logo || `/${basePath}/logo.png`} src={item.logo || `/${basePath}/logo.png`}
width={400} width={400}
onError={e => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)} onError={e => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
@@ -47,7 +47,7 @@ function ScriptHeader({ item }: { item: Script }) {
unoptimized unoptimized
/> />
</div> </div>
<div className="flex flex-col justify-between flex-grow space-y-4"> <div className="flex flex-col justify-between grow space-y-4">
<div className="space-y-2"> <div className="space-y-2">
<div className="flex items-start justify-between"> <div className="flex items-start justify-between">
<div> <div>
@@ -140,7 +140,7 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
</button> </button>
</div> </div>
<div className="rounded-xl border border-border bg-accent/30 backdrop-blur-sm shadow-sm"> <div className="rounded-xl border border-border bg-accent/30 backdrop-blur-xs shadow-xs">
<div className="p-6 space-y-6"> <div className="p-6 space-y-6">
<Suspense fallback={<div className="animate-pulse h-32 bg-accent/20 rounded-xl" />}> <Suspense fallback={<div className="animate-pulse h-32 bg-accent/20 rounded-xl" />}>
<ScriptHeader item={item} /> <ScriptHeader item={item} />
@@ -149,7 +149,7 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
<Description item={item} /> <Description item={item} />
<Alerts item={item} /> <Alerts item={item} />
<div className="mt-4 rounded-lg border shadow-sm"> <div className="mt-4 rounded-lg border shadow-xs">
<div className="flex gap-3 px-4 py-2 bg-accent/25"> <div className="flex gap-3 px-4 py-2 bg-accent/25">
<h2 className="text-lg font-semibold"> <h2 className="text-lg font-semibold">
How to How to

View File

@@ -16,7 +16,7 @@ export default function Alerts({ item }: { item: Script }) {
<> <>
{item?.notes?.length > 0 {item?.notes?.length > 0
&& item.notes.map((note: NoteProps, index: number) => ( && item.notes.map((note: NoteProps, index: number) => (
<div key={index} className="mt-4 flex flex-col shadow-sm gap-2"> <div key={index} className="mt-4 flex flex-col shadow-xs gap-2">
<p <p
className={cn( className={cn(
"inline-flex items-center gap-2 rounded-lg border p-2 pl-4 text-sm", "inline-flex items-center gap-2 rounded-lg border p-2 pl-4 text-sm",

View File

@@ -16,7 +16,7 @@ export default function DefaultPassword({ item }: { item: Script }) {
}; };
return ( return (
<div className="mt-4 rounded-lg border shadow-sm"> <div className="mt-4 rounded-lg border shadow-xs">
<div className="flex gap-3 px-4 py-2 bg-accent/25"> <div className="flex gap-3 px-4 py-2 bg-accent/25">
<h2 className="text-lg font-semibold">Default Login Credentials</h2> <h2 className="text-lg font-semibold">Default Login Credentials</h2>
</div> </div>

View File

@@ -14,19 +14,19 @@ import {
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
const buttonVariants = cva( const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,_color,_background-color,_border-color,_outline-color,_text-decoration-color,_fill,_stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,color,background-color,border-color,outline-color,text-decoration-color,fill,stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-hidden focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{ {
variants: { variants: {
variant: { variant: {
default: default:
"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", "bg-primary text-primary-foreground shadow-2xs hover:bg-primary/90",
accent: "bg-accent text-accent-foreground shadow-xs hover:bg-accent/90", accent: "bg-accent text-accent-foreground shadow-2xs hover:bg-accent/90",
destructive: destructive:
"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", "bg-destructive text-white shadow-2xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
outline: outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", "border bg-background shadow-2xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
secondary: secondary:
"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", "bg-secondary text-secondary-foreground shadow-2xs hover:bg-secondary/80",
ghost: ghost:
"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
link: "text-primary underline-offset-4 hover:underline", link: "text-primary underline-offset-4 hover:underline",

View File

@@ -18,14 +18,14 @@ import { Button as ButtonPrimitive } from "@/components/animate-ui/primitives/bu
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
const buttonVariants = cva( const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,_color,_background-color,_border-color,_outline-color,_text-decoration-color,_fill,_stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,color,background-color,border-color,outline-color,text-decoration-color,fill,stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-hidden focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{ {
variants: { variants: {
variant: { variant: {
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", default: "bg-primary text-primary-foreground shadow-2xs hover:bg-primary/90",
accent: "bg-accent text-accent-foreground shadow-xs hover:bg-accent/90", accent: "bg-accent text-accent-foreground shadow-2xs hover:bg-accent/90",
outline: outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", "border bg-background shadow-2xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
}, },
size: { size: {

View File

@@ -12,12 +12,12 @@ export default function AnimatedGradientText({
return ( return (
<div <div
className={cn( className={cn(
"group relative mx-auto flex max-w-fit flex-row items-center justify-center rounded-2xl bg-white/40 px-4 py-1.5 text-sm font-medium shadow-[inset_0_-8px_10px_#8fdfff1f] backdrop-blur-sm transition-shadow duration-500 ease-out [--bg-size:300%] hover:shadow-[inset_0_-5px_10px_#8fdfff3f] dark:bg-black/40", "group relative mx-auto flex max-w-fit flex-row items-center justify-center rounded-2xl bg-white/40 px-4 py-1.5 text-sm font-medium shadow-[inset_0_-8px_10px_#8fdfff1f] backdrop-blur-xs transition-shadow duration-500 ease-out [--bg-size:300%] hover:shadow-[inset_0_-5px_10px_#8fdfff3f] dark:bg-black/40",
className, className,
)} )}
> >
<div <div
className="absolute inset-0 block h-full w-full animate-gradient bg-gradient-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-[length:var(--bg-size)_100%] p-[1px] [border-radius:inherit] ![mask-composite:subtract] [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]" className="absolute inset-0 block h-full w-full animate-gradient bg-linear-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-size-[var(--bg-size)_100%] p-px rounded-[inherit] mask-subtract! [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]"
/> />
{children} {children}

View File

@@ -6,7 +6,7 @@ import * as React from "react";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
const badgeVariants = cva( const badgeVariants = cva(
"inline-flex items-center rounded-full border px-1.5 py-0.1 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", "inline-flex items-center rounded-full border px-1.5 py-0.1 text-xs font-semibold transition-colors focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2",
{ {
variants: { variants: {
variant: { variant: {

View File

@@ -7,7 +7,7 @@ import * as React from "react";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
const buttonVariants = cva( const buttonVariants = cva(
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
{ {
variants: { variants: {
variant: { variant: {
@@ -25,15 +25,15 @@ const buttonVariants = cva(
ringHover: ringHover:
"bg-primary text-primary-foreground transition-all duration-300 hover:bg-primary/90 hover:ring-2 hover:ring-primary/90 hover:ring-offset-2", "bg-primary text-primary-foreground transition-all duration-300 hover:bg-primary/90 hover:ring-2 hover:ring-primary/90 hover:ring-offset-2",
shine: shine:
"text-primary-foreground animate-shine bg-gradient-to-r from-primary via-primary/75 to-primary bg-[length:400%_100%] ", "text-primary-foreground animate-shine bg-linear-to-r from-primary via-primary/75 to-primary bg-size-[400%_100%] ",
gooeyRight: gooeyRight:
"text-primary-foreground relative bg-primary z-0 overflow-hidden transition-all duration-500 before:absolute before:inset-0 before:-z-10 before:translate-x-[150%] before:translate-y-[150%] before:scale-[2.5] before:rounded-[100%] before:bg-gradient-to-r from-zinc-400 before:transition-transform before:duration-1000 hover:before:translate-x-[0%] hover:before:translate-y-[0%] ", "text-primary-foreground relative bg-primary z-0 overflow-hidden transition-all duration-500 before:absolute before:inset-0 before:-z-10 before:translate-x-[150%] before:translate-y-[150%] before:scale-[2.5] before:rounded-[100%] before:bg-linear-to-r from-zinc-400 before:transition-transform before:duration-1000 hover:before:translate-x-[0%] hover:before:translate-y-[0%] ",
gooeyLeft: gooeyLeft:
"text-primary-foreground relative bg-primary z-0 overflow-hidden transition-all duration-500 after:absolute after:inset-0 after:-z-10 after:translate-x-[-150%] after:translate-y-[150%] after:scale-[2.5] after:rounded-[100%] after:bg-gradient-to-l from-zinc-400 after:transition-transform after:duration-1000 hover:after:translate-x-[0%] hover:after:translate-y-[0%] ", "text-primary-foreground relative bg-primary z-0 overflow-hidden transition-all duration-500 after:absolute after:inset-0 after:-z-10 after:translate-x-[-150%] after:translate-y-[150%] after:scale-[2.5] after:rounded-[100%] after:bg-linear-to-l from-zinc-400 after:transition-transform after:duration-1000 hover:after:translate-x-[0%] hover:after:translate-y-[0%] ",
linkHover1: linkHover1:
"relative after:absolute after:bg-primary after:bottom-2 after:h-[1px] after:w-2/3 after:origin-bottom-left after:scale-x-100 hover:after:origin-bottom-right hover:after:scale-x-0 after:transition-transform after:ease-in-out after:duration-300", "relative after:absolute after:bg-primary after:bottom-2 after:h-px after:w-2/3 after:origin-bottom-left after:scale-x-100 hover:after:origin-bottom-right hover:after:scale-x-0 after:transition-transform after:ease-in-out after:duration-300",
linkHover2: linkHover2:
"relative after:absolute after:bg-primary after:bottom-2 after:h-[1px] after:w-2/3 after:origin-bottom-right after:scale-x-0 hover:after:origin-bottom-left hover:after:scale-x-100 after:transition-transform after:ease-in-out after:duration-300", "relative after:absolute after:bg-primary after:bottom-2 after:h-px after:w-2/3 after:origin-bottom-right after:scale-x-0 hover:after:origin-bottom-left hover:after:scale-x-100 after:transition-transform after:ease-in-out after:duration-300",
}, },
size: { size: {
default: "h-10 px-4 py-2", default: "h-10 px-4 py-2",
@@ -96,7 +96,7 @@ const Button = React.forwardRef<
)} )}
<Slottable>{props.children}</Slottable> <Slottable>{props.children}</Slottable>
{Icon && iconPlacement === "right" && ( {Icon && iconPlacement === "right" && (
<div className="w-0 translate-x-[100%] pl-0 opacity-0 transition-all duration-200 group-hover:w-5 group-hover:translate-x-0 group-hover:pl-2 group-hover:opacity-100"> <div className="w-0 translate-x-full pl-0 opacity-0 transition-all duration-200 group-hover:w-5 group-hover:translate-x-0 group-hover:pl-2 group-hover:opacity-100">
<Icon /> <Icon />
</div> </div>
)} )}

View File

@@ -9,7 +9,7 @@ const Card = React.forwardRef<
<div <div
ref={ref} ref={ref}
className={cn( className={cn(
"rounded-lg border text-card-foreground shadow-sm", "rounded-lg border text-card-foreground shadow-xs",
className, className,
)} )}
{...props} {...props}

View File

@@ -15,7 +15,7 @@ import { Separator } from "./separator";
import { Button } from "./button"; import { Button } from "./button";
const buttonVariants = cva( const buttonVariants = cva(
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
{ {
variants: { variants: {
variant: { variant: {

View File

@@ -47,7 +47,7 @@ const CommandInput = React.forwardRef<
<CommandPrimitive.Input <CommandPrimitive.Input
ref={ref} ref={ref}
className={cn( className={cn(
"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50", "flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
className, className,
)} )}
{...props} {...props}
@@ -118,7 +118,7 @@ const CommandItem = React.forwardRef<
<CommandPrimitive.Item <CommandPrimitive.Item
ref={ref} ref={ref}
className={cn( className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50", "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50",
className, className,
)} )}
{...props} {...props}

View File

@@ -44,7 +44,7 @@ const DialogContent = React.forwardRef<
{...props} {...props}
> >
{children} {children}
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"> <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
<X className="h-4 w-4" /> <X className="h-4 w-4" />
<span className="sr-only">Close</span> <span className="sr-only">Close</span>
</DialogPrimitive.Close> </DialogPrimitive.Close>

View File

@@ -27,7 +27,7 @@ const DropdownMenuSubTrigger = React.forwardRef<
<DropdownMenuPrimitive.SubTrigger <DropdownMenuPrimitive.SubTrigger
ref={ref} ref={ref}
className={cn( className={cn(
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent", "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent data-[state=open]:bg-accent",
inset && "pl-8", inset && "pl-8",
className, className,
)} )}
@@ -47,7 +47,7 @@ const DropdownMenuSubContent = React.forwardRef<
<DropdownMenuPrimitive.SubContent <DropdownMenuPrimitive.SubContent
ref={ref} ref={ref}
className={cn( className={cn(
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", "z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className, className,
)} )}
{...props} {...props}
@@ -65,7 +65,7 @@ const DropdownMenuContent = React.forwardRef<
ref={ref} ref={ref}
sideOffset={sideOffset} sideOffset={sideOffset}
className={cn( className={cn(
"glass z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover/50 p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", "glass z-50 min-w-32 overflow-hidden rounded-md border bg-popover/50 p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className, className,
)} )}
{...props} {...props}
@@ -83,7 +83,7 @@ const DropdownMenuItem = React.forwardRef<
<DropdownMenuPrimitive.Item <DropdownMenuPrimitive.Item
ref={ref} ref={ref}
className={cn( className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", "relative flex cursor-default select-none items-center rounded-sm px-2 py-1 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
inset && "pl-8", inset && "pl-8",
className, className,
)} )}
@@ -99,7 +99,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
<DropdownMenuPrimitive.CheckboxItem <DropdownMenuPrimitive.CheckboxItem
ref={ref} ref={ref}
className={cn( className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
className, className,
)} )}
checked={checked} checked={checked}
@@ -123,7 +123,7 @@ const DropdownMenuRadioItem = React.forwardRef<
<DropdownMenuPrimitive.RadioItem <DropdownMenuPrimitive.RadioItem
ref={ref} ref={ref}
className={cn( className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
className, className,
)} )}
{...props} {...props}

View File

@@ -10,7 +10,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
<input <input
type={type} type={type}
className={cn( className={cn(
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
className, className,
)} )}
ref={ref} ref={ref}

View File

@@ -41,7 +41,7 @@ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
const NavigationMenuItem = NavigationMenuPrimitive.Item; const NavigationMenuItem = NavigationMenuPrimitive.Item;
const navigationMenuTriggerStyle = cva( const navigationMenuTriggerStyle = cva(
"group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50", "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-active:bg-accent/50 data-[state=open]:bg-accent/50",
); );
const NavigationMenuTrigger = React.forwardRef< const NavigationMenuTrigger = React.forwardRef<
@@ -56,7 +56,7 @@ const NavigationMenuTrigger = React.forwardRef<
{children} {children}
{" "} {" "}
<ChevronDown <ChevronDown
className="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180" className="relative top-px ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180"
aria-hidden="true" aria-hidden="true"
/> />
</NavigationMenuPrimitive.Trigger> </NavigationMenuPrimitive.Trigger>
@@ -87,7 +87,7 @@ const NavigationMenuViewport = React.forwardRef<
<div className={cn("absolute left-0 top-full flex justify-center")}> <div className={cn("absolute left-0 top-full flex justify-center")}>
<NavigationMenuPrimitive.Viewport <NavigationMenuPrimitive.Viewport
className={cn( className={cn(
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]", "origin-top-center relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-(--radix-navigation-menu-viewport-width)",
className, className,
)} )}
ref={ref} ref={ref}
@@ -105,7 +105,7 @@ const NavigationMenuIndicator = React.forwardRef<
<NavigationMenuPrimitive.Indicator <NavigationMenuPrimitive.Indicator
ref={ref} ref={ref}
className={cn( className={cn(
"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in", "top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",
className, className,
)} )}
{...props} {...props}

View File

@@ -19,7 +19,7 @@ const PopoverContent = React.forwardRef<
align={align} align={align}
sideOffset={sideOffset} sideOffset={sideOffset}
className={cn( className={cn(
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className, className,
)} )}
{...props} {...props}

View File

@@ -19,7 +19,7 @@ const SelectTrigger = React.forwardRef<
<SelectPrimitive.Trigger <SelectPrimitive.Trigger
ref={ref} ref={ref}
className={cn( className={cn(
"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1", "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
className, className,
)} )}
{...props} {...props}
@@ -75,7 +75,7 @@ const SelectContent = React.forwardRef<
<SelectPrimitive.Content <SelectPrimitive.Content
ref={ref} ref={ref}
className={cn( className={cn(
"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", "relative z-50 max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
position === "popper" position === "popper"
&& "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
className, className,
@@ -88,7 +88,7 @@ const SelectContent = React.forwardRef<
className={cn( className={cn(
"p-1", "p-1",
position === "popper" position === "popper"
&& "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]", && "h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width)",
)} )}
> >
{children} {children}
@@ -118,7 +118,7 @@ const SelectItem = React.forwardRef<
<SelectPrimitive.Item <SelectPrimitive.Item
ref={ref} ref={ref}
className={cn( className={cn(
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
className, className,
)} )}
{...props} {...props}

View File

@@ -19,7 +19,7 @@ const Separator = React.forwardRef<
orientation={orientation} orientation={orientation}
className={cn( className={cn(
"shrink-0 bg-border", "shrink-0 bg-border",
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]", orientation === "horizontal" ? "h-px w-full" : "h-full w-px",
className, className,
)} )}
{...props} {...props}

View File

@@ -65,7 +65,7 @@ const SheetContent = React.forwardRef<
{...props} {...props}
> >
{children} {children}
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary"> <SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
<X className="h-4 w-4" /> <X className="h-4 w-4" />
<span className="sr-only">Close</span> <span className="sr-only">Close</span>
</SheetPrimitive.Close> </SheetPrimitive.Close>

View File

@@ -11,7 +11,7 @@ const Switch = React.forwardRef<
>(({ className, ...props }, ref) => ( >(({ className, ...props }, ref) => (
<SwitchPrimitives.Root <SwitchPrimitives.Root
className={cn( className={cn(
"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input", "peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
className, className,
)} )}
{...props} {...props}

View File

@@ -43,7 +43,7 @@ const TableFooter = React.forwardRef<
<tfoot <tfoot
ref={ref} ref={ref}
className={cn( className={cn(
"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", "border-t bg-muted/50 font-medium last:[&>tr]:border-b-0",
className, className,
)} )}
{...props} {...props}

View File

@@ -29,7 +29,7 @@ const TabsTrigger = React.forwardRef<
<TabsPrimitive.Trigger <TabsPrimitive.Trigger
ref={ref} ref={ref}
className={cn( className={cn(
"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm", "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-xs",
className, className,
)} )}
{...props} {...props}
@@ -44,7 +44,7 @@ const TabsContent = React.forwardRef<
<TabsPrimitive.Content <TabsPrimitive.Content
ref={ref} ref={ref}
className={cn( className={cn(
"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", "mt-2 ring-offset-background focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
className, className,
)} )}
{...props} {...props}

View File

@@ -9,7 +9,7 @@ const Textarea = React.forwardRef<
return ( return (
<textarea <textarea
className={cn( className={cn(
"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
className, className,
)} )}
ref={ref} ref={ref}

View File

@@ -19,7 +19,7 @@ const TooltipContent = React.forwardRef<
ref={ref} ref={ref}
sideOffset={sideOffset} sideOffset={sideOffset}
className={cn( className={cn(
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]", "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-(--radix-tooltip-content-transform-origin)",
className, className,
)} )}
{...props} {...props}

View File

@@ -1,6 +1,147 @@
@tailwind base; @import 'tailwindcss';
@tailwind components;
@tailwind utilities; @custom-variant dark (&:is(.dark *));
@utility container {
margin-inline: auto;
padding-inline: 2rem;
@media (width >= --theme(--breakpoint-sm)) {
max-width: none;
}
@media (width >= 1400px) {
max-width: 1400px;
}
}
@theme {
--color-border: hsl(var(--border));
--color-input: hsl(var(--input));
--color-ring: hsl(var(--ring));
--color-background: hsl(var(--background));
--color-foreground: hsl(var(--foreground));
--color-primary: hsl(var(--primary));
--color-primary-foreground: hsl(var(--primary-foreground));
--color-secondary: hsl(var(--secondary));
--color-secondary-foreground: hsl(var(--secondary-foreground));
--color-destructive: hsl(var(--destructive));
--color-destructive-foreground: hsl(var(--destructive-foreground));
--color-muted: hsl(var(--muted));
--color-muted-foreground: hsl(var(--muted-foreground));
--color-accent: hsl(var(--accent));
--color-accent-foreground: hsl(var(--accent-foreground));
--color-popover: hsl(var(--popover));
--color-popover-foreground: hsl(var(--popover-foreground));
--color-card: hsl(var(--card));
--color-card-foreground: hsl(var(--card-foreground));
--radius-lg: var(--radius);
--radius-md: calc(var(--radius) - 2px);
--radius-sm: calc(var(--radius) - 4px);
--animate-accordion-down: accordion-down 0.2s ease-out;
--animate-accordion-up: accordion-up 0.2s ease-out;
--animate-shine: shine 8s ease-in-out infinite;
--animate-gradient: gradient 8s linear infinite;
@keyframes accordion-down {
from {
height: 0;
}
to {
height: var(--radix-accordion-content-height);
}
}
@keyframes accordion-up {
from {
height: var(--radix-accordion-content-height);
}
to {
height: 0;
}
}
@keyframes shine {
from {
background-position: 200% 0;
}
to {
background-position: -200% 0;
}
}
@keyframes gradient {
to {
background-position: var(--bg-size) 0;
}
}
@keyframes shine-pulse {
0% {
background-position: 0% 0%;
}
50% {
background-position: 100% 100%;
}
to {
background-position: 0% 0%;
}
}
@keyframes moveHorizontal {
0% {
transform: translateX(-50%) translateY(-10%);
}
50% {
transform: translateX(50%) translateY(10%);
}
100% {
transform: translateX(-50%) translateY(-10%);
}
}
@keyframes moveInCircle {
0% {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes moveVertical {
0% {
transform: translateY(-50%);
}
50% {
transform: translateY(50%);
}
100% {
transform: translateY(-50%);
}
}
}
/*
The default border color has changed to `currentcolor` in Tailwind CSS v4,
so we've added these compatibility styles to make sure everything still
looks the same as it did with Tailwind CSS v3.
If we ever want to remove these styles, we need to add an explicit border
color utility to any element that depends on these defaults.
*/
@layer base {
*,
::after,
::before,
::backdrop,
::file-selector-button {
border-color: var(--color-gray-200, currentcolor);
}
}
@layer base { @layer base {
:root { :root {

View File

@@ -1,181 +0,0 @@
/* eslint-disable ts/no-require-imports */
//
import type { Config } from "tailwindcss";
const {
default: flattenColorPalette,
} = require("tailwindcss/lib/util/flattenColorPalette");
const svgToDataUri = require("mini-svg-data-uri");
const config = {
darkMode: ["class"],
content: [
"./pages/**/*.{ts,tsx}",
"./components/**/*.{ts,tsx}",
"./app/**/*.{ts,tsx}",
"./src/**/*.{ts,tsx}",
],
prefix: "",
theme: {
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
colors: {
border: "hsl(var(--border))",
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",
background: "hsl(var(--background))",
foreground: "hsl(var(--foreground))",
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
secondary: {
DEFAULT: "hsl(var(--secondary))",
foreground: "hsl(var(--secondary-foreground))",
},
destructive: {
DEFAULT: "hsl(var(--destructive))",
foreground: "hsl(var(--destructive-foreground))",
},
muted: {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
accent: {
DEFAULT: "hsl(var(--accent))",
foreground: "hsl(var(--accent-foreground))",
},
popover: {
DEFAULT: "hsl(var(--popover))",
foreground: "hsl(var(--popover-foreground))",
},
card: {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
keyframes: {
"accordion-down": {
from: { height: "0" },
to: { height: "var(--radix-accordion-content-height)" },
},
"accordion-up": {
from: { height: "var(--radix-accordion-content-height)" },
to: { height: "0" },
},
"shine": {
from: { backgroundPosition: "200% 0" },
to: { backgroundPosition: "-200% 0" },
},
"gradient": {
to: {
backgroundPosition: "var(--bg-size) 0",
},
},
"shine-pulse": {
"0%": {
"background-position": "0% 0%",
},
"50%": {
"background-position": "100% 100%",
},
"to": {
"background-position": "0% 0%",
},
},
"moveHorizontal": {
"0%": {
transform: "translateX(-50%) translateY(-10%)",
},
"50%": {
transform: "translateX(50%) translateY(10%)",
},
"100%": {
transform: "translateX(-50%) translateY(-10%)",
},
},
"moveInCircle": {
"0%": {
transform: "rotate(0deg)",
},
"50%": {
transform: "rotate(180deg)",
},
"100%": {
transform: "rotate(360deg)",
},
},
"moveVertical": {
"0%": {
transform: "translateY(-50%)",
},
"50%": {
transform: "translateY(50%)",
},
"100%": {
transform: "translateY(-50%)",
},
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
"shine": "shine 8s ease-in-out infinite",
"gradient": "gradient 8s linear infinite",
},
},
},
plugins: [
require(`tailwindcss-animated`),
require("tailwindcss-animate"),
addVariablesForColors,
function ({ matchUtilities, theme }: any) {
matchUtilities(
{
"bg-grid": (value: any) => ({
backgroundImage: `url("${svgToDataUri(
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="none" stroke="${value}"><path d="M0 .5H31.5V32"/></svg>`,
)}")`,
}),
"bg-grid-small": (value: any) => ({
backgroundImage: `url("${svgToDataUri(
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="8" height="8" fill="none" stroke="${value}"><path d="M0 .5H31.5V32"/></svg>`,
)}")`,
}),
"bg-dot": (value: any) => ({
backgroundImage: `url("${svgToDataUri(
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="16" height="16" fill="none"><circle fill="${value}" id="pattern-circle" cx="10" cy="10" r="1.6257413380501518"></circle></svg>`,
)}")`,
}),
},
{
values: flattenColorPalette(theme("backgroundColor")),
type: "color",
},
);
},
],
} satisfies Config;
function addVariablesForColors({ addBase, theme }: any) {
const allColors = flattenColorPalette(theme("colors"));
const newVars = Object.fromEntries(
Object.entries(allColors).map(([key, val]) => [`--${key}`, val]),
);
addBase({
":root": newVars,
});
}
export default config;

View File

@@ -14,9 +14,9 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt install -y \
lsb-release \ lsb-release \
nginx nginx
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
PHP_VERSION="8.3" PHP_MODULE="common,ctype,fileinfo,mysql,cli" PHP_FPM="YES" setup_php PHP_VERSION="8.3" PHP_MODULE="common,ctype,fileinfo,mysql,cli" PHP_FPM="YES" setup_php
@@ -31,26 +31,26 @@ $STD mariadb -u root -e "CREATE DATABASE $DB_NAME;"
$STD mariadb -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';" $STD mariadb -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
$STD mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;" $STD mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
{ {
echo "2FAuth Credentials" echo "2FAuth Credentials"
echo "Database User: $DB_USER" echo "Database User: $DB_USER"
echo "Database Password: $DB_PASS" echo "Database Password: $DB_PASS"
echo "Database Name: $DB_NAME" echo "Database Name: $DB_NAME"
} >>~/2FAuth.creds } >>~/2FAuth.creds
msg_ok "Set up Database" msg_ok "Set up Database"
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth" fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth"
msg_info "Setup 2FAuth" msg_info "Setup 2FAuth"
cd /opt/2fauth cd /opt/2fauth || exit
cp .env.example .env cp .env.example .env
IPADDRESS=$(hostname -I | awk '{print $1}') IPADDRESS=$(hostname -I | awk '{print $1}')
sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \ sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \
-e "s|^DB_CONNECTION=$|DB_CONNECTION=mysql|" \ -e "s|^DB_CONNECTION=$|DB_CONNECTION=mysql|" \
-e "s|^DB_DATABASE=$|DB_DATABASE=$DB_NAME|" \ -e "s|^DB_DATABASE=$|DB_DATABASE=$DB_NAME|" \
-e "s|^DB_HOST=$|DB_HOST=127.0.0.1|" \ -e "s|^DB_HOST=$|DB_HOST=127.0.0.1|" \
-e "s|^DB_PORT=$|DB_PORT=3306|" \ -e "s|^DB_PORT=$|DB_PORT=3306|" \
-e "s|^DB_USERNAME=$|DB_USERNAME=$DB_USER|" \ -e "s|^DB_USERNAME=$|DB_USERNAME=$DB_USER|" \
-e "s|^DB_PASSWORD=$|DB_PASSWORD=$DB_PASS|" .env -e "s|^DB_PASSWORD=$|DB_PASSWORD=$DB_PASS|" .env
export COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER=1
$STD composer update --no-plugins --no-scripts $STD composer update --no-plugins --no-scripts
$STD composer install --no-dev --prefer-source --no-plugins --no-scripts $STD composer install --no-dev --prefer-source --no-plugins --no-scripts
@@ -99,6 +99,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
$STD apt-get -y autoremove $STD apt -y autoremove
$STD apt-get -y autoclean $STD apt -y autoclean
$STD apt -y clean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@@ -14,7 +14,7 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt install -y \
make \ make \
g++ g++
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
@@ -22,8 +22,7 @@ msg_ok "Installed Dependencies"
msg_info "Installing Actual Budget" msg_info "Installing Actual Budget"
cd /opt cd /opt
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
NODE_VERSION="22" NODE_VERSION="22" setup_nodejs
setup_nodejs
mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config} mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
chown -R root:root /opt/actualbudget-data chown -R root:root /opt/actualbudget-data
chmod -R 755 /opt/actualbudget-data chmod -R 755 /opt/actualbudget-data
@@ -50,7 +49,7 @@ cat <<EOF >/opt/actualbudget-data/config.json
EOF EOF
mkdir -p /opt/actualbudget mkdir -p /opt/actualbudget
cd /opt/actualbudget cd /opt/actualbudget || exit
$STD npm install --location=global @actual-app/sync-server $STD npm install --location=global @actual-app/sync-server
$STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF $STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF
US US
@@ -92,6 +91,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
$STD apt-get -y autoremove $STD apt -y autoremove
$STD apt-get -y autoclean $STD apt -y autoclean
$STD apt -y clean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@@ -14,7 +14,7 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt install -y \
gdal-bin \ gdal-bin \
libgdal-dev \ libgdal-dev \
git \ git \
@@ -22,9 +22,9 @@ $STD apt-get install -y \
libmemcached-tools libmemcached-tools
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.13" setup_uv
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
PG_VERSION="16" PG_MODULES="postgis" setup_postgresql PG_VERSION="17" PG_MODULES="postgis" setup_postgresql
msg_info "Set up PostgreSQL Database" msg_info "Set up PostgreSQL Database"
DB_NAME="adventurelog_db" DB_NAME="adventurelog_db"
@@ -74,7 +74,7 @@ DISABLE_REGISTRATION=False
# EMAIL_HOST_PASSWORD='password' # EMAIL_HOST_PASSWORD='password'
# DEFAULT_FROM_EMAIL='user@example.com' # DEFAULT_FROM_EMAIL='user@example.com'
EOF EOF
cd /opt/adventurelog/backend/server cd /opt/adventurelog/backend/server || exit
mkdir -p /opt/adventurelog/backend/server/media mkdir -p /opt/adventurelog/backend/server/media
$STD uv venv /opt/adventurelog/backend/server/.venv $STD uv venv /opt/adventurelog/backend/server/.venv
$STD /opt/adventurelog/backend/server/.venv/bin/python -m ensurepip --upgrade $STD /opt/adventurelog/backend/server/.venv/bin/python -m ensurepip --upgrade
@@ -88,13 +88,13 @@ PUBLIC_SERVER_URL=http://$LOCAL_IP:8000
BODY_SIZE_LIMIT=Infinity BODY_SIZE_LIMIT=Infinity
ORIGIN='http://$LOCAL_IP:3000' ORIGIN='http://$LOCAL_IP:3000'
EOF EOF
cd /opt/adventurelog/frontend cd /opt/adventurelog/frontend || exit
$STD pnpm i $STD pnpm i
$STD pnpm build $STD pnpm build
msg_ok "Installed AdventureLog" msg_ok "Installed AdventureLog"
msg_info "Setting up Django Admin" msg_info "Setting up Django Admin"
cd /opt/adventurelog/backend/server cd /opt/adventurelog/backend/server || exit
$STD .venv/bin/python -m manage shell <<EOF $STD .venv/bin/python -m manage shell <<EOF
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
UserModel = get_user_model() UserModel = get_user_model()
@@ -148,6 +148,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
$STD apt-get -y autoremove $STD apt -y autoremove
$STD apt-get -y autoclean $STD apt -y autoclean
$STD apt -y clean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@@ -17,8 +17,8 @@ update_os
msg_info "Installing Cockpit" msg_info "Installing Cockpit"
source /etc/os-release source /etc/os-release
echo "deb http://deb.debian.org/debian ${VERSION_CODENAME}-backports main" >/etc/apt/sources.list.d/backports.list echo "deb http://deb.debian.org/debian ${VERSION_CODENAME}-backports main" >/etc/apt/sources.list.d/backports.list
$STD apt-get update $STD apt update
$STD apt-get install -t ${VERSION_CODENAME}-backports cockpit --no-install-recommends -y $STD apt install -t ${VERSION_CODENAME}-backports cockpit --no-install-recommends -y
sed -i "s/root//g" /etc/cockpit/disallowed-users sed -i "s/root//g" /etc/cockpit/disallowed-users
msg_ok "Installed Cockpit" msg_ok "Installed Cockpit"
@@ -26,6 +26,6 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
$STD apt-get -y autoremove $STD apt -y autoremove
$STD apt-get -y autoclean $STD apt -y autoclean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@@ -47,7 +47,7 @@ cd /opt
curl -fsSL "https://github.com/glpi-project/glpi/releases/download/10.0.20/glpi-10.0.20.tgz" -o "glpi-10.0.20.tgz" curl -fsSL "https://github.com/glpi-project/glpi/releases/download/10.0.20/glpi-10.0.20.tgz" -o "glpi-10.0.20.tgz"
$STD tar -xzvf glpi-10.0.20.tgz $STD tar -xzvf glpi-10.0.20.tgz
cd /opt/glpi cd /opt/glpi
$STD php bin/console db:install --db-name=$DB_NAME --db-user=$DB_USER --db-password=$DB_PASS --no-interaction --allow-superuser $STD php bin/console db:install --db-name=$DB_NAME --db-user=$DB_USER --db-password=$DB_PASS --no-interaction
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Installed GLPi" msg_ok "Installed GLPi"

View File

@@ -14,7 +14,7 @@ network_check
update_os update_os
msg_info "Installing Dependencies (Patience)" msg_info "Installing Dependencies (Patience)"
$STD apt-get install -y ffmpeg $STD apt install -y ffmpeg
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
fetch_and_deploy_gh_release "navidrome" "navidrome/navidrome" "binary" fetch_and_deploy_gh_release "navidrome" "navidrome/navidrome" "binary"
@@ -32,6 +32,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
$STD apt-get -y autoremove $STD apt -y autoremove
$STD apt-get -y autoclean $STD apt -y autoclean
$STD apt -y clean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@@ -37,6 +37,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
$STD apt-get -y autoremove $STD apt -y autoremove
$STD apt-get -y autoclean $STD apt -y autoclean
$STD apt -y clean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@@ -14,7 +14,7 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt install -y \
git \ git \
ca-certificates ca-certificates
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"

View File

@@ -13,8 +13,7 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get update $STD apt install -y \
$STD apt-get install -y \
build-essential \ build-essential \
sshpass \ sshpass \
rsync \ rsync \