feat: complete install.sh and run.sh scripts with dynamic health check and build assets sync

This commit is contained in:
2026-05-21 21:38:28 +07:00
parent 177160ef03
commit a0673129ee
41 changed files with 507 additions and 310 deletions
Regular → Executable
View File
+213 -95
View File
@@ -1,106 +1,162 @@
#!/bin/bash
# --- Color Definitions for Premium Look ---
# --- Color Definitions for Premium Terminal Styling ---
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
MAGENTA='\033[0;35m'
BOLD='\033[1m'
NC='\033[0m' # No Color
echo -e "${CYAN}======================================================${NC}"
echo -e "${GREEN}${BOLD} ⚡ Biiproject Kit v2 — Professional Installer ⚡ ${NC}"
echo -e "${CYAN}======================================================${NC}"
# Helper Functions for Clean Output
log_info() {
echo -e " ${BLUE}[INFO]${NC} $1"
}
# 1. Pre-flight Checks (Docker & Daemon status)
echo -e "${CYAN}[1/7] Verifying Docker environment...${NC}"
if ! command -v docker &> /dev/null; then
echo -e " ${RED}❌ Error: Docker is not installed on this system.${NC}"
echo -e " ${YELLOW}👉 Please install Docker before running the installer.${NC}"
exit 1
fi
log_success() {
echo -e " ${GREEN}[SUCCESS]${NC}$1"
}
if ! docker info &> /dev/null; then
echo -e " ${RED}❌ Error: Docker daemon is not running.${NC}"
echo -e " ${YELLOW}👉 Please start Docker Desktop or the Docker service and try again.${NC}"
exit 1
fi
echo -e " ${GREEN}✔ Docker is installed and running perfectly.${NC}"
log_warning() {
echo -e " ${YELLOW}[WARNING]${NC}$1"
}
log_error() {
echo -e " ${RED}[ERROR]${NC}$1"
}
clear_screen() {
clear 2>/dev/null || printf "\033c"
}
clear_screen
# Premium Welcome Header
echo -e "${CYAN}======================================================================${NC}"
echo -e "${BOLD}${MAGENTA} 🛠️ BIIPROJECT KIT V2 - CORE APPLICATION INSTALLER 🛠️ ${NC}"
echo -e "${CYAN}======================================================================${NC}"
echo -e " Selamat datang di asisten instalasi otomatis Biiproject Kit."
echo -e " Skrip ini akan memvalidasi lingkungan Anda dan menginstal seluruh"
echo -e " kebutuhan aplikasi agar siap dijalankan."
echo -e "${CYAN}======================================================================${NC}"
echo ""
# 2. Check and Create Environment File (.env)
echo -e "${CYAN}[2/7] Preparing configuration environment (.env)...${NC}"
# 1. PRE-FLIGHT SYSTEM CHECKS
echo -e "${BOLD}${BLUE}[1/7] Memeriksa Kebutuhan Sistem (Pre-flight Checks)...${NC}"
# Check Docker Installation
if ! command -v docker &> /dev/null; then
log_error "Docker tidak ditemukan pada sistem ini."
log_warning "Harap instal Docker terlebih dahulu sebelum melanjutkan."
exit 1
else
log_success "Docker terinstal."
fi
# Check Docker Daemon Status
if ! docker info &> /dev/null; then
log_error "Docker daemon tidak berjalan."
log_warning "Harap jalankan Docker service Anda (misal: sudo systemctl start docker)."
exit 1
else
log_success "Docker daemon aktif dan berjalan."
fi
# Check Docker Compose Installation
if ! docker compose version &> /dev/null; then
log_warning "Docker Compose v2 tidak terdeteksi. Mencoba memeriksa 'docker-compose' lama..."
if ! command -v docker-compose &> /dev/null; then
log_error "Docker Compose tidak ditemukan pada sistem."
exit 1
else
log_success "Docker-compose (v1) terinstal."
DOCKER_COMPOSE_CMD="docker-compose"
fi
else
log_success "Docker Compose v2 terinstal."
DOCKER_COMPOSE_CMD="docker compose"
fi
echo ""
# 2. ENVIRONMENT CONFIGURATION
echo -e "${BOLD}${BLUE}[2/7] Mengonfigurasi File Environment (.env)...${NC}"
if [ ! -f .env ]; then
if [ -f .env.example ]; then
log_info "Membuat file .env baru dari .env.example..."
cp .env.example .env
echo -e " ${GREEN}✔ Created .env from .env.example template.${NC}"
log_success "File .env berhasil dibuat."
else
echo -e " ${RED}❌ Error: .env.example template is missing!${NC}"
log_error "File .env.example tidak ditemukan! Tidak dapat membuat file .env."
exit 1
fi
else
echo -e " ${GREEN}✔ Configuration file .env is already present.${NC}"
log_info "File .env sudah ada. Menggunakan konfigurasi yang ada."
fi
echo ""
# 3. Clean up conflicting containers
echo -e "${CYAN}[3/7] Cleaning up existing container conflicts...${NC}"
# Safely stop and remove containers by name to prevent conflict issues on port mapping
CONFLICT_CONTAINERS=("bii-kit-web" "bii-kit-pgsql" "bii-kit-redis")
for container in "${CONFLICT_CONTAINERS[@]}"; do
if [ ! -z "$(docker ps -a -q -f name=^/${container}$ 2>/dev/null)" ]; then
echo -ne " ${YELLOW}Removing old container $container...${NC}"
docker rm -f "$container" &>/dev/null
echo -e "\r ${GREEN}✔ Container $container successfully cleared. ${NC}"
# Parse App Port from .env
APP_PORT=$(grep "^APP_PORT=" .env | cut -d'=' -f2- | tr -d '"'\''')
APP_PORT=${APP_PORT:-8000}
# 3. VENDOR & COMPOSER DEPENDENCIES
echo -e "${BOLD}${BLUE}[3/7] Menginstal Dependensi PHP (Composer)...${NC}"
if [ ! -d vendor ]; then
log_info "Direktori 'vendor' tidak ditemukan. Mengunduh dependensi via PHP-Composer container..."
docker run --rm \
-u "$(id -u):$(id -g)" \
-v "$(pwd):/var/www/html" \
-w /var/www/html \
laravelsail/php83-composer:latest \
composer install --ignore-platform-reqs --no-interaction --prefer-dist
if [ $? -ne 0 ]; then
log_error "Gagal menginstal dependensi Composer. Silakan cek koneksi internet Anda."
exit 1
fi
done
echo -e " ${GREEN}✔ Conflict scanning complete.${NC}"
log_success "Dependensi Composer berhasil diinstal."
else
log_info "Direktori 'vendor' sudah ada. Melewati instalasi Composer."
fi
echo ""
# 4. Zero-Dependency Host Bootstrapping: Composer Install
echo -e "${CYAN}[4/7] Installing PHP dependencies via Composer...${NC}"
echo -e " ${YELLOW}⚙ Bootstrapping Composer packages inside lightweight PHP container...${NC}"
docker run --rm \
-u "$(id -u):$(id -g)" \
-v "$(pwd):/var/www/html" \
-w /var/www/html \
laravelsail/php83-composer:latest \
composer install --ignore-platform-reqs
# 4. SPIN UP DOCKER CONTAINERS
echo -e "${BOLD}${BLUE}[4/7] Memulai Container Docker (Database, Redis, Web)...${NC}"
log_info "Menjalankan '$DOCKER_COMPOSE_CMD up -d'..."
$DOCKER_COMPOSE_CMD up -d
if [ $? -ne 0 ]; then
echo -e " ${RED}❌ Error: Composer dependency installation failed.${NC}"
log_error "Gagal menjalankan Docker container. Periksa file docker-compose.yml."
exit 1
fi
echo -e " ${GREEN}✔ Composer dependencies successfully installed.${NC}"
log_success "Docker containers berhasil dijalankan."
echo ""
# 5. Booting Docker Services for DB Migration
echo -e "${CYAN}[5/7] Spin up database & Redis services...${NC}"
docker compose up pgsql redis -d
# Resolve container names dynamically
DB_CONTAINER="bii-pgsql"
REDIS_CONTAINER="bii-redis"
WEB_CONTAINER="laravel.test"
if [ $? -ne 0 ]; then
echo -e " ${RED}❌ Error: Failed to boot Postgres & Redis services.${NC}"
exit 1
fi
# 5. WAITING FOR SERVICES HEALTHY (Postgres & Redis)
echo -e "${BOLD}${BLUE}[5/7] Menunggu Database & Redis Siap (Healthcheck)...${NC}"
DB_CONTAINER="bii-kit-pgsql"
echo -ne " ${YELLOW}Waiting for PostgreSQL ($DB_CONTAINER) to become healthy...${NC}"
echo -ne " ${YELLOW}Memeriksa PostgreSQL Database ($DB_CONTAINER)...${NC}"
RETRIES=0
MAX_RETRIES=40
while [ $RETRIES -lt $MAX_RETRIES ]; do
STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$DB_CONTAINER" 2>/dev/null)
if [ "$STATUS" = "healthy" ]; then
echo -e "\r ${GREEN}✔ PostgreSQL is healthy and ready to accept connections! ${NC}"
echo -e "\r ${GREEN}[SELESAI]${NC} ✔ PostgreSQL siap menerima koneksi! "
break
elif [ "$STATUS" = "unhealthy" ]; then
echo -e "\r ${RED}⚠ PostgreSQL health check failed. Proceeding anyway...${NC}"
echo -e "\r ${YELLOW}[PERINGATAN]${NC} ⚠ Healthcheck PGSQL melaporkan error. Melanjutkan..."
break
elif [ -z "$STATUS" ]; then
RUNNING=$(docker inspect --format='{{.State.Running}}' "$DB_CONTAINER" 2>/dev/null)
if [ "$RUNNING" = "true" ]; then
echo -e "\r ${GREEN}✔ PostgreSQL container is running. ${NC}"
echo -e "\r ${GREEN}[SELESAI]${NC} ✔ PostgreSQL running (tanpa healthcheck status)."
break
fi
fi
@@ -108,56 +164,118 @@ while [ $RETRIES -lt $MAX_RETRIES ]; do
sleep 1.5
RETRIES=$((RETRIES + 1))
done
echo -ne " ${YELLOW}Memeriksa Redis Cache ($REDIS_CONTAINER)...${NC}"
RETRIES=0
while [ $RETRIES -lt $MAX_RETRIES ]; do
STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$REDIS_CONTAINER" 2>/dev/null)
if [ "$STATUS" = "healthy" ]; then
echo -e "\r ${GREEN}[SELESAI]${NC} ✔ Redis siap menerima koneksi! "
break
elif [ "$STATUS" = "unhealthy" ]; then
echo -e "\r ${YELLOW}[PERINGATAN]${NC} ⚠ Healthcheck Redis melaporkan error. Melanjutkan..."
break
elif [ -z "$STATUS" ]; then
RUNNING=$(docker inspect --format='{{.State.Running}}' "$REDIS_CONTAINER" 2>/dev/null)
if [ "$RUNNING" = "true" ]; then
echo -e "\r ${GREEN}[SELESAI]${NC} ✔ Redis running (tanpa healthcheck status)."
break
fi
fi
echo -n "."
sleep 1.5
RETRIES=$((RETRIES + 1))
done
sleep 2
echo ""
# 6. Initialize Database & Application Keys
echo -e "${CYAN}[6/7] Initializing keys and database seeds...${NC}"
# 6. INITIALIZING APPLICATION (Key, Database Migrate, NPM)
echo -e "${BOLD}${BLUE}[6/7] Menginisialisasi Database & Aset Aplikasi...${NC}"
# Start sails application container in background temporarily to execute artisan commands
docker compose up laravel.test -d
# Secure Permissions First
log_info "Mengonfigurasi hak akses file di dalam container..."
$DOCKER_COMPOSE_CMD exec -u root laravel.test chown -R sail:sail /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null
$DOCKER_COMPOSE_CMD exec -u root laravel.test chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null
# Secure directories owner & permissions
echo -e " ${YELLOW}Securing workspace file permissions...${NC}"
docker compose exec -u root laravel.test chown -R sail:sail /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null
docker compose exec -u root laravel.test chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null
# Generate APP_KEY
# Generate Key
APP_KEY_VAL=$(grep "^APP_KEY=" .env | cut -d'=' -f2- | tr -d '"'\''')
if [ -z "$APP_KEY_VAL" ] || [ "$APP_KEY_VAL" = "base64:" ] || [ "$APP_KEY_VAL" = "SomeRandomString" ]; then
echo -e " ${YELLOW}⚙ Generating application encryption key...${NC}"
docker compose exec -u sail laravel.test php artisan key:generate
log_info "Menghasilkan unique application key..."
$DOCKER_COMPOSE_CMD exec -u sail laravel.test php artisan key:generate
else
log_info "Application key sudah diatur."
fi
# Run migrations and seeders
echo -e " ${YELLOW}⚙ Initializing database schemas & Spatie RBAC tables...${NC}"
docker compose exec -u sail laravel.test php artisan migrate:fresh --seed
# Migration & Seed
log_info "Menjalankan migrasi database dan default seeders..."
$DOCKER_COMPOSE_CMD exec -u sail laravel.test php artisan migrate:fresh --seed
if [ $? -eq 0 ]; then
log_success "Database berhasil di-migrate dan di-seed."
else
log_error "Gagal melakukan migrasi database."
fi
# Generate Passport OAuth2 Keys
echo -e " ${YELLOW}⚙ Creating Passport OAuth2 server authentication client keys...${NC}"
docker compose exec -u sail laravel.test php artisan passport:keys --force
docker compose exec -u sail laravel.test php artisan passport:client --personal --no-interaction
echo -e " ${GREEN}✔ Database and keys successfully initialized.${NC}"
echo ""
# Link Storage
log_info "Membuat symbolic link untuk storage..."
$DOCKER_COMPOSE_CMD exec -u sail laravel.test php artisan storage:link --quiet 2>/dev/null
log_success "Storage link berhasil terhubung."
# 7. Compiling Frontend assets
echo -e "${CYAN}[7/7] Installing and compiling React Frontend...${NC}"
echo -e " ${YELLOW}⚙ Installing Node modules (NPM)...${NC}"
docker compose exec -u sail laravel.test npm install
# Install NPM Packages
log_info "Memasang dependensi NodeJS (NPM)..."
if [ ! -d node_modules ]; then
$DOCKER_COMPOSE_CMD exec -u sail laravel.test npm install
if [ $? -eq 0 ]; then
log_success "Dependensi NodeJS berhasil dipasang."
else
log_warning "Gagal memasang dependensi NodeJS."
fi
else
log_info "Folder 'node_modules' sudah ada. Melewati instalasi NPM."
fi
echo -e " ${YELLOW}⚙ Compiling production web bundles (Vite)...${NC}"
docker compose exec -u sail laravel.test npm run build
# Build Production Assets
log_info "Mengompilasi aset frontend (production build)..."
$DOCKER_COMPOSE_CMD exec -u sail laravel.test npm run build
if [ $? -eq 0 ]; then
log_success "Frontend assets berhasil dikompilasi."
else
log_warning "Gagal melakukan build frontend assets."
fi
# Storage Symlink
docker compose exec -u sail laravel.test php artisan storage:link &>/dev/null
# Final permission secure
docker compose exec -u root laravel.test chown -R sail:sail /var/www/html/node_modules /var/www/html/package-lock.json 2>/dev/null
# Clean up permissions again in case npm install created any root-owned folders
$DOCKER_COMPOSE_CMD exec -u root laravel.test chown -R sail:sail /var/www/html/node_modules /var/www/html/package-lock.json 2>/dev/null
echo ""
echo -e "${CYAN}=================================================================${NC}"
echo -e " 🎉 ${GREEN}${BOLD}Installation Complete! biiproject-kit v2 is ready!${NC} 🎉"
echo -e "${CYAN}=================================================================${NC}"
echo -e " ${WHITE}You can now run the application stack anytime by executing:${NC}"
echo -e " 👉 ${GREEN}${BOLD}./run.sh${NC}"
echo -e "${CYAN}=================================================================${NC}"
# 7. PERMISSIONS & FINISHING
echo -e "${BOLD}${BLUE}[7/7] Finishing & Finalizing...${NC}"
chmod +x artisan sail run.sh 2>/dev/null
log_success "Hak akses berkas lokal (artisan, sail, run.sh) disesuaikan."
clear_screen
# SUCCESS BOARD
echo -e "${GREEN}======================================================================${NC}"
echo -e "${BOLD}${GREEN} 🎉 INSTALASI BIIPROJECT KIT BERHASIL DISELESAIKAN! 🎉 ${NC}"
echo -e "${GREEN}======================================================================${NC}"
echo -e " Aplikasi Anda sekarang siap digunakan!"
echo -e ""
echo -e " 👉 ${BOLD}URL Aplikasi:${NC} ${CYAN}http://localhost:${APP_PORT}${NC}"
echo -e " 👉 ${BOLD}Monitoring Panel:${NC} ${CYAN}http://localhost:${APP_PORT}/system-monitoring${NC}"
echo -e " 👉 ${BOLD}Dokumentasi API:${NC} ${CYAN}http://localhost:${APP_PORT}/documentation${NC}"
echo -e " 👉 ${BOLD}Layanan Database:${NC} PostgreSQL pada port ${YELLOW}5432${NC}"
echo -e " 👉 ${BOLD}Layanan Redis:${NC} Redis pada port ${YELLOW}6379${NC}"
echo -e ""
echo -e " ========================================================"
echo -e " ${BOLD}CARA MENJALANKAN & MENGHENTIKAN APLIKASI:${NC}"
echo -e " ========================================================"
echo -e " Untuk menjalankan server pengembangan (live reload):"
echo -e " ${CYAN}./run.sh${NC}"
echo -e ""
echo -e " Untuk melihat logs docker secara realtime:"
echo -e " ${CYAN}docker compose logs -f${NC}"
echo -e ""
echo -e " Untuk menghentikan docker container:"
echo -e " ${CYAN}docker compose down${NC}"
echo -e "${GREEN}======================================================================${NC}"
echo ""
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{c as e,o as t,t as n}from"./app-BJ7g6sa8.js";e();var r=n();function i({ability:e,children:n,fallback:i=null}){let{permissions:a}=t().props.auth;return(Array.isArray(e)?e:[e]).some(e=>a.includes(e))?(0,r.jsx)(r.Fragment,{children:n}):(0,r.jsx)(r.Fragment,{children:i})}export{i as t};
import{c as e,o as t,t as n}from"./app-CBC6ZGaO.js";e();var r=n();function i({ability:e,children:n,fallback:i=null}){let{permissions:a}=t().props.auth;return(Array.isArray(e)?e:[e]).some(e=>a.includes(e))?(0,r.jsx)(r.Fragment,{children:n}):(0,r.jsx)(r.Fragment,{children:i})}export{i as t};
@@ -1,2 +1,2 @@
import{a as e,c as t,d as n,n as r,t as i}from"./app-BJ7g6sa8.js";var a=n(t(),1),o=i();function s(){let[t,n]=(0,a.useState)(!1),{data:i,setData:s,post:c,processing:l,errors:u}=e({code:``});return(0,o.jsxs)(`div`,{className:`min-h-screen bg-[#E3EBE8] flex items-center justify-center p-4`,children:[(0,o.jsx)(r,{title:`Two-Factor Authentication`}),(0,o.jsxs)(`div`,{className:`w-full max-w-sm`,children:[(0,o.jsxs)(`div`,{className:`text-center mb-8`,children:[(0,o.jsx)(`div`,{className:`inline-flex items-center justify-center w-14 h-14 rounded-2xl bg-[#3D4E4B] mb-4`,children:(0,o.jsx)(`svg`,{className:`w-7 h-7 text-[#D4A017]`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2.5,children:(0,o.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`})})}),(0,o.jsx)(`h1`,{className:`text-xl font-black text-[#3D4E4B] tracking-tight`,children:`Two-Factor Authentication`}),(0,o.jsx)(`p`,{className:`text-sm text-gray-500 font-medium mt-1`,children:t?`Enter a recovery code to continue`:`Enter the 6-digit code from your authenticator app`})]}),(0,o.jsxs)(`div`,{className:`bg-white rounded-2xl shadow-sm border border-gray-100 p-8`,children:[(0,o.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(route(`two-factor.verify`),{preserveScroll:!0})},className:`space-y-5`,children:[(0,o.jsxs)(`div`,{children:[(0,o.jsx)(`label`,{className:`block text-xs font-bold text-gray-500 uppercase tracking-widest mb-2`,children:t?`Recovery Code`:`Authentication Code`}),(0,o.jsx)(`input`,{type:`text`,inputMode:t?`text`:`numeric`,maxLength:t?21:6,value:i.code,onChange:e=>s(`code`,e.target.value),autoFocus:!0,className:`w-full h-12 border rounded-xl px-4 text-center font-mono font-bold text-lg tracking-[0.4em] outline-none transition-all
import{a as e,c as t,d as n,n as r,t as i}from"./app-CBC6ZGaO.js";var a=n(t(),1),o=i();function s(){let[t,n]=(0,a.useState)(!1),{data:i,setData:s,post:c,processing:l,errors:u}=e({code:``});return(0,o.jsxs)(`div`,{className:`min-h-screen bg-[#E3EBE8] flex items-center justify-center p-4`,children:[(0,o.jsx)(r,{title:`Two-Factor Authentication`}),(0,o.jsxs)(`div`,{className:`w-full max-w-sm`,children:[(0,o.jsxs)(`div`,{className:`text-center mb-8`,children:[(0,o.jsx)(`div`,{className:`inline-flex items-center justify-center w-14 h-14 rounded-2xl bg-[#3D4E4B] mb-4`,children:(0,o.jsx)(`svg`,{className:`w-7 h-7 text-[#D4A017]`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2.5,children:(0,o.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`})})}),(0,o.jsx)(`h1`,{className:`text-xl font-black text-[#3D4E4B] tracking-tight`,children:`Two-Factor Authentication`}),(0,o.jsx)(`p`,{className:`text-sm text-gray-500 font-medium mt-1`,children:t?`Enter a recovery code to continue`:`Enter the 6-digit code from your authenticator app`})]}),(0,o.jsxs)(`div`,{className:`bg-white rounded-2xl shadow-sm border border-gray-100 p-8`,children:[(0,o.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(route(`two-factor.verify`),{preserveScroll:!0})},className:`space-y-5`,children:[(0,o.jsxs)(`div`,{children:[(0,o.jsx)(`label`,{className:`block text-xs font-bold text-gray-500 uppercase tracking-widest mb-2`,children:t?`Recovery Code`:`Authentication Code`}),(0,o.jsx)(`input`,{type:`text`,inputMode:t?`text`:`numeric`,maxLength:t?21:6,value:i.code,onChange:e=>s(`code`,e.target.value),autoFocus:!0,className:`w-full h-12 border rounded-xl px-4 text-center font-mono font-bold text-lg tracking-[0.4em] outline-none transition-all
${u.code?`border-red-300 bg-red-50`:`border-gray-200 focus:border-[#3D4E4B] focus:ring-2 focus:ring-[#3D4E4B]/10`}`,placeholder:t?`xxxxxxxxxx-xxxxxxxxxx`:`000000`}),u.code&&(0,o.jsx)(`p`,{className:`text-xs text-red-500 font-semibold mt-1.5`,children:u.code})]}),(0,o.jsx)(`button`,{type:`submit`,disabled:l||i.code.length<(t?5:6),className:`w-full h-11 bg-[#3D4E4B] text-white text-sm font-bold rounded-xl hover:bg-[#2D3A38] transition-all disabled:opacity-60`,children:l?`Verifying...`:`Continue`})]}),(0,o.jsx)(`div`,{className:`mt-6 text-center`,children:(0,o.jsx)(`button`,{onClick:()=>{n(!t),s(`code`,``)},className:`text-xs font-bold text-[#3D4E4B] hover:underline`,children:t?`Use authenticator code instead`:`Use a recovery code`})})]}),(0,o.jsx)(`div`,{className:`mt-6 text-center`,children:(0,o.jsx)(`a`,{href:`/login`,className:`text-xs font-semibold text-gray-400 hover:text-[#3D4E4B]`,children:` Back to login`})})]})]})}export{s as default};
@@ -1 +1 @@
import{a as e,c as t,n,t as r}from"./app-BJ7g6sa8.js";import{t as i}from"./GuestLayout-CN-YY0cs.js";t();var a=r();function o(){let{data:t,setData:r,post:o,processing:s,errors:c,reset:l}=e({password:``});return(0,a.jsxs)(i,{children:[(0,a.jsx)(n,{title:`Confirm password`}),(0,a.jsxs)(`div`,{className:`mb-8 anim-down`,children:[(0,a.jsx)(`div`,{className:`w-12 h-12 bg-[#3D4E4B]/5 rounded-2xl flex items-center justify-center mb-6`,children:(0,a.jsx)(`svg`,{className:`w-5 h-5 text-[#3D4E4B]`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2,children:(0,a.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z`})})}),(0,a.jsx)(`h1`,{className:`text-2xl font-bold text-[#1A2421] tracking-tight`,children:`Confirm your password`}),(0,a.jsx)(`p`,{className:`mt-1.5 text-sm text-gray-400 font-medium leading-relaxed`,children:`For your security, please confirm your password to continue.`})]}),(0,a.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),o(route(`password.confirm`),{onFinish:()=>l(`password`)})},className:`anim-up`,style:{animationDelay:`0.1s`},children:[(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`label`,{htmlFor:`password`,className:`block text-sm font-semibold text-gray-600 mb-1.5`,children:`Password`}),(0,a.jsx)(`input`,{id:`password`,type:`password`,autoComplete:`current-password`,autoFocus:!0,value:t.password,onChange:e=>r(`password`,e.target.value),placeholder:`••••••••`,className:`auth-input${c.password?` !border-red-300 !bg-red-50/50`:``}`}),c.password&&(0,a.jsx)(`p`,{className:`mt-1.5 text-xs font-semibold text-red-500`,children:c.password})]}),(0,a.jsx)(`button`,{type:`submit`,disabled:s,className:`mt-6 w-full h-11 rounded-xl bg-[#3D4E4B] hover:bg-[#2D3A38] text-white text-sm font-bold tracking-tight transition-colors duration-200 flex items-center justify-center gap-2 disabled:opacity-60 disabled:cursor-not-allowed`,children:s?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(`svg`,{className:`w-4 h-4 animate-spin text-white/60`,fill:`none`,viewBox:`0 0 24 24`,children:[(0,a.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,a.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})]}),`Confirming…`]}):`Confirm password`})]})]})}export{o as default};
import{a as e,c as t,n,t as r}from"./app-CBC6ZGaO.js";import{t as i}from"./GuestLayout-DUQXV9II.js";t();var a=r();function o(){let{data:t,setData:r,post:o,processing:s,errors:c,reset:l}=e({password:``});return(0,a.jsxs)(i,{children:[(0,a.jsx)(n,{title:`Confirm password`}),(0,a.jsxs)(`div`,{className:`mb-8 anim-down`,children:[(0,a.jsx)(`div`,{className:`w-12 h-12 bg-[#3D4E4B]/5 rounded-2xl flex items-center justify-center mb-6`,children:(0,a.jsx)(`svg`,{className:`w-5 h-5 text-[#3D4E4B]`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2,children:(0,a.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z`})})}),(0,a.jsx)(`h1`,{className:`text-2xl font-bold text-[#1A2421] tracking-tight`,children:`Confirm your password`}),(0,a.jsx)(`p`,{className:`mt-1.5 text-sm text-gray-400 font-medium leading-relaxed`,children:`For your security, please confirm your password to continue.`})]}),(0,a.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),o(route(`password.confirm`),{onFinish:()=>l(`password`)})},className:`anim-up`,style:{animationDelay:`0.1s`},children:[(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`label`,{htmlFor:`password`,className:`block text-sm font-semibold text-gray-600 mb-1.5`,children:`Password`}),(0,a.jsx)(`input`,{id:`password`,type:`password`,autoComplete:`current-password`,autoFocus:!0,value:t.password,onChange:e=>r(`password`,e.target.value),placeholder:`••••••••`,className:`auth-input${c.password?` !border-red-300 !bg-red-50/50`:``}`}),c.password&&(0,a.jsx)(`p`,{className:`mt-1.5 text-xs font-semibold text-red-500`,children:c.password})]}),(0,a.jsx)(`button`,{type:`submit`,disabled:s,className:`mt-6 w-full h-11 rounded-xl bg-[#3D4E4B] hover:bg-[#2D3A38] text-white text-sm font-bold tracking-tight transition-colors duration-200 flex items-center justify-center gap-2 disabled:opacity-60 disabled:cursor-not-allowed`,children:s?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(`svg`,{className:`w-4 h-4 animate-spin text-white/60`,fill:`none`,viewBox:`0 0 24 24`,children:[(0,a.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,a.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})]}),`Confirming…`]}):`Confirm password`})]})]})}export{o as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{c as e,n as t,r as n,t as r}from"./app-BJ7g6sa8.js";e();var i=r(),a={403:{title:`Access Denied`,description:`You don't have permission to access this resource.`},404:{title:`Page Not Found`,description:`The page you're looking for doesn't exist or has been moved.`},419:{title:`Session Expired`,description:`Your session has expired. Please refresh and try again.`},500:{title:`Server Error`,description:`Something went wrong on our end. Please try again later.`},503:{title:`Under Maintenance`,description:`The system is temporarily unavailable. Please check back soon.`}};function o({status:e}){let{title:r,description:o}=a[e]??{title:`Unexpected Error`,description:`An unexpected error occurred.`};return(0,i.jsxs)(`div`,{className:`min-h-screen bg-[#E3EBE8] flex items-center justify-center p-6`,children:[(0,i.jsx)(t,{title:`${e}${r}`}),(0,i.jsxs)(`div`,{className:`w-full max-w-md`,children:[(0,i.jsxs)(`div`,{className:`bg-white rounded-3xl border border-gray-100 shadow-sm overflow-hidden`,children:[(0,i.jsxs)(`div`,{className:`bg-[#3D4E4B] px-8 py-10 text-center`,children:[(0,i.jsx)(`div`,{className:`text-7xl font-black text-white/10 tracking-tighter leading-none select-none`,children:e}),(0,i.jsx)(`div`,{className:`mt-2 text-xl font-bold text-white tracking-tight`,children:r})]}),(0,i.jsxs)(`div`,{className:`px-8 py-8 text-center space-y-6`,children:[(0,i.jsx)(`p`,{className:`text-sm font-semibold text-gray-400 leading-relaxed`,children:o}),(0,i.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3 justify-center`,children:[e===419?(0,i.jsxs)(`button`,{onClick:()=>window.location.reload(),className:`h-10 px-6 bg-[#3D4E4B] text-white text-sm font-bold tracking-tight rounded-xl hover:bg-[#2D3A38] transition-all flex items-center justify-center gap-2`,children:[(0,i.jsx)(`svg`,{className:`w-4 h-4`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2.5,children:(0,i.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`})}),`Refresh Page`]}):(0,i.jsxs)(n,{href:`/dashboard`,className:`h-10 px-6 bg-[#3D4E4B] text-white text-sm font-bold tracking-tight rounded-xl hover:bg-[#2D3A38] transition-all flex items-center justify-center gap-2`,children:[(0,i.jsx)(`svg`,{className:`w-4 h-4`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2.5,children:(0,i.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6`})}),`Back to Dashboard`]}),(0,i.jsx)(`button`,{onClick:()=>window.history.back(),className:`h-10 px-6 bg-white border border-gray-100 text-gray-500 text-sm font-bold tracking-tight rounded-xl hover:bg-gray-50 transition-all`,children:`Go Back`})]})]})]}),(0,i.jsxs)(`p`,{className:`text-center text-xs font-bold text-gray-400 uppercase tracking-widest mt-6`,children:[`Error `,e]})]})]})}export{o as default};
import{c as e,n as t,r as n,t as r}from"./app-CBC6ZGaO.js";e();var i=r(),a={403:{title:`Access Denied`,description:`You don't have permission to access this resource.`},404:{title:`Page Not Found`,description:`The page you're looking for doesn't exist or has been moved.`},419:{title:`Session Expired`,description:`Your session has expired. Please refresh and try again.`},500:{title:`Server Error`,description:`Something went wrong on our end. Please try again later.`},503:{title:`Under Maintenance`,description:`The system is temporarily unavailable. Please check back soon.`}};function o({status:e}){let{title:r,description:o}=a[e]??{title:`Unexpected Error`,description:`An unexpected error occurred.`};return(0,i.jsxs)(`div`,{className:`min-h-screen bg-[#E3EBE8] flex items-center justify-center p-6`,children:[(0,i.jsx)(t,{title:`${e}${r}`}),(0,i.jsxs)(`div`,{className:`w-full max-w-md`,children:[(0,i.jsxs)(`div`,{className:`bg-white rounded-3xl border border-gray-100 shadow-sm overflow-hidden`,children:[(0,i.jsxs)(`div`,{className:`bg-[#3D4E4B] px-8 py-10 text-center`,children:[(0,i.jsx)(`div`,{className:`text-7xl font-black text-white/10 tracking-tighter leading-none select-none`,children:e}),(0,i.jsx)(`div`,{className:`mt-2 text-xl font-bold text-white tracking-tight`,children:r})]}),(0,i.jsxs)(`div`,{className:`px-8 py-8 text-center space-y-6`,children:[(0,i.jsx)(`p`,{className:`text-sm font-semibold text-gray-400 leading-relaxed`,children:o}),(0,i.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3 justify-center`,children:[e===419?(0,i.jsxs)(`button`,{onClick:()=>window.location.reload(),className:`h-10 px-6 bg-[#3D4E4B] text-white text-sm font-bold tracking-tight rounded-xl hover:bg-[#2D3A38] transition-all flex items-center justify-center gap-2`,children:[(0,i.jsx)(`svg`,{className:`w-4 h-4`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2.5,children:(0,i.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`})}),`Refresh Page`]}):(0,i.jsxs)(n,{href:`/dashboard`,className:`h-10 px-6 bg-[#3D4E4B] text-white text-sm font-bold tracking-tight rounded-xl hover:bg-[#2D3A38] transition-all flex items-center justify-center gap-2`,children:[(0,i.jsx)(`svg`,{className:`w-4 h-4`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2.5,children:(0,i.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6`})}),`Back to Dashboard`]}),(0,i.jsx)(`button`,{onClick:()=>window.history.back(),className:`h-10 px-6 bg-white border border-gray-100 text-gray-500 text-sm font-bold tracking-tight rounded-xl hover:bg-gray-50 transition-all`,children:`Go Back`})]})]})]}),(0,i.jsxs)(`p`,{className:`text-center text-xs font-bold text-gray-400 uppercase tracking-widest mt-6`,children:[`Error `,e]})]})]})}export{o as default};
@@ -1 +1 @@
import{a as e,c as t,n,r,t as i}from"./app-BJ7g6sa8.js";import{t as a}from"./GuestLayout-CN-YY0cs.js";t();var o=i();function s({status:t}){let{data:i,setData:s,post:c,processing:l,errors:u}=e({email:``});return(0,o.jsxs)(a,{children:[(0,o.jsx)(n,{title:`Forgot password`}),(0,o.jsxs)(`div`,{className:`mb-8 anim-down`,children:[(0,o.jsx)(`h1`,{className:`text-2xl font-bold text-[#1A2421] tracking-tight`,children:`Forgot password?`}),(0,o.jsx)(`p`,{className:`mt-1.5 text-sm text-gray-400 font-medium`,children:`Enter your email and we'll send a reset link.`})]}),t&&(0,o.jsx)(`div`,{className:`mb-6 px-4 py-3 rounded-xl bg-emerald-50 border border-emerald-100 text-sm font-semibold text-emerald-700 anim-fade`,children:t}),(0,o.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(route(`password.email`))},className:`anim-up`,style:{animationDelay:`0.1s`},children:[(0,o.jsxs)(`div`,{children:[(0,o.jsx)(`label`,{htmlFor:`email`,className:`block text-sm font-semibold text-gray-600 mb-1.5`,children:`Email address`}),(0,o.jsx)(`input`,{id:`email`,type:`email`,autoComplete:`email`,autoFocus:!0,value:i.email,onChange:e=>s(`email`,e.target.value),placeholder:`you@company.com`,className:`auth-input${u.email?` !border-red-300 !bg-red-50/50`:``}`}),u.email&&(0,o.jsx)(`p`,{className:`mt-1.5 text-xs font-semibold text-red-500`,children:u.email})]}),(0,o.jsx)(`button`,{type:`submit`,disabled:l,className:`mt-6 w-full h-11 rounded-xl bg-[#3D4E4B] hover:bg-[#2D3A38] text-white text-sm font-bold tracking-tight transition-colors duration-200 flex items-center justify-center gap-2 disabled:opacity-60 disabled:cursor-not-allowed`,children:l?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(`svg`,{className:`w-4 h-4 animate-spin text-white/60`,fill:`none`,viewBox:`0 0 24 24`,children:[(0,o.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,o.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})]}),`Sending…`]}):`Send reset link`})]}),(0,o.jsx)(`p`,{className:`mt-7 text-center text-sm text-gray-400 font-medium anim-fade`,style:{animationDelay:`0.18s`},children:(0,o.jsx)(r,{href:route(`login`),className:`text-[#3D4E4B] font-semibold hover:text-[#D4A017] transition-colors duration-200`,children:`← Back to sign in`})})]})}export{s as default};
import{a as e,c as t,n,r,t as i}from"./app-CBC6ZGaO.js";import{t as a}from"./GuestLayout-DUQXV9II.js";t();var o=i();function s({status:t}){let{data:i,setData:s,post:c,processing:l,errors:u}=e({email:``});return(0,o.jsxs)(a,{children:[(0,o.jsx)(n,{title:`Forgot password`}),(0,o.jsxs)(`div`,{className:`mb-8 anim-down`,children:[(0,o.jsx)(`h1`,{className:`text-2xl font-bold text-[#1A2421] tracking-tight`,children:`Forgot password?`}),(0,o.jsx)(`p`,{className:`mt-1.5 text-sm text-gray-400 font-medium`,children:`Enter your email and we'll send a reset link.`})]}),t&&(0,o.jsx)(`div`,{className:`mb-6 px-4 py-3 rounded-xl bg-emerald-50 border border-emerald-100 text-sm font-semibold text-emerald-700 anim-fade`,children:t}),(0,o.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(route(`password.email`))},className:`anim-up`,style:{animationDelay:`0.1s`},children:[(0,o.jsxs)(`div`,{children:[(0,o.jsx)(`label`,{htmlFor:`email`,className:`block text-sm font-semibold text-gray-600 mb-1.5`,children:`Email address`}),(0,o.jsx)(`input`,{id:`email`,type:`email`,autoComplete:`email`,autoFocus:!0,value:i.email,onChange:e=>s(`email`,e.target.value),placeholder:`you@company.com`,className:`auth-input${u.email?` !border-red-300 !bg-red-50/50`:``}`}),u.email&&(0,o.jsx)(`p`,{className:`mt-1.5 text-xs font-semibold text-red-500`,children:u.email})]}),(0,o.jsx)(`button`,{type:`submit`,disabled:l,className:`mt-6 w-full h-11 rounded-xl bg-[#3D4E4B] hover:bg-[#2D3A38] text-white text-sm font-bold tracking-tight transition-colors duration-200 flex items-center justify-center gap-2 disabled:opacity-60 disabled:cursor-not-allowed`,children:l?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(`svg`,{className:`w-4 h-4 animate-spin text-white/60`,fill:`none`,viewBox:`0 0 24 24`,children:[(0,o.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,o.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})]}),`Sending…`]}):`Send reset link`})]}),(0,o.jsx)(`p`,{className:`mt-7 text-center text-sm text-gray-400 font-medium anim-fade`,style:{animationDelay:`0.18s`},children:(0,o.jsx)(r,{href:route(`login`),className:`text-[#3D4E4B] font-semibold hover:text-[#D4A017] transition-colors duration-200`,children:`← Back to sign in`})})]})}export{s as default};
@@ -1 +1 @@
import{c as e,o as t,r as n,t as r}from"./app-BJ7g6sa8.js";e();var i=r();function a({children:e}){let{system_settings:r}=t().props,a=r?.app_name||`biiproject kit v2`,o=r?.app_logo,s=r?.app_logo_text||`BK`;return(0,i.jsxs)(`div`,{className:`min-h-screen flex font-sans`,children:[(0,i.jsxs)(`div`,{className:`hidden lg:flex lg:w-[44%] bg-[#3D4E4B] flex-col justify-between p-14 relative overflow-hidden shrink-0`,children:[(0,i.jsxs)(`svg`,{className:`absolute inset-0 w-full h-full pointer-events-none`,xmlns:`http://www.w3.org/2000/svg`,children:[(0,i.jsx)(`defs`,{children:(0,i.jsx)(`pattern`,{id:`dots`,x:`0`,y:`0`,width:`28`,height:`28`,patternUnits:`userSpaceOnUse`,children:(0,i.jsx)(`circle`,{cx:`1.5`,cy:`1.5`,r:`1.5`,fill:`white`,fillOpacity:`0.07`})})}),(0,i.jsx)(`rect`,{width:`100%`,height:`100%`,fill:`url(#dots)`})]}),(0,i.jsx)(`div`,{className:`absolute -bottom-40 -right-40 w-[480px] h-[480px] rounded-full border border-white/[0.06] pointer-events-none`}),(0,i.jsx)(`div`,{className:`absolute -bottom-64 -right-64 w-[700px] h-[700px] rounded-full border border-white/[0.04] pointer-events-none`}),(0,i.jsx)(`div`,{className:`absolute top-[-60px] left-[-60px] w-[300px] h-[300px] rounded-full border border-white/[0.04] pointer-events-none`}),(0,i.jsx)(`div`,{className:`relative z-10 anim-fade`,children:(0,i.jsxs)(n,{href:`/`,className:`inline-flex items-center gap-3 group`,children:[(0,i.jsx)(`div`,{className:`w-10 h-10 rounded-[0.75rem] flex items-center justify-center overflow-hidden text-sm font-bold text-white shrink-0 ${o?`bg-white/10`:`bg-[#D4A017]`}`,children:o?(0,i.jsx)(`img`,{src:o,alt:a,className:`w-full h-full object-contain`}):s}),(0,i.jsx)(`span`,{className:`text-white font-bold text-base tracking-tight`,children:a})]})}),(0,i.jsxs)(`div`,{className:`relative z-10 anim-up`,style:{animationDelay:`0.1s`},children:[(0,i.jsx)(`p`,{className:`text-[#D4A017] text-xs font-bold uppercase tracking-[0.18em] mb-5`,children:`Enterprise Platform`}),(0,i.jsxs)(`h2`,{className:`text-white text-[2rem] font-bold leading-[1.2] tracking-tight`,children:[`Manage your`,(0,i.jsx)(`br`,{}),`organization`,(0,i.jsx)(`br`,{}),`with precision.`]}),(0,i.jsx)(`p`,{className:`mt-5 text-[#E3EBE8]/45 text-sm leading-relaxed max-w-xs`,children:`Access control, user management, and system configuration — unified in one secure interface.`}),(0,i.jsx)(`div`,{className:`mt-9 flex flex-col gap-3`,children:[`Role-based access control`,`Real-time audit logs`,`Multi-level permissions`].map(e=>(0,i.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,i.jsx)(`div`,{className:`w-1.5 h-1.5 rounded-full bg-[#D4A017] shrink-0`}),(0,i.jsx)(`span`,{className:`text-[#E3EBE8]/55 text-sm font-medium`,children:e})]},e))})]}),(0,i.jsx)(`div`,{className:`relative z-10 anim-fade`,style:{animationDelay:`0.2s`},children:(0,i.jsxs)(`p`,{className:`text-[#E3EBE8]/25 text-xs`,children:[`© `,new Date().getFullYear(),` `,a,`. All rights reserved.`]})})]}),(0,i.jsxs)(`div`,{className:`flex-1 flex flex-col items-center justify-center bg-white px-8 py-12 min-h-screen`,children:[(0,i.jsxs)(`div`,{className:`lg:hidden mb-10 flex items-center gap-3 anim-down`,children:[(0,i.jsx)(`div`,{className:`w-9 h-9 rounded-[0.6rem] flex items-center justify-center text-sm font-bold overflow-hidden ${o?``:`bg-[#3D4E4B] text-white`}`,children:o?(0,i.jsx)(`img`,{src:o,alt:a,className:`w-full h-full object-contain`}):s}),(0,i.jsx)(`span`,{className:`text-[#3D4E4B] font-bold text-base tracking-tight`,children:a})]}),(0,i.jsx)(`div`,{className:`w-full max-w-[360px]`,children:e}),(0,i.jsx)(`div`,{className:`mt-10 anim-fade`,style:{animationDelay:`0.35s`},children:(0,i.jsxs)(n,{href:`/`,className:`inline-flex items-center gap-1.5 text-xs font-semibold text-gray-300 hover:text-[#3D4E4B] transition-colors duration-200 tracking-tight`,children:[(0,i.jsx)(`svg`,{className:`w-3.5 h-3.5`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2.5,children:(0,i.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M10 19l-7-7m0 0l7-7m-7 7h18`})}),`Back to home`]})})]})]})}export{a as t};
import{c as e,o as t,r as n,t as r}from"./app-CBC6ZGaO.js";e();var i=r();function a({children:e}){let{system_settings:r}=t().props,a=r?.app_name||`biiproject kit v2`,o=r?.app_logo,s=r?.app_logo_text||`BK`;return(0,i.jsxs)(`div`,{className:`min-h-screen flex font-sans`,children:[(0,i.jsxs)(`div`,{className:`hidden lg:flex lg:w-[44%] bg-[#3D4E4B] flex-col justify-between p-14 relative overflow-hidden shrink-0`,children:[(0,i.jsxs)(`svg`,{className:`absolute inset-0 w-full h-full pointer-events-none`,xmlns:`http://www.w3.org/2000/svg`,children:[(0,i.jsx)(`defs`,{children:(0,i.jsx)(`pattern`,{id:`dots`,x:`0`,y:`0`,width:`28`,height:`28`,patternUnits:`userSpaceOnUse`,children:(0,i.jsx)(`circle`,{cx:`1.5`,cy:`1.5`,r:`1.5`,fill:`white`,fillOpacity:`0.07`})})}),(0,i.jsx)(`rect`,{width:`100%`,height:`100%`,fill:`url(#dots)`})]}),(0,i.jsx)(`div`,{className:`absolute -bottom-40 -right-40 w-[480px] h-[480px] rounded-full border border-white/[0.06] pointer-events-none`}),(0,i.jsx)(`div`,{className:`absolute -bottom-64 -right-64 w-[700px] h-[700px] rounded-full border border-white/[0.04] pointer-events-none`}),(0,i.jsx)(`div`,{className:`absolute top-[-60px] left-[-60px] w-[300px] h-[300px] rounded-full border border-white/[0.04] pointer-events-none`}),(0,i.jsx)(`div`,{className:`relative z-10 anim-fade`,children:(0,i.jsxs)(n,{href:`/`,className:`inline-flex items-center gap-3 group`,children:[(0,i.jsx)(`div`,{className:`w-10 h-10 rounded-[0.75rem] flex items-center justify-center overflow-hidden text-sm font-bold text-white shrink-0 ${o?`bg-white/10`:`bg-[#D4A017]`}`,children:o?(0,i.jsx)(`img`,{src:o,alt:a,className:`w-full h-full object-contain`}):s}),(0,i.jsx)(`span`,{className:`text-white font-bold text-base tracking-tight`,children:a})]})}),(0,i.jsxs)(`div`,{className:`relative z-10 anim-up`,style:{animationDelay:`0.1s`},children:[(0,i.jsx)(`p`,{className:`text-[#D4A017] text-xs font-bold uppercase tracking-[0.18em] mb-5`,children:`Enterprise Platform`}),(0,i.jsxs)(`h2`,{className:`text-white text-[2rem] font-bold leading-[1.2] tracking-tight`,children:[`Manage your`,(0,i.jsx)(`br`,{}),`organization`,(0,i.jsx)(`br`,{}),`with precision.`]}),(0,i.jsx)(`p`,{className:`mt-5 text-[#E3EBE8]/45 text-sm leading-relaxed max-w-xs`,children:`Access control, user management, and system configuration — unified in one secure interface.`}),(0,i.jsx)(`div`,{className:`mt-9 flex flex-col gap-3`,children:[`Role-based access control`,`Real-time audit logs`,`Multi-level permissions`].map(e=>(0,i.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,i.jsx)(`div`,{className:`w-1.5 h-1.5 rounded-full bg-[#D4A017] shrink-0`}),(0,i.jsx)(`span`,{className:`text-[#E3EBE8]/55 text-sm font-medium`,children:e})]},e))})]}),(0,i.jsx)(`div`,{className:`relative z-10 anim-fade`,style:{animationDelay:`0.2s`},children:(0,i.jsxs)(`p`,{className:`text-[#E3EBE8]/25 text-xs`,children:[`© `,new Date().getFullYear(),` `,a,`. All rights reserved.`]})})]}),(0,i.jsxs)(`div`,{className:`flex-1 flex flex-col items-center justify-center bg-white px-8 py-12 min-h-screen`,children:[(0,i.jsxs)(`div`,{className:`lg:hidden mb-10 flex items-center gap-3 anim-down`,children:[(0,i.jsx)(`div`,{className:`w-9 h-9 rounded-[0.6rem] flex items-center justify-center text-sm font-bold overflow-hidden ${o?``:`bg-[#3D4E4B] text-white`}`,children:o?(0,i.jsx)(`img`,{src:o,alt:a,className:`w-full h-full object-contain`}):s}),(0,i.jsx)(`span`,{className:`text-[#3D4E4B] font-bold text-base tracking-tight`,children:a})]}),(0,i.jsx)(`div`,{className:`w-full max-w-[360px]`,children:e}),(0,i.jsx)(`div`,{className:`mt-10 anim-fade`,style:{animationDelay:`0.35s`},children:(0,i.jsxs)(n,{href:`/`,className:`inline-flex items-center gap-1.5 text-xs font-semibold text-gray-300 hover:text-[#3D4E4B] transition-colors duration-200 tracking-tight`,children:[(0,i.jsx)(`svg`,{className:`w-3.5 h-3.5`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2.5,children:(0,i.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M10 19l-7-7m0 0l7-7m-7 7h18`})}),`Back to home`]})})]})]})}export{a as t};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{d as e,s as t}from"./app-BJ7g6sa8.js";var n=e(t(),1);function r({children:e}){return(0,n.createPortal)(e,document.body)}export{r as t};
import{d as e,s as t}from"./app-CBC6ZGaO.js";var n=e(t(),1);function r({children:e}){return(0,n.createPortal)(e,document.body)}export{r as t};
@@ -1 +1 @@
import{t as e}from"./app-BJ7g6sa8.js";var t=e();function n({className:e=``,disabled:n,children:r,...i}){return(0,t.jsx)(`button`,{...i,className:`inline-flex items-center rounded-md border border-transparent bg-gray-800 px-4 py-2 text-xs font-bold tracking-tight text-white transition duration-150 ease-in-out hover:bg-gray-700 focus:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 active:bg-gray-900 ${n&&`opacity-25`} `+e,disabled:n,children:r})}export{n as t};
import{t as e}from"./app-CBC6ZGaO.js";var t=e();function n({className:e=``,disabled:n,children:r,...i}){return(0,t.jsx)(`button`,{...i,className:`inline-flex items-center rounded-md border border-transparent bg-gray-800 px-4 py-2 text-xs font-bold tracking-tight text-white transition duration-150 ease-in-out hover:bg-gray-700 focus:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 active:bg-gray-900 ${n&&`opacity-25`} `+e,disabled:n,children:r})}export{n as t};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{a as e,c as t,n,t as r}from"./app-BJ7g6sa8.js";import{t as i}from"./GuestLayout-CN-YY0cs.js";t();var a=r();function o({token:t,email:r}){let{data:o,setData:s,post:c,processing:l,errors:u,reset:d}=e({token:t,email:r,password:``,password_confirmation:``});return(0,a.jsxs)(i,{children:[(0,a.jsx)(n,{title:`Reset password`}),(0,a.jsxs)(`div`,{className:`mb-8 anim-down`,children:[(0,a.jsx)(`h1`,{className:`text-2xl font-bold text-[#1A2421] tracking-tight`,children:`Set new password`}),(0,a.jsxs)(`p`,{className:`mt-1.5 text-sm text-gray-400 font-medium`,children:[`Choose a strong password for `,(0,a.jsx)(`span`,{className:`text-[#3D4E4B] font-semibold`,children:r}),`.`]})]}),(0,a.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(route(`password.store`),{onFinish:()=>d(`password`,`password_confirmation`)})},className:`space-y-4 anim-up`,style:{animationDelay:`0.1s`},children:[(0,a.jsx)(`input`,{type:`hidden`,value:o.email}),(0,a.jsx)(`input`,{type:`hidden`,value:o.token}),(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`label`,{htmlFor:`password`,className:`block text-sm font-semibold text-gray-600 mb-1.5`,children:`New password`}),(0,a.jsx)(`input`,{id:`password`,type:`password`,autoComplete:`new-password`,autoFocus:!0,value:o.password,onChange:e=>s(`password`,e.target.value),placeholder:`Min. 8 characters`,className:`auth-input${u.password?` !border-red-300 !bg-red-50/50`:``}`}),u.password&&(0,a.jsx)(`p`,{className:`mt-1.5 text-xs font-semibold text-red-500`,children:u.password})]}),(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`label`,{htmlFor:`password_confirmation`,className:`block text-sm font-semibold text-gray-600 mb-1.5`,children:`Confirm new password`}),(0,a.jsx)(`input`,{id:`password_confirmation`,type:`password`,autoComplete:`new-password`,value:o.password_confirmation,onChange:e=>s(`password_confirmation`,e.target.value),placeholder:`••••••••`,className:`auth-input${u.password_confirmation?` !border-red-300 !bg-red-50/50`:``}`}),u.password_confirmation&&(0,a.jsx)(`p`,{className:`mt-1.5 text-xs font-semibold text-red-500`,children:u.password_confirmation})]}),(0,a.jsx)(`button`,{type:`submit`,disabled:l,className:`mt-2 w-full h-11 rounded-xl bg-[#3D4E4B] hover:bg-[#2D3A38] text-white text-sm font-bold tracking-tight transition-colors duration-200 flex items-center justify-center gap-2 disabled:opacity-60 disabled:cursor-not-allowed`,children:l?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(`svg`,{className:`w-4 h-4 animate-spin text-white/60`,fill:`none`,viewBox:`0 0 24 24`,children:[(0,a.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,a.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})]}),`Saving…`]}):`Reset password`})]})]})}export{o as default};
import{a as e,c as t,n,t as r}from"./app-CBC6ZGaO.js";import{t as i}from"./GuestLayout-DUQXV9II.js";t();var a=r();function o({token:t,email:r}){let{data:o,setData:s,post:c,processing:l,errors:u,reset:d}=e({token:t,email:r,password:``,password_confirmation:``});return(0,a.jsxs)(i,{children:[(0,a.jsx)(n,{title:`Reset password`}),(0,a.jsxs)(`div`,{className:`mb-8 anim-down`,children:[(0,a.jsx)(`h1`,{className:`text-2xl font-bold text-[#1A2421] tracking-tight`,children:`Set new password`}),(0,a.jsxs)(`p`,{className:`mt-1.5 text-sm text-gray-400 font-medium`,children:[`Choose a strong password for `,(0,a.jsx)(`span`,{className:`text-[#3D4E4B] font-semibold`,children:r}),`.`]})]}),(0,a.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(route(`password.store`),{onFinish:()=>d(`password`,`password_confirmation`)})},className:`space-y-4 anim-up`,style:{animationDelay:`0.1s`},children:[(0,a.jsx)(`input`,{type:`hidden`,value:o.email}),(0,a.jsx)(`input`,{type:`hidden`,value:o.token}),(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`label`,{htmlFor:`password`,className:`block text-sm font-semibold text-gray-600 mb-1.5`,children:`New password`}),(0,a.jsx)(`input`,{id:`password`,type:`password`,autoComplete:`new-password`,autoFocus:!0,value:o.password,onChange:e=>s(`password`,e.target.value),placeholder:`Min. 8 characters`,className:`auth-input${u.password?` !border-red-300 !bg-red-50/50`:``}`}),u.password&&(0,a.jsx)(`p`,{className:`mt-1.5 text-xs font-semibold text-red-500`,children:u.password})]}),(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`label`,{htmlFor:`password_confirmation`,className:`block text-sm font-semibold text-gray-600 mb-1.5`,children:`Confirm new password`}),(0,a.jsx)(`input`,{id:`password_confirmation`,type:`password`,autoComplete:`new-password`,value:o.password_confirmation,onChange:e=>s(`password_confirmation`,e.target.value),placeholder:`••••••••`,className:`auth-input${u.password_confirmation?` !border-red-300 !bg-red-50/50`:``}`}),u.password_confirmation&&(0,a.jsx)(`p`,{className:`mt-1.5 text-xs font-semibold text-red-500`,children:u.password_confirmation})]}),(0,a.jsx)(`button`,{type:`submit`,disabled:l,className:`mt-2 w-full h-11 rounded-xl bg-[#3D4E4B] hover:bg-[#2D3A38] text-white text-sm font-bold tracking-tight transition-colors duration-200 flex items-center justify-center gap-2 disabled:opacity-60 disabled:cursor-not-allowed`,children:l?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(`svg`,{className:`w-4 h-4 animate-spin text-white/60`,fill:`none`,viewBox:`0 0 24 24`,children:[(0,a.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,a.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})]}),`Saving…`]}):`Reset password`})]})]})}export{o as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
import{c as e,d as t,t as n}from"./app-BJ7g6sa8.js";var r=n();function i({message:e,className:t=``,...n}){return e?(0,r.jsx)(`p`,{...n,className:`text-sm text-red-600 `+t,children:e}):null}function a({value:e,className:t=``,children:n,...i}){return(0,r.jsx)(`label`,{...i,className:`block text-sm font-medium text-gray-700 `+t,children:e||n})}var o=t(e(),1),s=Object.defineProperty,c=(e,t,n)=>t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,l=(e,t,n)=>(c(e,typeof t==`symbol`?t:t+``,n),n),u=new class{constructor(){l(this,`current`,this.detect()),l(this,`handoffState`,`pending`),l(this,`currentId`,0)}set(e){this.current!==e&&(this.handoffState=`pending`,this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current===`server`}get isClient(){return this.current===`client`}detect(){return typeof window>`u`||typeof document>`u`?`server`:`client`}handoff(){this.handoffState===`pending`&&(this.handoffState=`complete`)}get isHandoffComplete(){return this.handoffState===`complete`}};function d(e){typeof queueMicrotask==`function`?queueMicrotask(e):Promise.resolve().then(e).catch(e=>setTimeout(()=>{throw e}))}function f(){let e=[],t={addEventListener(e,n,r,i){return e.addEventListener(n,r,i),t.add(()=>e.removeEventListener(n,r,i))},requestAnimationFrame(...e){let n=requestAnimationFrame(...e);return t.add(()=>cancelAnimationFrame(n))},nextFrame(...e){return t.requestAnimationFrame(()=>t.requestAnimationFrame(...e))},setTimeout(...e){let n=setTimeout(...e);return t.add(()=>clearTimeout(n))},microTask(...e){let n={current:!0};return d(()=>{n.current&&e[0]()}),t.add(()=>{n.current=!1})},style(e,t,n){let r=e.style.getPropertyValue(t);return Object.assign(e.style,{[t]:n}),this.add(()=>{Object.assign(e.style,{[t]:r})})},group(e){let t=f();return e(t),this.add(()=>t.dispose())},add(t){return e.includes(t)||e.push(t),()=>{let n=e.indexOf(t);if(n>=0)for(let t of e.splice(n,1))t()}},dispose(){for(let t of e.splice(0))t()}};return t}function p(){let[e]=(0,o.useState)(f);return(0,o.useEffect)(()=>()=>e.dispose(),[e]),e}var m=(e,t)=>{u.isServer?(0,o.useEffect)(e,t):(0,o.useLayoutEffect)(e,t)};function h(e){let t=(0,o.useRef)(e);return m(()=>{t.current=e},[e]),t}var g=function(e){let t=h(e);return o.useCallback((...e)=>t.current(...e),[t])};function _(...e){return Array.from(new Set(e.flatMap(e=>typeof e==`string`?e.split(` `):[]))).filter(Boolean).join(` `)}function v(e,t,...n){if(e in t){let r=t[e];return typeof r==`function`?r(...n):r}let r=Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map(e=>`"${e}"`).join(`, `)}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,v),r}var y=(e=>(e[e.None=0]=`None`,e[e.RenderStrategy=1]=`RenderStrategy`,e[e.Static=2]=`Static`,e))(y||{}),b=(e=>(e[e.Unmount=0]=`Unmount`,e[e.Hidden=1]=`Hidden`,e))(b||{});function x(){let e=ee();return(0,o.useCallback)(t=>S({mergeRefs:e,...t}),[e])}function S({ourProps:e,theirProps:t,slot:n,defaultTag:r,features:i,visible:a=!0,name:o,mergeRefs:s}){s??=w;let c=T(t,e);if(a)return C(c,n,r,o,s);let l=i??0;if(l&2){let{static:e=!1,...t}=c;if(e)return C(t,n,r,o,s)}if(l&1){let{unmount:e=!0,...t}=c;return v(+!e,{0(){return null},1(){return C({...t,hidden:!0,style:{display:`none`}},n,r,o,s)}})}return C(c,n,r,o,s)}function C(e,t={},n,r,i){let{as:a=n,children:s,refName:c=`ref`,...l}=O(e,[`unmount`,`static`]),u=e.ref===void 0?{}:{[c]:e.ref},d=typeof s==`function`?s(t):s;d=A(d),`className`in l&&l.className&&typeof l.className==`function`&&(l.className=l.className(t)),l[`aria-labelledby`]&&l[`aria-labelledby`]===l.id&&(l[`aria-labelledby`]=void 0);let f={};if(t){let e=!1,n=[];for(let[r,i]of Object.entries(t))typeof i==`boolean`&&(e=!0),i===!0&&n.push(r.replace(/([A-Z])/g,e=>`-${e.toLowerCase()}`));if(e){f[`data-headlessui-state`]=n.join(` `);for(let e of n)f[`data-${e}`]=``}}if(j(a)&&(Object.keys(D(l)).length>0||Object.keys(D(f)).length>0))if(!(0,o.isValidElement)(d)||Array.isArray(d)&&d.length>1||M(d)){if(Object.keys(D(l)).length>0)throw Error([`Passing props on "Fragment"!`,``,`The current component <${r} /> is rendering a "Fragment".`,`However we need to passthrough the following props:`,Object.keys(D(l)).concat(Object.keys(D(f))).map(e=>` - ${e}`).join(`
import{c as e,d as t,t as n}from"./app-CBC6ZGaO.js";var r=n();function i({message:e,className:t=``,...n}){return e?(0,r.jsx)(`p`,{...n,className:`text-sm text-red-600 `+t,children:e}):null}function a({value:e,className:t=``,children:n,...i}){return(0,r.jsx)(`label`,{...i,className:`block text-sm font-medium text-gray-700 `+t,children:e||n})}var o=t(e(),1),s=Object.defineProperty,c=(e,t,n)=>t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,l=(e,t,n)=>(c(e,typeof t==`symbol`?t:t+``,n),n),u=new class{constructor(){l(this,`current`,this.detect()),l(this,`handoffState`,`pending`),l(this,`currentId`,0)}set(e){this.current!==e&&(this.handoffState=`pending`,this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current===`server`}get isClient(){return this.current===`client`}detect(){return typeof window>`u`||typeof document>`u`?`server`:`client`}handoff(){this.handoffState===`pending`&&(this.handoffState=`complete`)}get isHandoffComplete(){return this.handoffState===`complete`}};function d(e){typeof queueMicrotask==`function`?queueMicrotask(e):Promise.resolve().then(e).catch(e=>setTimeout(()=>{throw e}))}function f(){let e=[],t={addEventListener(e,n,r,i){return e.addEventListener(n,r,i),t.add(()=>e.removeEventListener(n,r,i))},requestAnimationFrame(...e){let n=requestAnimationFrame(...e);return t.add(()=>cancelAnimationFrame(n))},nextFrame(...e){return t.requestAnimationFrame(()=>t.requestAnimationFrame(...e))},setTimeout(...e){let n=setTimeout(...e);return t.add(()=>clearTimeout(n))},microTask(...e){let n={current:!0};return d(()=>{n.current&&e[0]()}),t.add(()=>{n.current=!1})},style(e,t,n){let r=e.style.getPropertyValue(t);return Object.assign(e.style,{[t]:n}),this.add(()=>{Object.assign(e.style,{[t]:r})})},group(e){let t=f();return e(t),this.add(()=>t.dispose())},add(t){return e.includes(t)||e.push(t),()=>{let n=e.indexOf(t);if(n>=0)for(let t of e.splice(n,1))t()}},dispose(){for(let t of e.splice(0))t()}};return t}function p(){let[e]=(0,o.useState)(f);return(0,o.useEffect)(()=>()=>e.dispose(),[e]),e}var m=(e,t)=>{u.isServer?(0,o.useEffect)(e,t):(0,o.useLayoutEffect)(e,t)};function h(e){let t=(0,o.useRef)(e);return m(()=>{t.current=e},[e]),t}var g=function(e){let t=h(e);return o.useCallback((...e)=>t.current(...e),[t])};function _(...e){return Array.from(new Set(e.flatMap(e=>typeof e==`string`?e.split(` `):[]))).filter(Boolean).join(` `)}function v(e,t,...n){if(e in t){let r=t[e];return typeof r==`function`?r(...n):r}let r=Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map(e=>`"${e}"`).join(`, `)}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,v),r}var y=(e=>(e[e.None=0]=`None`,e[e.RenderStrategy=1]=`RenderStrategy`,e[e.Static=2]=`Static`,e))(y||{}),b=(e=>(e[e.Unmount=0]=`Unmount`,e[e.Hidden=1]=`Hidden`,e))(b||{});function x(){let e=ee();return(0,o.useCallback)(t=>S({mergeRefs:e,...t}),[e])}function S({ourProps:e,theirProps:t,slot:n,defaultTag:r,features:i,visible:a=!0,name:o,mergeRefs:s}){s??=w;let c=T(t,e);if(a)return C(c,n,r,o,s);let l=i??0;if(l&2){let{static:e=!1,...t}=c;if(e)return C(t,n,r,o,s)}if(l&1){let{unmount:e=!0,...t}=c;return v(+!e,{0(){return null},1(){return C({...t,hidden:!0,style:{display:`none`}},n,r,o,s)}})}return C(c,n,r,o,s)}function C(e,t={},n,r,i){let{as:a=n,children:s,refName:c=`ref`,...l}=O(e,[`unmount`,`static`]),u=e.ref===void 0?{}:{[c]:e.ref},d=typeof s==`function`?s(t):s;d=A(d),`className`in l&&l.className&&typeof l.className==`function`&&(l.className=l.className(t)),l[`aria-labelledby`]&&l[`aria-labelledby`]===l.id&&(l[`aria-labelledby`]=void 0);let f={};if(t){let e=!1,n=[];for(let[r,i]of Object.entries(t))typeof i==`boolean`&&(e=!0),i===!0&&n.push(r.replace(/([A-Z])/g,e=>`-${e.toLowerCase()}`));if(e){f[`data-headlessui-state`]=n.join(` `);for(let e of n)f[`data-${e}`]=``}}if(j(a)&&(Object.keys(D(l)).length>0||Object.keys(D(f)).length>0))if(!(0,o.isValidElement)(d)||Array.isArray(d)&&d.length>1||M(d)){if(Object.keys(D(l)).length>0)throw Error([`Passing props on "Fragment"!`,``,`The current component <${r} /> is rendering a "Fragment".`,`However we need to passthrough the following props:`,Object.keys(D(l)).concat(Object.keys(D(f))).map(e=>` - ${e}`).join(`
`),``,`You can apply a few solutions:`,['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',`Render a single element as the child so that we can forward the props onto that element.`].map(e=>` - ${e}`).join(`
`)].join(`
`))}else{let e=d.props?.className,t=typeof e==`function`?(...t)=>_(e(...t),l.className):_(e,l.className),n=t?{className:t}:{},r=T(d.props,D(O(l,[`ref`])));for(let e in f)e in r&&delete f[e];return(0,o.cloneElement)(d,Object.assign({},r,f,u,{ref:i(k(d),u.ref)},n))}return(0,o.createElement)(a,Object.assign({},O(l,[`ref`]),!j(a)&&u,!j(a)&&f),d)}function ee(){let e=(0,o.useRef)([]),t=(0,o.useCallback)(t=>{for(let n of e.current)n!=null&&(typeof n==`function`?n(t):n.current=t)},[]);return(...n)=>{if(!n.every(e=>e==null))return e.current=n,t}}function w(...e){return e.every(e=>e==null)?void 0:t=>{for(let n of e)n!=null&&(typeof n==`function`?n(t):n.current=t)}}function T(...e){if(e.length===0)return{};if(e.length===1)return e[0];let t={},n={};for(let r of e)for(let e in r)e.startsWith(`on`)&&typeof r[e]==`function`?(n[e]??(n[e]=[]),n[e].push(r[e])):t[e]=r[e];if(t.disabled||t[`aria-disabled`])for(let e in n)/^(on(?:Click|Pointer|Mouse|Key)(?:Down|Up|Press)?)$/.test(e)&&(n[e]=[e=>(e?.preventDefault)?.call(e)]);for(let e in n)Object.assign(t,{[e](t,...r){let i=n[e];for(let e of i){if((t instanceof Event||t?.nativeEvent instanceof Event)&&t.defaultPrevented)return;e(t,...r)}}});return t}function E(e){return Object.assign((0,o.forwardRef)(e),{displayName:e.displayName??e.name})}function D(e){let t=Object.assign({},e);for(let e in t)t[e]===void 0&&delete t[e];return t}function O(e,t=[]){let n=Object.assign({},e);for(let e of t)e in n&&delete n[e];return n}function k(e){return`18.3.1`.split(`.`)[0]>=`19`?e.props.ref:e.ref}function A(e){if(e!=null&&e.$$typeof===Symbol.for(`react.lazy`)){let t=e._payload;if(t!=null&&t.status===`fulfilled`)return A(t.value)}return e}function j(e){return e===o.Fragment||e===Symbol.for(`react.fragment`)}function M(e){return j(e.type)}var N=Symbol();function P(e,t=!0){return Object.assign(e,{[N]:t})}function F(...e){let t=(0,o.useRef)(e);(0,o.useEffect)(()=>{t.current=e},[e]);let n=g(e=>{for(let n of t.current)n!=null&&(typeof n==`function`?n(e):n.current=e)});return e.every(e=>e==null||e?.[N])?void 0:n}function I(e=0){let[t,n]=(0,o.useState)(e);return{flags:t,setFlag:(0,o.useCallback)(e=>n(e),[]),addFlag:(0,o.useCallback)(e=>n(t=>t|e),[]),hasFlag:(0,o.useCallback)(e=>(t&e)===e,[t]),removeFlag:(0,o.useCallback)(e=>n(t=>t&~e),[]),toggleFlag:(0,o.useCallback)(e=>n(t=>t^e),[])}}typeof process<`u`&&typeof globalThis<`u`&&typeof Element<`u`&&(process==null?void 0:{})?.NODE_ENV===`test`&&(Element==null?void 0:Element.prototype)?.getAnimations===void 0&&(Element.prototype.getAnimations=function(){return console.warn(["Headless UI has polyfilled `Element.prototype.getAnimations` for your tests.","Please install a proper polyfill e.g. `jsdom-testing-mocks`, to silence these warnings.",``,`Example usage:`,"```js",`import { mockAnimationsApi } from 'jsdom-testing-mocks'`,`mockAnimationsApi()`,"```"].join(`
@@ -1 +1 @@
import{a as e,c as t,d as n,t as r}from"./app-BJ7g6sa8.js";import{C as i,S as a,n as o,t as s}from"./TextInput-DV7QeRn3.js";import{t as c}from"./PrimaryButton-KeVcwQeg.js";var l=n(t(),1),u=r();function d({className:t=``}){let n=(0,l.useRef)(),r=(0,l.useRef)(),{data:d,setData:f,errors:p,put:m,reset:h,processing:g,recentlySuccessful:_}=e({current_password:``,password:``,password_confirmation:``});return(0,u.jsxs)(`section`,{className:t,children:[(0,u.jsxs)(`header`,{children:[(0,u.jsx)(`h2`,{className:`text-lg font-medium text-gray-900`,children:`Update Password`}),(0,u.jsx)(`p`,{className:`mt-1 text-sm text-gray-600`,children:`Ensure your account is using a long, random password to stay secure.`})]}),(0,u.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),m(route(`password.update`),{preserveScroll:!0,onSuccess:()=>h(),onError:e=>{e.password&&(h(`password`,`password_confirmation`),n.current.focus()),e.current_password&&(h(`current_password`),r.current.focus())}})},className:`mt-6 space-y-6`,children:[(0,u.jsxs)(`div`,{children:[(0,u.jsx)(a,{htmlFor:`current_password`,value:`Current Password`}),(0,u.jsx)(s,{id:`current_password`,ref:r,value:d.current_password,onChange:e=>f(`current_password`,e.target.value),type:`password`,className:`mt-1 block w-full`,autoComplete:`current-password`}),(0,u.jsx)(i,{message:p.current_password,className:`mt-2`})]}),(0,u.jsxs)(`div`,{children:[(0,u.jsx)(a,{htmlFor:`password`,value:`New Password`}),(0,u.jsx)(s,{id:`password`,ref:n,value:d.password,onChange:e=>f(`password`,e.target.value),type:`password`,className:`mt-1 block w-full`,autoComplete:`new-password`}),(0,u.jsx)(i,{message:p.password,className:`mt-2`})]}),(0,u.jsxs)(`div`,{children:[(0,u.jsx)(a,{htmlFor:`password_confirmation`,value:`Confirm Password`}),(0,u.jsx)(s,{id:`password_confirmation`,value:d.password_confirmation,onChange:e=>f(`password_confirmation`,e.target.value),type:`password`,className:`mt-1 block w-full`,autoComplete:`new-password`}),(0,u.jsx)(i,{message:p.password_confirmation,className:`mt-2`})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,u.jsx)(c,{disabled:g,children:`Save`}),(0,u.jsx)(o,{show:_,enter:`transition ease-in-out`,enterFrom:`opacity-0`,leave:`transition ease-in-out`,leaveTo:`opacity-0`,children:(0,u.jsx)(`p`,{className:`text-sm text-gray-600`,children:`Saved.`})})]})]})]})}export{d as default};
import{a as e,c as t,d as n,t as r}from"./app-CBC6ZGaO.js";import{C as i,S as a,n as o,t as s}from"./TextInput--H1JolRE.js";import{t as c}from"./PrimaryButton-DMaDfcck.js";var l=n(t(),1),u=r();function d({className:t=``}){let n=(0,l.useRef)(),r=(0,l.useRef)(),{data:d,setData:f,errors:p,put:m,reset:h,processing:g,recentlySuccessful:_}=e({current_password:``,password:``,password_confirmation:``});return(0,u.jsxs)(`section`,{className:t,children:[(0,u.jsxs)(`header`,{children:[(0,u.jsx)(`h2`,{className:`text-lg font-medium text-gray-900`,children:`Update Password`}),(0,u.jsx)(`p`,{className:`mt-1 text-sm text-gray-600`,children:`Ensure your account is using a long, random password to stay secure.`})]}),(0,u.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),m(route(`password.update`),{preserveScroll:!0,onSuccess:()=>h(),onError:e=>{e.password&&(h(`password`,`password_confirmation`),n.current.focus()),e.current_password&&(h(`current_password`),r.current.focus())}})},className:`mt-6 space-y-6`,children:[(0,u.jsxs)(`div`,{children:[(0,u.jsx)(a,{htmlFor:`current_password`,value:`Current Password`}),(0,u.jsx)(s,{id:`current_password`,ref:r,value:d.current_password,onChange:e=>f(`current_password`,e.target.value),type:`password`,className:`mt-1 block w-full`,autoComplete:`current-password`}),(0,u.jsx)(i,{message:p.current_password,className:`mt-2`})]}),(0,u.jsxs)(`div`,{children:[(0,u.jsx)(a,{htmlFor:`password`,value:`New Password`}),(0,u.jsx)(s,{id:`password`,ref:n,value:d.password,onChange:e=>f(`password`,e.target.value),type:`password`,className:`mt-1 block w-full`,autoComplete:`new-password`}),(0,u.jsx)(i,{message:p.password,className:`mt-2`})]}),(0,u.jsxs)(`div`,{children:[(0,u.jsx)(a,{htmlFor:`password_confirmation`,value:`Confirm Password`}),(0,u.jsx)(s,{id:`password_confirmation`,value:d.password_confirmation,onChange:e=>f(`password_confirmation`,e.target.value),type:`password`,className:`mt-1 block w-full`,autoComplete:`new-password`}),(0,u.jsx)(i,{message:p.password_confirmation,className:`mt-2`})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,u.jsx)(c,{disabled:g,children:`Save`}),(0,u.jsx)(o,{show:_,enter:`transition ease-in-out`,enterFrom:`opacity-0`,leave:`transition ease-in-out`,leaveTo:`opacity-0`,children:(0,u.jsx)(`p`,{className:`text-sm text-gray-600`,children:`Saved.`})})]})]})]})}export{d as default};
@@ -1 +1 @@
import{a as e,o as t,r as n,t as r}from"./app-BJ7g6sa8.js";import{C as i,S as a,n as o,t as s}from"./TextInput-DV7QeRn3.js";import{t as c}from"./PrimaryButton-KeVcwQeg.js";var l=r();function u({mustVerifyEmail:r,status:u,className:d=``}){let f=t().props.auth.user,{data:p,setData:m,patch:h,errors:g,processing:_,recentlySuccessful:v}=e({name:f.name,email:f.email});return(0,l.jsxs)(`section`,{className:d,children:[(0,l.jsxs)(`header`,{children:[(0,l.jsx)(`h2`,{className:`text-lg font-medium text-gray-900`,children:`Profile Information`}),(0,l.jsx)(`p`,{className:`mt-1 text-sm text-gray-600`,children:`Update your account's profile information and email address.`})]}),(0,l.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),h(route(`profile.update`))},className:`mt-6 space-y-6`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(a,{htmlFor:`name`,value:`Name`}),(0,l.jsx)(s,{id:`name`,className:`mt-1 block w-full`,value:p.name,onChange:e=>m(`name`,e.target.value),required:!0,isFocused:!0,autoComplete:`name`}),(0,l.jsx)(i,{className:`mt-2`,message:g.name})]}),(0,l.jsxs)(`div`,{children:[(0,l.jsx)(a,{htmlFor:`email`,value:`Email`}),(0,l.jsx)(s,{id:`email`,type:`email`,className:`mt-1 block w-full`,value:p.email,onChange:e=>m(`email`,e.target.value),required:!0,autoComplete:`username`}),(0,l.jsx)(i,{className:`mt-2`,message:g.email})]}),r&&f.email_verified_at===null&&(0,l.jsxs)(`div`,{children:[(0,l.jsxs)(`p`,{className:`mt-2 text-sm text-gray-800`,children:[`Your email address is unverified.`,(0,l.jsx)(n,{href:route(`verification.send`),method:`post`,as:`button`,className:`rounded-md text-sm text-gray-600 underline hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2`,children:`Click here to re-send the verification email.`})]}),u===`verification-link-sent`&&(0,l.jsx)(`div`,{className:`mt-2 text-sm font-medium text-green-600`,children:`A new verification link has been sent to your email address.`})]}),(0,l.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,l.jsx)(c,{disabled:_,children:`Save`}),(0,l.jsx)(o,{show:v,enter:`transition ease-in-out`,enterFrom:`opacity-0`,leave:`transition ease-in-out`,leaveTo:`opacity-0`,children:(0,l.jsx)(`p`,{className:`text-sm text-gray-600`,children:`Saved.`})})]})]})]})}export{u as default};
import{a as e,o as t,r as n,t as r}from"./app-CBC6ZGaO.js";import{C as i,S as a,n as o,t as s}from"./TextInput--H1JolRE.js";import{t as c}from"./PrimaryButton-DMaDfcck.js";var l=r();function u({mustVerifyEmail:r,status:u,className:d=``}){let f=t().props.auth.user,{data:p,setData:m,patch:h,errors:g,processing:_,recentlySuccessful:v}=e({name:f.name,email:f.email});return(0,l.jsxs)(`section`,{className:d,children:[(0,l.jsxs)(`header`,{children:[(0,l.jsx)(`h2`,{className:`text-lg font-medium text-gray-900`,children:`Profile Information`}),(0,l.jsx)(`p`,{className:`mt-1 text-sm text-gray-600`,children:`Update your account's profile information and email address.`})]}),(0,l.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),h(route(`profile.update`))},className:`mt-6 space-y-6`,children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(a,{htmlFor:`name`,value:`Name`}),(0,l.jsx)(s,{id:`name`,className:`mt-1 block w-full`,value:p.name,onChange:e=>m(`name`,e.target.value),required:!0,isFocused:!0,autoComplete:`name`}),(0,l.jsx)(i,{className:`mt-2`,message:g.name})]}),(0,l.jsxs)(`div`,{children:[(0,l.jsx)(a,{htmlFor:`email`,value:`Email`}),(0,l.jsx)(s,{id:`email`,type:`email`,className:`mt-1 block w-full`,value:p.email,onChange:e=>m(`email`,e.target.value),required:!0,autoComplete:`username`}),(0,l.jsx)(i,{className:`mt-2`,message:g.email})]}),r&&f.email_verified_at===null&&(0,l.jsxs)(`div`,{children:[(0,l.jsxs)(`p`,{className:`mt-2 text-sm text-gray-800`,children:[`Your email address is unverified.`,(0,l.jsx)(n,{href:route(`verification.send`),method:`post`,as:`button`,className:`rounded-md text-sm text-gray-600 underline hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2`,children:`Click here to re-send the verification email.`})]}),u===`verification-link-sent`&&(0,l.jsx)(`div`,{className:`mt-2 text-sm font-medium text-green-600`,children:`A new verification link has been sent to your email address.`})]}),(0,l.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,l.jsx)(c,{disabled:_,children:`Save`}),(0,l.jsx)(o,{show:v,enter:`transition ease-in-out`,enterFrom:`opacity-0`,leave:`transition ease-in-out`,leaveTo:`opacity-0`,children:(0,l.jsx)(`p`,{className:`text-sm text-gray-600`,children:`Saved.`})})]})]})]})}export{u as default};
@@ -1 +1 @@
import{a as e,c as t,n,r,t as i}from"./app-BJ7g6sa8.js";import{t as a}from"./GuestLayout-CN-YY0cs.js";t();var o=i();function s({status:t}){let{post:i,processing:s}=e({});return(0,o.jsxs)(a,{children:[(0,o.jsx)(n,{title:`Verify email`}),(0,o.jsxs)(`div`,{className:`mb-8 anim-down`,children:[(0,o.jsx)(`div`,{className:`w-12 h-12 bg-[#3D4E4B]/5 rounded-2xl flex items-center justify-center mb-6`,children:(0,o.jsx)(`svg`,{className:`w-5 h-5 text-[#3D4E4B]`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2,children:(0,o.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z`})})}),(0,o.jsx)(`h1`,{className:`text-2xl font-bold text-[#1A2421] tracking-tight`,children:`Check your email`}),(0,o.jsx)(`p`,{className:`mt-1.5 text-sm text-gray-400 font-medium leading-relaxed`,children:`We sent a verification link to your email address. Click the link to activate your account.`})]}),t===`verification-link-sent`&&(0,o.jsx)(`div`,{className:`mb-6 px-4 py-3 rounded-xl bg-emerald-50 border border-emerald-100 text-sm font-semibold text-emerald-700 anim-fade`,children:`A new verification link has been sent to your email.`}),(0,o.jsx)(`form`,{onSubmit:e=>{e.preventDefault(),i(route(`verification.send`))},className:`anim-up`,style:{animationDelay:`0.1s`},children:(0,o.jsx)(`button`,{type:`submit`,disabled:s,className:`w-full h-11 rounded-xl bg-[#3D4E4B] hover:bg-[#2D3A38] text-white text-sm font-bold tracking-tight transition-colors duration-200 flex items-center justify-center gap-2 disabled:opacity-60 disabled:cursor-not-allowed`,children:s?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(`svg`,{className:`w-4 h-4 animate-spin text-white/60`,fill:`none`,viewBox:`0 0 24 24`,children:[(0,o.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,o.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})]}),`Sending…`]}):`Resend verification email`})}),(0,o.jsx)(`div`,{className:`mt-5 text-center anim-fade`,style:{animationDelay:`0.18s`},children:(0,o.jsx)(r,{href:route(`logout`),method:`post`,as:`button`,className:`text-sm font-semibold text-gray-400 hover:text-[#3D4E4B] transition-colors duration-200`,children:`Sign out`})})]})}export{s as default};
import{a as e,c as t,n,r,t as i}from"./app-CBC6ZGaO.js";import{t as a}from"./GuestLayout-DUQXV9II.js";t();var o=i();function s({status:t}){let{post:i,processing:s}=e({});return(0,o.jsxs)(a,{children:[(0,o.jsx)(n,{title:`Verify email`}),(0,o.jsxs)(`div`,{className:`mb-8 anim-down`,children:[(0,o.jsx)(`div`,{className:`w-12 h-12 bg-[#3D4E4B]/5 rounded-2xl flex items-center justify-center mb-6`,children:(0,o.jsx)(`svg`,{className:`w-5 h-5 text-[#3D4E4B]`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2,children:(0,o.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z`})})}),(0,o.jsx)(`h1`,{className:`text-2xl font-bold text-[#1A2421] tracking-tight`,children:`Check your email`}),(0,o.jsx)(`p`,{className:`mt-1.5 text-sm text-gray-400 font-medium leading-relaxed`,children:`We sent a verification link to your email address. Click the link to activate your account.`})]}),t===`verification-link-sent`&&(0,o.jsx)(`div`,{className:`mb-6 px-4 py-3 rounded-xl bg-emerald-50 border border-emerald-100 text-sm font-semibold text-emerald-700 anim-fade`,children:`A new verification link has been sent to your email.`}),(0,o.jsx)(`form`,{onSubmit:e=>{e.preventDefault(),i(route(`verification.send`))},className:`anim-up`,style:{animationDelay:`0.1s`},children:(0,o.jsx)(`button`,{type:`submit`,disabled:s,className:`w-full h-11 rounded-xl bg-[#3D4E4B] hover:bg-[#2D3A38] text-white text-sm font-bold tracking-tight transition-colors duration-200 flex items-center justify-center gap-2 disabled:opacity-60 disabled:cursor-not-allowed`,children:s?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(`svg`,{className:`w-4 h-4 animate-spin text-white/60`,fill:`none`,viewBox:`0 0 24 24`,children:[(0,o.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,o.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})]}),`Sending…`]}):`Resend verification email`})}),(0,o.jsx)(`div`,{className:`mt-5 text-center anim-fade`,style:{animationDelay:`0.18s`},children:(0,o.jsx)(r,{href:route(`logout`),method:`post`,as:`button`,className:`text-sm font-semibold text-gray-400 hover:text-[#3D4E4B] transition-colors duration-200`,children:`Sign out`})})]})}export{s as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{c as e,n as t,t as n}from"./app-BJ7g6sa8.js";e();var r=n();function i({auth:e}){return(0,r.jsxs)(`div`,{className:`min-h-screen bg-[#E3EBE8] text-[#3D4E4B] font-sans`,children:[(0,r.jsx)(t,{title:`Xxx`}),(0,r.jsxs)(`div`,{className:`max-w-7xl mx-auto px-6 py-12`,children:[(0,r.jsx)(`h1`,{className:`text-3xl font-bold mb-8`,children:`Xxx Page`}),(0,r.jsx)(`div`,{className:`bg-white rounded-lg shadow-sm p-6`,children:(0,r.jsx)(`p`,{children:`This is the new xxx page content.`})})]})]})}export{i as default};
import{c as e,n as t,t as n}from"./app-CBC6ZGaO.js";e();var r=n();function i({auth:e}){return(0,r.jsxs)(`div`,{className:`min-h-screen bg-[#E3EBE8] text-[#3D4E4B] font-sans`,children:[(0,r.jsx)(t,{title:`Xxx`}),(0,r.jsxs)(`div`,{className:`max-w-7xl mx-auto px-6 py-12`,children:[(0,r.jsx)(`h1`,{className:`text-3xl font-bold mb-8`,children:`Xxx Page`}),(0,r.jsx)(`div`,{className:`bg-white rounded-lg shadow-sm p-6`,children:(0,r.jsx)(`p`,{children:`This is the new xxx page content.`})})]})]})}export{i as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
import{d as e,u as t}from"./app-BJ7g6sa8.js";var n=t(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self,n.Sweetalert2=r())})(e,(function(){function e(e,t,n){if(typeof e==`function`?e===t:e.has(t))return arguments.length<3?t:n;throw TypeError(`Private element is not present on this object`)}function t(e,t){if(t.has(e))throw TypeError(`Cannot initialize the same private elements twice on an object`)}function n(t,n){return t.get(e(t,n))}function r(e,n,r){t(e,n),n.set(e,r)}function i(t,n,r){return t.set(e(t,n),r),r}let a={},o=()=>{a.previousActiveElement instanceof HTMLElement?(a.previousActiveElement.focus(),a.previousActiveElement=null):document.body&&document.body.focus()},s=e=>new Promise(t=>{if(!e)return t();let n=window.scrollX,r=window.scrollY;a.restoreFocusTimeout=setTimeout(()=>{o(),t()},100),window.scrollTo(n,r)}),ee=`swal2-`,c=`container.shown.height-auto.iosfix.popup.modal.no-backdrop.no-transition.toast.toast-shown.show.hide.close.title.html-container.actions.confirm.deny.cancel.footer.icon.icon-content.image.input.file.range.select.radio.checkbox.label.textarea.inputerror.input-label.validation-message.progress-steps.active-progress-step.progress-step.progress-step-line.loader.loading.styled.top.top-start.top-end.top-left.top-right.center.center-start.center-end.center-left.center-right.bottom.bottom-start.bottom-end.bottom-left.bottom-right.grow-row.grow-column.grow-fullscreen.rtl.timer-progress-bar.timer-progress-bar-container.scrollbar-measure.icon-success.icon-warning.icon-info.icon-question.icon-error.draggable.dragging`.split(`.`).reduce((e,t)=>(e[t]=ee+t,e),{}),l=[`success`,`warning`,`info`,`question`,`error`].reduce((e,t)=>(e[t]=ee+t,e),{}),te=`SweetAlert2:`,ne=e=>e.charAt(0).toUpperCase()+e.slice(1),u=e=>{console.warn(`${te} ${typeof e==`object`?e.join(` `):e}`)},d=e=>{console.error(`${te} ${e}`)},re=[],ie=e=>{re.includes(e)||(re.push(e),u(e))},ae=(e,t=null)=>{ie(`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:``}`)},oe=e=>typeof e==`function`?e():e,se=e=>e&&typeof e.toPromise==`function`,f=e=>se(e)?e.toPromise():Promise.resolve(e),ce=e=>e&&Promise.resolve(e)===e,le=()=>navigator.userAgent.includes(`Firefox`),p=()=>document.body.querySelector(`.${c.container}`),m=e=>{let t=p();return t?t.querySelector(e):null},h=e=>m(`.${e}`),g=()=>h(c.popup),_=()=>h(c.icon),ue=()=>h(c[`icon-content`]),de=()=>h(c.title),fe=()=>h(c[`html-container`]),pe=()=>h(c.image),me=()=>h(c[`progress-steps`]),he=()=>h(c[`validation-message`]),v=()=>m(`.${c.actions} .${c.confirm}`),y=()=>m(`.${c.actions} .${c.cancel}`),b=()=>m(`.${c.actions} .${c.deny}`),ge=()=>h(c[`input-label`]),x=()=>m(`.${c.loader}`),S=()=>h(c.actions),_e=()=>h(c.footer),ve=()=>h(c[`timer-progress-bar`]),ye=()=>h(c.close),be=()=>{let e=g();if(!e)return[];let t=e.querySelectorAll(`[tabindex]:not([tabindex="-1"]):not([tabindex="0"])`),n=Array.from(t).sort((e,t)=>{let n=parseInt(e.getAttribute(`tabindex`)||`0`),r=parseInt(t.getAttribute(`tabindex`)||`0`);return n>r?1:n<r?-1:0}),r=e.querySelectorAll(`
import{d as e,u as t}from"./app-CBC6ZGaO.js";var n=t(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self,n.Sweetalert2=r())})(e,(function(){function e(e,t,n){if(typeof e==`function`?e===t:e.has(t))return arguments.length<3?t:n;throw TypeError(`Private element is not present on this object`)}function t(e,t){if(t.has(e))throw TypeError(`Cannot initialize the same private elements twice on an object`)}function n(t,n){return t.get(e(t,n))}function r(e,n,r){t(e,n),n.set(e,r)}function i(t,n,r){return t.set(e(t,n),r),r}let a={},o=()=>{a.previousActiveElement instanceof HTMLElement?(a.previousActiveElement.focus(),a.previousActiveElement=null):document.body&&document.body.focus()},s=e=>new Promise(t=>{if(!e)return t();let n=window.scrollX,r=window.scrollY;a.restoreFocusTimeout=setTimeout(()=>{o(),t()},100),window.scrollTo(n,r)}),ee=`swal2-`,c=`container.shown.height-auto.iosfix.popup.modal.no-backdrop.no-transition.toast.toast-shown.show.hide.close.title.html-container.actions.confirm.deny.cancel.footer.icon.icon-content.image.input.file.range.select.radio.checkbox.label.textarea.inputerror.input-label.validation-message.progress-steps.active-progress-step.progress-step.progress-step-line.loader.loading.styled.top.top-start.top-end.top-left.top-right.center.center-start.center-end.center-left.center-right.bottom.bottom-start.bottom-end.bottom-left.bottom-right.grow-row.grow-column.grow-fullscreen.rtl.timer-progress-bar.timer-progress-bar-container.scrollbar-measure.icon-success.icon-warning.icon-info.icon-question.icon-error.draggable.dragging`.split(`.`).reduce((e,t)=>(e[t]=ee+t,e),{}),l=[`success`,`warning`,`info`,`question`,`error`].reduce((e,t)=>(e[t]=ee+t,e),{}),te=`SweetAlert2:`,ne=e=>e.charAt(0).toUpperCase()+e.slice(1),u=e=>{console.warn(`${te} ${typeof e==`object`?e.join(` `):e}`)},d=e=>{console.error(`${te} ${e}`)},re=[],ie=e=>{re.includes(e)||(re.push(e),u(e))},ae=(e,t=null)=>{ie(`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:``}`)},oe=e=>typeof e==`function`?e():e,se=e=>e&&typeof e.toPromise==`function`,f=e=>se(e)?e.toPromise():Promise.resolve(e),ce=e=>e&&Promise.resolve(e)===e,le=()=>navigator.userAgent.includes(`Firefox`),p=()=>document.body.querySelector(`.${c.container}`),m=e=>{let t=p();return t?t.querySelector(e):null},h=e=>m(`.${e}`),g=()=>h(c.popup),_=()=>h(c.icon),ue=()=>h(c[`icon-content`]),de=()=>h(c.title),fe=()=>h(c[`html-container`]),pe=()=>h(c.image),me=()=>h(c[`progress-steps`]),he=()=>h(c[`validation-message`]),v=()=>m(`.${c.actions} .${c.confirm}`),y=()=>m(`.${c.actions} .${c.cancel}`),b=()=>m(`.${c.actions} .${c.deny}`),ge=()=>h(c[`input-label`]),x=()=>m(`.${c.loader}`),S=()=>h(c.actions),_e=()=>h(c.footer),ve=()=>h(c[`timer-progress-bar`]),ye=()=>h(c.close),be=()=>{let e=g();if(!e)return[];let t=e.querySelectorAll(`[tabindex]:not([tabindex="-1"]):not([tabindex="0"])`),n=Array.from(t).sort((e,t)=>{let n=parseInt(e.getAttribute(`tabindex`)||`0`),r=parseInt(t.getAttribute(`tabindex`)||`0`);return n>r?1:n<r?-1:0}),r=e.querySelectorAll(`
a[href],
area[href],
input:not([disabled]),
+83 -83
View File
@@ -1,48 +1,48 @@
{
"_AuthenticatedLayout-CrB9BCoI.js": {
"file": "assets/AuthenticatedLayout-CrB9BCoI.js",
"_AuthenticatedLayout-DI4WLw0Y.js": {
"file": "assets/AuthenticatedLayout-DI4WLw0Y.js",
"name": "AuthenticatedLayout",
"imports": [
"resources/js/app.tsx"
]
},
"_Can-DIOq7dyw.js": {
"file": "assets/Can-DIOq7dyw.js",
"_Can-B4U9XlNZ.js": {
"file": "assets/Can-B4U9XlNZ.js",
"name": "Can",
"imports": [
"resources/js/app.tsx"
]
},
"_GuestLayout-CN-YY0cs.js": {
"file": "assets/GuestLayout-CN-YY0cs.js",
"_GuestLayout-DUQXV9II.js": {
"file": "assets/GuestLayout-DUQXV9II.js",
"name": "GuestLayout",
"imports": [
"resources/js/app.tsx"
]
},
"_Portal-DJbp1s68.js": {
"file": "assets/Portal-DJbp1s68.js",
"_Portal-DJRNWzaL.js": {
"file": "assets/Portal-DJRNWzaL.js",
"name": "Portal",
"imports": [
"resources/js/app.tsx"
]
},
"_PrimaryButton-KeVcwQeg.js": {
"file": "assets/PrimaryButton-KeVcwQeg.js",
"_PrimaryButton-DMaDfcck.js": {
"file": "assets/PrimaryButton-DMaDfcck.js",
"name": "PrimaryButton",
"imports": [
"resources/js/app.tsx"
]
},
"_TextInput-DV7QeRn3.js": {
"file": "assets/TextInput-DV7QeRn3.js",
"_TextInput--H1JolRE.js": {
"file": "assets/TextInput--H1JolRE.js",
"name": "TextInput",
"imports": [
"resources/js/app.tsx"
]
},
"_filepond-plugin-file-validate-type-CBUe71W_.js": {
"file": "assets/filepond-plugin-file-validate-type-CBUe71W_.js",
"_filepond-plugin-file-validate-type-Bm_JOscj.js": {
"file": "assets/filepond-plugin-file-validate-type-Bm_JOscj.js",
"name": "filepond-plugin-file-validate-type",
"imports": [
"resources/js/app.tsx"
@@ -55,15 +55,15 @@
"file": "assets/filepond-plugin-file-validate-type-CEtEkCs1.css",
"src": "_filepond-plugin-file-validate-type-CEtEkCs1.css"
},
"_lodash-ZrZcSXd_.js": {
"file": "assets/lodash-ZrZcSXd_.js",
"_lodash-LlLUQFZC.js": {
"file": "assets/lodash-LlLUQFZC.js",
"name": "lodash",
"imports": [
"resources/js/app.tsx"
]
},
"_swal-DZXjpqDE.js": {
"file": "assets/swal-DZXjpqDE.js",
"_swal-ClfUb7Hm.js": {
"file": "assets/swal-ClfUb7Hm.js",
"name": "swal",
"imports": [
"resources/js/app.tsx"
@@ -77,99 +77,99 @@
"src": "_swal-DtpL8WXZ.css"
},
"resources/js/Pages/ActivityLogs/Index.tsx": {
"file": "assets/Index-Cm49_1vz.js",
"file": "assets/Index-D9_r9v0x.js",
"name": "Index",
"src": "resources/js/Pages/ActivityLogs/Index.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_lodash-ZrZcSXd_.js",
"_Portal-DJbp1s68.js",
"_AuthenticatedLayout-CrB9BCoI.js"
"_lodash-LlLUQFZC.js",
"_Portal-DJRNWzaL.js",
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Auth/ConfirmPassword.tsx": {
"file": "assets/ConfirmPassword-Ducw29r7.js",
"file": "assets/ConfirmPassword-DrcXbtHq.js",
"name": "ConfirmPassword",
"src": "resources/js/Pages/Auth/ConfirmPassword.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_GuestLayout-CN-YY0cs.js"
"_GuestLayout-DUQXV9II.js"
]
},
"resources/js/Pages/Auth/ForgotPassword.tsx": {
"file": "assets/ForgotPassword-BmQrO4Bp.js",
"file": "assets/ForgotPassword-iOghYKk1.js",
"name": "ForgotPassword",
"src": "resources/js/Pages/Auth/ForgotPassword.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_GuestLayout-CN-YY0cs.js"
"_GuestLayout-DUQXV9II.js"
]
},
"resources/js/Pages/Auth/Login.tsx": {
"file": "assets/Login-DUDEFmAx.js",
"file": "assets/Login-DEf6GiBL.js",
"name": "Login",
"src": "resources/js/Pages/Auth/Login.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_GuestLayout-CN-YY0cs.js"
"_GuestLayout-DUQXV9II.js"
]
},
"resources/js/Pages/Auth/Register.tsx": {
"file": "assets/Register-BscYc22x.js",
"file": "assets/Register-qd5-M6ei.js",
"name": "Register",
"src": "resources/js/Pages/Auth/Register.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_GuestLayout-CN-YY0cs.js"
"_GuestLayout-DUQXV9II.js"
]
},
"resources/js/Pages/Auth/ResetPassword.tsx": {
"file": "assets/ResetPassword-BTTfjVJh.js",
"file": "assets/ResetPassword-yn7YFp-y.js",
"name": "ResetPassword",
"src": "resources/js/Pages/Auth/ResetPassword.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_GuestLayout-CN-YY0cs.js"
"_GuestLayout-DUQXV9II.js"
]
},
"resources/js/Pages/Auth/VerifyEmail.tsx": {
"file": "assets/VerifyEmail-rqxgUqlx.js",
"file": "assets/VerifyEmail-BFOE_wr5.js",
"name": "VerifyEmail",
"src": "resources/js/Pages/Auth/VerifyEmail.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_GuestLayout-CN-YY0cs.js"
"_GuestLayout-DUQXV9II.js"
]
},
"resources/js/Pages/Dashboard.tsx": {
"file": "assets/Dashboard-DZOwY3RZ.js",
"file": "assets/Dashboard-TCrsNPIF.js",
"name": "Dashboard",
"src": "resources/js/Pages/Dashboard.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_AuthenticatedLayout-CrB9BCoI.js"
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Docs/Index.tsx": {
"file": "assets/Index-CgghpLIe.js",
"file": "assets/Index-BtuMIlrp.js",
"name": "Index",
"src": "resources/js/Pages/Docs/Index.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_AuthenticatedLayout-CrB9BCoI.js"
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Errors/Error.tsx": {
"file": "assets/Error-rwcY_Rc-.js",
"file": "assets/Error-BNxSWMq-.js",
"name": "Error",
"src": "resources/js/Pages/Errors/Error.tsx",
"isDynamicEntry": true,
@@ -178,99 +178,99 @@
]
},
"resources/js/Pages/Notifications/Index.tsx": {
"file": "assets/Index-DLpY0zj1.js",
"file": "assets/Index-C7twDNCh.js",
"name": "Index",
"src": "resources/js/Pages/Notifications/Index.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_swal-DZXjpqDE.js",
"_AuthenticatedLayout-CrB9BCoI.js"
"_swal-ClfUb7Hm.js",
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Profile/Edit.tsx": {
"file": "assets/Edit-BCh5fCTK.js",
"file": "assets/Edit-DtBBQL0C.js",
"name": "Edit",
"src": "resources/js/Pages/Profile/Edit.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_filepond-plugin-file-validate-type-CBUe71W_.js",
"_swal-DZXjpqDE.js",
"_AuthenticatedLayout-CrB9BCoI.js"
"_filepond-plugin-file-validate-type-Bm_JOscj.js",
"_swal-ClfUb7Hm.js",
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Profile/Partials/DeleteUserForm.tsx": {
"file": "assets/DeleteUserForm-DLkG3tvo.js",
"file": "assets/DeleteUserForm-CsCxb3Is.js",
"name": "DeleteUserForm",
"src": "resources/js/Pages/Profile/Partials/DeleteUserForm.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_TextInput-DV7QeRn3.js"
"_TextInput--H1JolRE.js"
]
},
"resources/js/Pages/Profile/Partials/UpdatePasswordForm.tsx": {
"file": "assets/UpdatePasswordForm-DXZy5eGn.js",
"file": "assets/UpdatePasswordForm-CdprBtNO.js",
"name": "UpdatePasswordForm",
"src": "resources/js/Pages/Profile/Partials/UpdatePasswordForm.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_TextInput-DV7QeRn3.js",
"_PrimaryButton-KeVcwQeg.js"
"_TextInput--H1JolRE.js",
"_PrimaryButton-DMaDfcck.js"
]
},
"resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.tsx": {
"file": "assets/UpdateProfileInformationForm-CZPCM5rZ.js",
"file": "assets/UpdateProfileInformationForm-x_xz6hYY.js",
"name": "UpdateProfileInformationForm",
"src": "resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_TextInput-DV7QeRn3.js",
"_PrimaryButton-KeVcwQeg.js"
"_TextInput--H1JolRE.js",
"_PrimaryButton-DMaDfcck.js"
]
},
"resources/js/Pages/Roles/Index.tsx": {
"file": "assets/Index-Bnf5l0xj.js",
"file": "assets/Index-DpI3WTvv.js",
"name": "Index",
"src": "resources/js/Pages/Roles/Index.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_swal-DZXjpqDE.js",
"_Can-DIOq7dyw.js",
"_Portal-DJbp1s68.js",
"_AuthenticatedLayout-CrB9BCoI.js"
"_swal-ClfUb7Hm.js",
"_Can-B4U9XlNZ.js",
"_Portal-DJRNWzaL.js",
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Settings/Index.tsx": {
"file": "assets/Index-z4H1ItiM.js",
"file": "assets/Index-DAQoqCgq.js",
"name": "Index",
"src": "resources/js/Pages/Settings/Index.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_filepond-plugin-file-validate-type-CBUe71W_.js",
"_swal-DZXjpqDE.js",
"_AuthenticatedLayout-CrB9BCoI.js"
"_filepond-plugin-file-validate-type-Bm_JOscj.js",
"_swal-ClfUb7Hm.js",
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/SystemSettings/Index.tsx": {
"file": "assets/Index-A9YntmU6.js",
"file": "assets/Index-LTuEHoHq.js",
"name": "Index",
"src": "resources/js/Pages/SystemSettings/Index.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_filepond-plugin-file-validate-type-CBUe71W_.js",
"_swal-DZXjpqDE.js",
"_AuthenticatedLayout-CrB9BCoI.js"
"_filepond-plugin-file-validate-type-Bm_JOscj.js",
"_swal-ClfUb7Hm.js",
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/TwoFactor/Challenge.tsx": {
"file": "assets/Challenge-DaBnX94x.js",
"file": "assets/Challenge-c9X8OgcQ.js",
"name": "Challenge",
"src": "resources/js/Pages/TwoFactor/Challenge.tsx",
"isDynamicEntry": true,
@@ -279,42 +279,42 @@
]
},
"resources/js/Pages/TwoFactor/Setup.tsx": {
"file": "assets/Setup-ZspLG92f.js",
"file": "assets/Setup-DtB1W1gN.js",
"name": "Setup",
"src": "resources/js/Pages/TwoFactor/Setup.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_swal-DZXjpqDE.js",
"_AuthenticatedLayout-CrB9BCoI.js"
"_swal-ClfUb7Hm.js",
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Users/Index.tsx": {
"file": "assets/Index-cmCbZg8n.js",
"file": "assets/Index-vfgoW_YL.js",
"name": "Index",
"src": "resources/js/Pages/Users/Index.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_lodash-ZrZcSXd_.js",
"_swal-DZXjpqDE.js",
"_Can-DIOq7dyw.js",
"_Portal-DJbp1s68.js",
"_AuthenticatedLayout-CrB9BCoI.js"
"_lodash-LlLUQFZC.js",
"_swal-ClfUb7Hm.js",
"_Can-B4U9XlNZ.js",
"_Portal-DJRNWzaL.js",
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Users/Show.tsx": {
"file": "assets/Show-lMRyP8VR.js",
"file": "assets/Show-Bb6wuATu.js",
"name": "Show",
"src": "resources/js/Pages/Users/Show.tsx",
"isDynamicEntry": true,
"imports": [
"resources/js/app.tsx",
"_AuthenticatedLayout-CrB9BCoI.js"
"_AuthenticatedLayout-DI4WLw0Y.js"
]
},
"resources/js/Pages/Welcome.tsx": {
"file": "assets/Welcome-CDP6Hme4.js",
"file": "assets/Welcome-Sa40wPkZ.js",
"name": "Welcome",
"src": "resources/js/Pages/Welcome.tsx",
"isDynamicEntry": true,
@@ -323,7 +323,7 @@
]
},
"resources/js/Pages/Xxx.tsx": {
"file": "assets/Xxx-CagXuP8t.js",
"file": "assets/Xxx-NxSPHpxI.js",
"name": "Xxx",
"src": "resources/js/Pages/Xxx.tsx",
"isDynamicEntry": true,
@@ -332,7 +332,7 @@
]
},
"resources/js/app.tsx": {
"file": "assets/app-BJ7g6sa8.js",
"file": "assets/app-CBC6ZGaO.js",
"name": "app",
"src": "resources/js/app.tsx",
"isEntry": true,
@@ -363,7 +363,7 @@
"resources/js/Pages/Xxx.tsx"
],
"css": [
"assets/app-Bu4ihmu3.css"
"assets/app-CgPzmd0h.css"
]
}
}
+1
View File
@@ -0,0 +1 @@
http://localhost:5173
+174 -96
View File
@@ -1,169 +1,247 @@
#!/bin/bash
# --- Color Definitions for Premium Look ---
# --- Color Definitions for Premium Terminal Styling ---
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
MAGENTA='\033[0;35m'
BOLD='\033[1m'
NC='\033[0m' # No Color
echo -e "${CYAN}======================================================${NC}"
echo -e "${GREEN}${BOLD} 🐳 Biiproject Kit v2 — Docker Runtime Engine 🐳 ${NC}"
echo -e "${CYAN}======================================================${NC}"
# Helper Functions for Clean Output
log_info() {
echo -e " ${BLUE}[INFO]${NC} $1"
}
# 1. Pre-flight Checks
echo -e "${CYAN}[1/6] Checking system environment...${NC}"
if ! command -v docker &> /dev/null; then
echo -e " ${RED}❌ Error: Docker is not installed on this system.${NC}"
exit 1
fi
log_success() {
echo -e " ${GREEN}[SUCCESS]${NC}$1"
}
if ! docker info &> /dev/null; then
echo -e " ${RED}❌ Error: Docker daemon is not running.${NC}"
exit 1
fi
echo -e " ${GREEN}✔ Docker is installed and running perfectly.${NC}"
log_warning() {
echo -e " ${YELLOW}[WARNING]${NC}$1"
}
log_error() {
echo -e " ${RED}[ERROR]${NC}$1"
}
clear_screen() {
clear 2>/dev/null || printf "\033c"
}
clear_screen
# Premium Welcome Header
echo -e "${BLUE}======================================================================${NC}"
echo -e "${BOLD}${GREEN} 🐳 BIIPROJECT KIT V2 - CONTAINERIZED RUNNER & MONITOR 🐳 ${NC}"
echo -e "${BLUE}======================================================================${NC}"
echo -e " Skrip ini akan memvalidasi port, menyalakan container Docker,"
echo -e " dan mengaktifkan server pengembangan frontend otomatis."
echo -e "${BLUE}======================================================================${NC}"
echo ""
# 2. Port & Container Conflicts Resolution (Self-Healing)
echo -e "${CYAN}[2/6] Preventing port and container name conflicts...${NC}"
# 1. VERIFY INSTALLATION STATE
echo -e "${BOLD}${BLUE}[1/5] Memverifikasi Status Instalasi Aplikasi...${NC}"
# Resolve ports dynamically
PORT_8000=$(grep "^APP_PORT=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"'\''')
PORT_8000=${PORT_8000:-8000}
# Check for .env file
if [ ! -f .env ]; then
log_warning "File konfigurasi '.env' tidak ditemukan."
log_info "Menjalankan skrip instalasi terlebih dahulu..."
sleep 1.5
if [ -f install.sh ]; then
chmod +x install.sh
./install.sh
exit $?
else
log_error "Skrip install.sh tidak ditemukan!"
exit 1
fi
fi
PORT_5432=$(grep -E "^(FORWARD_DB_PORT|DB_PORT)=" .env 2>/dev/null | head -n1 | cut -d'=' -f2- | tr -d '"'\''')
PORT_5432=${PORT_5432:-5432}
# Check for Composer dependencies
if [ ! -d vendor ] || [ ! -d node_modules ]; then
log_warning "Dependensi aplikasi belum lengkap (vendor atau node_modules hilang)."
log_info "Mengalihkan ke skrip instalasi untuk setup awal..."
sleep 2
if [ -f install.sh ]; then
chmod +x install.sh
./install.sh
exit $?
else
log_error "Skrip install.sh tidak ditemukan!"
exit 1
fi
fi
PORT_6379=$(grep -E "^(FORWARD_REDIS_PORT|REDIS_PORT)=" .env 2>/dev/null | head -n1 | cut -d'=' -f2- | tr -d '"'\''')
PORT_6379=${PORT_6379:-6379}
# Check Docker Installation
if ! command -v docker &> /dev/null; then
log_error "Docker tidak ditemukan pada sistem. Harap instal Docker terlebih dahulu."
exit 1
fi
# Kill local system processes occupying these ports
# Check Docker Daemon
if ! docker info &> /dev/null; then
log_error "Docker daemon tidak aktif. Harap jalankan layanan Docker Anda."
exit 1
fi
# Resolve Docker Compose Command
if docker compose version &> /dev/null; then
DOCKER_COMPOSE_CMD="docker compose"
else
DOCKER_COMPOSE_CMD="docker-compose"
fi
log_success "Sistem siap dijalankan."
echo ""
# 2. RESOLVE PORTS & PREVENT CONFLICTS
echo -e "${BOLD}${BLUE}[2/5] Memeriksa Port Bebas & Konflik Container...${NC}"
# Parse ports from .env
APP_PORT=$(grep "^APP_PORT=" .env | cut -d'=' -f2- | tr -d '"'\''')
APP_PORT=${APP_PORT:-8000}
DB_PORT=$(grep -E "^(FORWARD_DB_PORT|DB_PORT)=" .env | head -n1 | cut -d'=' -f2- | tr -d '"'\''')
DB_PORT=${DB_PORT:-5432}
REDIS_PORT=$(grep -E "^(FORWARD_REDIS_PORT|REDIS_PORT)=" .env | head -n1 | cut -d'=' -f2- | tr -d '"'\''')
REDIS_PORT=${REDIS_PORT:-6379}
# Function to stop conflicting containers on a specific port
stop_conflict_on_port() {
local port=$1
local service_name=$2
local conflicting_container=$(docker ps --filter "publish=$port" --format "{{.Names}}" 2>/dev/null)
if [ ! -z "$conflicting_container" ]; then
# Exclude our own kit containers
if [[ "$conflicting_container" != "bii-web" && "$conflicting_container" != "bii-pgsql" && "$conflicting_container" != "bii-redis" ]]; then
log_warning "Port $port ($service_name) digunakan oleh container '$conflicting_container'."
log_info "Menghentikan container '$conflicting_container' untuk menghindari konflik..."
docker stop "$conflicting_container" &>/dev/null
sleep 1
fi
fi
}
# Stop local processes using fuser/lsof if available
if command -v lsof &>/dev/null && command -v fuser &>/dev/null; then
for port in "$PORT_8000" "$PORT_5432" "$PORT_6379"; do
for port in "$APP_PORT" "$DB_PORT" "$REDIS_PORT"; do
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null ; then
echo -e " ${YELLOW}⚠ Port $port is occupied locally. Freeing up port $port...${NC}"
log_warning "Port $port digunakan oleh proses lokal. Menghentikan proses..."
fuser -k $port/tcp 2>/dev/null
sleep 1
fi
done
fi
# Scan and remove conflicting stopped containers with same names
CONFLICT_CONTAINERS=("bii-kit-web" "bii-kit-pgsql" "bii-kit-redis")
for container in "${CONFLICT_CONTAINERS[@]}"; do
if [ ! -z "$(docker ps -a -q -f name=^/${container}$ 2>/dev/null)" ]; then
# Check if container is running
if [ ! -z "$(docker ps -q -f name=^/${container}$ 2>/dev/null)" ]; then
echo -ne " ${YELLOW}Stopping conflicting running container: $container...${NC}"
docker stop "$container" &>/dev/null
fi
echo -ne " ${YELLOW}Removing conflicting container $container to avoid duplication...${NC}"
docker rm -f "$container" &>/dev/null
echo -e "\r ${GREEN}✔ Cleared conflicting container: $container. ${NC}"
fi
done
echo -e " ${GREEN}✔ Environment conflicts resolved successfully.${NC}"
stop_conflict_on_port "$APP_PORT" "Web Aplikasi"
stop_conflict_on_port "$DB_PORT" "Database PostgreSQL"
stop_conflict_on_port "$REDIS_PORT" "Redis Cache"
log_success "Port $APP_PORT (Web), $DB_PORT (DB), dan $REDIS_PORT (Redis) siap digunakan."
echo ""
# 3. Booting Docker Compose Stack
echo -e "${CYAN}[3/6] Starting application containers...${NC}"
docker compose up -d
# 3. START DOCKER CONTAINER STACK
echo -e "${BOLD}${BLUE}[3/5] Mengaktifkan Container Docker (Sail)...${NC}"
$DOCKER_COMPOSE_CMD up -d
if [ $? -ne 0 ]; then
echo -e " ${RED}❌ Error: Failed to start containers. Try running: docker compose down && docker compose up -d${NC}"
log_error "Gagal menyalakan Docker containers."
exit 1
fi
echo -e " ${GREEN}✔ Containers booted successfully.${NC}"
log_success "Docker containers berhasil dinyalakan."
echo ""
# 4. Service Health Check & Permissions Correction
echo -e "${CYAN}[4/6] Waiting for database health & setting permissions...${NC}"
# 4. HEALTH CHECK & PERMISSIONS
echo -e "${BOLD}${BLUE}[4/5] Memvalidasi Kesehatan Layanan & Hak Akses...${NC}"
DB_CONTAINER="bii-kit-pgsql"
REDIS_CONTAINER="bii-kit-redis"
echo -ne " ${YELLOW}Checking PostgreSQL database ($DB_CONTAINER)...${NC}"
# Postgres Check
echo -ne " ${YELLOW}Memeriksa PostgreSQL Database ($DB_CONTAINER)...${NC}"
RETRIES=0
MAX_RETRIES=40
MAX_RETRIES=30
while [ $RETRIES -lt $MAX_RETRIES ]; do
STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$DB_CONTAINER" 2>/dev/null)
if [ "$STATUS" = "healthy" ]; then
echo -e "\r ${GREEN}✔ PostgreSQL is healthy and ready to accept connections! ${NC}"
break
elif [ "$STATUS" = "unhealthy" ]; then
echo -e "\r ${RED}⚠ PostgreSQL health check failed. Proceeding... ${NC}"
echo -e "\r ${GREEN}[SELESAI]${NC} ✔ PostgreSQL sehat dan siap! "
break
elif [ -z "$STATUS" ]; then
RUNNING=$(docker inspect --format='{{.State.Running}}' "$DB_CONTAINER" 2>/dev/null)
if [ "$RUNNING" = "true" ]; then
echo -e "\r ${GREEN}✔ PostgreSQL is running (no healthcheck defined). ${NC}"
echo -e "\r ${GREEN}[SELESAI]${NC} ✔ PostgreSQL container aktif. "
break
fi
fi
echo -n "."
sleep 1.5
sleep 1.2
RETRIES=$((RETRIES + 1))
done
echo -ne " ${YELLOW}Checking Redis cache ($REDIS_CONTAINER)...${NC}"
# Redis Check
echo -ne " ${YELLOW}Memeriksa Redis Cache ($REDIS_CONTAINER)...${NC}"
RETRIES=0
while [ $RETRIES -lt $MAX_RETRIES ]; do
STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$REDIS_CONTAINER" 2>/dev/null)
if [ "$STATUS" = "healthy" ]; then
echo -e "\r ${GREEN}✔ Redis is healthy and ready! ${NC}"
echo -e "\r ${GREEN}[SELESAI]${NC} ✔ Redis sehat dan siap! "
break
elif [ -z "$STATUS" ]; then
RUNNING=$(docker inspect --format='{{.State.Running}}' "$REDIS_CONTAINER" 2>/dev/null)
if [ "$RUNNING" = "true" ]; then
echo -e "\r ${GREEN}✔ Redis is running. ${NC}"
echo -e "\r ${GREEN}[SELESAI]${NC} ✔ Redis container aktif. "
break
fi
fi
echo -n "."
sleep 1.5
sleep 1.2
RETRIES=$((RETRIES + 1))
done
# Extra sleep for container initialization
sleep 2
# Writable directories permission fix
docker compose exec -u root laravel.test chown -R sail:sail /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null
docker compose exec -u root laravel.test chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null
echo -e " ${GREEN}✔ Folder write permissions secured.${NC}"
# Secure storage and cache permissions inside container
$DOCKER_COMPOSE_CMD exec -u root laravel.test chown -R sail:sail /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null
$DOCKER_COMPOSE_CMD exec -u root laravel.test chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null
log_success "Hak akses file storage & cache berhasil diselaraskan."
echo ""
# 5. Database Migration Sync
echo -e "${CYAN}[5/6] Checking for pending database migrations...${NC}"
docker compose exec -u sail laravel.test php artisan migrate
# 5. START VITE FRONTEND LIVE SERVER
echo -e "${BOLD}${BLUE}[5/5] Memulai Server Frontend (Vite Live-Reload)...${NC}"
# Start npm dev in background inside container
$DOCKER_COMPOSE_CMD exec -d -u sail laravel.test npm run dev
log_success "Server pengembangan Vite aktif di latar belakang."
echo ""
# 6. Booting Live-reload Dev Server
echo -e "${CYAN}[6/6] Launching React Vite dev server...${NC}"
# Stop any duplicate background dev servers inside container
docker compose exec -u sail laravel.test pkill -f "vite" &>/dev/null
sleep 1
clear_screen
# Start Vite server in detached mode
docker compose exec -d -u sail laravel.test npm run dev
echo -e " ${GREEN}✔ Vite live-reload dev server launched in background.${NC}"
echo ""
# Final Premium Screen Info
echo -e "${CYAN}=========================================================${NC}"
echo -e " 🎉 ${GREEN}${BOLD}Biiproject Kit v2 is running successfully!${NC} 🎉"
echo -e "${CYAN}=========================================================${NC}"
echo -e " 🚀 ${WHITE}${BOLD}Web Application:${NC} ${GREEN}http://localhost:${PORT_8000}${NC}"
echo -e " 📋 ${WHITE}${BOLD}Activity Telemetry:${NC} ${GREEN}http://localhost:${PORT_8000}/activity-logs${NC}"
echo -e " 📖 ${WHITE}${BOLD}Documentation Hub:${NC} ${GREEN}http://localhost:${PORT_8000}/documentation${NC}"
echo -e " 🐘 ${WHITE}${BOLD}Postgres Port:${NC} ${YELLOW}${PORT_5432}${NC}"
echo -e " 🍒 ${WHITE}${BOLD}Redis Port:${NC} ${YELLOW}${PORT_6379}${NC}"
echo -e "${CYAN}=========================================================${NC}"
echo -e " ${YELLOW}${BOLD}Useful Commands:${NC}"
echo -e " 👉 View live logs: ${CYAN}docker compose logs -f${NC}"
echo -e " 👉 Stop the stack: ${CYAN}docker compose down${NC}"
echo -e " 👉 Restart containers: ${CYAN}./run.sh${NC}"
echo -e "${CYAN}=========================================================${NC}"
# Premium Dashboard Information Board
echo -e "${GREEN}======================================================================${NC}"
echo -e "${BOLD}${GREEN} 🚀 BIIPROJECT KIT V2 BERHASIL DIJALANKAN! 🚀 ${NC}"
echo -e "${GREEN}======================================================================${NC}"
echo -e " Aplikasi Anda berjalan lancar di dalam Docker container."
echo -e ""
echo -e " 👉 ${BOLD}Web Application:${NC} ${CYAN}http://localhost:${APP_PORT}${NC}"
echo -e " 👉 ${BOLD}Monitoring Panel:${NC} ${CYAN}http://localhost:${APP_PORT}/system-monitoring${NC}"
echo -e " 👉 ${BOLD}Dokumentasi API:${NC} ${CYAN}http://localhost:${APP_PORT}/documentation${NC}"
echo -e " 👉 ${BOLD}Database Port:${NC} ${YELLOW}${DB_PORT}${NC} (PostgreSQL)"
echo -e " 👉 ${BOLD}Redis Port:${NC} ${YELLOW}${REDIS_PORT}${NC} (Redis)"
echo -e ""
echo -e " ========================================================"
echo -e " ${BOLD}PERINTAH BERMANFAAT LAINNYA:${NC}"
echo -e " ========================================================"
echo -e " Untuk melihat logs realtime dari container:"
echo -e " ${CYAN}docker compose logs -f${NC}"
echo -e ""
echo -e " Untuk masuk ke terminal container aplikasi:"
echo -e " ${CYAN}./sail shell${NC}"
echo -e ""
echo -e " Untuk menghentikan dan menonaktifkan container:"
echo -e " ${CYAN}docker compose down${NC}"
echo -e "${GREEN}======================================================================${NC}"
echo ""