This commit is contained in:
2026-08-07 17:19:57 +00:00
parent 08816695c9
commit 4375781521
9 changed files with 67 additions and 84 deletions

2
.gitignore vendored
View File

@@ -30,3 +30,5 @@ dist-ssr
*.njsproj *.njsproj
*.sln *.sln
*.sw? *.sw?
deploy.yml

16
Dockerfile Normal file
View File

@@ -0,0 +1,16 @@
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --omit=dev
COPY --from=build /app/dist ./dist
COPY start.js ./
EXPOSE 8005
ENV NODE_ENV=production
CMD ["node", "start.js"]

BIN
PROMIST LOGO.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 KiB

View File

@@ -1,5 +0,0 @@
name: promist
type: node
port: 8005
build: npm run build
start: PORT=8005 node start.js

87
package-lock.json generated
View File

@@ -2105,6 +2105,7 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2121,6 +2122,7 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2137,6 +2139,7 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2153,6 +2156,7 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2169,6 +2173,7 @@
"cpu": [ "cpu": [
"arm" "arm"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2185,9 +2190,7 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"libc": [ "dev": true,
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2204,9 +2207,7 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"libc": [ "dev": true,
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2223,9 +2224,7 @@
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
"libc": [ "dev": true,
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2242,9 +2241,7 @@
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
"libc": [ "dev": true,
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2261,9 +2258,7 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [ "dev": true,
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2280,9 +2275,7 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [ "dev": true,
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2299,6 +2292,7 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2315,6 +2309,7 @@
"cpu": [ "cpu": [
"wasm32" "wasm32"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -2333,6 +2328,7 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2349,6 +2345,7 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2505,9 +2502,6 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2524,9 +2518,6 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2543,9 +2534,6 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -2562,9 +2550,6 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -5153,9 +5138,6 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"libc": [
"glibc"
],
"license": "MPL-2.0", "license": "MPL-2.0",
"optional": true, "optional": true,
"os": [ "os": [
@@ -5176,9 +5158,6 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"libc": [
"musl"
],
"license": "MPL-2.0", "license": "MPL-2.0",
"optional": true, "optional": true,
"os": [ "os": [
@@ -5199,9 +5178,6 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [
"glibc"
],
"license": "MPL-2.0", "license": "MPL-2.0",
"optional": true, "optional": true,
"os": [ "os": [
@@ -5222,9 +5198,6 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [
"musl"
],
"license": "MPL-2.0", "license": "MPL-2.0",
"optional": true, "optional": true,
"os": [ "os": [
@@ -5462,6 +5435,18 @@
} }
} }
}, },
"node_modules/nitro/node_modules/lru-cache": {
"version": "11.5.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
"integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
"dev": true,
"license": "BlueOak-1.0.0",
"optional": true,
"peer": true,
"engines": {
"node": "20 || >=22"
}
},
"node_modules/nitro/node_modules/unstorage": { "node_modules/nitro/node_modules/unstorage": {
"version": "2.0.0-alpha.7", "version": "2.0.0-alpha.7",
"resolved": "https://registry.npmjs.org/unstorage/-/unstorage-2.0.0-alpha.7.tgz", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-2.0.0-alpha.7.tgz",
@@ -6799,9 +6784,6 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -6818,9 +6800,6 @@
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -6837,9 +6816,6 @@
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -6856,9 +6832,6 @@
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -6875,9 +6848,6 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -6894,9 +6864,6 @@
"cpu": [ "cpu": [
"x64" "x64"
], ],
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [

BIN
public/profen-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 993 KiB

View File

@@ -174,7 +174,7 @@ function Header() {
return ( return (
<header className="sticky top-0 z-50 bg-background/95 backdrop-blur border-b"> <header className="sticky top-0 z-50 bg-background/95 backdrop-blur border-b">
<div className="container-page flex items-center justify-between h-20"> <div className="container-page flex items-center justify-center gap-6 h-20">
<Link to="/" className="flex items-center shrink-0"> <Link to="/" className="flex items-center shrink-0">
<img src="/promist-logo.png" alt="Promist" className="h-10 w-auto" /> <img src="/promist-logo.png" alt="Promist" className="h-10 w-auto" />
</Link> </Link>
@@ -195,6 +195,9 @@ function Header() {
), ),
)} )}
</nav> </nav>
<a href="https://profen.openexplorer.xyz" target="_blank" rel="noopener noreferrer" className="hidden lg:block shrink-0" aria-label="Profen Engineering">
<img src="/profen-logo.png" alt="Profen Engineering" className="h-9 w-auto" />
</a>
<button <button
onClick={() => setOpen((v) => !v)} onClick={() => setOpen((v) => !v)}
className="lg:hidden inline-flex items-center justify-center h-10 w-10 rounded-md border" className="lg:hidden inline-flex items-center justify-center h-10 w-10 rounded-md border"
@@ -297,6 +300,7 @@ function Footer() {
<div className="container-page py-5 text-xs text-muted-foreground flex flex-wrap justify-between gap-2"> <div className="container-page py-5 text-xs text-muted-foreground flex flex-wrap justify-between gap-2">
<span>&copy; 2026 Promist Misting Systems. All rights reserved.</span> <span>&copy; 2026 Promist Misting Systems. All rights reserved.</span>
<span>Humidity and Control</span> <span>Humidity and Control</span>
<span className="w-full text-center pt-1">Maintained and built by OpenXpert Solutions LLC.</span>
</div> </div>
</div> </div>
</footer> </footer>

View File

@@ -8,7 +8,7 @@ export const Route = createFileRoute("/")({
head: () => ({ head: () => ({
meta: [ meta: [
{ title: "Promist — High-Pressure Misting for Cooling & Humidity" }, { title: "Promist — High-Pressure Misting for Cooling & Humidity" },
{ name: "description", content: "Turnkey misting systems for outdoor cooling, humidification, dust suppression, sanitization and special effects. Manufactured in the UAE since 1979." }, { name: "description", content: "Turnkey misting systems for outdoor cooling, humidification, dust suppression and special effects. Manufactured in the UAE since 1979." },
{ property: "og:title", content: "Promist — Humidity and Control" }, { property: "og:title", content: "Promist — Humidity and Control" },
{ property: "og:description", content: "Misting systems for cooling, humidification and dust suppression." }, { property: "og:description", content: "Misting systems for cooling, humidification and dust suppression." },
], ],
@@ -18,7 +18,6 @@ export const Route = createFileRoute("/")({
const IMG = { const IMG = {
nozzle: "/wp-uploads/2020/04/banner-sanitz.jpg", nozzle: "/wp-uploads/2020/04/banner-sanitz.jpg",
booth: "/wp-uploads/2020/04/image-002.png",
humid: "/wp-uploads/2016/03/humidification-misting.jpg", humid: "/wp-uploads/2016/03/humidification-misting.jpg",
commercial: "/wp-uploads/2016/03/commercial-misting.jpg", commercial: "/wp-uploads/2016/03/commercial-misting.jpg",
industrial: "/wp-uploads/2016/03/industrial-misting.jpg", industrial: "/wp-uploads/2016/03/industrial-misting.jpg",
@@ -30,11 +29,11 @@ const IMG = {
const SLIDES = [ const SLIDES = [
{ {
img: "/slide-sanitization.jpg", img: "/wp-uploads/2017/04/nozzle-banner1.jpg",
title: "Sanitization Booth", title: "Misting Solutions",
subtitle: "A turnkey solution for your disinfectant needs — engineered for continuous public use.", subtitle: "Turnkey high-pressure misting for outdoor cooling, humidification, dust suppression and special effects — engineered in the UAE since 1979.",
cta: "View details", cta: "Discover solutions",
ctaTo: "/products/sanitization-booth", ctaTo: "/misting-technology",
}, },
{ {
img: "/slide-residential.jpg", img: "/slide-residential.jpg",
@@ -180,23 +179,23 @@ function Home() {
{/* HERO SLIDER */} {/* HERO SLIDER */}
<HeroSlider /> <HeroSlider />
{/* SANITIZATION BOOTH FEATURE */} {/* HIGH-PRESSURE MISTING SOLUTIONS FEATURE */}
<section className="bg-muted/40 py-24 border-y"> <section className="bg-muted/40 py-24 border-y">
<div className="container-page grid lg:grid-cols-2 gap-14 items-center"> <div className="container-page grid lg:grid-cols-2 gap-14 items-center">
<div> <div>
<span className="rule-blue" /> <span className="rule-blue" />
<h2 className="mt-4 font-display text-4xl md:text-5xl font-black">Sanitization Booth</h2> <h2 className="mt-4 font-display text-4xl md:text-5xl font-black">High-Pressure Misting Solutions</h2>
<p className="mt-4 text-muted-foreground max-w-lg"> <p className="mt-4 text-muted-foreground max-w-lg">
A turnkey solution for your disinfectant needs engineered for continuous public use. From residential patios to industrial facilities, our high-pressure misting systems cool the air, control humidity, suppress dust and elevate spaces designed, built and installed in the UAE since 1979.
</p> </p>
<ul className="mt-8 grid sm:grid-cols-2 gap-x-8 gap-y-4 text-sm"> <ul className="mt-8 grid sm:grid-cols-2 gap-x-8 gap-y-4 text-sm">
{[ {[
"Transparent plastic cover with aluminium structure", "Outdoor cooling up to 45°C and beyond",
"Electric control panel", "Industrial & commercial humidification",
"Optimised water consumption", "Dust suppression & air filtration",
"Reflective sensor", "Special effects for events & landscapes",
"Custom system design & installation",
"12-month warranty from installation", "12-month warranty from installation",
"234 × 110 × 238 cm",
].map((f) => ( ].map((f) => (
<li key={f} className="flex gap-3 border-b border-dashed pb-3"> <li key={f} className="flex gap-3 border-b border-dashed pb-3">
<span className="text-brand-red font-black">/</span> <span className="text-brand-red font-black">/</span>
@@ -204,12 +203,12 @@ function Home() {
</li> </li>
))} ))}
</ul> </ul>
<Link to="/products/sanitization-booth" className="mt-8 inline-flex items-center gap-2 bg-brand-blue text-white px-6 py-3 rounded-md text-sm font-semibold hover:opacity-90"> <Link to="/misting-technology" className="mt-8 inline-flex items-center gap-2 bg-brand-blue text-white px-6 py-3 rounded-md text-sm font-semibold hover:opacity-90">
View details <ArrowUpRight className="h-4 w-4" /> Discover solutions <ArrowUpRight className="h-4 w-4" />
</Link> </Link>
</div> </div>
<div> <div>
<img src={IMG.booth} alt="Sanitization Booth" className="w-full max-h-[560px] object-contain" /> <img src="/wp-uploads/2017/04/commercial.jpg" alt="Misting Solutions" className="w-full max-h-[560px] object-contain" />
</div> </div>
</div> </div>
</section> </section>