HST Medical, a subsidiary of Kowa
Website refresh v2.2Supporting documents
12 October 2026

hstmedical.com · Classic WordPress redesign

Website refresh: supporting documents

The requirements, the store styling, the widget and menu guide, the performance report, the validation results and the optional new homepage, in one place. Prepared by TechNext for HST Medical and McGallen & Bolden.

The files to install are in HST-Medical_Website-Refresh_v2.2_2026-10-12.zip, with its install guide.

1

RFP sections 2 and 3 · 8 October call

Requirements and compliance

What the RFP asks for

RFPRequirement
2.1Classic WordPress theme only: no block themes, block templates, theme.json layouts or Full-Site Editing. Editing stays in the Classic Editor and Classic Widgets.
2.2GeneratePress (classic) as the foundation, with changes made as non-destructive overrides.
2.3WP EasyCart store, product grids, product pages, cart and checkout work without layout breaks.
2.4Mobile-first. Graphics-lite: no heavy animated scripts, no hero carousels, minimal page weight on 4G/LTE.
2.5Typography-centric (system or lightweight web fonts, clear H1 to H4). SEO: semantic HTML, schema-friendly markup, low layout shift. GEO: AI search engines can read the content without running JavaScript.
2.6WordPress.org standards, GPL licensing, minimal extension code, no proprietary lock-in.
3Five deliverables: theme package · WP EasyCart custom styling · widget and menu guide · performance audit report · Theme Check verification.

Scope agreed on the 8 October 2026 call

  • A design refresh. TechNext provides GeneratePress settings, one CSS file and graphics, and McGallen & Bolden installs them on the live site.
  • Not changed: WP EasyCart and its settings, the AI chatbot and the hosting. No rebuild.
  • Product updates (20+ new products) follow as a separate, second part.
  • Look: minimalist, modern, fast on phones and readable by AI search. Images look real: only HST's own product photos and artwork are used.
  • Least cost: no new plugins, licences or hosting.

Compliance, requirement by requirement

Every requirement from the RFP and the 8 October call, checked against the live site as it was on 9 October 2026.

