Преглед изворни кода

Commit pre-built frontend, remove Node.js from Pi deployment

The Pi Zero 2W (512MB RAM) can't survive npm ci + vite build.
Since static/dist/ is only ~3.6MB / 98 files, commit it to git
and eliminate Node.js entirely from the Pi setup and update flow.

- Un-ignore static/dist/ and track pre-built frontend assets
- Remove install_nodejs(), enable_swap()/disable_swap() from setup-pi.sh
- Remove frontend build steps from setup-pi.sh, dw update, dw checkout
- Add cleanup_unused() to purge Node.js and Docker from prior installs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tuanchris пре 4 месеци
родитељ
комит
d2037ee167
100 измењених фајлова са 95 додато и 97 уклоњено
  1. 0 1
      .gitignore
  2. 0 41
      dw
  3. 27 55
      setup-pi.sh
  4. 0 0
      static/dist/assets/index-B78VxGpo.css
  5. 0 0
      static/dist/assets/index-pZ3J7MoU.js
  6. BIN
      static/dist/assets/material-icons-Dr0goTwe.woff
  7. BIN
      static/dist/assets/material-icons-kAwBdRge.woff2
  8. BIN
      static/dist/assets/material-icons-outlined-BpWbwl2n.woff
  9. BIN
      static/dist/assets/material-icons-outlined-DZhiGvEA.woff2
  10. BIN
      static/dist/assets/noto-sans-cyrillic-400-normal-BDYvNhAR.woff
  11. BIN
      static/dist/assets/noto-sans-cyrillic-400-normal-CHP_ranX.woff2
  12. BIN
      static/dist/assets/noto-sans-cyrillic-500-normal-9zZ_jNuA.woff2
  13. BIN
      static/dist/assets/noto-sans-cyrillic-500-normal-BxM0HQjg.woff
  14. BIN
      static/dist/assets/noto-sans-cyrillic-600-normal-BRIw9PIU.woff
  15. BIN
      static/dist/assets/noto-sans-cyrillic-600-normal-KpAl9xZA.woff2
  16. BIN
      static/dist/assets/noto-sans-cyrillic-700-normal-D8UNalU-.woff
  17. BIN
      static/dist/assets/noto-sans-cyrillic-700-normal-DYZmzPmX.woff2
  18. BIN
      static/dist/assets/noto-sans-cyrillic-ext-400-normal-BjDhGU6t.woff2
  19. BIN
      static/dist/assets/noto-sans-cyrillic-ext-400-normal-d9FrwbiD.woff
  20. BIN
      static/dist/assets/noto-sans-cyrillic-ext-500-normal-Bw4G4pNe.woff
  21. BIN
      static/dist/assets/noto-sans-cyrillic-ext-500-normal-CuwgPeWW.woff2
  22. BIN
      static/dist/assets/noto-sans-cyrillic-ext-600-normal-Cwz1867h.woff
  23. BIN
      static/dist/assets/noto-sans-cyrillic-ext-600-normal-DlWr7wnj.woff2
  24. BIN
      static/dist/assets/noto-sans-cyrillic-ext-700-normal-D83T7awq.woff
  25. BIN
      static/dist/assets/noto-sans-cyrillic-ext-700-normal-OK-fZO_i.woff2
  26. BIN
      static/dist/assets/noto-sans-devanagari-400-normal-C3FccbrF.woff2
  27. BIN
      static/dist/assets/noto-sans-devanagari-400-normal-g9fsM2jL.woff
  28. BIN
      static/dist/assets/noto-sans-devanagari-500-normal-B62tDw8r.woff
  29. BIN
      static/dist/assets/noto-sans-devanagari-500-normal-VG35fhMU.woff2
  30. BIN
      static/dist/assets/noto-sans-devanagari-600-normal-Bly84zfI.woff
  31. BIN
      static/dist/assets/noto-sans-devanagari-600-normal-Ewgvvq1j.woff2
  32. BIN
      static/dist/assets/noto-sans-devanagari-700-normal-CT12sGlc.woff
  33. BIN
      static/dist/assets/noto-sans-devanagari-700-normal-DVs0dmkg.woff2
  34. BIN
      static/dist/assets/noto-sans-greek-400-normal-Be2BcUUc.woff
  35. BIN
      static/dist/assets/noto-sans-greek-400-normal-DCESwnT1.woff2
  36. BIN
      static/dist/assets/noto-sans-greek-500-normal-BAAA_uK7.woff
  37. BIN
      static/dist/assets/noto-sans-greek-500-normal-D_0l3T9g.woff2
  38. BIN
      static/dist/assets/noto-sans-greek-600-normal-C0bz_iEd.woff
  39. BIN
      static/dist/assets/noto-sans-greek-600-normal-CT9U7UAD.woff2
  40. BIN
      static/dist/assets/noto-sans-greek-700-normal-DDNJsN3F.woff
  41. BIN
      static/dist/assets/noto-sans-greek-700-normal-x3kNWF-0.woff2
  42. BIN
      static/dist/assets/noto-sans-greek-ext-400-normal-L11LEhi4.woff
  43. BIN
      static/dist/assets/noto-sans-greek-ext-400-normal-i2oSBwXz.woff2
  44. BIN
      static/dist/assets/noto-sans-greek-ext-500-normal-CbZNESfr.woff
  45. BIN
      static/dist/assets/noto-sans-greek-ext-500-normal-D6bOGD5V.woff2
  46. BIN
      static/dist/assets/noto-sans-greek-ext-600-normal-B4z4a2vi.woff2
  47. BIN
      static/dist/assets/noto-sans-greek-ext-600-normal-BjvVOqxV.woff
  48. BIN
      static/dist/assets/noto-sans-greek-ext-700-normal-BOmIwFkq.woff
  49. BIN
      static/dist/assets/noto-sans-greek-ext-700-normal-Dq1WA5-1.woff2
  50. BIN
      static/dist/assets/noto-sans-latin-400-normal-BTkUljjl.woff2
  51. BIN
      static/dist/assets/noto-sans-latin-400-normal-DPpKfCgK.woff
  52. BIN
      static/dist/assets/noto-sans-latin-500-normal-CDPngY5C.woff
  53. BIN
      static/dist/assets/noto-sans-latin-500-normal-DCA2Z9Cj.woff2
  54. BIN
      static/dist/assets/noto-sans-latin-600-normal-DVJMj_t0.woff
  55. BIN
      static/dist/assets/noto-sans-latin-600-normal-Dkgu5AE5.woff2
  56. BIN
      static/dist/assets/noto-sans-latin-700-normal-CrvTEWhy.woff2
  57. BIN
      static/dist/assets/noto-sans-latin-700-normal-ZyrKABVF.woff
  58. BIN
      static/dist/assets/noto-sans-latin-ext-400-normal-CNh9dRW_.woff
  59. BIN
      static/dist/assets/noto-sans-latin-ext-400-normal-CVf-LbaS.woff2
  60. BIN
      static/dist/assets/noto-sans-latin-ext-500-normal-Bn9_h39k.woff
  61. BIN
      static/dist/assets/noto-sans-latin-ext-500-normal-D88cFz81.woff2
  62. BIN
      static/dist/assets/noto-sans-latin-ext-600-normal-B3lLaxXr.woff
  63. BIN
      static/dist/assets/noto-sans-latin-ext-600-normal-Has_8ph9.woff2
  64. BIN
      static/dist/assets/noto-sans-latin-ext-700-normal-BypTtJma.woff2
  65. BIN
      static/dist/assets/noto-sans-latin-ext-700-normal-CgsG9aVh.woff
  66. BIN
      static/dist/assets/noto-sans-vietnamese-400-normal-C3Al4sv4.woff
  67. BIN
      static/dist/assets/noto-sans-vietnamese-400-normal-D2wP-Vm-.woff2
  68. BIN
      static/dist/assets/noto-sans-vietnamese-500-normal-BBHKifio.woff
  69. BIN
      static/dist/assets/noto-sans-vietnamese-500-normal-B_DgfjT4.woff2
  70. BIN
      static/dist/assets/noto-sans-vietnamese-600-normal-D0HZFEqa.woff
  71. BIN
      static/dist/assets/noto-sans-vietnamese-600-normal-mhyQDSzg.woff2
  72. BIN
      static/dist/assets/noto-sans-vietnamese-700-normal-1GL2JyGE.woff
  73. BIN
      static/dist/assets/noto-sans-vietnamese-700-normal-DayJ0F-f.woff2
  74. BIN
      static/dist/assets/plus-jakarta-sans-latin-400-normal-BDKaGhyp.woff
  75. BIN
      static/dist/assets/plus-jakarta-sans-latin-400-normal-Dhut76fR.woff2
  76. BIN
      static/dist/assets/plus-jakarta-sans-latin-500-normal-Bf-nb4oT.woff2
  77. BIN
      static/dist/assets/plus-jakarta-sans-latin-500-normal-DYtqi0QS.woff
  78. BIN
      static/dist/assets/plus-jakarta-sans-latin-600-normal-BR_Ojra4.woff
  79. BIN
      static/dist/assets/plus-jakarta-sans-latin-600-normal-DLTa1BUW.woff2
  80. BIN
      static/dist/assets/plus-jakarta-sans-latin-700-normal-CfpNZvy6.woff2
  81. BIN
      static/dist/assets/plus-jakarta-sans-latin-700-normal-DqEcQeE5.woff
  82. BIN
      static/dist/assets/plus-jakarta-sans-latin-ext-400-normal-2ppkqaOR.woff
  83. BIN
      static/dist/assets/plus-jakarta-sans-latin-ext-400-normal-D127hM_v.woff2
  84. BIN
      static/dist/assets/plus-jakarta-sans-latin-ext-500-normal-9VZagAe1.woff2
  85. BIN
      static/dist/assets/plus-jakarta-sans-latin-ext-500-normal-CqEEAICU.woff
  86. BIN
      static/dist/assets/plus-jakarta-sans-latin-ext-600-normal-B0WRRYJ1.woff
  87. BIN
      static/dist/assets/plus-jakarta-sans-latin-ext-600-normal-DQgPU_Cg.woff2
  88. BIN
      static/dist/assets/plus-jakarta-sans-latin-ext-700-normal-8-d-IyIQ.woff
  89. BIN
      static/dist/assets/plus-jakarta-sans-latin-ext-700-normal-BajbvANd.woff2
  90. BIN
      static/dist/assets/plus-jakarta-sans-vietnamese-400-normal-B8TCSmUq.woff
  91. BIN
      static/dist/assets/plus-jakarta-sans-vietnamese-400-normal-Cg2kxhWu.woff2
  92. BIN
      static/dist/assets/plus-jakarta-sans-vietnamese-500-normal-CvE5C8T-.woff
  93. BIN
      static/dist/assets/plus-jakarta-sans-vietnamese-500-normal-DiU8zqi-.woff2
  94. BIN
      static/dist/assets/plus-jakarta-sans-vietnamese-600-normal-5YsyKbU1.woff
  95. BIN
      static/dist/assets/plus-jakarta-sans-vietnamese-600-normal-Y4VTTRme.woff2
  96. BIN
      static/dist/assets/plus-jakarta-sans-vietnamese-700-normal-BCh_uG_5.woff
  97. BIN
      static/dist/assets/plus-jakarta-sans-vietnamese-700-normal-CV6qDkkj.woff2
  98. 67 0
      static/dist/index.html
  99. 1 0
      static/dist/registerSW.js
  100. 0 0
      static/dist/sw.js

