feat: complete install.sh and run.sh scripts with dynamic health check and build assets sync
This commit is contained in:
+207
-89
@@ -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}"
|
||||
fi
|
||||
done
|
||||
echo -e " ${GREEN}✔ Conflict scanning complete.${NC}"
|
||||
echo ""
|
||||
# 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..."
|
||||
|
||||
# 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
|
||||
composer install --ignore-platform-reqs --no-interaction --prefer-dist
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e " ${RED}❌ Error: Composer dependency installation failed.${NC}"
|
||||
log_error "Gagal menginstal dependensi Composer. Silakan cek koneksi internet Anda."
|
||||
exit 1
|
||||
fi
|
||||
echo -e " ${GREEN}✔ Composer dependencies successfully installed.${NC}"
|
||||
log_success "Dependensi Composer berhasil diinstal."
|
||||
else
|
||||
log_info "Direktori 'vendor' sudah ada. Melewati instalasi Composer."
|
||||
fi
|
||||
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
|
||||
# 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: Failed to boot Postgres & Redis services.${NC}"
|
||||
log_error "Gagal menjalankan Docker container. Periksa file docker-compose.yml."
|
||||
exit 1
|
||||
fi
|
||||
log_success "Docker containers berhasil dijalankan."
|
||||
echo ""
|
||||
|
||||
DB_CONTAINER="bii-kit-pgsql"
|
||||
echo -ne " ${YELLOW}Waiting for PostgreSQL ($DB_CONTAINER) to become healthy...${NC}"
|
||||
# Resolve container names dynamically
|
||||
DB_CONTAINER="bii-pgsql"
|
||||
REDIS_CONTAINER="bii-redis"
|
||||
WEB_CONTAINER="laravel.test"
|
||||
|
||||
# 5. WAITING FOR SERVICES HEALTHY (Postgres & Redis)
|
||||
echo -e "${BOLD}${BLUE}[5/7] Menunggu Database & Redis Siap (Healthcheck)...${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 ""
|
||||
|
||||
+1
-1
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
-1
@@ -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
@@ -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};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
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
@@ -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
@@ -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
@@ -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
@@ -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
-1
@@ -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
@@ -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
@@ -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
@@ -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
+1
-1
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
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
http://localhost:5173
|
||||
@@ -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 ""
|
||||
|
||||
Reference in New Issue
Block a user