# Requirement Status How it is met / evidence
2.1 Classic theme paradigm; no block themes, block templates, theme.json layouts or FSE Met Two GeneratePress settings files, Additional CSS and (optionally) one GeneratePress Hook Element of plain HTML. No block markup: the validator finds 0 <!-- wp: blocks.
2.1 Editing stays in the Classic Editor and Classic Widgets Met No editor change. Widgets and menus are reused as they are (see Widgets and menus).
2.2 GeneratePress (classic) as the foundation; non-destructive overrides Met Built on the live GeneratePress 3.6.1 + GP Premium 2.5.6. Both settings files use GP Premium's palette-only and typography-only imports, so only the colour palette and the type scale change; every other setting (header, widths, menus, spacing, sticky menu) stays as the site has it. Backup and rollback are in the install guide.
2.3 WP EasyCart store, grids, product pages, cart and checkout without layout breaks Met CSS only, no template forks (see Store styling). Store, category and product pages checked on the live markup at 13 widths from 360 to 1440 px; cart and checkout end to end on a local EasyCart copy at 1440 and 390 px.
2.4 Mobile-first and responsive Met No sideways scrolling added at any of 13 widths from 360 to 1440 px on 14 page types (one pre-existing 6 px overflow on the cart at 360 px comes from another plugin's hidden note, Store styling). 44 px touch targets for buttons, menus, product cards and footer links. Works with the phone bar (UnoDock) and the Jamie bubble (DocuChat).
2.4 Graphics-lite: no heavy animated scripts or excessive hero carousels Met No script in any file (the optional homepage embeds the existing TV commercial as a lazy, privacy-enhanced YouTube video, as the Home page does today), and no GeneratePress option that adds a script is switched on. A still hero image. Motion is CSS only and switches off for reduced motion.
2.4 Minimal page weight on 4G Met The core adds about 10 KB of compressed CSS and one small font file (about 27 KB) served from the site. The optional homepage cuts the homepage download on phones from 5.8 MB to 1.8 MB (see Performance).
2.5 Typography-centric; legible system or lightweight web fonts; clear H1–H4 Met The device's own font for text, and one font (Plus Jakarta Sans 700/800, served from hstmedical.com through GP Premium's Font Library) for headings. A clear H1 to H5 scale. No text below 12 px in these files.
2.5 SEO: semantic HTML, low CLS Met Semantic sections and headings in the homepage block. CLS measured on home, store and product: home 0.000 → 0.000, store 0.000 → 0.000, product 0.217 → 0.000 (see Performance).
2.5 GEO: content readable without client-side JavaScript Met All homepage content, including the symptom finders, is HTML and CSS that works with JavaScript off. The Home page's own content stays in WordPress, so its Markdown/AI version keeps working.
2.6 WordPress.org coding standards / GPL Met No PHP or JS ships. CSS and HTML validate with 0 errors (tinycss2, html5lib); the minified CSS is checked rule for rule against the readable file. No third-party code in these files and no tracking.
3 Child theme / standalone theme package In part Replaced by the settings + CSS + graphics handover agreed on the 8 October call: the install zip.
3 WP EasyCart custom styling Met Store styling (sections 7–9 of hst-refresh.css).
3 Widget and menu configuration guide Met Widgets and menus.
3 Performance audit report (Core Web Vitals, PageSpeed) In part Performance. The design does not slow pages; "green" mobile scores need the server-side steps listed there.
3 Theme Check: zero errors In part No theme code ships, so Theme Check has nothing to scan. The equivalent syntax and policy check of every file passes: Validation.
Call Deliverable = settings + CSS + graphics Met The install zip is exactly that. The settings come as two files because only GeneratePress's palette-only and typography-only imports leave the rest of the site's settings alone; one combined file would have reset them. The new homepage is an optional add-on (see Optional new homepage).
Call Keep WP EasyCart and its settings Met Not changed.
Call AI chatbot not touched Met Not changed. On phones the CSS only moves DocuChat's bubble above the bottom bar.
Call Existing hosting; no rebuild Met Nothing to host. Images go into the existing Media Library and uploads folder.
Call Minimalist, modern, page-speed friendly; works for AI search Met See above and Performance.
Call Realistic images, not obviously AI Met Only HST's own product photos, award artwork and the Kowa event photo. The logo artwork is unchanged.
Call Bootstrap: least cost Met Core install about 20 minutes; no new plugins (the Font Library is part of GP Premium), licences or hosting.

Accessibility (WCAG 2.2 AA, axe-core 4 on 13 page types at 1440 px and 8 at 390 px)

After the package: 0 colour-contrast failures and 0 links told apart by colour alone (the live site today has up to 40 contrast failures per page). The findings left all sit outside these files:

  • WP EasyCart controls without labels: the sidebar search buttons, the sort menu and the product quantity field. These need a template or plugin fix. (The checkout steps were not part of this axe run.)
  • Video iframes on About and Contact have no title. Adding one in the editor fixes it.
  • Not tested here: the UnoDock bar and the DocuChat widget, which are third-party plugins.
2

RFP section 3 · WP EasyCart custom styling

Store styling

Nothing extra to install. The EasyCart styling is part of hst-refresh.min.css in the install zip, so it goes live with step 5 of the install guide. It is CSS only: no EasyCart template is copied or changed, so EasyCart updates keep working, and the store settings, prices, stock and checkout steps stay exactly as they are.

Built for the markup of WP EasyCart 6.0.3 on GeneratePress 3.6.1 + GP Premium 2.5.6, the versions the live site runs.

Where it sits in the CSS

In the readable hst-refresh.css (the minified file holds the same rules in the same order):

Section Lines Covers
7. Shop grid and product cards 321–462 Online store, category pages, related products and the homepage popular picks
8. Product page 463–544 Single product view
9. Cart, checkout, account 545–601 Cart, checkout steps, order success, My account

EasyCart's own Design settings (colours and fonts in EasyCart › Settings › Design) no longer show through on these pages: the store follows the site palette and fonts instead. To change the store's magenta, change the values in section 1 of the CSS (--hst-stamp, --hst-stamp-hover, --wpec-main-color and the brand tokens).

What changes, view by view

