Appwrite
tcp/443
Edge
tcp/443
Varnish
tcp/80
Open service 2a04:4e42:400::820:80 · quickserve.io
2026-02-08 19:04
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Sun, 08 Feb 2026 19:04:28 GMT Via: 1.1 varnish X-Served-By: cache-yyz4540-YYZ X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1770577468.481625,VS0,VE0
Open service 2a04:4e42:200::820:80 · quickserve.io
2026-02-08 19:04
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Sun, 08 Feb 2026 19:04:28 GMT Via: 1.1 varnish X-Served-By: cache-pao-kpao1770044-PAO X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1770577468.458143,VS0,VE0
Open service 151.101.3.52:80 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://appwrite.quickserve.io/ Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:25 GMT Via: 1.1 varnish X-Served-By: cache-sjc10027-SJC X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769091025.110141,VS0,VE0
Open service 2a04:4e42:400::820:443 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-Appwrite-Platform, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Expose-Headers: X-Appwrite-Session, X-Fallback-Cookies Access-Control-Max-Age: 86400 Content-Type: text/html Location: /console/ Server: Appwrite Strict-Transport-Security: max-age=10886400 X-Content-Type-Options: nosniff X-Debug-Speed: 0.0038471221923828 X-Frame-Options: SAMEORIGIN X-Ua-Compatible: IE=Edge X-Xss-Protection: 1; mode=block; report=/v1/xss?url=%2F Accept-Ranges: bytes Via: 1.1 varnish, 1.1 varnish Date: Thu, 22 Jan 2026 14:10:25 GMT X-Served-By: cache-fra-etou8220153-FRA, cache-bom-vanm7210044-BOM X-Cache: MISS, MISS X-Cache-Hits: 0, 0
Open service 151.101.195.52:80 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://appwrite.quickserve.io/ Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:25 GMT Via: 1.1 varnish X-Served-By: cache-yyz4538-YYZ X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769091025.058448,VS0,VE0
Open service 2a04:4e42:600::820:443 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-Appwrite-Platform, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Expose-Headers: X-Appwrite-Session, X-Fallback-Cookies Access-Control-Max-Age: 86400 Content-Type: text/html Location: /console/ Server: Appwrite Strict-Transport-Security: max-age=10886400 X-Content-Type-Options: nosniff X-Debug-Speed: 0.0046050548553467 X-Frame-Options: SAMEORIGIN X-Ua-Compatible: IE=Edge X-Xss-Protection: 1; mode=block; report=/v1/xss?url=%2F Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:25 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230163-FRA X-Cache: MISS X-Cache-Hits: 0
Open service 151.101.131.52:443 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-Appwrite-Platform, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Expose-Headers: X-Appwrite-Session, X-Fallback-Cookies Access-Control-Max-Age: 86400 Content-Type: text/html Location: /console/ Server: Appwrite Strict-Transport-Security: max-age=10886400 X-Content-Type-Options: nosniff X-Debug-Speed: 0.0052089691162109 X-Frame-Options: SAMEORIGIN X-Ua-Compatible: IE=Edge X-Xss-Protection: 1; mode=block; report=/v1/xss?url=%2F Accept-Ranges: bytes Via: 1.1 varnish, 1.1 varnish Date: Thu, 22 Jan 2026 14:10:25 GMT X-Served-By: cache-fra-etou8220094-FRA, cache-yyz4562-YYZ X-Cache: MISS, MISS X-Cache-Hits: 0, 0
Open service 2a04:4e42:400::820:80 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://appwrite.quickserve.io/ Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:24 GMT Via: 1.1 varnish X-Served-By: cache-rtm-ehrd2290051-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769091025.932662,VS0,VE0
Open service 151.101.67.52:80 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://appwrite.quickserve.io/ Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:24 GMT Via: 1.1 varnish X-Served-By: cache-rtm-ehrd2290029-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769091025.912817,VS0,VE0
Open service 2a04:4e42:600::820:80 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://appwrite.quickserve.io/ Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:24 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230120-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769091025.913629,VS0,VE0
Open service 151.101.195.52:443 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-Appwrite-Platform, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Expose-Headers: X-Appwrite-Session, X-Fallback-Cookies Access-Control-Max-Age: 86400 Content-Type: text/html Location: /console/ Server: Appwrite Strict-Transport-Security: max-age=10886400 X-Content-Type-Options: nosniff X-Debug-Speed: 0.0044810771942139 X-Frame-Options: SAMEORIGIN X-Ua-Compatible: IE=Edge X-Xss-Protection: 1; mode=block; report=/v1/xss?url=%2F Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:25 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230079-FRA X-Cache: MISS X-Cache-Hits: 0
Open service 151.101.3.52:443 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-Appwrite-Platform, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Expose-Headers: X-Appwrite-Session, X-Fallback-Cookies Access-Control-Max-Age: 86400 Content-Type: text/html Location: /console/ Server: Appwrite Strict-Transport-Security: max-age=10886400 X-Content-Type-Options: nosniff X-Debug-Speed: 0.0043289661407471 X-Frame-Options: SAMEORIGIN X-Ua-Compatible: IE=Edge X-Xss-Protection: 1; mode=block; report=/v1/xss?url=%2F Accept-Ranges: bytes Via: 1.1 varnish, 1.1 varnish Date: Thu, 22 Jan 2026 14:10:25 GMT X-Served-By: cache-fra-eddf8230168-FRA, cache-lga21987-LGA X-Cache: MISS, MISS X-Cache-Hits: 0, 0
Open service 2a04:4e42::820:80 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://appwrite.quickserve.io/ Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:24 GMT Via: 1.1 varnish X-Served-By: cache-pao-kpao1770054-PAO X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769091025.887840,VS0,VE0
Open service 151.101.67.52:443 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-Appwrite-Platform, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Expose-Headers: X-Appwrite-Session, X-Fallback-Cookies Access-Control-Max-Age: 86400 Content-Type: text/html Location: /console/ Server: Appwrite Strict-Transport-Security: max-age=10886400 X-Content-Type-Options: nosniff X-Debug-Speed: 0.0038149356842041 X-Frame-Options: SAMEORIGIN X-Ua-Compatible: IE=Edge X-Xss-Protection: 1; mode=block; report=/v1/xss?url=%2F Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:24 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230021-FRA X-Cache: MISS X-Cache-Hits: 0
Open service 2a04:4e42:200::820:80 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://appwrite.quickserve.io/ Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:24 GMT Via: 1.1 varnish X-Served-By: cache-lga21987-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769091025.878373,VS0,VE0
Open service 2a04:4e42:200::820:443 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-Appwrite-Platform, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Expose-Headers: X-Appwrite-Session, X-Fallback-Cookies Access-Control-Max-Age: 86400 Content-Type: text/html Location: /console/ Server: Appwrite Strict-Transport-Security: max-age=10886400 X-Content-Type-Options: nosniff X-Debug-Speed: 0.007357120513916 X-Frame-Options: SAMEORIGIN X-Ua-Compatible: IE=Edge X-Xss-Protection: 1; mode=block; report=/v1/xss?url=%2F Accept-Ranges: bytes Via: 1.1 varnish, 1.1 varnish Date: Thu, 22 Jan 2026 14:10:24 GMT X-Served-By: cache-fra-etou8220119-FRA, cache-lcy-egml8630093-LCY X-Cache: MISS, MISS X-Cache-Hits: 0, 0
Open service 2a04:4e42::820:443 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-Appwrite-Platform, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE Access-Control-Expose-Headers: X-Appwrite-Session, X-Fallback-Cookies Access-Control-Max-Age: 86400 Content-Type: text/html Location: /console/ Server: Appwrite Strict-Transport-Security: max-age=10886400 X-Content-Type-Options: nosniff X-Debug-Speed: 0.0036919116973877 X-Frame-Options: SAMEORIGIN X-Ua-Compatible: IE=Edge X-Xss-Protection: 1; mode=block; report=/v1/xss?url=%2F Accept-Ranges: bytes Via: 1.1 varnish, 1.1 varnish Date: Thu, 22 Jan 2026 14:10:24 GMT X-Served-By: cache-fra-etou8220045-FRA, cache-lon420088-LON X-Cache: MISS, MISS X-Cache-Hits: 0, 0
Open service 151.101.131.52:80 · appwrite.quickserve.io
2026-01-22 14:10
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://appwrite.quickserve.io/ Accept-Ranges: bytes Date: Thu, 22 Jan 2026 14:10:24 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230035-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769091025.808733,VS0,VE0
Open service 151.101.195.52:443 · quickserve.io
2026-01-12 09:50
HTTP/1.1 200 OK
Connection: close
Content-Length: 14223
Cache-Control: public, max-age=86400, stale-while-revalidate=86400
Content-Type: text/html; charset=utf-8
Etag: "0e15dee8fa312db74d38d4d6c432209e"
Server: Edge
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Appwrite-Project-Id: 68df97bf0002175c565d
X-Appwrite-Traffic-Type: site
X-Content-Type-Options: nosniff
X-Debug-Speed: 0.47721195220947
X-Edge-Location: sfo
X-Edge-Rule-Cache: miss
X-Edge-Runtime-Cache: miss
Accept-Ranges: bytes
Date: Mon, 12 Jan 2026 09:50:39 GMT
Via: 1.1 varnish
Age: 2
X-Served-By: cache-pao-kpao1770066-PAO
X-Cache: HIT
X-Cache-Hits: 1
Page title: QuickServe - Restaurant QR Ordering System
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/logo_simple.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="QuickServe - Modern QR-based restaurant ordering system" />
<script>
(function () {
"use strict";
// Inspector is always available when script is loaded
console.log("[Vibe Inspector] Script loaded and ready");
// Inspector state
let isInspectorActive = false;
let lastHighlightedElement = null;
let selectedElement = null;
let overlayElement = null;
let isInitialized = false;
// Create overlay element for highlighting
function createOverlay() {
if (overlayElement) return overlayElement;
overlayElement = document.createElement("div");
overlayElement.id = "__vibe-inspector-overlay__";
overlayElement.style.cssText = `
position: absolute;
pointer-events: none;
z-index: 999999;
border: 2px solid #007acc;
background: rgba(0, 122, 204, 0.1);
border-radius: 2px;
transition: all 0.1s ease;
display: none;
`;
document.body.appendChild(overlayElement);
return overlayElement;
}
// Remove overlay element
function removeOverlay() {
if (overlayElement && overlayElement.parentNode) {
overlayElement.parentNode.removeChild(overlayElement);
overlayElement = null;
}
}
// Generate CSS selector for element
function generateSelector(element) {
if (!element || element === document.body) return "body";
if (element === document.documentElement) return "html";
// If element has unique ID, use that
if (
element.id &&
document.querySelectorAll("#" + element.id).length === 1
) {
return "#" + element.id;
}
// Build path from root
const path = [];
let current = element;
while (
current &&
current !== document.body &&
current !== document.documentElement
) {
let selector = current.tagName.toLowerCase();
// Add class if available
if (current.className && typeof current.className === "string") {
const classes = current.className
.trim()
.split(/\s+/)
.filter((cls) => cls && /^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(cls));
if (classes.length > 0) {
selector += "." + classes.slice(0, 3).join(".");
}
}
// Add nth-child if there are siblings with same tag
if (current.parentNode) {
const siblings = Array.from(current.parentNode.children).filter(
(sibling) => sibling.tagName === current.tagName
);
if (siblings.length > 1) {
const index = siblings.indexOf(current) + 1;
selector += `:nth-child(${index})`;
}
}
path.unshift(selector);
current = current.parentNode;
}
return path.length > 0
? path.join(" > ")
: element.tagName.toLowerCase();
}
// Extract element data
function extractElementData(element) {
if (!element) return null;
const computedStyles = window.getComputedStyle(element);
const rect = element.getBoundingClientRect();
// Get important computed styles
const importantStyles = [
"display",
"position",
"width",
"height",
"margin",
"padding",
"background-color",
"color",
"font-family",
"font-size",
"border",
"flex-direction",
"justify-content",
Open service 151.101.3.52:80 · quickserve.io
2026-01-12 09:50
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Mon, 12 Jan 2026 09:50:39 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230177-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1768211439.413140,VS0,VE0
Open service 151.101.131.52:443 · quickserve.io
2026-01-12 09:50
HTTP/1.1 200 OK
Connection: close
Content-Length: 14223
Cache-Control: public, max-age=86400, stale-while-revalidate=86400
Content-Type: text/html; charset=utf-8
Etag: "0e15dee8fa312db74d38d4d6c432209e"
Server: Edge
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Appwrite-Project-Id: 68df97bf0002175c565d
X-Appwrite-Traffic-Type: site
X-Content-Type-Options: nosniff
X-Debug-Speed: 0.40018010139465
X-Edge-Location: fra
X-Edge-Rule-Cache: hit
X-Edge-Runtime-Cache: hit
Accept-Ranges: bytes
Date: Mon, 12 Jan 2026 09:50:39 GMT
Via: 1.1 varnish
Age: 2
X-Served-By: cache-fra-eddf8230156-FRA
X-Cache: HIT
X-Cache-Hits: 1
Page title: QuickServe - Restaurant QR Ordering System
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/logo_simple.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="QuickServe - Modern QR-based restaurant ordering system" />
<script>
(function () {
"use strict";
// Inspector is always available when script is loaded
console.log("[Vibe Inspector] Script loaded and ready");
// Inspector state
let isInspectorActive = false;
let lastHighlightedElement = null;
let selectedElement = null;
let overlayElement = null;
let isInitialized = false;
// Create overlay element for highlighting
function createOverlay() {
if (overlayElement) return overlayElement;
overlayElement = document.createElement("div");
overlayElement.id = "__vibe-inspector-overlay__";
overlayElement.style.cssText = `
position: absolute;
pointer-events: none;
z-index: 999999;
border: 2px solid #007acc;
background: rgba(0, 122, 204, 0.1);
border-radius: 2px;
transition: all 0.1s ease;
display: none;
`;
document.body.appendChild(overlayElement);
return overlayElement;
}
// Remove overlay element
function removeOverlay() {
if (overlayElement && overlayElement.parentNode) {
overlayElement.parentNode.removeChild(overlayElement);
overlayElement = null;
}
}
// Generate CSS selector for element
function generateSelector(element) {
if (!element || element === document.body) return "body";
if (element === document.documentElement) return "html";
// If element has unique ID, use that
if (
element.id &&
document.querySelectorAll("#" + element.id).length === 1
) {
return "#" + element.id;
}
// Build path from root
const path = [];
let current = element;
while (
current &&
current !== document.body &&
current !== document.documentElement
) {
let selector = current.tagName.toLowerCase();
// Add class if available
if (current.className && typeof current.className === "string") {
const classes = current.className
.trim()
.split(/\s+/)
.filter((cls) => cls && /^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(cls));
if (classes.length > 0) {
selector += "." + classes.slice(0, 3).join(".");
}
}
// Add nth-child if there are siblings with same tag
if (current.parentNode) {
const siblings = Array.from(current.parentNode.children).filter(
(sibling) => sibling.tagName === current.tagName
);
if (siblings.length > 1) {
const index = siblings.indexOf(current) + 1;
selector += `:nth-child(${index})`;
}
}
path.unshift(selector);
current = current.parentNode;
}
return path.length > 0
? path.join(" > ")
: element.tagName.toLowerCase();
}
// Extract element data
function extractElementData(element) {
if (!element) return null;
const computedStyles = window.getComputedStyle(element);
const rect = element.getBoundingClientRect();
// Get important computed styles
const importantStyles = [
"display",
"position",
"width",
"height",
"margin",
"padding",
"background-color",
"color",
"font-family",
"font-size",
"border",
"flex-direction",
"justify-content",
Open service 2a04:4e42:600::820:80 · quickserve.io
2026-01-12 09:50
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Mon, 12 Jan 2026 09:50:39 GMT Via: 1.1 varnish X-Served-By: cache-pao-kpao1770048-PAO X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1768211439.387457,VS0,VE0
Open service 151.101.195.52:80 · quickserve.io
2026-01-12 09:50
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Mon, 12 Jan 2026 09:50:39 GMT Via: 1.1 varnish X-Served-By: cache-sin-wsss1830063-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1768211439.378594,VS0,VE0
Open service 2a04:4e42:400::820:443 · quickserve.io
2026-01-12 09:50
HTTP/1.1 200 OK
Connection: close
Content-Length: 14223
Cache-Control: public, max-age=86400, stale-while-revalidate=86400
Content-Type: text/html; charset=utf-8
Etag: "0e15dee8fa312db74d38d4d6c432209e"
Server: Edge
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Appwrite-Project-Id: 68df97bf0002175c565d
X-Appwrite-Traffic-Type: site
X-Content-Type-Options: nosniff
X-Debug-Speed: 0.47721195220947
X-Edge-Location: sfo
X-Edge-Rule-Cache: miss
X-Edge-Runtime-Cache: miss
Accept-Ranges: bytes
Date: Mon, 12 Jan 2026 09:50:39 GMT
Via: 1.1 varnish
Age: 2
X-Served-By: cache-pao-kpao1770057-PAO
X-Cache: HIT
X-Cache-Hits: 1
Page title: QuickServe - Restaurant QR Ordering System
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/logo_simple.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="QuickServe - Modern QR-based restaurant ordering system" />
<script>
(function () {
"use strict";
// Inspector is always available when script is loaded
console.log("[Vibe Inspector] Script loaded and ready");
// Inspector state
let isInspectorActive = false;
let lastHighlightedElement = null;
let selectedElement = null;
let overlayElement = null;
let isInitialized = false;
// Create overlay element for highlighting
function createOverlay() {
if (overlayElement) return overlayElement;
overlayElement = document.createElement("div");
overlayElement.id = "__vibe-inspector-overlay__";
overlayElement.style.cssText = `
position: absolute;
pointer-events: none;
z-index: 999999;
border: 2px solid #007acc;
background: rgba(0, 122, 204, 0.1);
border-radius: 2px;
transition: all 0.1s ease;
display: none;
`;
document.body.appendChild(overlayElement);
return overlayElement;
}
// Remove overlay element
function removeOverlay() {
if (overlayElement && overlayElement.parentNode) {
overlayElement.parentNode.removeChild(overlayElement);
overlayElement = null;
}
}
// Generate CSS selector for element
function generateSelector(element) {
if (!element || element === document.body) return "body";
if (element === document.documentElement) return "html";
// If element has unique ID, use that
if (
element.id &&
document.querySelectorAll("#" + element.id).length === 1
) {
return "#" + element.id;
}
// Build path from root
const path = [];
let current = element;
while (
current &&
current !== document.body &&
current !== document.documentElement
) {
let selector = current.tagName.toLowerCase();
// Add class if available
if (current.className && typeof current.className === "string") {
const classes = current.className
.trim()
.split(/\s+/)
.filter((cls) => cls && /^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(cls));
if (classes.length > 0) {
selector += "." + classes.slice(0, 3).join(".");
}
}
// Add nth-child if there are siblings with same tag
if (current.parentNode) {
const siblings = Array.from(current.parentNode.children).filter(
(sibling) => sibling.tagName === current.tagName
);
if (siblings.length > 1) {
const index = siblings.indexOf(current) + 1;
selector += `:nth-child(${index})`;
}
}
path.unshift(selector);
current = current.parentNode;
}
return path.length > 0
? path.join(" > ")
: element.tagName.toLowerCase();
}
// Extract element data
function extractElementData(element) {
if (!element) return null;
const computedStyles = window.getComputedStyle(element);
const rect = element.getBoundingClientRect();
// Get important computed styles
const importantStyles = [
"display",
"position",
"width",
"height",
"margin",
"padding",
"background-color",
"color",
"font-family",
"font-size",
"border",
"flex-direction",
"justify-content",
Open service 151.101.67.52:80 · quickserve.io
2026-01-12 09:50
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Mon, 12 Jan 2026 09:50:39 GMT Via: 1.1 varnish X-Served-By: cache-lga21950-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1768211439.378592,VS0,VE0
Open service 2a04:4e42:200::820:443 · quickserve.io
2026-01-12 09:50
HTTP/1.1 200 OK
Connection: close
Content-Length: 14223
Cache-Control: public, max-age=86400, stale-while-revalidate=86400
Content-Type: text/html; charset=utf-8
Etag: "0e15dee8fa312db74d38d4d6c432209e"
Server: Edge
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Appwrite-Project-Id: 68df97bf0002175c565d
X-Appwrite-Traffic-Type: site
X-Content-Type-Options: nosniff
X-Debug-Speed: 1.2632570266724
X-Edge-Location: nyc
X-Edge-Rule-Cache: miss
X-Edge-Runtime-Cache: miss
Accept-Ranges: bytes
Date: Mon, 12 Jan 2026 09:50:39 GMT
Via: 1.1 varnish
Age: 18325
X-Served-By: cache-lga21935-LGA
X-Cache: HIT
X-Cache-Hits: 1
Page title: QuickServe - Restaurant QR Ordering System
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/logo_simple.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="QuickServe - Modern QR-based restaurant ordering system" />
<script>
(function () {
"use strict";
// Inspector is always available when script is loaded
console.log("[Vibe Inspector] Script loaded and ready");
// Inspector state
let isInspectorActive = false;
let lastHighlightedElement = null;
let selectedElement = null;
let overlayElement = null;
let isInitialized = false;
// Create overlay element for highlighting
function createOverlay() {
if (overlayElement) return overlayElement;
overlayElement = document.createElement("div");
overlayElement.id = "__vibe-inspector-overlay__";
overlayElement.style.cssText = `
position: absolute;
pointer-events: none;
z-index: 999999;
border: 2px solid #007acc;
background: rgba(0, 122, 204, 0.1);
border-radius: 2px;
transition: all 0.1s ease;
display: none;
`;
document.body.appendChild(overlayElement);
return overlayElement;
}
// Remove overlay element
function removeOverlay() {
if (overlayElement && overlayElement.parentNode) {
overlayElement.parentNode.removeChild(overlayElement);
overlayElement = null;
}
}
// Generate CSS selector for element
function generateSelector(element) {
if (!element || element === document.body) return "body";
if (element === document.documentElement) return "html";
// If element has unique ID, use that
if (
element.id &&
document.querySelectorAll("#" + element.id).length === 1
) {
return "#" + element.id;
}
// Build path from root
const path = [];
let current = element;
while (
current &&
current !== document.body &&
current !== document.documentElement
) {
let selector = current.tagName.toLowerCase();
// Add class if available
if (current.className && typeof current.className === "string") {
const classes = current.className
.trim()
.split(/\s+/)
.filter((cls) => cls && /^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(cls));
if (classes.length > 0) {
selector += "." + classes.slice(0, 3).join(".");
}
}
// Add nth-child if there are siblings with same tag
if (current.parentNode) {
const siblings = Array.from(current.parentNode.children).filter(
(sibling) => sibling.tagName === current.tagName
);
if (siblings.length > 1) {
const index = siblings.indexOf(current) + 1;
selector += `:nth-child(${index})`;
}
}
path.unshift(selector);
current = current.parentNode;
}
return path.length > 0
? path.join(" > ")
: element.tagName.toLowerCase();
}
// Extract element data
function extractElementData(element) {
if (!element) return null;
const computedStyles = window.getComputedStyle(element);
const rect = element.getBoundingClientRect();
// Get important computed styles
const importantStyles = [
"display",
"position",
"width",
"height",
"margin",
"padding",
"background-color",
"color",
"font-family",
"font-size",
"border",
"flex-direction",
"justify-content",
Open service 2a04:4e42:200::820:80 · quickserve.io
2026-01-12 09:50
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Mon, 12 Jan 2026 09:50:39 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230069-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1768211439.350848,VS0,VE0
Open service 2a04:4e42:600::820:443 · quickserve.io
2026-01-12 09:50
HTTP/1.1 200 OK
Connection: close
Content-Length: 14223
Cache-Control: public, max-age=86400, stale-while-revalidate=86400
Content-Type: text/html; charset=utf-8
Etag: "0e15dee8fa312db74d38d4d6c432209e"
Server: Edge
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Appwrite-Project-Id: 68df97bf0002175c565d
X-Appwrite-Traffic-Type: site
X-Content-Type-Options: nosniff
X-Debug-Speed: 0.33636903762817
X-Edge-Location: nyc
X-Edge-Rule-Cache: miss
X-Edge-Runtime-Cache: miss
Accept-Ranges: bytes
Date: Mon, 12 Jan 2026 09:50:39 GMT
Via: 1.1 varnish
Age: 2
X-Served-By: cache-yyz4562-YYZ
X-Cache: HIT
X-Cache-Hits: 1
Page title: QuickServe - Restaurant QR Ordering System
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/logo_simple.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="QuickServe - Modern QR-based restaurant ordering system" />
<script>
(function () {
"use strict";
// Inspector is always available when script is loaded
console.log("[Vibe Inspector] Script loaded and ready");
// Inspector state
let isInspectorActive = false;
let lastHighlightedElement = null;
let selectedElement = null;
let overlayElement = null;
let isInitialized = false;
// Create overlay element for highlighting
function createOverlay() {
if (overlayElement) return overlayElement;
overlayElement = document.createElement("div");
overlayElement.id = "__vibe-inspector-overlay__";
overlayElement.style.cssText = `
position: absolute;
pointer-events: none;
z-index: 999999;
border: 2px solid #007acc;
background: rgba(0, 122, 204, 0.1);
border-radius: 2px;
transition: all 0.1s ease;
display: none;
`;
document.body.appendChild(overlayElement);
return overlayElement;
}
// Remove overlay element
function removeOverlay() {
if (overlayElement && overlayElement.parentNode) {
overlayElement.parentNode.removeChild(overlayElement);
overlayElement = null;
}
}
// Generate CSS selector for element
function generateSelector(element) {
if (!element || element === document.body) return "body";
if (element === document.documentElement) return "html";
// If element has unique ID, use that
if (
element.id &&
document.querySelectorAll("#" + element.id).length === 1
) {
return "#" + element.id;
}
// Build path from root
const path = [];
let current = element;
while (
current &&
current !== document.body &&
current !== document.documentElement
) {
let selector = current.tagName.toLowerCase();
// Add class if available
if (current.className && typeof current.className === "string") {
const classes = current.className
.trim()
.split(/\s+/)
.filter((cls) => cls && /^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(cls));
if (classes.length > 0) {
selector += "." + classes.slice(0, 3).join(".");
}
}
// Add nth-child if there are siblings with same tag
if (current.parentNode) {
const siblings = Array.from(current.parentNode.children).filter(
(sibling) => sibling.tagName === current.tagName
);
if (siblings.length > 1) {
const index = siblings.indexOf(current) + 1;
selector += `:nth-child(${index})`;
}
}
path.unshift(selector);
current = current.parentNode;
}
return path.length > 0
? path.join(" > ")
: element.tagName.toLowerCase();
}
// Extract element data
function extractElementData(element) {
if (!element) return null;
const computedStyles = window.getComputedStyle(element);
const rect = element.getBoundingClientRect();
// Get important computed styles
const importantStyles = [
"display",
"position",
"width",
"height",
"margin",
"padding",
"background-color",
"color",
"font-family",
"font-size",
"border",
"flex-direction",
"justify-content",
Open service 151.101.131.52:80 · quickserve.io
2026-01-12 09:50
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Mon, 12 Jan 2026 09:50:39 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230164-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1768211439.371401,VS0,VE0
Open service 151.101.67.52:443 · quickserve.io
2026-01-12 09:50
HTTP/1.1 200 OK
Connection: close
Content-Length: 14223
Cache-Control: public, max-age=86400, stale-while-revalidate=86400
Content-Type: text/html; charset=utf-8
Etag: "0e15dee8fa312db74d38d4d6c432209e"
Server: Edge
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Appwrite-Project-Id: 68df97bf0002175c565d
X-Appwrite-Traffic-Type: site
X-Content-Type-Options: nosniff
X-Debug-Speed: 0.40018010139465
X-Edge-Location: fra
X-Edge-Rule-Cache: hit
X-Edge-Runtime-Cache: hit
Accept-Ranges: bytes
Date: Mon, 12 Jan 2026 09:50:39 GMT
Via: 1.1 varnish
Age: 2
X-Served-By: cache-fra-eddf8230156-FRA
X-Cache: HIT
X-Cache-Hits: 2
Page title: QuickServe - Restaurant QR Ordering System
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/logo_simple.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="QuickServe - Modern QR-based restaurant ordering system" />
<script>
(function () {
"use strict";
// Inspector is always available when script is loaded
console.log("[Vibe Inspector] Script loaded and ready");
// Inspector state
let isInspectorActive = false;
let lastHighlightedElement = null;
let selectedElement = null;
let overlayElement = null;
let isInitialized = false;
// Create overlay element for highlighting
function createOverlay() {
if (overlayElement) return overlayElement;
overlayElement = document.createElement("div");
overlayElement.id = "__vibe-inspector-overlay__";
overlayElement.style.cssText = `
position: absolute;
pointer-events: none;
z-index: 999999;
border: 2px solid #007acc;
background: rgba(0, 122, 204, 0.1);
border-radius: 2px;
transition: all 0.1s ease;
display: none;
`;
document.body.appendChild(overlayElement);
return overlayElement;
}
// Remove overlay element
function removeOverlay() {
if (overlayElement && overlayElement.parentNode) {
overlayElement.parentNode.removeChild(overlayElement);
overlayElement = null;
}
}
// Generate CSS selector for element
function generateSelector(element) {
if (!element || element === document.body) return "body";
if (element === document.documentElement) return "html";
// If element has unique ID, use that
if (
element.id &&
document.querySelectorAll("#" + element.id).length === 1
) {
return "#" + element.id;
}
// Build path from root
const path = [];
let current = element;
while (
current &&
current !== document.body &&
current !== document.documentElement
) {
let selector = current.tagName.toLowerCase();
// Add class if available
if (current.className && typeof current.className === "string") {
const classes = current.className
.trim()
.split(/\s+/)
.filter((cls) => cls && /^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(cls));
if (classes.length > 0) {
selector += "." + classes.slice(0, 3).join(".");
}
}
// Add nth-child if there are siblings with same tag
if (current.parentNode) {
const siblings = Array.from(current.parentNode.children).filter(
(sibling) => sibling.tagName === current.tagName
);
if (siblings.length > 1) {
const index = siblings.indexOf(current) + 1;
selector += `:nth-child(${index})`;
}
}
path.unshift(selector);
current = current.parentNode;
}
return path.length > 0
? path.join(" > ")
: element.tagName.toLowerCase();
}
// Extract element data
function extractElementData(element) {
if (!element) return null;
const computedStyles = window.getComputedStyle(element);
const rect = element.getBoundingClientRect();
// Get important computed styles
const importantStyles = [
"display",
"position",
"width",
"height",
"margin",
"padding",
"background-color",
"color",
"font-family",
"font-size",
"border",
"flex-direction",
"justify-content",
Open service 2a04:4e42:400::820:80 · quickserve.io
2026-01-12 09:50
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://quickserve.io/ Accept-Ranges: bytes Date: Mon, 12 Jan 2026 09:50:39 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230149-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1768211439.310133,VS0,VE0
Open service 151.101.3.52:443 · quickserve.io
2026-01-12 09:50
HTTP/1.1 200 OK
Connection: close
Content-Length: 14223
Cache-Control: public, max-age=86400, stale-while-revalidate=86400
Content-Type: text/html; charset=utf-8
Etag: "0e15dee8fa312db74d38d4d6c432209e"
Server: Edge
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Appwrite-Project-Id: 68df97bf0002175c565d
X-Appwrite-Traffic-Type: site
X-Content-Type-Options: nosniff
X-Debug-Speed: 0.40018010139465
X-Edge-Location: fra
X-Edge-Rule-Cache: hit
X-Edge-Runtime-Cache: hit
Accept-Ranges: bytes
Date: Mon, 12 Jan 2026 09:50:39 GMT
Via: 1.1 varnish
Age: 2
X-Served-By: cache-fra-eddf8230140-FRA
X-Cache: HIT
X-Cache-Hits: 1
Page title: QuickServe - Restaurant QR Ordering System
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/logo_simple.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="QuickServe - Modern QR-based restaurant ordering system" />
<script>
(function () {
"use strict";
// Inspector is always available when script is loaded
console.log("[Vibe Inspector] Script loaded and ready");
// Inspector state
let isInspectorActive = false;
let lastHighlightedElement = null;
let selectedElement = null;
let overlayElement = null;
let isInitialized = false;
// Create overlay element for highlighting
function createOverlay() {
if (overlayElement) return overlayElement;
overlayElement = document.createElement("div");
overlayElement.id = "__vibe-inspector-overlay__";
overlayElement.style.cssText = `
position: absolute;
pointer-events: none;
z-index: 999999;
border: 2px solid #007acc;
background: rgba(0, 122, 204, 0.1);
border-radius: 2px;
transition: all 0.1s ease;
display: none;
`;
document.body.appendChild(overlayElement);
return overlayElement;
}
// Remove overlay element
function removeOverlay() {
if (overlayElement && overlayElement.parentNode) {
overlayElement.parentNode.removeChild(overlayElement);
overlayElement = null;
}
}
// Generate CSS selector for element
function generateSelector(element) {
if (!element || element === document.body) return "body";
if (element === document.documentElement) return "html";
// If element has unique ID, use that
if (
element.id &&
document.querySelectorAll("#" + element.id).length === 1
) {
return "#" + element.id;
}
// Build path from root
const path = [];
let current = element;
while (
current &&
current !== document.body &&
current !== document.documentElement
) {
let selector = current.tagName.toLowerCase();
// Add class if available
if (current.className && typeof current.className === "string") {
const classes = current.className
.trim()
.split(/\s+/)
.filter((cls) => cls && /^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(cls));
if (classes.length > 0) {
selector += "." + classes.slice(0, 3).join(".");
}
}
// Add nth-child if there are siblings with same tag
if (current.parentNode) {
const siblings = Array.from(current.parentNode.children).filter(
(sibling) => sibling.tagName === current.tagName
);
if (siblings.length > 1) {
const index = siblings.indexOf(current) + 1;
selector += `:nth-child(${index})`;
}
}
path.unshift(selector);
current = current.parentNode;
}
return path.length > 0
? path.join(" > ")
: element.tagName.toLowerCase();
}
// Extract element data
function extractElementData(element) {
if (!element) return null;
const computedStyles = window.getComputedStyle(element);
const rect = element.getBoundingClientRect();
// Get important computed styles
const importantStyles = [
"display",
"position",
"width",
"height",
"margin",
"padding",
"background-color",
"color",
"font-family",
"font-size",
"border",
"flex-direction",
"justify-content",