The theme gives every button a pressed effect -- button:active sets
position: relative; top: 1px. Splide renders its arrows as <button>, so
they matched it and flipped from absolute to relative positioning for as
long as the mouse was held down, jumping 181px out of their centred
position mid-click. mousedown and mouseup therefore landed on different
elements (the arrow, then the caption overlay behind it), so the browser
fired click on their common ancestor and the arrow's own handler never
ran. Nothing was logged because nothing errored.
Restoring absolute positioning for .splide__arrow:active fixes it.
Autoplay and the pagination dots were unaffected throughout, which is
why this looked like the arrows specifically were unbound -- they were
bound, the click just never reached them. Verified with real mouse
clicks (not synthetic .click(), which bypasses hit-testing and masked
the bug) on both sites.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The gap between listing items was collapsing to 11-33px and varying per
item, despite a 50px margin. The thumbnail floats left and nothing
contained it, so whenever the excerpt was shorter than the 150px image
-- which is most of them now the column is the full 930px rather than
the theme's 650px -- the image overflowed the item and the margin below
it was absorbed.
.post/.hentry now use display: flow-root, so the item wraps its own
float and the margin is measured below the image. Measured against the
live old site: it has no overflow (-6px) and a steady 42px gap; this was
overflowing by 39-61px. Both sites now sit at a consistent 60px.
That also makes the theme's trailing <br /> and clear div redundant --
they existed only to escape the float -- so the listing markup drops
them and the wrapping Fragment with them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
.post/.hentry margin-bottom goes from the theme's 20px to 50px, giving
about 72px between items once the heading margins and the clearing
<br /> are counted.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three things were off in the front-page and blog listings.
The floated thumbnail was never cleared, so the next item's heading
wrapped around it instead of starting below -- front-page.php emits
<br /><div class="clear"> </div> after each post, which is now
reproduced.
The post wrapper was missing the classes WordPress adds via
post_class(); .post/.hentry carry the margin-bottom: 20px that separates
items.
And the listings sat in the theme's #content, which is float: left and
650px because it expects a 230px sidebar alongside. There is no sidebar
here -- the search and widget boxes were WordPress-specific chrome and
were dropped -- so that just left dead space to the right. BaseLayout
already wraps the slot in the full-width #content-full, so the inner
wrapper is removed and the sections span the full 930px.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The theme styled the nav, all headings and the comments watermark with
'Coda', cursive, sans-serif, pulling Coda from Google Fonts. That font
load was never ported, so browsers moved to the next entry in the stack
-- the generic cursive family -- and rendered those elements as a script
face on any device that ships one, which phones do. It went unnoticed
because this server's Chromium has no cursive font installed and so fell
through to sans-serif.
Those three rules now use Arial, Helvetica, sans-serif, matching the body
text, rather than depending on a webfont that is no longer loaded.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
.entrytext carried the theme's bottom.png as a centre-bottom background,
which rendered as a grey smudge trailing the last line of every page.
Removed the rule and the now-unused asset.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
WordPress expands shortcodes at render time via do_shortcode(), so the
raw post_content the export reads still contains them literally. All ten
[caption] instances were being written straight into the Markdown and
rendered as visible markup -- the Hosting page led with
[caption id="attachment_205" align="aligncenter" width="300"].
They now become the same div.wp-caption / p.wp-caption-text structure
WordPress produces, which the ported theme CSS already styles. The
shortcode is swapped for a placeholder before the HTML->Markdown pass and
rebuilt after, so the image inside stays Markdown and still goes through
Astro's image pipeline rather than being frozen as raw HTML pointing into
src/assets, which would not resolve at runtime.
[caption] is the only shortcode in use -- no gallery/embed/video/audio.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Content linked between pages using absolute WordPress URLs -- 100
occurrences across 39 files, many against wp.vicidial.com, the old
WordPress backend host that won't outlive this migration, the rest
against www.vicidial.com in ?page_id=N form.
The export now resolves those IDs against the published page/post set and
emits /slug (or /blog/slug) instead. All 100 resolved; links to
vicihost.com are a separate site and deliberately untouched.
Verified every internal href in the built output corresponds to a page
that actually exists -- no broken links.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Normalises text to LF and marks the migrated WordPress uploads (204 PNGs,
94 JPGs, plus GIFs/PDFs/ICO/MP4) as binary so git stops trying to diff,
merge or rewrite endings in them. src/styles/global.css came out of the
theme with CRLF endings and is renormalised here in one deliberate pass
rather than leaving it to surprise someone on a later commit -- the
content is byte-identical ignoring whitespace.
.gitignore additionally covers .vscode/, *.log, *.swp, Thumbs.db and all
.env variants -- the last of those matters because scripts/export-wp.mjs
reads the WordPress DB credentials from the environment.
Also corrects the note on the excluded 80MB video: it lives in public/
and Astro copies it into dist/ on every build, so no manual copy step is
needed, contrary to what the old comment claimed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Page content separates its major sections with leading <br><br>, which
the old site renders as a blank line before each section heading. Those
breaks were being lost, leaving every section butted up against the
previous one.
Two causes. The content contains malformed `</br>` closing tags, which
browsers treat as a line break but an HTML parser discards, so they
never survived the HTML->Markdown conversion; they're now rewritten to
<br />. And Markdown drops a hard break at the start of a paragraph, so
turndown now emits literal <br /> tags instead of the trailing-two-space
form -- inline, with no trailing newline, since a lone tag on its own
line starts a raw HTML block (CommonMark type 7) and would stop the rest
of the paragraph being parsed as Markdown at all.
Verified against the live old site: paragraph count, <br> count, bold
heading count and per-paragraph break placement now all match exactly.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The front-page/blog listings rendered featured images as 150x150
centre-cropped squares stacked above the text. The theme actually
renders them at 210x150 cropped from the left-top corner
(set_post_thumbnail_size), floated left with a border so the excerpt
wraps beside them -- the CSS for that (#container .attachment-thumbnail)
was already ported, the class just was never applied.
The left-top anchor matters: every featured image is a 930x354 slide
banner whose subject sits in the left portion, so a centre crop cut the
subject out entirely.
Also restores the "Read the Rest..." link (the theme's excerpt_more
filter) and corrects excerpt length -- the theme uses 60 words on the
front page and 30 in the slideshow; the export was baking WordPress's
default 55 for both.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The small-business theme stores every of_get_option() value in a single
serialized wp_options row named after the theme id ("smallbusiness"),
not as individual featured-title1/etc rows. My earlier check queried for
the individual rows, found nothing, and wrongly concluded the options had
never been customized -- so the homepage shipped the theme's built-in
demo copy ("Small Business Theme", "Small Business Pro will give your
Extra Freedom...") instead of the real marketing content.
Pulls the actual values: the page heading, all three featured boxes
(Capterra rating, awards/FinancesOnline seal, VICIhost dedicated
hosting), and the bottom quotation block, which was missing entirely.
Internal ?p=/?page_id= links in those options are rewritten to their
new-site paths (/blog/most-popular-open-source-contact-center, /hosting).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Nav.astro was using the #smallbusiness-main-menu id/CSS (designed for
the tall under-logo nav row) while rendered inside #top-menu-container
(the compact top bar), causing items to overflow onto a second line.
Switched to the matching #smallbusiness-top-menu styling and dropped
the extra "Home" link that pushed it over. Single nav bar, as intended.
Splide's core CSS import from Slideshow.astro's frontmatter was being
silently dropped from the build (component-level bare CSS imports
don't bundle the same way layout-level ones do) -- moved it to
BaseLayout.astro where global.css already imports successfully, and
switched to the full theme CSS for real arrow/pagination styling.
Also fixed #slideshow .post-slide: position:absolute with no explicit
top/left fell back to its hypothetical static position (right after
the 354px image), pushing the caption overlay below the visible slide
instead of on top of it. Pinned top:0; left:0 so the margin-based
offset actually anchors to the slide.
Verified visually via headless Chromium screenshot, not just HTML
content -- the earlier "renders the 5 latest posts" check only
confirmed the data was present, not that it displayed correctly.
Static brochure/marketing site: 55 pages, 5 posts, 82 attachments, and
the 7-item nav, exported from the wordpress_vicidial DB via
scripts/export-wp.mjs (re-runnable). Layout/styles ported from the
small-business WP theme; homepage slideshow rebuilt as a Splide client
island pulling the latest 5 posts at build time, replacing the old
BJQS jQuery plugin.