Specification

Product details and overview

Material

100% Cotton

Color

Blue

Size

Medium

Weight

1.2 lbs

Dimensions

12 x 8 x 4 inches

Brand

ABC Apparel

Care Instructions

Machine wash cold

Origin

Made in USA

Introducing Block Patterns

import { useState } from “react”; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ReferenceLine, ResponsiveContainer } from “recharts”; const NI_RATE = 0.15; const NI_THRESHOLD_WEEK = 5000 / 52; // £5,000/yr secondary threshold, per employee (weekly) const VAT_RATE = 0.20; const n = (v) => parseFloat(v) || 0; const money = (v) => (v < 0 ? "−" : "") + "£" + Math.abs(Math.round(v)).toLocaleString("en-GB"); const money2 = (v) => (v < 0 ? "−" : "") + "£" + Math.abs(v).toLocaleString("en-GB", { minimumFractionDigits: 2, maximumFractionDigits: 2 }); function Field({ label, value, onChange, step = "1", w }) { return (
onChange(e.target.value)} className=”w-full px-3 py-2 text-base border border-gray-300 rounded-md box-border” />
); } function PLRow({ label, value, muted, tag }) { return (
{label} {tag && {tag}} {value}
); } export default function DarkKitchenPL() { const [sales, setSales] = useState(“15.00”); const [comm, setComm] = useState(30); const [foodCost, setFoodCost] = useState(“3.20”); const [packCost, setPackCost] = useState(“0.60”); const [drinkCost, setDrinkCost] = useState(“0.70”); const [unitsDay, setUnitsDay] = useState(“40”); const [days, setDays] = useState(“7”); const [rent, setRent] = useState(“2000”); const [insurance, setInsurance] = useState(“150”); const [otherFixed, setOtherFixed] = useState(“100”); const [gas, setGas] = useState(“200”); const [elec, setElec] = useState(“400”); const [water, setWater] = useState(“80”); const [holidayPct, setHolidayPct] = useState(“12.07”); const [pensionPct, setPensionPct] = useState(“3”); const [employees, setEmployees] = useState([ { rate: “13.50”, hours: “40” }, { rate: “12.50”, hours: “40” }, { rate: “12.50”, hours: “25” }, ]); const addStaff = () => setEmployees([…employees, { rate: “12.50”, hours: “40” }]); const removeStaff = () => setEmployees(employees.slice(0, -1)); const updateEmp = (i, field, val) => { const next = employees.map((e, idx) => (idx === i ? { …e, [field]: val } : e)); setEmployees(next); }; // —- calculations (weekly) —- const daysPerWeek = n(days); const units = n(unitsDay) * daysPerWeek; // orders per week const salesTotal = units * n(sales); const commission = salesTotal * (n(comm) / 100); const cosFood = units * n(foodCost); const cosPack = units * n(packCost); const cosDrink = units * n(drinkCost); const cos = cosFood + cosPack + cosDrink; const grossProfit = salesTotal – commission – cos; // overheads entered as monthly bills -> weekly share (× 12 ÷ 52) const M2W = 12 / 52; const fixed = (n(rent) + n(insurance) + n(otherFixed)) * M2W; const variable = (n(gas) + n(elec) + n(water)) * M2W; const weeklyWages = employees.reduce((sum, e) => sum + n(e.rate) * n(e.hours), 0); const wages = weeklyWages; // weekly const monthlyWagesEquiv = (weeklyWages * 52) / 12; const staffCount = employees.length; const holiday = (n(holidayPct) / 100) * wages; const payrollBase = wages + holiday; const employerNI = NI_RATE * Math.max(0, payrollBase – staffCount * NI_THRESHOLD_WEEK); const pension = (n(pensionPct) / 100) * payrollBase; const staffCost = wages + holiday + employerNI + pension; const netProfit = grossProfit – fixed – variable – staffCost; const perDay = daysPerWeek > 0 ? netProfit / daysPerWeek : 0; const outputVat = salesTotal – salesTotal / (1 + VAT_RATE); const inputVatComm = commission * VAT_RATE; const inputVatPack = cosPack – cosPack / (1 + VAT_RATE); // VAT inside packaging cost const inputVatDrink = cosDrink – cosDrink / (1 + VAT_RATE); // VAT inside drinks cost const inputVat = inputVatComm + inputVatPack + inputVatDrink; const vatOwed = outputVat – inputVat; // —- break-even (annual) —- const vPerOrder = n(sales) * (n(comm) / 100) + n(foodCost) + n(packCost) + n(drinkCost); // variable cost / order const contribution = n(sales) – vPerOrder; // gross profit per order const weeklyFixed = fixed + variable + staffCost; // costs that don’t move with volume const annualFixed = weeklyFixed * 52; const beOrdersYear = contribution > 0 ? annualFixed / contribution : Infinity; const beOrdersDay = contribution > 0 && daysPerWeek > 0 ? beOrdersYear / (daysPerWeek * 52) : Infinity; const xMax = Math.max(isFinite(beOrdersDay) ? beOrdersDay * 1.6 : 0, n(unitsDay) * 1.6, 10); const chartData = []; const STEPS = 24; for (let i = 0; i <= STEPS; i++) { const od = (xMax / STEPS) * i; const oy = od * daysPerWeek * 52; chartData.push({ orders: Math.round(od * 10) / 10, Revenue: Math.round(n(sales) * oy), Cost: Math.round(annualFixed + vPerOrder * oy), }); } const kFmt = (v) => “£” + Math.round(v / 1000) + “k”; const pct = (part) => (salesTotal > 0 ? “(” + ((part / salesTotal) * 100).toFixed(0) + “%)” : “”); const npClass = netProfit < 0 ? "text-red-600" : "text-green-700"; return (

Dark Kitchen — Monthly P&L

Live figures. Wages, NI, pension & holiday cover are worked out for you.

Net profit / wk
{money(netProfit)} {salesTotal > 0 ? “(” + ((netProfit / salesTotal) * 100).toFixed(1) + “%)” : “”}
VAT owed / wk
{money(vatOwed)}
{/* PER ORDER */}
Per order
{comm}%
setComm(e.target.value)} className=”flex-1 accent-orange-600″ /> setComm(e.target.value)} className=”w-16 px-2 py-2 text-center border border-gray-300 rounded-md” />
{/* VOLUME */}
Volume
{/* FIXED */}
Fixed expenses (monthly)
{/* VARIABLE */}
Variable expenses (monthly)
{/* STAFF */}
Staff (monthly)
{staffCount}
£ / hour hours / week
{employees.map((emp, i) => (
Staff {i + 1} updateEmp(i, “rate”, e.target.value)} className=”flex-1 px-2 py-2 text-[15px] border border-gray-300 rounded-md” /> updateEmp(i, “hours”, e.target.value)} className=”flex-1 px-2 py-2 text-[15px] border border-gray-300 rounded-md” />
))}
Gross wages (rate × hours) {money(weeklyWages)} /week
Monthly equivalent (× 52 ÷ 12) {money(monthlyWagesEquiv)} /mo
Total staff cost / week{money(staffCost)}
Wages{money(wages)}
Holiday cover{money2(holiday)}
Employer NI @ 15%{money2(employerNI)}
Employer pension{money2(pension)}
{/* RESULTS */}

