# Grocery aisle workspace

Bookify adaptation, 2026, of TomBursch/kitchenowl at 7d508352d698a780f3fb62112e7761f770b62d70 (AGPL-3.0). Original repository: https://github.com/TomBursch/kitchenowl. Copyright remains with the original contributors. The original licence is retained in LICENSE.txt; inspected original reference files are retained under source/ with their original paths.

source.mjs ports ShoppinglistSorting's case-insensitive alphabetical comparator and SliverShopinglistItemView's category iteration, omission of empty categories and uncategorized-last behavior. The category, item, description and shopping-list models are adapted in core.mjs. The interface retains the original green selected item cards, title/description stacking, light recent-item cards, list tabs, search and category group headings from the inspected grocery screenshot and SelectableButtonCard/ListTile sources. The original #167946 shade provides readable white text. No source logos, photographs, remote fonts or commercial links appear in the workspace.

Bookify adds per-store aisle ordering, explicit purchased/re-add state, duplicate preservation, strict 300-item/50-aisle/10-store limits, safe multiline paste, atomic IndexedDB snapshots with revision checks, backup preview/replace/undo, plain-text exports and formula-safe CSV. Quantity descriptions are never interpreted as amounts. All operations save locally; this distribution does not provide network sharing. Item aisle assignments are shared across stores, while each store has its own complete category order.

Runtime: index.html, style.css, app.mjs, core.mjs, source.mjs and storage.mjs. Serve this directory using an ordinary HTTP/HTTPS static server; no build step, remote services or third-party runtime packages are required. IndexedDB provides storage. Original reference files are inert. No upstream install scripts, migrations, server or package dependencies were executed.

The complete standalone adaptation is provided under AGPL-3.0. bookify-groceries-source.zip includes every distributed file except itself, including these notices and the original licence. Regenerate with scripts/package-grocery-source.py in the containing repository.
