Initial commit — Beach Party Balloons shop
Full Next.js storefront with Square catalog integration, balloon color picker, delivery/pickup slot booking, CalDAV calendar sync, and admin panel. Admin features: item overrides, category display order/visibility, hours editor, holiday/occasion windows, quantity units, and modifier deselect. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
7
.dockerignore
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
node_modules
|
||||||
|
.next
|
||||||
|
.git
|
||||||
|
.env
|
||||||
|
*.env.local
|
||||||
|
npm-debug.log*
|
||||||
|
.DS_Store
|
||||||
49
.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
|
||||||
31
.gitignore
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# dependencies
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
.next/
|
||||||
|
out/
|
||||||
|
|
||||||
|
# Runtime data (persisted config — keep data/ but ignore any secrets)
|
||||||
|
# data/ is intentionally tracked (hours.json, overrides, etc.)
|
||||||
|
|
||||||
|
# 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
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"]
|
||||||
1
data/catalog-cache.json
Normal file
11
data/categories-display.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"order": [
|
||||||
|
"latex",
|
||||||
|
"birthday",
|
||||||
|
"mylar-bouquets",
|
||||||
|
"graduation",
|
||||||
|
"letters-and-numbers",
|
||||||
|
"other"
|
||||||
|
],
|
||||||
|
"hidden": []
|
||||||
|
}
|
||||||
46
data/item-overrides.json
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"PMCN5EKJ7BFR7SGQ3THNDCST": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenModifierIds": [],
|
||||||
|
"colorMax": 4,
|
||||||
|
"chromeSurchargePerColor": 500,
|
||||||
|
"categoryOverride": "graduation",
|
||||||
|
"categoryLabelOverride": "Graduation"
|
||||||
|
},
|
||||||
|
"BKKWWP2F7GNYSNM2CQF22HFS": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenModifierIds": [],
|
||||||
|
"colorMax": 2,
|
||||||
|
"chromeSurchargePerColor": 25
|
||||||
|
},
|
||||||
|
"GDWTO7IIB5F6WFRYPVOIQCLM": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenModifierIds": [],
|
||||||
|
"colorMax": 10,
|
||||||
|
"chromeSurchargePerColor": 25
|
||||||
|
},
|
||||||
|
"Z3P76LDJLFGJK6IF55DKM5KB": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenModifierIds": [],
|
||||||
|
"chromeSurchargePerColor": 25
|
||||||
|
},
|
||||||
|
"5WHYHPFM23LABMAEM4V5A6HS": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenModifierIds": [],
|
||||||
|
"categoryOverride": "graduation",
|
||||||
|
"categoryLabelOverride": "Graduation"
|
||||||
|
},
|
||||||
|
"QRPT3VBPGKT4XZWUT6N2HPNL": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenModifierIds": [],
|
||||||
|
"categoryOverride": "birthday",
|
||||||
|
"categoryLabelOverride": "Birthday"
|
||||||
|
},
|
||||||
|
"46WOMDVNJXX4TUBBJT2ZGQSM": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenModifierIds": [],
|
||||||
|
"colorMax": 6,
|
||||||
|
"chromeSurchargePerColor": 300,
|
||||||
|
"quantityUnit": "ft"
|
||||||
|
}
|
||||||
|
}
|
||||||
8
data/occasions.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"mothers-day": {
|
||||||
|
"windowStart": "04-10"
|
||||||
|
},
|
||||||
|
"graduation": {
|
||||||
|
"windowStart": "04-01"
|
||||||
|
}
|
||||||
|
}
|
||||||
32
docker-compose.yml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
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
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "echo > /dev/tcp/localhost/5000"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
balloons-shop:
|
||||||
|
build: .
|
||||||
|
container_name: balloons-shop
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
osrm:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/catalog"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
1
docker/osrm/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
data/
|
||||||
33
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
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
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.
|
||||||
15
next.config.mjs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/** @type {import('next').NextConfig} */
|
||||||
|
const nextConfig = {
|
||||||
|
output: 'standalone',
|
||||||
|
images: {
|
||||||
|
remotePatterns: [
|
||||||
|
{ protocol: 'https', hostname: '**.squarecdn.com' },
|
||||||
|
{
|
||||||
|
protocol: 'https',
|
||||||
|
hostname: 'items-images-production.s3.us-west-2.amazonaws.com',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default nextConfig
|
||||||
6634
package-lock.json
generated
Normal file
37
package.json
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"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",
|
||||||
|
"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
postcss.config.mjs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/** @type {import('postcss-load-config').Config} */
|
||||||
|
const config = {
|
||||||
|
plugins: {
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
export default config
|
||||||
71
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
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
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
public/color-picker/images/chrome-blue.webp
Normal file
|
After Width: | Height: | Size: 228 KiB |
BIN
public/color-picker/images/chrome-champagne.webp
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
public/color-picker/images/chrome-gold.webp
Normal file
|
After Width: | Height: | Size: 160 KiB |
BIN
public/color-picker/images/chrome-green.webp
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
public/color-picker/images/chrome-pink.webp
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
public/color-picker/images/chrome-purple.webp
Normal file
|
After Width: | Height: | Size: 2.4 MiB |
BIN
public/color-picker/images/chrome-rosegold.webp
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
public/color-picker/images/chrome-silver.webp
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
public/color-picker/images/chrome-spacegrey.webp
Normal file
|
After Width: | Height: | Size: 164 KiB |
BIN
public/color-picker/images/chrome-truffle.webp
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
public/color-picker/images/classic-gold.webp
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
public/color-picker/images/classic-silver.webp
Normal file
|
After Width: | Height: | Size: 180 KiB |
BIN
public/color-picker/images/metalic-rosegold.webp
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
public/color-picker/images/pearl-fuchsia.webp
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
public/color-picker/images/pearl-lightblue.webp
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
public/color-picker/images/pearl-lilac.webp
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
public/color-picker/images/pearl-midnightblue.webp
Normal file
|
After Width: | Height: | Size: 225 KiB |
BIN
public/color-picker/images/pearl-peach.webp
Normal file
|
After Width: | Height: | Size: 521 KiB |
BIN
public/color-picker/images/pearl-periwinkle.webp
Normal file
|
After Width: | Height: | Size: 213 KiB |
BIN
public/color-picker/images/pearl-pink.webp
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
public/color-picker/images/pearl-sapphire.webp
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
public/color-picker/images/pearl-violet.webp
Normal file
|
After Width: | Height: | Size: 137 KiB |
BIN
public/color-picker/images/pearl-white.webp
Normal file
|
After Width: | Height: | Size: 109 KiB |
2
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
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
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
public/favicon/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/favicon/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
public/favicon/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/favicon/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 738 B |
BIN
public/favicon/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/favicon/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
public/favicon/favicon_io.zip
Normal file
1
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
public/images/centerpiece/centerpiece-cover.webp
Normal file
|
After Width: | Height: | Size: 932 KiB |
BIN
public/images/classic/20240825_104716.webp
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
public/images/classic/ceiling.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
1
public/images/classic/ceiling.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Ceiling Fill
|
||||||
1
public/images/classic/classic-cover.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
30ft Areopole Arch
|
||||||
BIN
public/images/classic/classic-cover.webp
Normal file
|
After Width: | Height: | Size: 877 KiB |
BIN
public/images/classic/hero.jpg
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
public/images/classic/hero.webp
Normal file
|
After Width: | Height: | Size: 827 KiB |
BIN
public/images/favicon/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/images/favicon/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
public/images/favicon/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/images/favicon/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 738 B |
BIN
public/images/favicon/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/images/favicon/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
public/images/favicon/favicon_io.zip
Normal file
1
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
|
||||||
BIN
public/images/gallery/centerpiece/20230108_112718.jpg}.webp
Normal file
|
After Width: | Height: | Size: 689 KiB |
1
public/images/gallery/classic/20230617_131551.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
20' Classic Arch
|
||||||
BIN
public/images/gallery/classic/20230617_131551.webp
Normal file
|
After Width: | Height: | Size: 2.8 MiB |
@ -0,0 +1 @@
|
|||||||
|
Classic Columns
|
||||||
BIN
public/images/gallery/classic/_Photos_20241207_083534.webp
Normal file
|
After Width: | Height: | Size: 3.2 MiB |
BIN
public/images/gallery/organic/20241121_200047~2.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
public/images/gallery/organic/20250202_133930~2.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
10
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
public/images/helium/img1.webp
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
public/images/logo/BeachPartyBalloons-logo white background.png
Normal file
|
After Width: | Height: | Size: 890 KiB |
BIN
public/images/logo/BeachPartyBalloons-logo-horizontal.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
public/images/logo/BeachPartyBalloons-logo.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
public/images/logo/BeachPartyBalloons-logo.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 890 KiB |
BIN
public/images/logo/logo/BeachPartyBalloons-logo-horizontal.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
public/images/logo/logo/BeachPartyBalloons-logo.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
public/images/logo/logo/BeachPartyBalloons-logo.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/images/organic/img1.webp
Normal file
|
After Width: | Height: | Size: 519 KiB |
BIN
public/images/organic/img2.webp
Normal file
|
After Width: | Height: | Size: 739 KiB |
BIN
public/images/organic/organic-cover.webp
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
BIN
public/images/sculptures/sculpture-cover.webp
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 3.8 KiB |
BIN
public/images/trusted/512px-Subway_icon.svg.webp
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
public/images/trusted/512px-University_of_New_Haven_logo.webp
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/images/trusted/Mohegan-Sun-Logo.webp
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
BIN
public/images/trusted/Planet_Fitness_(2).webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
public/images/trusted/Post_university_of_conn_logo.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
public/images/trusted/Yale_press_logo.webp
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
public/images/trusted/amazon.webp
Normal file
|
After Width: | Height: | Size: 4.4 KiB |