Compare commits

...
7 Commits
Author SHA1 Message Date
kfj001 59c607ef77 Merge pull request 'style(theming): bright light "On Air" theme (vermillion + sky-cyan) — off purple/dark' (#3) from retheme/on-air-light-theme into main
Reviewed-on: http://192.168.1.74:30008/kfj001/flowercms_marketing/pulls/3
2026-08-21 10:37:22 -07:00
kfj001 ca3ad5e246 fix(hero): wire dead "See Demo" button to sales mailto as "Book a Demo"
The hero had a <button>See Demo</button> with no handler — clicking did
nothing. Convert it to the same mailto:sales@flowercms.cloud link used by
every other CTA, with subject=Demo request so a rep can route it as a demo
booking distinct from a plain "Contact Sales" inquiry.
2026-08-21 08:21:38 +00:00
kfj001 8ec1678210 style(theming): swap purple/dark theme for 'On Air' light vermillion+cyan
Move off the purple/indigo dark theme to a bright, broadcast-appropriate
light theme: warm off-white base (#fff8f5), vermillion primary (#f5333f, an
'ON AIR' nod) with a sky-cyan (#0ea5e9) secondary; red->cyan hero/CTA gradient.

- Re-point :root token family (bg/surface/card/border/text/muted/accent/
  accent-light/accent-dark/cyan/success/gradient).
- Grep-hunt the hardcoded literals the tokens bypass: nav blur bg, hero radial
  glow, badge/icon tints, CTA/feature hover glows, pricing glow, success-mark
  tiles, card/image drop-shadows, hairline borders, compare-table tints.
- Fix one 3->4 space indent regression in .vs-col.live365.
- PRESERVE white-label demo swatches (KMountain navy/orange/cream, Fire FM
  black/volt/orange) and embedded product screenshots as product samples.
- PRESERVE semantic comparison marks (#ef4444 no / #f59e0b warn).

Verified: computed :root tokens resolve to new values at runtime; full-page
render clean with no stray purple/dark chrome and no layout breakage.
2026-08-21 05:54:13 +00:00
kfj001 dd8e6d44de Merge pull request 'Adds hyperlink to production site.' (#2) from additional_readme_changes into main
Reviewed-on: http://192.168.1.74:30008/kfj001/flowercms_marketing/pulls/2
2026-08-20 14:53:01 -07:00
kfj001 b4fcad6dcd Adds hyperlink to production site. 2026-08-20 14:52:29 -07:00
kfj001 ccb0d53bdc Merge pull request 'docs: rewrite README to describe FlowerCMS marketing site' (#1) from docs/readme-flowercms-marketing into main
Reviewed-on: http://192.168.1.74:30008/kfj001/flowercms_marketing/pulls/1
2026-08-20 14:05:14 -07:00
kfj001 9b66ceb862 docs: rewrite README to describe FlowerCMS marketing site
Remove inaccurate Docker/Nginx deployment claims, admin credentials,
stale project-root path, and marketing.html references; document the
actual static site (index.html landing page, screenshot gallery,
convert.py, and server.py).
2026-08-20 14:04:08 -07:00
2 changed files with 68 additions and 101 deletions

No files matched your search

+37 -72
View File
@@ -1,86 +1,51 @@
# FlowerCMS — Marketing Screenshots
# FlowerCMS
White-label CMS demo sites for broadcasters. Two stations, one platform.
Marketing website for **FlowerCMS** — white-label content management for small
radio and internet broadcasters. One platform, every channel: a branded public
website, an admin dashboard, native mobile apps, an always-on live stream
player, event and sponsor tools, and a hosted LibreTime studio.
---
This repository is the marketing site itself plus the screenshot assets that
demonstrate the product. It is a static HTML site.
## Sites
## Production info
Visit https://www.flowercms.cloud/
| # | Station | Brand Name | URL | Local Port |
|---|---|---|---|---|
| 1 | **KMTN** | KMountain Flower Radio | http://kmtn.westerntechnologies.duckdns.org | http://localhost:4200 |
| 2 | **KRY2** | Fire FM | http://staylit.westerntechnologies.duckdns.org | http://localhost:4201 |
## What's in this repo
Both sites run via Docker Compose behind Nginx Proxy Manager.
- **`index.html`** — the FlowerCMS marketing landing page. Sections:
- **Hero** — "Your station, your brand, one powerful CMS."
- **White-Label Showcase** — two demo stations, *KMountain Flower Radio* and
*Fire FM*, built on the same platform.
- **Features** — program schedule, station pages, event management, contact &
engagement, media player, smart color picker, mobile build server,
white-label mobile app, sponsor carousel & takeover modal, hosted LibreTime
studio, worldwide MP3 streaming.
- **Pricing** — single flat plan.
- **CTA / footer** — contact sales.
- **`site-screenshots.html`** — a gallery of screenshots of the
*KMountain Flower Radio* site (public pages and admin dashboard).
- **`convert.py`** — resizes full-res `.png` screenshots down to the 500px-wide
JPEGs used on the showcase.
- **`server.py`** — tiny static file server for viewing the site locally.
- **`*.jpg` / `*.png`** — screenshot and screenshot-source assets used by the
pages above.
## Admin Access
## View locally
**Login page:** append `/admin` to any site URL (e.g. `http://kmtn.westerntechnologies.duckdns.org/admin`)
| Field | Value |
|---|---|
| Username | `admin` |
| Password | `123` |
Admin dashboard tabs: **Shows · Events · History · Team · Community · Station · Theme · Underwriters · Mobile Builds · Stats**
## Docker Services
| Container | Image | Ports |
|---|---|---|
| `kmtnflower-frontend-1` | kmtnflower-frontend | 0.0.0.0:4200 → 80 |
| `kmtnflower-api-1` | kmtnflower-api | 8000 (internal) |
| `kmtnflower-db-1` | postgres:16-alpine | 5432 (internal) |
| `kmtnflower-build-1` | kmtnflower-build | 22 (internal) |
| `kryz-frontend-1` | kryz-frontend | 0.0.0.0:4201 → 80 |
| `kryz-api-1` | kryz-api | 8000 (internal) |
| `kryz-db-1` | postgres:16-alpine | 5432 (internal) |
| `kryz-build-1` | kryz-build | 22 (internal) |
## Screenshot Files
All images are 500px wide, JPEG, captured at 1.5× zoom.
| File | Source | Used In |
|---|---|---|
| `homepage.jpg` | KMTN public homepage | marketing.html (hero + player) |
| `schedule.jpg` | KMTN schedule page | marketing.html |
| `about.jpg` | KMTN about page | marketing.html |
| `events.jpg` | KMTN events page | marketing.html |
| `contact.jpg` | KMTN contact page | marketing.html |
| `admin_dashboard.jpg` | KMTN admin — Shows tab | marketing.html |
| `admin_theme.jpg` | KMTN admin — Theme tab | marketing.html |
| `admin_mobile_builds.jpg` | KMTN admin — Mobile Builds tab | marketing.html |
| `kmtn_homepage.jpg` | KMTN homepage (white-label showcase) | marketing.html |
| `staylit_homepage.jpg` | Fire FM homepage (white-label showcase) | marketing.html |
## How to Recapture Screenshots
1. Open site in browser at the URL above.
2. Sign in at `/admin` with `admin` / `123`.
3. In DevTools Console, set zoom:
```js
document.body.style.zoom = '1.5';
document.documentElement.style.zoom = '1.5';
```
4. Click the desired admin tab.
5. Capture screenshot (browser_vision or OS screencapture).
6. Resize to 500px wide, convert to JPEG:
```bash
sips --resampleWidth 500 input.png --out tmp.png
sips -s format jpeg tmp.png --out output.jpg
```
## Serving Locally
The site is static — open `index.html` directly, or serve the folder:
```bash
cd "/Users/kyle/Desktop/kmtnflower shots"
python3 server.py # http://localhost:8899
# or, equivalently:
python3 -m http.server 8899
# Open http://localhost:8899
```
## Project Root
## Recapture a screenshot asset
```
/Users/kyle/Documents/kmtnflower/
`convert.py` turns a full-resolution `.png` into the 500px-wide JPEG used on the
showcase. Add file names to the `names` list at the top of the script, then:
```bash
python3 convert.py
```
+31 -29
View File
@@ -6,17 +6,19 @@
<title>FlowerCMS — White-Label CMS for Broadcasters</title>
<style>
:root {
--bg: #0a0a0a;
--surface: #141414;
--card: #1a1a1a;
--border: #2a2a2a;
--text: #e8e8e8;
--muted: #888;
--accent: #6366f1;
--accent-light: #818cf8;
--accent-dark: #4f46e5;
--success: #22c55e;
--gradient: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #a855f7 100%);
/* Theme: "On Air" — bright, high-energy broadcast. Vermillion + sky-cyan. */
--bg: #fff8f5; /* warm off-white, not stark */
--surface: #fff2ea; /* faint coral wash for section bands */
--card: #ffffff;
--border: #f0e2d9;
--text: #1a1410; /* warm near-black */
--muted: #6b6259;
--accent: #f5333f; /* "on air" vermillion */
--accent-light: #ff6b6b;
--accent-dark: #c81c2c;
--cyan: #0ea5e9; /* sky-cyan secondary */
--success: #16a34a; /* "yes/online" green */
--gradient: linear-gradient(135deg, #ff5470 0%, #f5333f 40%, #0ea5e9 100%);
}
* { margin: 0; padding: 0; box-sizing: border-box; }
@@ -41,7 +43,7 @@
left: 0;
right: 0;
z-index: 100;
background: rgba(10,10,10,0.8);
background: rgba(255,248,245,0.85);
backdrop-filter: blur(20px);
border-bottom: 1px solid var(--border);
padding: 16px 40px;
@@ -78,7 +80,7 @@
}
nav .cta:hover {
transform: translateY(-1px);
box-shadow: 0 4px 20px rgba(99,102,241,0.4);
box-shadow: 0 4px 20px rgba(245,51,63,0.4);
}
/* HERO */
@@ -97,13 +99,13 @@
transform: translateX(-50%);
width: 600px;
height: 600px;
background: radial-gradient(circle, rgba(99,102,241,0.15) 0%, transparent 70%);
background: radial-gradient(circle, rgba(245,51,63,0.15) 0%, transparent 70%);
pointer-events: none;
}
.hero .badge {
display: inline-block;
background: rgba(99,102,241,0.1);
border: 1px solid rgba(99,102,241,0.3);
background: rgba(245,51,63,0.1);
border: 1px solid rgba(245,51,63,0.3);
color: var(--accent-light);
padding: 6px 16px;
border-radius: 20px;
@@ -149,7 +151,7 @@
}
.hero .btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(99,102,241,0.4);
box-shadow: 0 8px 30px rgba(245,51,63,0.4);
}
.hero .btn-secondary {
background: transparent;
@@ -174,7 +176,7 @@
width: 100%;
border-radius: 16px;
border: 1px solid var(--border);
box-shadow: 0 20px 60px rgba(0,0,0,0.5);
box-shadow: 0 20px 50px rgba(46,30,20,0.16);
}
/* FEATURES */
@@ -252,7 +254,7 @@
display: flex;
align-items: center;
justify-content: center;
background: rgba(34,197,94,0.1);
background: rgba(22,163,74,0.12);
border-radius: 50%;
flex-shrink: 0;
}
@@ -260,7 +262,7 @@
border-radius: 12px;
overflow: hidden;
border: 1px solid var(--border);
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
box-shadow: 0 10px 40px rgba(46,30,20,0.10);
}
.feature-image img {
width: 100%;
@@ -310,7 +312,7 @@
.grid-card .icon {
width: 44px;
height: 44px;
background: rgba(99,102,241,0.1);
background: rgba(245,51,63,0.1);
border-radius: 10px;
display: flex;
align-items: center;
@@ -359,7 +361,7 @@
}
.cta-section .btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(99,102,241,0.4);
box-shadow: 0 8px 30px rgba(245,51,63,0.4);
}
/* FOOTER */
@@ -445,7 +447,7 @@
width: 32px;
height: 32px;
border-radius: 6px;
border: 1px solid rgba(255,255,255,0.1);
border: 1px solid rgba(0,0,0,0.08);
}
.showcase-card-body p {
color: var(--muted);
@@ -508,7 +510,7 @@
border-radius: 16px;
padding: 48px 40px;
margin-bottom: 60px;
box-shadow: 0 0 60px rgba(99,102,241,0.15);
box-shadow: 0 0 60px rgba(245,51,63,0.15);
}
.pricing-header {
margin-bottom: 36px;
@@ -559,7 +561,7 @@
display: flex;
align-items: center;
justify-content: center;
background: rgba(34,197,94,0.1);
background: rgba(22,163,74,0.12);
border-radius: 50%;
flex-shrink: 0;
}
@@ -583,7 +585,7 @@
}
.pricing-cta .btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(99,102,241,0.4);
box-shadow: 0 8px 30px rgba(245,51,63,0.4);
}
.pricing-cta .btn-contact {
color: var(--muted);
@@ -652,10 +654,10 @@
}
.vs-col:last-child { border-right: none; }
.vs-col.live365 {
background: rgba(255,255,255,0.02);
background: rgba(0,0,0,0.02);
}
.vs-col.flowercms {
background: rgba(99,102,241,0.05);
background: rgba(245,51,63,0.05);
font-weight: 600;
}
.vs-col.highlight .yes {
@@ -725,7 +727,7 @@
<p>White-label content management for small radio and internet broadcasters. Professional websites, custom branding, and native mobile apps — all from one dashboard.</p>
<div class="hero-cta">
<a href="mailto:sales@flowercms.cloud" class="btn-primary">Contact Sales</a>
<button class="btn-secondary">See Demo</button>
<a href="mailto:sales@flowercms.cloud?subject=Demo%20request" class="btn-secondary">Book a Demo</a>
</div>
</section>