+ 0 - 1
.gitignore

@@ -30,7 +30,6 @@ node_modules/
 static/custom/*
 !static/custom/.gitkeep
 .claude/
-static/dist/
 .planning/
 .coverage
 # Frontend test artifacts

+ 0 - 41
dw

@@ -28,26 +28,6 @@ YELLOW='\033[1;33m'
 BLUE='\033[0;34m'
 NC='\033[0m'
 
-# Temporary swap for memory-constrained boards (e.g. Pi Zero 2W)
-SWAP_FILE="/tmp/dw-build-swap"
-enable_swap() {
-    local total_mb
-    total_mb=$(awk '/MemTotal/ {printf "%d", $2/1024}' /proc/meminfo)
-    if [[ "$total_mb" -lt 1024 ]]; then
-        echo "Low memory detected (${total_mb}MB). Enabling temporary swap..."
-        sudo dd if=/dev/zero of="$SWAP_FILE" bs=1M count=1024 status=none 2>/dev/null || true
-        sudo chmod 600 "$SWAP_FILE"
-        sudo mkswap "$SWAP_FILE" > /dev/null 2>&1 || true
-        sudo swapon "$SWAP_FILE" 2>/dev/null || true
-    fi
-}
-disable_swap() {
-    if [[ -f "$SWAP_FILE" ]]; then
-        sudo swapoff "$SWAP_FILE" 2>/dev/null || true
-        sudo rm -f "$SWAP_FILE"
-    fi
-}
-
 # Find dune-weaver directory
 find_install_dir() {
     # Check common locations
@@ -138,20 +118,10 @@ cmd_update() {
         exec /usr/local/bin/dw update --continue
     fi
 
-    enable_swap
-
     echo "Updating Python dependencies..."
     source .venv/bin/activate
     pip install -r requirements.txt
 
-    echo "Rebuilding frontend..."
-    cd "$INSTALL_DIR/frontend"
-    npm ci --loglevel=error
-    npx vite build
-    cd "$INSTALL_DIR"
-
-    disable_swap
-
     # Update nginx config
     echo "Updating nginx config..."
     sudo cp "$INSTALL_DIR/nginx/dune-weaver.conf" /etc/nginx/sites-available/dune-weaver.conf
@@ -333,22 +303,11 @@ cmd_checkout() {
 
     echo -e "Switched to branch: ${GREEN}${branch}${NC}"
 
-    enable_swap
-
-    # Rebuild frontend
-    echo "Rebuilding frontend..."
-    cd "$INSTALL_DIR/frontend"
-    npm ci --loglevel=error
-    npx vite build
-    cd "$INSTALL_DIR"
-
     # Update Python dependencies
     echo "Updating Python dependencies..."
     source .venv/bin/activate
     pip install -r requirements.txt
 
-    disable_swap
-
     # Update dw CLI from the new branch
     sudo cp "$INSTALL_DIR/dw" /usr/local/bin/dw
     sudo chmod +x /usr/local/bin/dw

+ 27 - 55
setup-pi.sh

@@ -82,28 +82,6 @@ print_success() {
     echo -e "${GREEN}$1${NC}"
 }
 
-# Temporary swap for memory-constrained boards (e.g. Pi Zero 2W with 512MB)
-SWAP_FILE="/tmp/dw-build-swap"
-
-enable_swap() {
-    local total_mb
-    total_mb=$(awk '/MemTotal/ {printf "%d", $2/1024}' /proc/meminfo)
-    if [[ "$total_mb" -lt 1024 ]]; then
-        echo "Low memory detected (${total_mb}MB). Enabling temporary swap..."
-        sudo dd if=/dev/zero of="$SWAP_FILE" bs=1M count=1024 status=none 2>/dev/null || true
-        sudo chmod 600 "$SWAP_FILE"
-        sudo mkswap "$SWAP_FILE" > /dev/null 2>&1 || true
-        sudo swapon "$SWAP_FILE" 2>/dev/null || true
-    fi
-}
-
-disable_swap() {
-    if [[ -f "$SWAP_FILE" ]]; then
-        sudo swapoff "$SWAP_FILE" 2>/dev/null || true
-        sudo rm -f "$SWAP_FILE"
-    fi
-}
-
 # Install system dependencies
 install_system_deps() {
     print_step "Installing system dependencies..."
@@ -159,29 +137,6 @@ install_lgpio() {
     fi
 }
 
-# Install Node.js 20 via nodesource
-install_nodejs() {
-    print_step "Installing Node.js..."
-
-    if command -v node &> /dev/null; then
-        local node_version
-        node_version=$(node --version)
-        echo "Node.js already installed: $node_version"
-        # Check if version is 20+
-        local major
-        major=$(echo "$node_version" | sed 's/v//' | cut -d. -f1)
-        if [[ "$major" -ge 20 ]]; then
-            print_success "Node.js version is sufficient"
-            return
-        fi
-        echo "Upgrading to Node.js 20..."
-    fi
-
-    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
-    sudo DEBIAN_FRONTEND=noninteractive apt install -y nodejs
-    print_success "Node.js $(node --version) installed"
-}
-
 # Check if running on Raspberry Pi
 check_raspberry_pi() {
     print_step "Checking system compatibility..."
@@ -304,15 +259,6 @@ deploy_native() {
     pip install --upgrade pip
     pip install -r requirements.txt
 
-    # Build frontend (swap helps Pi Zero 2W survive npm ci)
-    enable_swap
-    print_step "Building frontend..."
-    cd "$INSTALL_DIR/frontend"
-    npm ci --loglevel=error
-    npx vite build
-    cd "$INSTALL_DIR"
-    disable_swap
-
     # Ensure nginx (www-data) can traverse to static files
     # chmod o+x grants traversal only, not directory listing
     local dir="$INSTALL_DIR"
@@ -466,6 +412,32 @@ configure_uart() {
     fi
 }
 
+# Remove software that is no longer needed on the Pi
+cleanup_unused() {
+    print_step "Cleaning up unused software..."
+
+    # Remove Node.js / npm if present from a prior install
+    if dpkg -l nodejs 2>/dev/null | grep -q '^ii'; then
+        echo "Removing Node.js (no longer needed — frontend is pre-built)..."
+        sudo apt purge -y nodejs || true
+        sudo rm -f /etc/apt/sources.list.d/nodesource.list \
+                    /etc/apt/keyrings/nodesource.gpg 2>/dev/null || true
+        sudo apt autoremove -y
+        print_success "Node.js removed"
+    fi
+
+    # Remove Docker if present from old Docker-based deployment
+    if dpkg -l docker-ce 2>/dev/null | grep -q '^ii'; then
+        echo "Removing Docker (old deployment method)..."
+        # Stop running containers
+        sudo docker stop $(sudo docker ps -aq) 2>/dev/null || true
+        sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 2>/dev/null || true
+        sudo rm -rf /var/lib/docker
+        sudo apt autoremove -y
+        print_success "Docker removed"
+    fi
+}
+
 # Get IP address
 get_ip_address() {
     # Try multiple methods to get IP
@@ -541,7 +513,6 @@ main() {
     # Run setup steps
     check_raspberry_pi
     install_system_deps
-    install_nodejs
     ensure_repo
     update_system
     disable_wlan_powersave
@@ -557,6 +528,7 @@ main() {
     install_lgpio
     deploy_native
     install_cli
+    cleanup_unused
     print_final_instructions
 }
 

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
static/dist/assets/index-B78VxGpo.css


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
static/dist/assets/index-pZ3J7MoU.js


BIN
static/dist/assets/material-icons-Dr0goTwe.woff


BIN
static/dist/assets/material-icons-kAwBdRge.woff2


BIN
static/dist/assets/material-icons-outlined-BpWbwl2n.woff


BIN
static/dist/assets/material-icons-outlined-DZhiGvEA.woff2


BIN
static/dist/assets/noto-sans-cyrillic-400-normal-BDYvNhAR.woff


BIN
static/dist/assets/noto-sans-cyrillic-400-normal-CHP_ranX.woff2


BIN
static/dist/assets/noto-sans-cyrillic-500-normal-9zZ_jNuA.woff2


BIN
static/dist/assets/noto-sans-cyrillic-500-normal-BxM0HQjg.woff


BIN
static/dist/assets/noto-sans-cyrillic-600-normal-BRIw9PIU.woff


BIN
static/dist/assets/noto-sans-cyrillic-600-normal-KpAl9xZA.woff2


BIN
static/dist/assets/noto-sans-cyrillic-700-normal-D8UNalU-.woff


BIN
static/dist/assets/noto-sans-cyrillic-700-normal-DYZmzPmX.woff2


BIN
static/dist/assets/noto-sans-cyrillic-ext-400-normal-BjDhGU6t.woff2


BIN
static/dist/assets/noto-sans-cyrillic-ext-400-normal-d9FrwbiD.woff


BIN
static/dist/assets/noto-sans-cyrillic-ext-500-normal-Bw4G4pNe.woff


BIN
static/dist/assets/noto-sans-cyrillic-ext-500-normal-CuwgPeWW.woff2


BIN
static/dist/assets/noto-sans-cyrillic-ext-600-normal-Cwz1867h.woff


BIN
static/dist/assets/noto-sans-cyrillic-ext-600-normal-DlWr7wnj.woff2


BIN
static/dist/assets/noto-sans-cyrillic-ext-700-normal-D83T7awq.woff


BIN
static/dist/assets/noto-sans-cyrillic-ext-700-normal-OK-fZO_i.woff2


BIN
static/dist/assets/noto-sans-devanagari-400-normal-C3FccbrF.woff2


BIN
static/dist/assets/noto-sans-devanagari-400-normal-g9fsM2jL.woff


BIN
static/dist/assets/noto-sans-devanagari-500-normal-B62tDw8r.woff


BIN
static/dist/assets/noto-sans-devanagari-500-normal-VG35fhMU.woff2


BIN
static/dist/assets/noto-sans-devanagari-600-normal-Bly84zfI.woff


BIN
static/dist/assets/noto-sans-devanagari-600-normal-Ewgvvq1j.woff2


BIN
static/dist/assets/noto-sans-devanagari-700-normal-CT12sGlc.woff


BIN
static/dist/assets/noto-sans-devanagari-700-normal-DVs0dmkg.woff2


BIN
static/dist/assets/noto-sans-greek-400-normal-Be2BcUUc.woff


BIN
static/dist/assets/noto-sans-greek-400-normal-DCESwnT1.woff2


BIN
static/dist/assets/noto-sans-greek-500-normal-BAAA_uK7.woff


BIN
static/dist/assets/noto-sans-greek-500-normal-D_0l3T9g.woff2


BIN
static/dist/assets/noto-sans-greek-600-normal-C0bz_iEd.woff


BIN
static/dist/assets/noto-sans-greek-600-normal-CT9U7UAD.woff2


BIN
static/dist/assets/noto-sans-greek-700-normal-DDNJsN3F.woff


BIN
static/dist/assets/noto-sans-greek-700-normal-x3kNWF-0.woff2


BIN
static/dist/assets/noto-sans-greek-ext-400-normal-L11LEhi4.woff


BIN
static/dist/assets/noto-sans-greek-ext-400-normal-i2oSBwXz.woff2


BIN
static/dist/assets/noto-sans-greek-ext-500-normal-CbZNESfr.woff


BIN
static/dist/assets/noto-sans-greek-ext-500-normal-D6bOGD5V.woff2


BIN
static/dist/assets/noto-sans-greek-ext-600-normal-B4z4a2vi.woff2


BIN
static/dist/assets/noto-sans-greek-ext-600-normal-BjvVOqxV.woff


BIN
static/dist/assets/noto-sans-greek-ext-700-normal-BOmIwFkq.woff


BIN
static/dist/assets/noto-sans-greek-ext-700-normal-Dq1WA5-1.woff2


BIN
static/dist/assets/noto-sans-latin-400-normal-BTkUljjl.woff2


BIN
static/dist/assets/noto-sans-latin-400-normal-DPpKfCgK.woff


BIN
static/dist/assets/noto-sans-latin-500-normal-CDPngY5C.woff


BIN
static/dist/assets/noto-sans-latin-500-normal-DCA2Z9Cj.woff2


BIN
static/dist/assets/noto-sans-latin-600-normal-DVJMj_t0.woff


BIN
static/dist/assets/noto-sans-latin-600-normal-Dkgu5AE5.woff2


BIN
static/dist/assets/noto-sans-latin-700-normal-CrvTEWhy.woff2


BIN
static/dist/assets/noto-sans-latin-700-normal-ZyrKABVF.woff


BIN
static/dist/assets/noto-sans-latin-ext-400-normal-CNh9dRW_.woff


BIN
static/dist/assets/noto-sans-latin-ext-400-normal-CVf-LbaS.woff2


BIN
static/dist/assets/noto-sans-latin-ext-500-normal-Bn9_h39k.woff


BIN
static/dist/assets/noto-sans-latin-ext-500-normal-D88cFz81.woff2


BIN
static/dist/assets/noto-sans-latin-ext-600-normal-B3lLaxXr.woff


BIN
static/dist/assets/noto-sans-latin-ext-600-normal-Has_8ph9.woff2


BIN
static/dist/assets/noto-sans-latin-ext-700-normal-BypTtJma.woff2


BIN
static/dist/assets/noto-sans-latin-ext-700-normal-CgsG9aVh.woff


BIN
static/dist/assets/noto-sans-vietnamese-400-normal-C3Al4sv4.woff


BIN
static/dist/assets/noto-sans-vietnamese-400-normal-D2wP-Vm-.woff2


BIN
static/dist/assets/noto-sans-vietnamese-500-normal-BBHKifio.woff


BIN
static/dist/assets/noto-sans-vietnamese-500-normal-B_DgfjT4.woff2


BIN
static/dist/assets/noto-sans-vietnamese-600-normal-D0HZFEqa.woff


BIN
static/dist/assets/noto-sans-vietnamese-600-normal-mhyQDSzg.woff2


BIN
static/dist/assets/noto-sans-vietnamese-700-normal-1GL2JyGE.woff


BIN
static/dist/assets/noto-sans-vietnamese-700-normal-DayJ0F-f.woff2


BIN
static/dist/assets/plus-jakarta-sans-latin-400-normal-BDKaGhyp.woff


BIN
static/dist/assets/plus-jakarta-sans-latin-400-normal-Dhut76fR.woff2


BIN
static/dist/assets/plus-jakarta-sans-latin-500-normal-Bf-nb4oT.woff2


BIN
static/dist/assets/plus-jakarta-sans-latin-500-normal-DYtqi0QS.woff


BIN
static/dist/assets/plus-jakarta-sans-latin-600-normal-BR_Ojra4.woff


BIN
static/dist/assets/plus-jakarta-sans-latin-600-normal-DLTa1BUW.woff2


BIN
static/dist/assets/plus-jakarta-sans-latin-700-normal-CfpNZvy6.woff2


BIN
static/dist/assets/plus-jakarta-sans-latin-700-normal-DqEcQeE5.woff


BIN
static/dist/assets/plus-jakarta-sans-latin-ext-400-normal-2ppkqaOR.woff


BIN
static/dist/assets/plus-jakarta-sans-latin-ext-400-normal-D127hM_v.woff2


BIN
static/dist/assets/plus-jakarta-sans-latin-ext-500-normal-9VZagAe1.woff2


BIN
static/dist/assets/plus-jakarta-sans-latin-ext-500-normal-CqEEAICU.woff


BIN
static/dist/assets/plus-jakarta-sans-latin-ext-600-normal-B0WRRYJ1.woff


BIN
static/dist/assets/plus-jakarta-sans-latin-ext-600-normal-DQgPU_Cg.woff2


BIN
static/dist/assets/plus-jakarta-sans-latin-ext-700-normal-8-d-IyIQ.woff


BIN
static/dist/assets/plus-jakarta-sans-latin-ext-700-normal-BajbvANd.woff2


BIN
static/dist/assets/plus-jakarta-sans-vietnamese-400-normal-B8TCSmUq.woff


BIN
static/dist/assets/plus-jakarta-sans-vietnamese-400-normal-Cg2kxhWu.woff2


BIN
static/dist/assets/plus-jakarta-sans-vietnamese-500-normal-CvE5C8T-.woff


BIN
static/dist/assets/plus-jakarta-sans-vietnamese-500-normal-DiU8zqi-.woff2


BIN
static/dist/assets/plus-jakarta-sans-vietnamese-600-normal-5YsyKbU1.woff


BIN
static/dist/assets/plus-jakarta-sans-vietnamese-600-normal-Y4VTTRme.woff2


BIN
static/dist/assets/plus-jakarta-sans-vietnamese-700-normal-BCh_uG_5.woff


BIN
static/dist/assets/plus-jakarta-sans-vietnamese-700-normal-CV6qDkkj.woff2


+ 67 - 0
static/dist/index.html

@@ -0,0 +1,67 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
+    <meta name="description" content="Control your kinetic sand table" />
+
+    <!-- PWA Meta Tags -->
+    <meta name="theme-color" content="#0a0a0a" />
+    <meta name="apple-mobile-web-app-capable" content="yes" />
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
+    <meta name="apple-mobile-web-app-title" content="Dune Weaver" />
+    <meta name="mobile-web-app-capable" content="yes" />
+
+    <!-- Favicons - will be updated dynamically if custom logo exists -->
+    <link rel="icon" type="image/x-icon" href="/static/favicon.ico" id="favicon-ico" />
+    <link rel="icon" type="image/png" sizes="128x128" href="/static/favicon-128x128.png" id="favicon-128" />
+    <link rel="icon" type="image/png" sizes="96x96" href="/static/favicon-96x96.png" id="favicon-96" />
+    <link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png" id="favicon-32" />
+    <link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png" id="favicon-16" />
+    <link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png" id="apple-touch-icon" />
+    <link rel="manifest" href="/api/manifest.webmanifest" id="manifest" />
+
+    <title>Dune Weaver</title>
+
+    <!-- Check for custom favicon -->
+    <script>
+      // Get base URL for active table (supports multi-table connections)
+      (function() {
+        var baseUrl = '';
+        try {
+          var stored = localStorage.getItem('duneweaver_tables');
+          var activeId = localStorage.getItem('duneweaver_active_table');
+          if (stored && activeId) {
+            var data = JSON.parse(stored);
+            var active = (data.tables || []).find(function(t) { return t.id === activeId; });
+            if (active && !active.isCurrent && active.url && active.url !== window.location.origin) {
+              baseUrl = active.url.replace(/\/$/, '');
+            }
+          }
+        } catch (e) {}
+
+        fetch(baseUrl + '/api/settings')
+          .then(function(r) { return r.json(); })
+          .then(function(settings) {
+            if (settings.app && settings.app.custom_logo) {
+              // Use generated icons with proper padding (not the raw uploaded logo)
+              document.getElementById('favicon-ico').href = baseUrl + '/static/custom/favicon.ico';
+              document.getElementById('apple-touch-icon').href = baseUrl + '/static/custom/apple-touch-icon.png';
+            }
+            if (settings.app && settings.app.name) {
+              document.title = settings.app.name;
+              // Also update PWA title
+              var appTitleMeta = document.querySelector('meta[name="apple-mobile-web-app-title"]');
+              if (appTitleMeta) appTitleMeta.content = settings.app.name;
+            }
+          })
+          .catch(function() {});
+      })();
+    </script>
+    <script type="module" crossorigin src="/assets/index-pZ3J7MoU.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-B78VxGpo.css">
+  <script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
+  <body>
+    <div id="root"></div>
+  </body>
+</html>

+ 1 - 0
static/dist/registerSW.js

@@ -0,0 +1 @@
+if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('/sw.js', { scope: '/' })})}

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
static/dist/sw.js


Неке датотеке нису приказане због велике количине промена