Weekly P&L

Cost of sales{money(-cos)}
Food (no VAT){money(cosFood)}
Packaging (inc VAT){money(cosPack)}
Drinks (inc VAT){money(cosDrink)}
Gross profit {pct(grossProfit)} {money(grossProfit)}
Net profit {salesTotal > 0 ? “(” + ((netProfit / salesTotal) * 100).toFixed(1) + “%)” : “”} {money(netProfit)}
≈ per day{money2(perDay)}

All figures weekly. Rent, insurance & utilities are entered as monthly bills and shown here as their weekly share (× 12 ÷ 52). Employer NI = 15% on payroll above £{Math.round(NI_THRESHOLD_WEEK)}/week per employee (applied to wages + holiday cover). Eligible employers can offset up to £10,500/yr via the Employment Allowance. Holiday cover = statutory 5.6 weeks’ leave (12.07% of wages). Pension = 3% (statutory min is 3% of the £6,240–£50,270 band).

{/* VAT */}

VAT owed to HMRC (20%, weekly)

Input VAT — commission{money2(-inputVatComm)}
Input VAT — packaging{money2(-inputVatPack)}
Input VAT — drinks{money2(-inputVatDrink)}
Net VAT owed{money(vatOwed)}

Output VAT assumes VAT-registered, hot food standard-rated, sale price includes 20% VAT. Food COGS is zero-rated (no reclaim); packaging and drinks are treated as VAT-inclusive, so the 20% within them is reclaimed, along with VAT the platform adds on commission. P&L lines are shown VAT-inclusive; this block is the HMRC reconciliation.

{/* BREAK-EVEN CHART */}

Break-even (yearly)

{isFinite(beOrdersDay) ? “You break even at about ” + Math.ceil(beOrdersDay) + ” orders/day (” + Math.ceil(beOrdersDay * daysPerWeek) + “/week). Below the crossover you’re loss-making; above it you profit.” : “At this price, each order loses money before you sell it — the lines never cross. Raise the price, or cut commission / COGS.”}

[“£” + value.toLocaleString(“en-GB”), name + “/yr”]} labelFormatter={(l) => l + ” orders/day”} /> {isFinite(beOrdersDay) && ( )}
— Revenue — Total cost
); }

Key notes

  • Simplify content creation and ensure design consistency.
  • Streamlines the design process and saves time.
  • Pre-arranged collections of blocks.

Moreover, the WordPress community and theme developers are actively contributing to a growing library of block patterns, making it easier for users to find a pattern that suits their needs. Whether you`re building a landing page, a photo gallery, or a complex layout, there`s likely a block pattern ready to use.

This democratizes design for non-technical users while offering developers a way to extend WordPress functionality and provide more options to their clients.

Innovative Creative Solutions

Discover Our Unique Approach

At our agency, we blend creativity with strategy to deliver exceptional results. Our team is dedicated to understanding your needs and crafting tailored solutions that resonate with your audience. Join us on a journey of innovation and success.