← All implementations
EDITORIAL STOREFRONT / TAXONOMYLive · showcase

SinfulSmoke

A visual identity with a catalog underneath.

sinfulsmoke.com
Visit website ↗
The published SinfulSmoke homepage with the original script logo, editorial heading and curved chestnut pipe.
The published SinfulSmoke showcase, with the preserved logo and custom product artwork.

SinfulSmoke pairs a distinctive visual world with a structured catalog of pipes, leaf and accessories. The original logo anchors a new system of product artwork, collections and detailed item pages.

The problem

Catalog discovery needs more than attractive cards. Categories, descendant terms, filters and result counts need to agree as the visitor narrows a collection.

The implementation

NestedTerms defines the catalog taxonomy. A build step validates associations and ships a read-only catalog with the application. Stow’s browser adapter manages the demo bag and favorites without a writable server cart.

  • Hierarchical categories and descendant-aware facets
  • Search, sorting, item details and related editorial pages
  • Stow browser baskets for favorites and demo bag quantities
01Browse a collection02Narrow its taxonomy03Inspect an item04Save a demo favorite
02 / ENGINEERING DECISIONS

Where the details matter.

01

A taxonomy supports discovery

A selected parent category includes its descendants. NestedTerms provides traversal while the application constructs the filter response.

02

Build the catalog once

Catalog installation checks every declared term before associating it. The deployment archive contains the prepared catalog; public browsing remains read-only.

03

Use the same basket package in the browser

Stow’s browser adapter owns bounded bag quantities and favorites membership. Saved state migrates from the previous storage format; recently viewed history remains separate navigation state.

03 / PACKAGES & CODE

Inside the implementation.

NestedTerms 2 powers hierarchical categories and tag associations. Stow 2.1 supplies the browser basket used for the demo bag and favorites. Preflight checks the read-only server deployment. These client-side baskets do not create orders or payments.

APPLICATION EXCERPT

Build catalog taxonomy associations

Runs only in catalog build/isolated tests. Public requests read the packaged catalog.

NestedTerms package ↗
app/Content/CatalogInstaller.phpPHP
$tags = CatalogTag::whereIn('slug', $item['terms'])->get();
if ($tags->count() !== count($item['terms'])) {
    throw new \RuntimeException("Unknown catalog terms for {$item['slug']}.");
}
$record->syncTags($tags->all());
Source excerpt · 9791187 · lines 40–44. Surrounding setup is omitted.
APPLICATION EXCERPT

Descendant-aware catalog nodes

AllDescendants comes from NestedTerms; application builds the facet response.

NestedTerms package ↗
app/Content/CatalogBrowser.phpPHP
private function node(CatalogTag $tag): array
{
    return ['slug' => $tag->slug, 'label' => $tag->name,
        'ids' => [$tag->id, ...$tag->allDescendants()->modelKeys()],
        'children' => $tag->children->map(fn ($child) => $this->node($child))->all()];
}
Source excerpt · 9791187 · lines 84–89. Surrounding setup is omitted.
APPLICATION EXCERPT

Compose shared and application-specific release checks

The shared runner checks the Vapor manifest alongside production configuration and the storefront’s read-only runtime rules.

Preflight package ↗
scripts/vapor-preflight.phpPHP
$runner = new Runner;
$results = array_merge($results, $runner->run([
    new VaporManifest($manifest, 'production', config('preflight.vapor_limits')),
    $app->make(ProductionConfiguration::class),
    $app->make(DemoRuntime::class),
]));
Source excerpt · 87be633 · lines 26–31. Release assertions are combined before a strict pass/fail exit.
APPLICATION EXCERPT

A browser basket with legacy-state migration

The application passes valid catalog slugs and its item/quantity limits to Stow. The migration imports previously saved demo lines into the package’s browser storage.

Stow package ↗
resources/js/demoBag.jsJavaScript
basket = createBrowserBasket({
    storageKey: "sinfulsmoke.stow.bag.v1",
    allowedIds: items.map((item) => item.slug),
    maxItems: 20,
    maxQuantity: 9,
    migrate(storage) {
        let legacy;
        try {
            legacy = JSON.parse(storage.getItem("sinfulsmoke.demo-previews.v1") || "[]");
        } catch { return []; }
        return Array.isArray(legacy)
            ? legacy.map((line) => ({ id: line?.slug, quantity: line?.quantity }))
            : [];
    },
});
Actual application source · createBrowserBasket is imported from the installed laravel-stow package. Surrounding Vue state setup is omitted.
APPLICATION EXCERPT

Favorites use basket operations too

A separate Stow basket is configured for at most 24 items and one of each. The application keeps catalog validation and visitor-facing notices.

Stow package ↗
resources/js/collectionState.jsJavaScript
export function toggleFavorite(slug) {
    if (!favorites || !catalog.value.some((item) => item.slug === slug)) return;
    const removing = isFavorite(slug);
    if (removing) favorites.remove(slug);
    else favorites.add(slug);
    collectionNotice.value = removing
        ? "Removed from favorites."
        : isFavorite(slug) ? "Saved to favorites." : "You can save up to 24 favorites.";
}
Actual application source · favorites.add/remove call the Stow browser adapter; ordered recently viewed history is separate.
APPLICATION EXCERPT

Shared attribution outside the application root

The host application keeps its own footer and copyright. A shared Blade component follows the application root, so client rendering does not duplicate it.

SiteCredit package ↗
resources/views/app.blade.phpBlade
<x-site-credit />
Actual component call; the package stylesheet is bundled through Vite.
04 / VERIFICATION & CURRENT SCOPE

What holds it together.

  • Catalog build rejects references to unknown terms.
  • Preflight asserts that public web routes are GET/HEAD only.
  • The published site explicitly identifies its showcase and ordering limitations.
  • Automated and browser checks exercise bag quantities, favorites, reload persistence and migration of previously saved browser state.
CURRENT RELEASE

A published nontransactional showcase. Stow manages browser-only favorites and demo bag state; ordering, payment collection and real inventory sales are unavailable.

KEEP EXPLORING

Arid Farm

Designed, Developed and Hosted by Better Web Design and Development Services, LLC