Add 'estore/' from commit 'e34dfc397c94025670baa2b73b482c01f3033a6a'

git-subtree-dir: estore
git-subtree-mainline: 746868d720b9be1003a2f783b7a12d526d8eea60
git-subtree-split: e34dfc397c94025670baa2b73b482c01f3033a6a
This commit is contained in:
chris 2026-04-13 19:22:23 -04:00
commit 21ebb9667b
168 changed files with 17162 additions and 0 deletions

7
estore/.dockerignore Normal file
View File

@ -0,0 +1,7 @@
node_modules
.next
.git
.env
*.env.local
npm-debug.log*
.DS_Store

49
estore/.env.example Normal file
View 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
View 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
View 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"]

View File

@ -0,0 +1,11 @@
{
"order": [
"latex",
"birthday",
"mylar-bouquets",
"graduation",
"letters-and-numbers",
"other"
],
"hidden": []
}

View File

@ -0,0 +1,8 @@
{
"mothers-day": {
"windowStart": "04-10"
},
"graduation": {
"windowStart": "04-01"
}
}

26
estore/docker-compose.yml Normal file
View 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
View File

@ -0,0 +1 @@
data/

View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

38
estore/package.json Normal file
View 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"
}
}

View File

@ -0,0 +1,7 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
autoprefixer: {},
},
}
export default config

View 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

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View 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

View 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
View 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"
}
]
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

View 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"}

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@ -0,0 +1 @@
Ceiling Fill

View File

@ -0,0 +1 @@
30ft Areopole Arch

Binary file not shown.

After

Width:  |  Height:  |  Size: 877 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

View 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"}

View File

@ -0,0 +1 @@
Cocktail Arrangements

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 KiB

View File

@ -0,0 +1 @@
20' Classic Arch

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

View File

@ -0,0 +1 @@
Classic Columns

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View 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"

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Some files were not shown because too many files have changed in this diff Show More