Store and category pages (section 7)

  • Product grid: as many columns as fit (cards at least 200 px wide), 2 on phones, 4 in the homepage popular picks. Cards are of equal height, with the price and button aligned along the bottom. Product names show up to 3 lines (4 on phones).
  • Product photos sit on a soft floor shadow and lift slightly on hover (switched off for reduced motion).
  • Sidebar: the search box and category list as tinted pills; the current category is filled in magenta. On phones the sidebar folds into EasyCart's Filters button, and the Filters button and sort menu share one row.
  • Sort menu, sale and "new" tags, out-of-stock notes, Quick View, "added to cart" and loading states restyled.
  • "Add to cart" buttons are full width and at least 44 px tall for touch.

Product page (section 8)

  • The repeated page title and page image GeneratePress adds above the product are hidden, so EasyCart's own photo, title and price lead. This also removes the layout shift on product pages (see Performance).
  • The product photo sits on a soft halo; title and price use the heading font and the new type scale.
  • Options, quantity stepper and "Add to cart" restyled; option error messages keep EasyCart's own colours.
  • Description and specification tabs as pills (they fit EasyCart's folded tab row on phones); related products in the same card look as the store.

Cart, checkout and account (section 9)

  • Cart table, item photos and titles, coupon and price rows, totals and "Continue shopping" restyled.
  • Checkout breadcrumb (current step in magenta, later steps grey), form fields and success messages restyled; error messages keep EasyCart's own colours.
  • My account dashboard links restyled.
  • The checkout flow itself (steps, fields, payment) is EasyCart's own and is not changed.

Tested

Store, category and product pages on snapshots of the live site (WP EasyCart 6.0.3 with Pro) at 1440, 1280, 1100, 1024, 1000, 900, 820, 801, 800, 768, 414, 390 and 360 px: no layout breaks and no horizontal scrolling caused by these files. The cart (with a product added) and the checkout details step on a local copy of the site (WP EasyCart 6.0.1, free) at 1440 and 390 px. Screenshots are below.

After an EasyCart update, check the store, a product with options and a sale price, the cart and the checkout: the CSS follows EasyCart's class names, and a major EasyCart release can rename them.

Outside these files

  • EasyCart prints a few controls without text labels: the sidebar search buttons, the sort menu and the product quantity field. CSS cannot add labels, so these need a small template or plugin fix if a full WCAG 2.2 AA pass is wanted (see Accessibility under Requirements and compliance).
  • At 360 px the live cart page can be scrolled 6 px sideways. It does the same with and without these files (measured on both), so it does not come from them. Phones 390 px and wider are not affected.
3

RFP section 3 · Widget & menu configuration guide

Widgets and menus

The refresh uses the menus, Classic Widgets and plugins hstmedical.com already has (as on 9 October 2026). Nothing needs to be moved or re-created. This page lists what the design expects, so future edits keep working.

Menus (Appearance › Menus)

Location Menu today What the design does with it
Primary (header) "topmenu": AI Chat, Pain Relief, Cold, Cough & Flu, Online store, Where to buy?, About HST, Blog, Contact, then WP EasyCart's cart Text links with a magenta underline on hover and on the current page. The item linking to /store/ becomes the magenta "Online store" button and is drawn at the end of the row (move it to the end in the menu too, so keyboard order matches). EasyCart's cart shows as a cart icon with a count, only once something is in the cart. On phones (800 px and below) the menu opens from the Menu button; the shop item is in bold.
Footer (widget) "footermenu" in a Navigation Menu widget Two columns of links, on desktop and on phones.

Width budget. The 8 items, the shop button and the cart icon fit one row from 801 px up: between 801 and 1099 px the items tighten, and between 801 and 999 px the logo takes its own row above a centred menu. A ninth item, or much longer labels, can push the menu to a second row on small laptops; check 801 to 1100 px after any menu change. Menu Icons (the plugin) keep working: the AI Chat icon is inherited by the new styles.

Footer widget areas (Appearance › Widgets, Classic Widgets)

GeneratePress has 3 footer widget areas on this site. The design styles widgets by type, not by position.

Area today Widget How it shows
Footer 1 Recent Posts ("FREE blog articles") Desktop: the 3 latest posts, one line each. 800 px and below: hidden (Blog is in the main menu), together with its column if nothing else is in it.
Footer 2 Simple Social Icons ("Socials") White rounded tiles with magenta icons, filled magenta on hover. Shown last on desktop.
Footer 2 Custom HTML (the FDA statement) Small print, with its "More here." link underlined.
Footer 3 Navigation Menu ("Find out more …") Two columns of links. Shown first on phones.

Widget titles show as 13 px capitals. Any other standard widget (Text, Custom HTML, Image) takes the same light footer style. Keep to 3 footer areas: the desktop footer is laid out as three columns.

Plugins on screen

  • UnoDock (the bar at the bottom of the screen up to 782 px: Home, Pain Relief, Cold/Cough, Store and an unlabelled person icon): its settings are untouched. Section 13 of the CSS recolours it to the site palette and enlarges its labels to 12 px; delete the rules under "the refresh palette for the dock" to keep its own colours. The footer ends with room for the bar, so it never covers the copyright line. If UnoDock is ever removed, delete section 13.
  • DocuChat (the round "Jamie" bubble, bottom right): untouched; on phones the CSS lifts it above the UnoDock bar. The AI Chat page keeps its embedded chat.

Other GeneratePress parts used

  • Site Identity › Logo: the current logo, or the optional hst-logo-trimmed.png (same artwork, empty margins removed). The header shows it up to 88 px tall on desktop and 60 px on phones.
  • Header (Customize › Layout › Header): unchanged; full width, as today.
  • Sticky menu (GP Premium › Menu Plus): unchanged, including its sticky logo. The sticky bar gets a soft shadow and side margins; on phones it shows the sticky logo on the left and the Menu button on the right.
  • Back to top (GeneratePress setting): stays off, as today. If it is switched on later, the CSS already styles it as a rounded button.
  • Copyright (GP Premium › Copyright): unchanged text, shown small.
  • Font Library (GP Premium): holds Plus Jakarta Sans 700 and 800 for headings (install step 4).
  • Optional Hook Element (Appearance › Elements): "HST homepage" on generate_after_header (Front Page). See Optional new homepage.
4

RFP section 3 · Performance audit report

Performance

Method. Lab Core Web Vitals on PageSpeed's mobile profile: a Moto G class phone (412 × 823), "Slow 4G" (150 ms round trip, 1.6 Mbps down), 4× CPU slowdown and a cold cache, via the Chrome DevTools Protocol. Each figure is the median of 5 runs. The pages are snapshots of the live hstmedical.com pages taken on 9 October 2026, served compressed as the live server does, with the live product photos, scripts and image CDN. "After" applies our files exactly as installed (Plus Jakarta Sans served from the site, as the Font Library does). The third-party chat (DocuChat), Google rating (Trustindex), analytics and YouTube player were blocked in both versions, so the absolute figures are a little better than a visitor sees; the before/after difference is what the files make. This is a lab approximation of PageSpeed Insights, which needs a public URL; expect run-to-run variation of about ±0.5 s.

LCP = Largest Contentful Paint (when the main content appears). CLS = Cumulative Layout Shift (how much the page jumps; under 0.1 is good). TBT = Total Blocking Time.

Page Version LCP, median (5 runs) CLS TBT Requests Download
Home Live today 8.9 s (3.6–23.3) 0.000 43 ms 132 5.8 MB
Home Core files only (settings + CSS + graphics) 16.3 s (10.1–19.1) 0.001 44 ms 139 6.1 MB
Home With the optional new homepage 1.9 s (1.8–2.4) 0.000 0 ms 62 1.8 MB
Online store Live today 14.2 s (7.5–17.6) 0.000 0 ms 131 5.7 MB
Online store With the refresh 7.0 s (3.6–17.1) 0.000 30 ms 133 5.8 MB
Product Live today 3.0 s (2.9–3.5) 0.217 0 ms 48 1.1 MB
Product With the refresh 2.2 s (2.0–2.8) 0.000 5 ms 50 1.2 MB

Why LCP swings so much on the home and store pages. On both, the largest element is the same HST banner image (hst_web2025_whatis2.005, the page image above the content), and it competes with the 85 full-size product photos for a slow connection, so each run depends on which photos the browser fetches first (live home today: 3.6 to 23.3 s). The core files do not change that image or the photo list; the optional new homepage and server step 4 below remove the competition. The download sizes, request counts, CLS and TBT are stable from run to run.

What our files do

  • They add little. Text uses each device's own font. One heading font, Plus Jakarta Sans (700/800, about 27 KB), is served from the site with font-display: swap, so text is never hidden while it loads. The CSS is about 10 KB compressed. No script is added.
  • Product pages stop jumping. The repeated page image used to push the product down as it loaded. With the refresh the product page's CLS is 0.000 (live today: 0.217).
  • The optional new homepage is about 69% lighter on phones (5.8 MB → 1.8 MB). It shows 8 popular picks instead of all 85 products with full-size photos (its install removes only that list from the Home content).
  • The hero image is a 40 KB WebP on phones, loaded first (fetchpriority="high"). Everything below it loads lazily, with sizes set so nothing shifts.

Why "green" (LCP under 2.5 s) needs server-side work. On every page, the browser must download jQuery, the WP EasyCart scripts and stylesheet (the store CSS alone is 345 KB), dashicons, jQuery UI and the Fast Velocity Minify bundles before it can paint. None of these come from our files. Steps for McGallen, in order of effect:

  1. Defer scripts (WordPress 6.3+ strategy => defer, or FVM's "defer JS" option) and preload the homepage hero image.
  2. Load EasyCart's CSS and JS only on shop pages (store, category, product, cart, account and the homepage if it shows products), with a small wp_enqueue_scripts filter or an asset manager plugin.
  3. Drop styles not needed for visitors: jQuery UI "smoothness", Owl Carousel and reviews CSS on pages without them; dashicons for logged-out users where no icon uses them.
  4. Paginate the store: 24 products per page instead of 85 (EasyCart › Settings › Product List). This is the biggest cut for the store page (almost 6 MB on phones today).
  5. Server response: page caching (a full-page cache plugin or the host's) and HTTP/2 or HTTP/3 with Brotli.
  6. Third-party widgets: DocuChat, Trustindex and the UnoDock bar each add requests on every page; load the chat on click if DocuChat offers it.

These steps are independent of the design and can be done before or after it goes live.

5

RFP section 3 · Theme Check verification

Validation

Result: PASS. 0 parse errors and 0 policy issues in every file of this package.

The WordPress Theme Check plugin scans a theme folder (PHP templates, style.css headers, functions.php). As agreed on the 8 October call, this handover ships no theme folder: it is two GeneratePress settings files, Additional CSS, graphics and an optional Hook Element of plain HTML, used with the GeneratePress parent theme that is already installed and is itself listed on WordPress.org. Theme Check therefore has nothing of ours to scan, and the live theme it would scan is unchanged.

In its place, every file we ship was checked for the same things Theme Check guards against:

Check Tool Files
Valid JSON in GP Premium's merge formats only (they cannot replace other settings) Python json hst-gp-1-global-colors.json, hst-gp-2-typography.json
CSS parse errors tinycss2 (CSS Syntax Level 3) hst-refresh.css, hst-refresh.min.css, the <style> block in hst-home.html
Minified CSS has the same rules, in the same order, as the readable file tinycss2 hst-refresh.min.css
HTML parse errors html5lib (HTML5 parsing spec) hst-home.html
No scripts, no inline event handlers pattern check hst-home.html
No block-editor (Gutenberg) markup pattern check hst-home.html
Every image has alt, width and height; every iframe has a title pattern check hst-home.html

About WordPress's own CSS checker. Customize › Additional CSS runs CSSLint from 2016, which does not know current CSS such as :is() and :has(). On hst-refresh.min.css it reports 99 "errors"; none is a real error (the current parser above finds 0). Install step 5 explains the "Update anyway" tick box.

No PHP and no JavaScript ship, so there are no deprecated functions, unescaped output or enqueue issues to report. The CSS, HTML and graphics are TechNext's original work with no third-party code; the product photos are HST's own.

Validator output

hst-gp-1-global-colors.json: valid JSON, GP Premium merge format (global-colors, 11 entries)
hst-gp-2-typography.json: valid JSON, GP Premium merge format (typography, 12 entries)
hst-refresh.css: 343 top-level rules, 0 parse errors
hst-refresh.min.css: 343 top-level rules, 0 parse errors
hst-refresh.min.css: the same rules, in the same order, as hst-refresh.css
hst-home.html <style>: 189 top-level rules, 0 parse errors
hst-home.html: 0 HTML parse errors; script tags 0, block-editor markup 0, inline event handlers 0, images without width/height 0, images without alt 0, iframes without title 0
RESULT: PASS
6

Optional add-on · after HST approves its wording

Optional new homepage

A new homepage block, added above today's Home content as a GeneratePress Hook Element on the front page. It shows 8 popular picks instead of the list of all 85 products, adds symptom finders that work with JavaScript off, and keeps the awards, the offer, the TV commercial, the Kowa news, Telegram and the links to the new Pain Relief and Cold, Cough & Flu pages.

5.8 MB → 1.8 MB

Homepage download on phones (lab test, median of 5 runs).

8.9 s → 1.9 s

Main content appears (LCP) on a slow 4G phone. Today's figure varies from 3.6 to 23.3 s.

132 → 62

Requests to load the homepage.

Desktop scroll inside to see the whole page
The new homepage on desktop
Phone scroll inside
The new homepage on a phone

How it is installed

About 10 minutes more, after the install files from the zip:

  1. Upload its images to /wp-content/uploads/hst-refresh/.
  2. Add a Hook Element, "HST homepage", on generate_after_header with Execute Shortcodes ticked and the location set to Front Page. This needs an Administrator account that can save unfiltered HTML.
  3. On the Home page, remove only the "Bestsellers" heading and the EasyCart product list under it, and tick Disable Elements › Featured Image. Everything else on the page stays.

Editing it later

  • Popular picks come live from EasyCart through [ec_product productid="16,28,29,27,24,11,31,39"]: Rheuma-Salve® Balm 50g, Cough Alievaid, Deep Sea Squalene, Pearl Powder, Crocodile Oil, Safari Buddies, Flu Gard and Melatonin 5mg. Change the IDs to change the products; prices always come from EasyCart.
  • The offer banner is one line in the Hook Element; delete it when the offer ends.
  • Health notes are three article links; edit them when newer articles should lead.

The homepage file and its images are supplied once HST approves its wording (items 6 to 8 in For HST to confirm).

7

Open questions

For HST to confirm

The install files

  1. Accent colour: the design uses #dd1860. Today's accent is #D10056; the logo magenta is #DB026D. If HST prefers one of those, we re-issue the colours file and the matching CSS values.
  2. Logo size, and whether the "A subsidiary of Kowa" line must stay readable. The header shows the logo up to 88 px tall on desktop and 60 px on phones; keeping today's size is a two-line change in the CSS.
  3. The FDA statement in the footer ("not evaluated by the U.S. Food and Drug Administration"): keep it on a Singapore site?
  4. Store categories: the phone Filters list shows both "Pain relief" and "Pain Relief" (two categories). Merge or rename one?
  5. Free delivery wording: the Promotions page says "SGD 30 and above"; the Shipping page says above SGD 30, with SGD 1.99 at SGD 30 and below. Which is right?

The optional new homepage

  1. Every factual line. The symptom and "How to use" lines follow HST's product sheets and product pages, with the daily maximums and the label cautions, plus "Always read the label and use only as directed. If symptoms persist, see a doctor or pharmacist." under each finder. Also the kicker "By HST Medical, a subsidiary of Kowa", the heading "Deep relief, five ways.", "Rooted in a family medical hall, since 1930", the popular picks (including Melatonin 5mg), the offer wording, and the products in each finder (they differ slightly from HST's new Pain Relief and Cold, Cough & Flu pages).
  2. What it leaves out from today's Home: the Trustindex "Top Rated" badge, the multilingual "Authentic! Buy Direct!" line and Chinese sub-headings, the panel images, the list of all 85 products and the closing line.
  3. Trademarks: the homepage marks Rheuma-Salve®, Heritage® and HST Medical® (as the store does), Alievaid™, and Zoo-Vite with no mark (as the store and catalogue do). The Kowa announcement uses Heritage™, HST Medical™ and Zoo-Vite™ instead: which is right?