Add 'estore/' from commit 'e34dfc397c94025670baa2b73b482c01f3033a6a'
git-subtree-dir: estore git-subtree-mainline: 746868d720b9be1003a2f783b7a12d526d8eea60 git-subtree-split: e34dfc397c94025670baa2b73b482c01f3033a6a
7
estore/.dockerignore
Normal file
@ -0,0 +1,7 @@
|
||||
node_modules
|
||||
.next
|
||||
.git
|
||||
.env
|
||||
*.env.local
|
||||
npm-debug.log*
|
||||
.DS_Store
|
||||
49
estore/.env.example
Normal file
@ -0,0 +1,49 @@
|
||||
# ─── Square API ────────────────────────────────────────────────────────────────
|
||||
# Get these from https://developer.squareup.com/apps
|
||||
SQUARE_ACCESS_TOKEN=your_square_access_token_here
|
||||
SQUARE_LOCATION_ID=your_square_location_id_here
|
||||
# "sandbox" or "production"
|
||||
SQUARE_ENVIRONMENT=sandbox
|
||||
|
||||
# These are exposed to the browser — use your Square Application ID (not access token)
|
||||
# and the same location ID as above.
|
||||
NEXT_PUBLIC_SQUARE_APP_ID=sandbox-sq0idb-your_app_id_here
|
||||
NEXT_PUBLIC_SQUARE_LOCATION_ID=your_square_location_id_here
|
||||
# "sandbox" or "production" — controls which Square JS SDK URL is loaded
|
||||
NEXT_PUBLIC_SQUARE_ENVIRONMENT=sandbox
|
||||
# Optional: ID of a Square category (Items > Categories) whose items appear in the shop.
|
||||
# If set, only items in this category are shown. Otherwise falls back to src/config/shop-items.json.
|
||||
SQUARE_SHOP_CATEGORY_ID=
|
||||
|
||||
# ─── CalDAV (Nextcloud) ────────────────────────────────────────────────────────
|
||||
# Your Nextcloud CalDAV base URL — include trailing slash
|
||||
CALDAV_URL=https://your-nextcloud.example.com/remote.php/dav/calendars/username/
|
||||
CALDAV_USERNAME=your_nextcloud_username
|
||||
# Use an app password (Settings > Security > Devices & sessions > App passwords)
|
||||
CALDAV_PASSWORD=your_nextcloud_app_password
|
||||
# Display name of the calendar to check for Busy blocks
|
||||
CALDAV_CALENDAR_NAME=Deliveries
|
||||
|
||||
# ─── Email (SMTP — your mail server) ──────────────────────────────────────────
|
||||
SMTP_HOST=mail.beachpartyballoons.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=shop@beachpartyballoons.com
|
||||
SMTP_PASS=your_email_password_here
|
||||
# Address that receives new-order & slot-conflict alerts (you/staff)
|
||||
ALERT_EMAIL_TO=you@beachpartyballoons.com
|
||||
# Sender shown on outgoing emails
|
||||
ALERT_EMAIL_FROM=shop@beachpartyballoons.com
|
||||
|
||||
# ─── Admin panel ───────────────────────────────────────────────────────────────
|
||||
# Password to access /admin — keep this secret
|
||||
ADMIN_PASSWORD=change_me_to_something_strong
|
||||
# Secret token for the cron cache-refresh endpoint (POST /api/cache/refresh)
|
||||
CACHE_REFRESH_SECRET=change_me_to_something_random
|
||||
|
||||
# ─── OSRM (self-hosted routing) ────────────────────────────────────────────────
|
||||
# Leave blank to use the public demo server (unreliable). Self-host for production:
|
||||
# https://hub.docker.com/r/osrm/osrm-backend
|
||||
OSRM_URL=http://localhost:5000
|
||||
|
||||
# ─── Site ──────────────────────────────────────────────────────────────────────
|
||||
NEXT_PUBLIC_SITE_URL=http://localhost:3000
|
||||
32
estore/.gitignore
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
# dependencies
|
||||
node_modules/
|
||||
|
||||
# Next.js build output
|
||||
.next/
|
||||
out/
|
||||
|
||||
# Runtime data — cache and item overrides change at runtime, don't track them
|
||||
data/catalog-cache.json
|
||||
data/item-overrides.json
|
||||
|
||||
# Environment variables — never commit these
|
||||
.env
|
||||
.env.local
|
||||
.env*.local
|
||||
|
||||
# OS / editor
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
.vscode/
|
||||
.idea/
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
|
||||
# Misc
|
||||
.eslintcache
|
||||
|
||||
# Raw/duplicate image files — use public/images/ directly
|
||||
public/images/pics/
|
||||
*.heic
|
||||
34
estore/Dockerfile
Normal file
@ -0,0 +1,34 @@
|
||||
# ── Stage 1: Install dependencies ────────────────────────────────────────────
|
||||
FROM node:20-alpine AS deps
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
|
||||
# ── Stage 2: Build ────────────────────────────────────────────────────────────
|
||||
FROM node:20-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
COPY . .
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
RUN npm run build
|
||||
|
||||
# ── Stage 3: Production runner ────────────────────────────────────────────────
|
||||
FROM node:20-alpine AS runner
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
|
||||
RUN addgroup --system --gid 1001 nodejs \
|
||||
&& adduser --system --uid 1001 nextjs
|
||||
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||
|
||||
USER nextjs
|
||||
EXPOSE 3000
|
||||
ENV PORT=3000
|
||||
ENV HOSTNAME="0.0.0.0"
|
||||
|
||||
CMD ["node", "server.js"]
|
||||
11
estore/data/categories-display.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"order": [
|
||||
"latex",
|
||||
"birthday",
|
||||
"mylar-bouquets",
|
||||
"graduation",
|
||||
"letters-and-numbers",
|
||||
"other"
|
||||
],
|
||||
"hidden": []
|
||||
}
|
||||
8
estore/data/occasions.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"mothers-day": {
|
||||
"windowStart": "04-10"
|
||||
},
|
||||
"graduation": {
|
||||
"windowStart": "04-01"
|
||||
}
|
||||
}
|
||||
26
estore/docker-compose.yml
Normal file
@ -0,0 +1,26 @@
|
||||
services:
|
||||
osrm:
|
||||
image: osrm/osrm-backend
|
||||
container_name: osrm
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5002:5000"
|
||||
volumes:
|
||||
- ./docker/osrm/data:/data
|
||||
command: osrm-routed --algorithm mld /data/connecticut-latest.osrm
|
||||
|
||||
balloons-shop:
|
||||
build: .
|
||||
container_name: balloons-shop
|
||||
ports:
|
||||
- "3000:3000"
|
||||
env_file:
|
||||
- .env
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- osrm
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/catalog"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
1
estore/docker/osrm/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
data/
|
||||
33
estore/docker/osrm/docker-compose.yml
Normal file
@ -0,0 +1,33 @@
|
||||
services:
|
||||
osrm-init:
|
||||
image: osrm/osrm-backend
|
||||
container_name: osrm-init
|
||||
volumes:
|
||||
- ./data:/data
|
||||
entrypoint: sh -c
|
||||
command:
|
||||
- |
|
||||
echo 'Extracting...' &&
|
||||
osrm-extract -p /opt/osrm-backend/profiles/car.lua /data/connecticut-latest.osm.pbf &&
|
||||
echo 'Partitioning...' &&
|
||||
osrm-partition /data/connecticut-latest.osrm &&
|
||||
echo 'Customizing...' &&
|
||||
osrm-customize /data/connecticut-latest.osrm &&
|
||||
echo 'Done.'
|
||||
profiles:
|
||||
- init
|
||||
|
||||
osrm:
|
||||
image: osrm/osrm-backend
|
||||
container_name: osrm
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5002:5000"
|
||||
volumes:
|
||||
- ./data:/data
|
||||
command: osrm-routed --algorithm mld /data/connecticut-latest.osrm
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "echo > /dev/tcp/localhost/5000"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
20
estore/docker/osrm/update.sh
Executable file
@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
# Downloads and reprocesses Connecticut OSM data, then restarts OSRM.
|
||||
# Run quarterly or whenever needed.
|
||||
# Crontab: 0 3 1 1,4,7,10 * /path/to/docker/osrm/update.sh >> /var/log/osrm-update.log 2>&1
|
||||
|
||||
set -e
|
||||
cd "$(dirname "$0")"
|
||||
mkdir -p data
|
||||
|
||||
echo "[$(date)] Downloading Connecticut OSM data..."
|
||||
curl -L -o data/connecticut-latest.osm.pbf \
|
||||
https://download.geofabrik.de/north-america/us/connecticut-latest.osm.pbf
|
||||
|
||||
echo "[$(date)] Processing..."
|
||||
docker compose --profile init up --force-recreate osrm-init
|
||||
|
||||
echo "[$(date)] Restarting OSRM..."
|
||||
docker compose up -d osrm
|
||||
|
||||
echo "[$(date)] Done."
|
||||
5
estore/next-env.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
|
||||
42
estore/next.config.mjs
Normal file
@ -0,0 +1,42 @@
|
||||
const isDev = process.env.NODE_ENV === 'development'
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
output: 'standalone',
|
||||
images: {
|
||||
remotePatterns: [
|
||||
{ protocol: 'https', hostname: 'items-images-production.s3.us-west-2.amazonaws.com' },
|
||||
{ protocol: 'https', hostname: 'items-images-sandbox.s3.us-west-2.amazonaws.com' },
|
||||
{ protocol: 'https', hostname: 'square-web-sdk-production.squarecdn.com' },
|
||||
{ protocol: 'https', hostname: 'square-web-sdk-sandbox.squarecdn.com' },
|
||||
],
|
||||
},
|
||||
async headers() {
|
||||
return [
|
||||
{
|
||||
source: '/(.*)',
|
||||
headers: [
|
||||
{ key: 'X-Content-Type-Options', value: 'nosniff' },
|
||||
{ key: 'X-Frame-Options', value: 'DENY' },
|
||||
{ key: 'X-XSS-Protection', value: '1; mode=block' },
|
||||
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
|
||||
{ key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
|
||||
{
|
||||
key: 'Content-Security-Policy',
|
||||
value: [
|
||||
"default-src 'self'",
|
||||
`script-src 'self' 'unsafe-inline'${isDev ? " 'unsafe-eval'" : ''} https://web.squarecdn.com https://sandbox.web.squarecdn.com https://cdnjs.cloudflare.com`,
|
||||
"style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdnjs.cloudflare.com https://web.squarecdn.com https://sandbox.web.squarecdn.com",
|
||||
"font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com https://cash-f.squarecdn.com",
|
||||
"img-src 'self' data: https://items-images-production.s3.us-west-2.amazonaws.com https://items-images-sandbox.s3.us-west-2.amazonaws.com https://*.squarecdn.com",
|
||||
"connect-src 'self' https://web.squarecdn.com https://sandbox.web.squarecdn.com https://pci-connect.squareup.com https://pci-connect.squareupsandbox.com",
|
||||
"frame-src https://web.squarecdn.com https://sandbox.web.squarecdn.com",
|
||||
].join('; '),
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
},
|
||||
}
|
||||
|
||||
export default nextConfig
|
||||
7151
estore/package-lock.json
generated
Normal file
38
estore/package.json
Normal file
@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "beach-party-balloons-shop",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint",
|
||||
"setup:images": "cp -r ../website/assets/pics public/images && cp -r ../website/assets/logo public/images/logo && cp -r ../website/assets/trusted public/images/trusted && cp -rn ../website/assets/favicon public/"
|
||||
},
|
||||
"dependencies": {
|
||||
"bulma": "^1.0.4",
|
||||
"clsx": "^2.1.1",
|
||||
"date-fns": "^3.6.0",
|
||||
"ical.js": "^1.5.0",
|
||||
"lucide-react": "^0.400.0",
|
||||
"next": "14.2.21",
|
||||
"nodemailer": "^8.0.5",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"sharp": "^0.34.5",
|
||||
"square": "^34.0.0",
|
||||
"tsdav": "^2.0.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/nodemailer": "^8.0.0",
|
||||
"@types/react": "^18",
|
||||
"@types/react-dom": "^18",
|
||||
"autoprefixer": "^10.4.19",
|
||||
"eslint": "^8",
|
||||
"eslint-config-next": "14.2.21",
|
||||
"postcss": "^8",
|
||||
"tailwindcss": "^3.4.4",
|
||||
"typescript": "^5"
|
||||
}
|
||||
}
|
||||
7
estore/postcss.config.mjs
Normal file
@ -0,0 +1,7 @@
|
||||
/** @type {import('postcss-load-config').Config} */
|
||||
const config = {
|
||||
plugins: {
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
export default config
|
||||
71
estore/public/color-picker/images/1balloon-mask.svg
Normal file
@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="12in"
|
||||
height="12in"
|
||||
viewBox="0 0 39.999867 39.999867"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="balloon-mask1.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#111111"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="true"
|
||||
inkscape:pageopacity="0.00392157"
|
||||
inkscape:pagecheckerboard="1"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="in"
|
||||
showgrid="true"
|
||||
inkscape:zoom="0.93262836"
|
||||
inkscape:cx="847.06839"
|
||||
inkscape:cy="614.39264"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1532"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:lockguides="false"
|
||||
showborder="true"
|
||||
inkscape:snap-global="false"><inkscape:grid
|
||||
id="grid1"
|
||||
units="in"
|
||||
originx="0"
|
||||
originy="0"
|
||||
spacingx="3.3333222"
|
||||
spacingy="3.3333222"
|
||||
empcolor="#0099e5"
|
||||
empopacity="0.41176471"
|
||||
color="#e51100"
|
||||
opacity="0.30196078"
|
||||
empspacing="5"
|
||||
dotted="false"
|
||||
gridanglex="30"
|
||||
gridanglez="30"
|
||||
visible="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
enabled="true" /></sodipodi:namedview><defs
|
||||
id="defs1"><color-profile
|
||||
name="Built-in-display"
|
||||
xlink:href="../../../.local/share/icc/edid-88fcf6ba6729e8e4531280899cfccbad.icc"
|
||||
id="color-profile3338" /><color-profile
|
||||
name="Built-in-display"
|
||||
xlink:href="../../../.local/share/icc/edid-88fcf6ba6729e8e4531280899cfccbad.icc"
|
||||
id="color-profile3340" /></defs><g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"><path
|
||||
style="fill:#ffffff;stroke:#000000;stroke-width:0;stroke-linejoin:round;stroke-dashoffset:297.6;paint-order:stroke markers fill"
|
||||
d="m 21.227687,32.109589 c 0.624172,-0.03563 0.710957,-0.06698 0.809593,-0.292541 0.111029,-0.253897 0.09912,-0.307345 -0.240234,-1.078141 -0.174461,-0.396274 -0.294294,-0.741734 -0.2663,-0.76769 0.028,-0.02596 0.228136,-0.112851 0.44475,-0.193094 1.995094,-0.739052 3.728405,-2.506163 5.411409,-5.516916 1.220107,-2.182667 2.190925,-4.927783 2.72858,-7.715409 0.205455,-1.065242 0.27528,-3.230083 0.132803,-4.117189 -0.92694,-5.3136132 -5.113634,-8.7321766 -9.099685,-8.8288819 -1.386756,-0.032517 -1.869622,0.036057 -2.992621,0.4247129 -3.317278,1.1480578 -5.807323,4.2711432 -6.501356,8.154187 -0.262848,1.470608 -0.187185,3.472708 0.205696,5.44264 0.625764,3.137673 1.896442,6.36622 3.388147,8.608653 0.43191,0.649277 1.544521,1.935737 2.054649,2.375694 0.442106,0.381296 1.399196,0.967298 1.866288,1.142685 0.188138,0.07064 0.341629,0.146181 0.341096,0.167867 -5.41e-4,0.02169 -0.143212,0.330201 -0.317063,0.685577 -0.403624,0.825076 -0.418669,1.148088 -0.06362,1.36587 0.156034,0.09572 1.415279,0.180933 2.097874,0.141981 z"
|
||||
id="path2013"
|
||||
sodipodi:nodetypes="sssssssccssssssssss" /></g></svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
51
estore/public/color-picker/images/balloon-mask(1).svg
Normal file
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
width="266.66666"
|
||||
height="266.66666"
|
||||
viewBox="0 0 266.66666 266.66666"
|
||||
sodipodi:docname="970844-200.png"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
inkscape:dataloss="true"
|
||||
inkscape:export-filename="balloon.svg"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.8537501"
|
||||
inkscape:cx="133.33333"
|
||||
inkscape:cy="133.33333"
|
||||
inkscape:window-width="1913"
|
||||
inkscape:window-height="965"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<path
|
||||
style="fill:#000000"
|
||||
d="m 110.86728,176.98292 c -4.14002,0 -4.72369,-2.23401 -2.50756,-9.59765 l 1.86611,-6.20063 -6.64984,-2.17505 C 79.220392,151.04328 59.783306,123.31229 54.44661,88.916447 50.643745,64.406394 58.908048,38.185685 75.880855,20.91057 112.83686,-16.70367 169.04213,6.1526753 179.48832,63.043415 c 1.80388,9.824085 1.93369,13.895611 0.74359,23.324138 -3.90357,30.925927 -19.83967,57.568167 -41.24178,68.948697 -4.48207,2.38333 -8.96523,4.34252 -9.96258,4.35375 -4.50331,0.0507 -5.26813,1.96681 -3.1647,7.92856 2.23565,6.33649 1.10587,9.38436 -3.47859,9.38436 z"
|
||||
id="path1"
|
||||
sodipodi:nodetypes="sscssssssssss" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
51
estore/public/color-picker/images/balloon-mask.svg
Normal file
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
width="266.66666"
|
||||
height="266.66666"
|
||||
viewBox="0 0 266.66666 266.66666"
|
||||
sodipodi:docname="970844-200.png"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
inkscape:dataloss="true"
|
||||
inkscape:export-filename="balloon.svg"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.8537501"
|
||||
inkscape:cx="133.33333"
|
||||
inkscape:cy="133.33333"
|
||||
inkscape:window-width="1913"
|
||||
inkscape:window-height="965"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<path
|
||||
style="fill:#000000"
|
||||
d="m 110.86728,176.98292 c -4.14002,0 -4.72369,-2.23401 -2.50756,-9.59765 l 1.86611,-6.20063 -6.64984,-2.17505 C 79.220392,151.04328 59.783306,123.31229 54.44661,88.916447 50.643745,64.406394 58.908048,38.185685 75.880855,20.91057 112.83686,-16.70367 169.04213,6.1526753 179.48832,63.043415 c 1.80388,9.824085 1.93369,13.895611 0.74359,23.324138 -3.90357,30.925927 -19.83967,57.568167 -41.24178,68.948697 -4.48207,2.38333 -8.96523,4.34252 -9.96258,4.35375 -4.50331,0.0507 -5.26813,1.96681 -3.1647,7.92856 2.23565,6.33649 1.10587,9.38436 -3.47859,9.38436 z"
|
||||
id="path1"
|
||||
sodipodi:nodetypes="sscssssssssss" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
BIN
estore/public/color-picker/images/chrome-blue.webp
Normal file
|
After Width: | Height: | Size: 228 KiB |
BIN
estore/public/color-picker/images/chrome-champagne.webp
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
estore/public/color-picker/images/chrome-gold.webp
Normal file
|
After Width: | Height: | Size: 160 KiB |
BIN
estore/public/color-picker/images/chrome-green.webp
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
estore/public/color-picker/images/chrome-pink.webp
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
estore/public/color-picker/images/chrome-purple.webp
Normal file
|
After Width: | Height: | Size: 2.4 MiB |
BIN
estore/public/color-picker/images/chrome-rosegold.webp
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
estore/public/color-picker/images/chrome-silver.webp
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
estore/public/color-picker/images/chrome-spacegrey.webp
Normal file
|
After Width: | Height: | Size: 164 KiB |
BIN
estore/public/color-picker/images/chrome-truffle.webp
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
estore/public/color-picker/images/classic-gold.webp
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
estore/public/color-picker/images/classic-silver.webp
Normal file
|
After Width: | Height: | Size: 180 KiB |
BIN
estore/public/color-picker/images/metalic-rosegold.webp
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
estore/public/color-picker/images/pearl-fuchsia.webp
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
estore/public/color-picker/images/pearl-lightblue.webp
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
estore/public/color-picker/images/pearl-lilac.webp
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
estore/public/color-picker/images/pearl-midnightblue.webp
Normal file
|
After Width: | Height: | Size: 225 KiB |
BIN
estore/public/color-picker/images/pearl-peach.webp
Normal file
|
After Width: | Height: | Size: 521 KiB |
BIN
estore/public/color-picker/images/pearl-periwinkle.webp
Normal file
|
After Width: | Height: | Size: 213 KiB |
BIN
estore/public/color-picker/images/pearl-pink.webp
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
estore/public/color-picker/images/pearl-sapphire.webp
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
estore/public/color-picker/images/pearl-violet.webp
Normal file
|
After Width: | Height: | Size: 137 KiB |
BIN
estore/public/color-picker/images/pearl-white.webp
Normal file
|
After Width: | Height: | Size: 109 KiB |
2
estore/public/color-picker/images/shine.svg
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="12in" height="12in" version="1.1" viewBox="0 0 40 40" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g fill="#fff"><ellipse cx="13.333" cy="5" rx="3.3333" ry="1.6667" stroke-width="0" style="paint-order:stroke markers fill"/><path d="m-24.93-4.1667c1.0417 0 1.7361 1.3889 1.7361 2.4305s-0.69444 1.7361-1.7361 1.7361-1.7361-0.69444-1.7361-1.7361 0.69444-2.4305 1.7361-2.4305z" stroke-width=".034722"/></g></svg>
|
||||
|
After Width: | Height: | Size: 515 B |
2
estore/public/color-picker/shine.svg
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="12in" height="12in" version="1.1" viewBox="0 0 40 40" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g fill="#fff"><ellipse cx="13.333" cy="5" rx="3.3333" ry="1.6667" stroke-width="0" style="paint-order:stroke markers fill"/><path d="m-24.93-4.1667c1.0417 0 1.7361 1.3889 1.7361 2.4305s-0.69444 1.7361-1.7361 1.7361-1.7361-0.69444-1.7361-1.7361 0.69444-2.4305 1.7361-2.4305z" stroke-width=".034722"/></g></svg>
|
||||
|
After Width: | Height: | Size: 515 B |
254
estore/public/colors.json
Normal file
@ -0,0 +1,254 @@
|
||||
[
|
||||
{
|
||||
"family": "Whites & Neutrals",
|
||||
"colors": [
|
||||
{ "name": "White", "hex": "#ffffff" },
|
||||
{ "name": "Retro White", "hex": "#e8e3d9" },
|
||||
{ "name": "Sand", "hex": "#e1d8c6" },
|
||||
{ "name": "Cameo", "hex": "#e9ccc8" },
|
||||
{ "name": "Grey", "hex": "#ced3d4" },
|
||||
{ "name": "Stone", "hex": "#989689" },
|
||||
{ "name": "Fog", "hex": "#6b9098" },
|
||||
{ "name": "Smoke", "hex": "#75777b" },
|
||||
{ "name": "Black", "hex": "#0b0d0f" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"family": "Pinks & Reds",
|
||||
"colors": [
|
||||
{ "name": "Blush", "hex": "#fbd6c0" },
|
||||
{ "name": "Light Pink", "hex": "#fcccda" },
|
||||
{ "name": "Melon", "hex": "#fac4bc"},
|
||||
{ "name": "Rose Pink", "hex": "#d984a3" },
|
||||
{ "name": "Fuchsia", "hex": "#eb4799" },
|
||||
{ "name": "Aloha", "hex": "#e45c56" },
|
||||
{ "name": "Red", "hex": "#ef2a2f" },
|
||||
{ "name": "Pastel Magenta", "hex": "#B72E6C"},
|
||||
{ "name": "Coral", "hex": "#bd4b3b" },
|
||||
{ "name": "Wild Berry", "hex": "#79384c"},
|
||||
{ "name": "Maroon", "hex": "#80011f" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"family": "Oranges & Browns & Yellows",
|
||||
"colors": [
|
||||
{ "name": "Pastel Yellow", "hex": "#fcfd96" },
|
||||
{ "name": "Yellow", "hex": "#f5e812" },
|
||||
{ "name": "Goldenrod", "hex": "#f7b615" },
|
||||
{ "name": "Orange", "hex": "#ef6b24" },
|
||||
{ "name":"Blended Brown","hex":"#c9aea0"},
|
||||
{ "name": "Coffee", "hex": "#957461" },
|
||||
{ "name": "Burnt Orange", "hex": "#9d4223" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"family": "Greens",
|
||||
"colors": [
|
||||
{ "name": "Eucalyptus", "hex": "#a3bba3" },
|
||||
{ "name": "Pastel Green", "hex": "#acdba7" },
|
||||
{ "name": "Lime Green", "hex": "#8fc73e" },
|
||||
{ "name": "Seafoam", "hex": "#00c7b2" },
|
||||
{ "name": "Grass Green", "hex": "#28b35e" },
|
||||
{ "name": "Empowermint", "hex": "#779786" },
|
||||
{ "name": "Forest Green", "hex": "#218b21" },
|
||||
{ "name": "Willow", "hex": "#4a715c" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"family": "Blues",
|
||||
"colors": [
|
||||
{ "name": "Sky Blue", "hex": "#87ceec" },
|
||||
{ "name": "Sea Glass", "hex": "#80a4bc" },
|
||||
{ "name": "Caribbean Blue", "hex": "#0bbbb6" },
|
||||
{ "name": "Medium Blue", "hex": "#1b89e8" },
|
||||
{ "name": "Blue Slate", "hex": "#327295" },
|
||||
{ "name": "Tropical Teal", "hex": "#0d868f" },
|
||||
{ "name": "Royal Blue", "hex": "#005eb7" },
|
||||
{ "name": "Dark Blue", "hex": "#26408e" },
|
||||
{ "name": "Navy", "hex": "#262266" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"family": "Purples",
|
||||
"colors": [
|
||||
{ "name": "Pastel Dusk", "hex": "#d7c4c8" },
|
||||
{ "name": "Lilac", "hex": "#c69edb" },
|
||||
{ "name": "Canyon Rose", "hex": "#ca93b3" },
|
||||
{ "name": "Rosewood", "hex": "#ad7271" },
|
||||
{ "name": "Lavender", "hex": "#866c92" },
|
||||
{ "name": "Orchid", "hex": "#a42487" },
|
||||
{ "name": "Violet", "hex": "#812a8c" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"family": "Pearl and Matallic Colors",
|
||||
"colors": [
|
||||
{
|
||||
"name": "Pearl White",
|
||||
"hex": "#F8F8F8",
|
||||
"metallic": true,
|
||||
"pearlType": "white",
|
||||
"image": "images/pearl-white.webp"
|
||||
},
|
||||
{
|
||||
"name": "Classic Silver",
|
||||
"hex": "#C0C0C0",
|
||||
"metallic": true,
|
||||
"pearlType": "silver",
|
||||
"image": "images/classic-silver.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Pink",
|
||||
"hex": "#F4C2D0",
|
||||
"metallic": true,
|
||||
"pearlType": "pink",
|
||||
"image": "images/pearl-pink.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Peach",
|
||||
"hex": "#F4D2C2",
|
||||
"metallic": true,
|
||||
"pearlType": "pink",
|
||||
"image": "images/pearl-peach.webp"
|
||||
},
|
||||
{
|
||||
"name": "Classic Rose Gold",
|
||||
"hex": "#B76E79",
|
||||
"metallic": true,
|
||||
"pearlType": "pink",
|
||||
"image": "images/metalic-rosegold.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Lilac",
|
||||
"hex": "#C8A2C8",
|
||||
"metallic": true,
|
||||
"pearlType": "lilac",
|
||||
"image": "images/pearl-lilac.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Light Blue",
|
||||
"hex": "#87CEEB",
|
||||
"metallic": true,
|
||||
"pearlType": "blue",
|
||||
"image": "images/pearl-lightblue.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Periwinkle",
|
||||
"hex": "#CCCCFF",
|
||||
"metallic": true,
|
||||
"pearlType": "blue",
|
||||
"image": "images/pearl-periwinkle.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Fuchsia",
|
||||
"hex": "#FD49AB",
|
||||
"metallic": true,
|
||||
"pearlType": "fuchsia",
|
||||
"image": "images/pearl-fuchsia.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Violet",
|
||||
"hex": "#8F00FF",
|
||||
"metallic": true,
|
||||
"pearlType": "violet",
|
||||
"image": "images/pearl-violet.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Sapphire",
|
||||
"hex": "#0F52BA",
|
||||
"metallic": true,
|
||||
"pearlType": "sapphire",
|
||||
"image": "images/pearl-sapphire.webp"
|
||||
},
|
||||
{
|
||||
"name": "Pearl Midnight Blue",
|
||||
"hex": "#191970",
|
||||
"metallic": true,
|
||||
"pearlType": "midnight-blue",
|
||||
"image": "images/pearl-midnightblue.webp"
|
||||
},
|
||||
{
|
||||
"name": "Classic Gold",
|
||||
"hex": "#E32636",
|
||||
"metallic": true,
|
||||
"pearlType": "gold",
|
||||
"image": "images/classic-gold.webp"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"family": "Chrome Colors",
|
||||
"colors": [
|
||||
{
|
||||
"name": "Chrome Rose Gold",
|
||||
"hex": "#B76E79",
|
||||
"metallic": true,
|
||||
"chromeType": "rosegold",
|
||||
"image": "images/chrome-rosegold.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Pink",
|
||||
"hex": "#FF69B4",
|
||||
"metallic": true,
|
||||
"chromeType": "rosegold",
|
||||
"image": "images/chrome-pink.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Purple",
|
||||
"hex": "#DFFF00",
|
||||
"metallic": true,
|
||||
"chromeType": "purple",
|
||||
"image": "images/chrome-purple.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Champagne",
|
||||
"hex": "#F7E7CE",
|
||||
"metallic": true,
|
||||
"chromeType": "champagne",
|
||||
"image": "images/chrome-champagne.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Truffle",
|
||||
"hex": "#D2B48C",
|
||||
"metallic": true,
|
||||
"chromeType": "champagne",
|
||||
"image": "images/chrome-truffle.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Silver",
|
||||
"hex": "#C0C0C0",
|
||||
"metallic": true,
|
||||
"chromeType": "silver",
|
||||
"image": "images/chrome-silver.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Space Grey",
|
||||
"hex": "#5C5C5C",
|
||||
"metallic": true,
|
||||
"chromeType": "spacegrey",
|
||||
"image": "images/chrome-spacegrey.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Gold",
|
||||
"hex": "#a18b67",
|
||||
"metallic": true,
|
||||
"chromeType": "gold",
|
||||
"image": "images/chrome-gold.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Green",
|
||||
"hex": "#457066",
|
||||
"metallic": true,
|
||||
"chromeType": "green",
|
||||
"image": "images/chrome-green.webp"
|
||||
},
|
||||
{
|
||||
"name": "Chrome Blue",
|
||||
"hex": "#2d576f",
|
||||
"metallic": true,
|
||||
"chromeType": "blue",
|
||||
"image": "images/chrome-blue.webp"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
BIN
estore/public/favicon/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
estore/public/favicon/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
estore/public/favicon/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
estore/public/favicon/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 738 B |
BIN
estore/public/favicon/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
estore/public/favicon/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
estore/public/favicon/favicon_io.zip
Normal file
1
estore/public/favicon/site.webmanifest
Normal file
@ -0,0 +1 @@
|
||||
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
||||
BIN
estore/public/images/centerpiece/centerpiece-cover.webp
Normal file
|
After Width: | Height: | Size: 932 KiB |
BIN
estore/public/images/classic/20240825_104716.webp
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
estore/public/images/classic/ceiling.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
1
estore/public/images/classic/ceiling.txt
Normal file
@ -0,0 +1 @@
|
||||
Ceiling Fill
|
||||
1
estore/public/images/classic/classic-cover.txt
Normal file
@ -0,0 +1 @@
|
||||
30ft Areopole Arch
|
||||
BIN
estore/public/images/classic/classic-cover.webp
Normal file
|
After Width: | Height: | Size: 877 KiB |
BIN
estore/public/images/classic/hero.jpg
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
estore/public/images/classic/hero.webp
Normal file
|
After Width: | Height: | Size: 827 KiB |
BIN
estore/public/images/favicon/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
estore/public/images/favicon/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
estore/public/images/favicon/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
estore/public/images/favicon/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 738 B |
BIN
estore/public/images/favicon/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
estore/public/images/favicon/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
estore/public/images/favicon/favicon_io.zip
Normal file
1
estore/public/images/favicon/site.webmanifest
Normal file
@ -0,0 +1 @@
|
||||
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
||||
@ -0,0 +1 @@
|
||||
Cocktail Arrangements
|
||||
|
After Width: | Height: | Size: 689 KiB |
1
estore/public/images/gallery/classic/20230617_131551.txt
Normal file
@ -0,0 +1 @@
|
||||
20' Classic Arch
|
||||
BIN
estore/public/images/gallery/classic/20230617_131551.webp
Normal file
|
After Width: | Height: | Size: 2.8 MiB |
@ -0,0 +1 @@
|
||||
Classic Columns
|
||||
|
After Width: | Height: | Size: 3.2 MiB |
BIN
estore/public/images/gallery/organic/20241121_200047~2.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
estore/public/images/gallery/organic/20250202_133930~2.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
10
estore/public/images/gallery/rotate.sh
Normal file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ $# -ne 1 ]; then
|
||||
echo "Usage: $0 <image_file>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
IMAGE_FILE=$1
|
||||
|
||||
convert "$IMAGE_FILE" -rotate 90 "$IMAGE_FILE"
|
||||
BIN
estore/public/images/helium/img1.webp
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 890 KiB |
BIN
estore/public/images/logo/BeachPartyBalloons-logo-horizontal.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
estore/public/images/logo/BeachPartyBalloons-logo.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
estore/public/images/logo/BeachPartyBalloons-logo.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 890 KiB |
|
After Width: | Height: | Size: 30 KiB |
BIN
estore/public/images/logo/logo/BeachPartyBalloons-logo.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
estore/public/images/logo/logo/BeachPartyBalloons-logo.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
estore/public/images/organic/img1.webp
Normal file
|
After Width: | Height: | Size: 519 KiB |
BIN
estore/public/images/organic/img2.webp
Normal file
|
After Width: | Height: | Size: 739 KiB |
BIN
estore/public/images/organic/organic-cover.webp
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
BIN
estore/public/images/sculptures/sculpture-cover.webp
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 3.8 KiB |
BIN
estore/public/images/trusted/512px-Subway_icon.svg.webp
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 20 KiB |
BIN
estore/public/images/trusted/Mohegan-Sun-Logo.webp
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
BIN
estore/public/images/trusted/Planet_Fitness_(2).webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
estore/public/images/trusted/Post_university_of_conn_logo.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
estore/public/images/trusted/Yale_press_logo.webp
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
estore/public/images/trusted/amazon.webp
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
estore/public/images/trusted/lincoln-culinary.webp
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
estore/public/images/trusted/logo-full-color.webp
Normal file
|
After Width: | Height: | Size: 3.4 KiB |