The rainbow fruit skewer table from the pin, with a shopping list that scales for 10, 20, 30 or 50 guests, then eleven more spreads: snack cups, cracker stacks, roll-ups, a first birthday table, a budget table and one for a crowd.
- 12 spreads, one method
- Shopping list for 20, 30 or 50
- First birthday and budget tables
- Nut-free and halal

The table from the pin: rainbow fruit skewers on a wooden board, cheddar cubes, pretzel twists, candy cups and cupcakes on red gingham.
A kids grazing table is the easiest birthday food there is: no plates to fill, nothing to cut, and children help themselves. The skill is in the quantities and the layout. The featured table below comes with a shopping list that scales from 10 guests to 50, and the eleven ideas after it cover every kind of party.
In this post:
- Why a grazing table works for kids
- The rainbow skewer table, for 10 to 50 guests
- Five rules for a table that looks like the pin
- How much food per guest
- Where everything goes
- Six themes for the same table
- 11 more spreads: savory, sweet and every kind of party
- Budget swaps, little-kid safety and 14 FAQs
Why a Grazing Table Works for a Kids Birthday
Children serve themselves
Bite-size food at their height, in colors they recognize. Nothing needs a knife, a plate or an adult to hand it out, so the party runs while the grown-ups talk.
One shopping list, any guest count
The card below scales from 10 guests to 50, and the how-much table under it gives per-guest amounts, so nothing runs out and little goes home.
Most of it is made the day before
Cheese cubed, roll-ups rolled, dips portioned, cupcakes frosted. Only the skewers are threaded the morning of, and they keep four hours in the fridge.
Twelve tables, one method
Rainbow rows, bowls first, crunch in the gaps. The same steps build a first birthday table, a budget one or a spread for 50; only the food changes.
The Rainbow Fruit Skewer Grazing Table: Shopping List and Setup
Number 1 of 12, and the table on the pin. The card is set for 20 guests; tap 10, 30 or 50 and every quantity changes.
Rainbow Fruit Skewer Grazing Table
The table from the pin: rainbow fruit skewers on a wooden board, cheddar cubes, rolled turkey bites, crackers, pretzels, candy cups and cupcakes. Tap a guest count and the shopping list scales; print the card and take it to the store.
<p class="kg-rc-lbl">How many guests?</p>
<div class="kg-tabs">
<label for="kgsA">10</label>
<label for="kgsB">20</label>
<label for="kgsC">30</label>
<label for="kgsD">50</label>
</div>
<ul class="kg-meta">
<li><span>Prep</span>1 hour, day before</li>
<li><span>Assemble</span>45 minutes</li>
<li><span>Serves</span><b class="svA">10 guests</b><b class="svB">20 guests</b><b class="svC">30 guests</b><b class="svD">50 guests</b></li>
<li><span>Table</span><b class="svA">3-ft board or tray</b><b class="svB">4- to 5-ft table</b><b class="svC">6-ft table</b><b class="svD">two 6-ft tables</b></li>
</ul>
Ingredients
- 15304575 Rainbow skewers: 6-inch blunt bamboo skewers or party picks
- ¾ lb (15)1½ lb (30)2¼ lb (45)3¾ lb (75) strawberries, hulled
- 24610 mandarins, segmented (or cantaloupe chunks)
- 1½ cups3 cups4½ cups7½ cups pineapple, 1-inch chunks
- ½ lb1 lb1½ lb2½ lb seedless green and red grapes
- ½ cup1 cup1½ cups2½ cups blueberries
- 8 oz1 lb1½ lb2½ lb The board: cheddar or colby jack, ¾-inch cubes
- 6 oz12 oz18 oz30 oz halal turkey or chicken deli slices
- 2 oz4 oz6 oz10 oz cream cheese, softened (for the roll-ups)
- 24610 mini cucumbers (sticks for the roll-ups, rounds for the board)
- ½ lb1 lb1½ lb2½ lb baby carrots
- 8 oz1 lb1½ lb2½ lb round butter crackers
- 6 oz12 oz18 oz30 oz mini pretzel twists
- ¾ cup1½ cups2¼ cups3¾ cups ranch or Greek yogurt dip
- 6 oz12 oz18 oz30 oz Sweets: candy-coated chocolates
- 4 oz8 oz12 oz20 oz halal-gelatin or pectin gummy bears
- 12243660 cupcakes (or the birthday cake)
Skewers: blunt-ended bamboo or paper party picks; for under-5s, serve the same fruit in cups. Under-4s: quarter grapes lengthwise and halve blueberries. Deli slices: halal turkey or chicken; check the label. Gummies: halal gelatin or pectin.
Instructions
- Prep the day before Wash the fruit and dry it on towels. Cube the cheese and cut the pineapple. For the roll-ups, spread each deli slice with cream cheese, roll it around a cucumber stick, wrap tight and chill. Portion the dips and fill the candy cups.
- Thread the skewers The morning of, up to 4 hours ahead: strawberry through the hull end, mandarin segment, pineapple, green grape, three blueberries, red grape. Lay them on a tray, cover with a damp paper towel and chill.
- Cover the table Red gingham or kraft paper over a folding table, the largest wooden board in the middle, a cake stand at one back corner for the cupcakes and an upturned bowl under a tray for height.
- Bowls first Set the dips, candy cups and pretzel bowls across the board before any food goes down, spaced so every part of the table has one.
- Lay the skewers Line them diagonally along the front of the board in rainbow order, all pointing the same way. They are the centerpiece, and they sit at kid height.
- Fill the board Halve the roll-ups and stand them cut side up beside the cheese. Run the cheese cubes in a curve, fan the crackers, and put the carrots and cucumber rounds next to the ranch.
- Close the gaps Push pretzels and crackers into every gap until no board shows. Cupcakes go on the stand at the back, candy cups beside them.
- Serve and refill Put it out 15 minutes before guests arrive, with half the skewers and roll-ups held back in the fridge. Refill at the one-hour mark; cold food goes back in after 2 hours.
Download the Recipe Card (PNG) →
Five Rules for a Kids Grazing Table That Looks Like the Pin

Up close: strawberry, mandarin, pineapple, green grape, blueberries and red grape, in the same order on every skewer.
1
Rainbow order does the decorating
Red, orange, yellow, green, blue, purple, on the skewers or in rows. Color in order looks planned; the same food heaped at random looks like leftovers.
2
Bowls first, then the board, then the gaps
Place every bowl before any food goes down, then the big items, then crackers and pretzels pushed into each gap so no board shows.
3
Kid height at the front, sweets at the back
Skewers, cheese and roll-ups along the front edge where small hands reach. Cupcakes and candy at the back or on a stand, so the savory goes first.
4
Nothing to cut, nothing to build
Every item is one or two bites and picks up with fingers. No knives on the table, no cheese wedges, no whole fruit.
5
Two hours out, then refill
Put out half and keep the rest chilled on trays. After two hours (one hour above 90°F) cold food goes back in and the refill trays come out.
How Much Food for a Kids Grazing Table: 10, 20, 30 or 50 Guests
The same amounts as the card, side by side:
| Guests | Table | Fruit skewers | Roll-up bites | Cheese | Crackers + pretzels | Cupcakes |
|---|---|---|---|---|---|---|
| Guests10 | Table3-ft board or tray | Fruit skewers15 | Roll-up bites24 | Cheese8 oz | Crackers + pretzelsabout 1 lb | Cupcakes12 |
| Guests20 | Table4- to 5-ft table | Fruit skewers30 | Roll-up bites48 | Cheese1 lb | Crackers + pretzels1¾ lb | Cupcakes24 |
| Guests30 | Table6-ft table | Fruit skewers45 | Roll-up bites72 | Cheese1½ lb | Crackers + pretzels2½ lb | Cupcakes36 |
| Guests50 | TableTwo 6-ft tables | Fruit skewers75 | Roll-up bites120 | Cheese2½ lb | Crackers + pretzels4½ lb | Cupcakes60 |
| GuestsPer guest | Table— | Fruit skewers1½ | Roll-up bites2 to 3 | Cheeseabout ¾ oz | Crackers + pretzelsabout 1½ oz | Cupcakes1, plus spares |
These amounts are for a party between meals. If the party runs over lunch, add one hearty item: pinwheels, shape-cut sandwiches or mini pizzas (numbers 4 to 6), about three pieces a child.
How to Lay Out a Kids Grazing Table

Halfway there: the bowls placed first, the skewers in rows, and the crackers and pretzels still to fill the gaps.
Think of it as a line, not a pile. Guests start at one end and leave at the other:
| Zone | What goes there | Why |
|---|---|---|
| ZoneFront edge | What goes thereFruit skewers, cheese cubes, roll-up bites | WhyKid height; the fresh food is reached first |
| ZoneMiddle | What goes thereCrackers, pretzels, carrots and cucumber around the dips | WhyCrunch fills the gaps and frames the bowls |
| ZoneStart of the line | What goes thereSnack cups or small plates, napkins, wipes | WhyGuests pick up a cup and move along |
| ZoneBack, or on a stand | What goes thereCupcakes and candy cups | WhySeen from across the room, reached last |
| ZoneFar end | What goes thereDrinks and the birthday cake | WhyKeeps spills away from the board |
| ZoneThe fridge | What goes thereHalf the skewers and roll-ups on trays | WhyThe refill at the one-hour mark |
Six Themes for the Same Table
The layout stays the same; the colors, cutters and cloth change. Tap one:Rainbow (as written)DinosaurUnicornUnder the seaSports dayTea party
Rainbow Birthday
The table above: rainbow skewers, red gingham, sky-blue bowls and balloons in the same colors. It suits any age, and any child who cannot pick a theme.
Dinosaur Dig
Kraft paper, green grapes, kiwi, broccoli “trees” and cucumber, chocolate pudding cups under cookie-crumb “dirt” with a toy dinosaur pushed in, pretzel-stick bones and dinosaur-cut sandwiches.
Pastel Unicorn
Pastels instead of the rainbow: strawberries, pineapple, green grapes and blueberries with a pink strawberry-yogurt dip, white-chocolate pretzels in pastel sprinkles, star-cut cheese and cupcakes swirled pink, lilac and mint.
Under the Sea
A blue cloth, blueberries and blue candy in bowls, fish-shaped crackers in a “school”, cucumber ribbons as seaweed, mandarin segments as tiny fish and cupcakes with blue frosting waves.
Sports Day
A green cloth marked like a field, popcorn, pretzels and cheese in team-color cups, round crackers as balls, sandwiches cut into rectangles and cupcakes topped with candy balls.
Tea Party
Mismatched saucers instead of boards, crustless finger sandwiches, strawberries, mini scones with jam, heart-cut cheese and juice poured from a teapot. The calmest of the six, and the best for under-sevens.
Savory Kids Grazing Table Ideas
Five spreads built around crackers, cheese and roll-ups. Numbers 2 to 6:
2
Snack Cup Station Germ-friendly
Clear cups filled the morning of, so every child takes their own: ranch or hummus in the bottom with carrot, cucumber and pepper sticks standing in it, fruit cups, pretzel-and-cheese cups and popcorn cups for the big kids. A name sticker on each, and nothing gets double-dipped.
3
Build-Your-Own Cracker Stacks Lunch-friendly
Round crackers, cheddar and colby slices cut into circles with a cookie cutter, halal turkey circles, cucumber rounds and cherry tomato halves, laid in rows so children stack their own. The homemade version of the boxed cracker kits, for a fraction of the price.
4
Rolled Deli Bites and Pinwheels Make ahead
Halal turkey or chicken slices spread with cream cheese, rolled around a cucumber stick and halved. Pinwheels too: a large tortilla with cream cheese, turkey and spinach, rolled tight, chilled an hour and sliced into eight. Both keep a day, wrapped, in the fridge.
5
Shape-Cut Sandwich Board Lunch-friendly
Soft-bread sandwiches cut with star, heart and dinosaur cookie cutters: cheese, egg salad, chicken salad, and jam with sunflower seed butter as a nut-free sweet one. Stack them by filling with a small label, and save the offcuts for the adults.
6
Mini Pizza Board Warm
English muffin or mini naan halves with tomato sauce and mozzarella, baked at 425°F for 8 to 10 minutes, halved and served warm, with bowls of peppers, sweetcorn, olives and halal beef or chicken pepperoni for a build-your-own second round.
Sweet Spreads: Candy Cups and Cupcakes

The party end of the table: cupcakes on a stand, candy cups in a row and the grazing board in front, with balloons in the same colors.
Numbers 7 and 8, kept at the back of the table:
7
Candy Cup Corner Big kids
Clear cups filled one color each, so the candy makes its own rainbow: candy-coated chocolates, halal or pectin gummy bears, chocolate-covered raisins, sprinkle-dipped pretzels. One small cup per child instead of open bowls, at the back of the table, with hard candy and lollipops kept away from under-4s.
8
Cupcake and Cookie Dessert Board Day before
Cupcakes on a tiered stand in two frosting colors from the theme, beside a board of mini cookies, chocolate-dipped pretzel rods in sprinkles, sprinkle-dipped strawberries and crispy rice treats cut into squares. It can replace the cake or sit beside it.
A Grazing Table for Every Kind of Party
Morning, first birthday, budget, big crowd. Numbers 9 to 12:
9
Pancake Breakfast Board Morning party
For a morning party: silver-dollar pancakes and waffle quarters kept warm in a low oven, berries, banana coins, yogurt cups, a small jug of maple syrup, whipped cream, sprinkles and halal chicken breakfast sausages. Children build their own stacks; the adults get coffee.
10
First Birthday Grazing Table Baby-safe
Two halves. A low tray of soft food for the babies (banana, ripe avocado, steamed carrot and sweet potato sticks, quartered blueberries, puffs, yogurt melts) and the full table for older children and adults, with the smash cake in the middle. Nothing hard, round or sticky on the baby side.
11
Budget DIY Grazing Table Budget
Whole fruit cut at home (clementines, bananas, watermelon, apples in lemon water), block cheese cubed yourself, stovetop popcorn, pretzels, carrots and a yogurt dip, on kraft paper over a folding table. One splurge, berries or cupcakes, in the middle. The swap table below has the rest.
12
The 50-Guest Party Table Big party
Two 6-foot tables end to end with the food set out double-sided, the same layout repeated on each so neither end runs out first. Half the food on the table, half on trays in the fridge, and one adult on refills at the one-hour mark.
Budget Swaps
| Instead of | Use | Why |
|---|---|---|
| Instead ofPre-cut fruit trays | UseWhole fruit cut at home | WhyYou pay a lot for the cutting |
| Instead ofBerries for everything | UseClementines, grapes, bananas, watermelon | WhyBerries as the one splurge in the middle |
| Instead ofPre-sliced cheese | UseBlock cheddar, cubed or cut with a cookie cutter | WhyCheaper, and the shapes look planned |
| Instead ofA deli platter | UsePinwheels: tortillas, cream cheese, a few turkey slices | WhyOne pack of turkey goes much further |
| Instead ofCandy by the bag | UsePopcorn tossed with sprinkles and a little candy | WhyFills cups for very little |
| Instead ofBoards and platters | UseKraft paper on a folding table, parchment under moist food | WhyLooks like the pin, nothing to buy |
| Instead ofBakery cupcakes | UseA home-baked sheet cake cut in squares | WhySame frosting, one pan |
Little-Kid and Allergy Safety
| Watch for | Do this |
|---|---|
| Watch forWhole grapes, cherry tomatoes, blueberries | Do thisQuarter grapes and tomatoes lengthwise and halve blueberries for under-4s |
| Watch forPopcorn, whole nuts, hard candy, lollipops | Do thisLeave them off for under-4s, or keep them at a separate big-kid end |
| Watch forCheese cubes and deli rolls | Do thisThin strips for toddlers instead of cubes and rounds |
| Watch forSkewers | Do thisBlunt ends and an adult nearby; for under-5s, the same fruit in cups |
| Watch forNuts | Do thisKeep the table nut-free, check cracker and chocolate labels, and say so on a small sign |
| Watch forGelatin | Do thisGummies made with halal gelatin or pectin |
| Watch forHeat | Do thisTwo hours out at most, one hour above 90°F; trays over ice outdoors |
Make Ahead: The Timeline
| When | What | Notes |
|---|---|---|
| When2 days ahead | WhatShop; bake the cupcakes and freeze them unfrosted; make the dips | NotesDips in lidded tubs in the fridge |
| WhenThe day before | WhatWash and dry fruit, cube cheese, roll the deli bites and pinwheels, cut pineapple, fill candy cups, frost cupcakes | NotesWrapped tight and chilled |
| WhenMorning of | WhatSegment mandarins, thread skewers (up to 4 hours ahead), fill snack cups | NotesSkewers under a damp paper towel in the fridge |
| When1 hour before | WhatCover the table, set bowls and stands, lay crackers and pretzels | NotesDry food first |
| When15 minutes before | WhatSkewers, cheese, roll-ups and dips go out | NotesHalf out, half on refill trays |
| WhenAt 1 hour | WhatRefill from the fridge and clear empty bowls | NotesCold food back in at 2 hours |
More grazing tables on the site:
- An all-fruit version: the fruit grazing table
- For a party over lunch: a grazing table with sandwiches
- For tighter budgets: cheap grazing table ideas
- Individual portions: grazing cups
- For the first birthday: a sugar-free smash cake
- When 50 is not enough: a grazing table for 100 people
Troubleshooting
| Problem | Likely cause | Fix |
|---|---|---|
| ProblemFruit weeping onto the board | Likely causeWashed fruit not dried, or cut too early | FixDry on towels; thread the morning of |
| ProblemStrawberries split on the skewer | Likely causePushed through the side | FixThread through the hull end, point outward |
| ProblemRoll-ups unrolling | Likely causeCut before chilling | FixWrap tight, chill 1 hour, cut with a sharp knife |
| ProblemSoft crackers | Likely causeNext to wet fruit, or out too long | FixCrackers on the dry side; refill instead of setting all out |
| ProblemBoard looks sparse | Likely causeGaps between items | FixPretzels and crackers into every gap; no board should show |
| ProblemSweets gone first | Likely causeCandy at the front | FixSweets at the back or on a stand, savory along the edge |
| ProblemToo much left over | Likely causePlanned like a meal for a snack-time party | FixUse the per-guest row; refill trays, not a fuller table |
| ProblemMessy after 30 minutes | Likely causeNo cups or plates at the start | FixSnack cups or small plates and wipes at one end |
Nutrition (approximate, per guest)
Calories~420
Protein~12g
Carbs~50g
Fat~20g
One guest’s share of the savory and fruit on the card (1½ skewers, 2 roll-up bites, cheese, crackers, pretzels, carrots and dip), before cupcakes and candy.
Kids Grazing Table: FAQs
What do you put on a kids grazing table?
Bite-size food children can pick up: fruit skewers or cut fruit, cheese cubes, crackers, pretzels, roll-up bites or pinwheels, carrot and cucumber sticks with a dip, and a few sweets such as cupcakes and candy cups. Rainbow colors, nothing that needs cutting, and the sweets at the back. How much food do I need for a kids grazing table for 20?
For a party between meals: about 30 fruit skewers, 48 roll-up bites, 1 lb of cheese, 1¾ lb of crackers and pretzels, 1½ lb of carrots and cucumber with dips, and 24 cupcakes. The card above has the full list; tap 30 or 50 for bigger parties. How much food for a grazing table for 50 guests?
Roughly 75 fruit skewers, 120 roll-up bites, 2½ lb of cheese, 4½ lb of crackers and pretzels and 60 cupcakes, on two 6-foot tables with half held back in the fridge. If the party runs through lunch, add pinwheels or sandwiches at three pieces a child. How do you make a cheap kids grazing table?
Cut whole fruit and block cheese yourself, lean on popcorn, pretzels, carrots, bananas and clementines, make pinwheels instead of buying a deli tray, and lay it all on kraft paper over a folding table. Keep one splurge, berries or cupcakes, in the middle. How far ahead can I make a grazing table?
Most of it the day before: cheese cubed, roll-ups and pinwheels rolled, dips made, cupcakes frosted, candy cups filled. Thread the skewers the morning of, up to four hours ahead, and set up the table in the last hour. How long can a grazing table sit out?
Two hours for cheese, deli bites, dips and cut fruit, or one hour above 90°F, then back into the fridge. Crackers, pretzels, popcorn and candy can stay out. Putting out half and refilling keeps the table full and safe. How do you make a grazing table for a first birthday?
Split it: a low tray of soft, baby-safe food (banana, avocado, steamed carrot and sweet potato sticks, quartered blueberries, puffs) for the babies, and the full table for older children and adults, with the smash cake in the middle. Number 10 above has the list. Are fruit skewers safe for toddlers?
Not on sticks. For under-5s, serve the same fruit in cups, with grapes quartered lengthwise and blueberries halved for under-4s. For older children, use blunt-ended skewers or paper party picks and keep an adult near the table. What is the difference between a grazing table and a charcuterie board?
A charcuterie board is built around cured meats and cheese for adults. A kids grazing table is a whole table of finger food, mostly fruit, cheese, crackers and sweets, with mild deli roll-ups instead of cured meats, set up so children serve themselves. How do I keep the fruit from browning?
Use fruit that does not brown for the skewers: strawberries, grapes, pineapple, mandarins, blueberries, kiwi and melon. Apples and bananas need a quick dip in lemon water or go out last. Dry everything well so the board stays dry. What are nut-free grazing table ideas?
Everything on this list can be nut-free: fruit, cheese, crackers, pretzels, roll-ups, popcorn and cupcakes. Check cracker, chocolate and candy labels for “may contain” warnings, use sunflower seed butter instead of peanut butter, and put a small sign on the table. What theme should a kids grazing table be?
Rainbow is the easiest and suits any age, because the fruit does the decorating. Dinosaur, unicorn, under the sea, sports day and tea party versions are in the theme tabs above; the layout stays the same and only the colors and cutter shapes change. What do you set a grazing table on?
A folding table covered with kraft paper or a gingham cloth, wooden boards and trays on top, and parchment under any moist food. Add height with a cake stand and an upturned bowl under a tray. A 6-foot table holds food for about 30 guests. How do I keep a grazing table cold outdoors?
Set the dips, roll-ups and cheese on trays over ice, keep the table in the shade, put out smaller amounts and refill from a cooler every 30 to 45 minutes. Above 90°F, nothing cold sits out longer than an hour.
Save the pin so the shopping list, the how-much table and all 12 spreads are one tap away.
More Grazing Tables
An all-fruit table, a lunch version, the budget guide, grazing cups, the smash cake and a table for 100.
Fruit Grazing Table
The rainbow without the crackers. See the table → Lunch Party Grazing Table with Sandwiches For a party that runs over lunch. See the table → Budget Cheap Grazing Table Ideas More ways to spend less. See the ideas → Individual Grazing Cups The snack-cup station, in full. See the cups → First Birthday Sugar-Free Smash Cake For the middle of number 10. See the recipe → Big Crowd Grazing Table for 100 People When 50 is not enough. See the plan →
Bowls first, rainbow rows, crunch in the gaps, half held back for the refill. The table looks like the pin and the party runs itself.
Pin this kids grazing table plan for the next birthday.
Save This Grazing Table on Pinterest →
[v(‘–sky’, ‘#f0f6fa’), v(‘–sky-b’, ‘#d2e6ef’), v(‘–sky-d’, ‘#3a6c85’)]
] }; } /* ———- DOM reading ———————————————— */ function txt(el) { if (!el) { return ”; } return (el.textContent || ”).replace(/\s+/g, ‘ ‘).replace(/ /g, ‘ ‘).trim(); } /* Reads only what is actually on screen. The serving-size amounts are hidden with CSS, and different posts use different class names for them (.svA..svD, .sv1..sv4), so visibility is the honest test rather than any class name. */ function visibleText(el, skip) { var out = ”; /* display is the only test. visibility and off-screen positioning are how print-only cards hide themselves, and those nodes are exactly the ones we DO want to read. The root is never tested for the same reason. */ function walk(n, isRoot) { if (n === skip) { return; } if (n.nodeType === 3) { out += n.nodeValue; return; } if (n.nodeType !== 1) { return; } if (!isRoot) { var st; try { st = getComputedStyle(n); } catch (e) { st = null; } if (st && st.display === ‘none’) { return; } } for (var i = 0; lt(i, n.childNodes.length); i++) { walk(n.childNodes[i], false); } } walk(el, true); return out.replace(new RegExp(‘\\s+’, ‘g’), ‘ ‘) .replace(new RegExp(‘\\u00a0’, ‘g’), ‘ ‘).trim(); } function visibleAmount(li) { var amt = li.querySelector(‘.kg-amt’); return amt ? visibleText(amt) : ”; } function ingredientText(li) { return visibleText(li, li.querySelector(‘.kg-amt’)); } /* Fallback for cards that predate the chassis markup: map whatever headings, lists and label/value pairs are actually there. */ function readGeneric(card) { var blocks = [], used = []; var metaBox = card.querySelector(‘[class*=”meta”]’); if (metaBox) { var cells = metaBox.children, chips = []; for (var i = 0; lt(i, cells.length); i++) { var lb = cells[i].querySelector(‘[class*=”lbl”],[class*=”label”]’); var vl = cells[i].querySelector(‘[class*=”val”]’); if (lb && vl) { chips.push({ label: txt(lb), value: visibleText(vl) }); } } if (chips.length) { used.push(metaBox); } var pending = chips; } var nodes = card.querySelectorAll(‘h1,h2,h3,h4,ul,ol,p,div’); var titled = false, subDone = false; for (var n = 0; lt(n, nodes.length); n++) { var el = nodes[n], tag = el.tagName.toLowerCase(); var inMeta = false; for (var u = 0; lt(u, used.length); u++) { if (used[u].contains(el)) { inMeta = true; } } if (inMeta) { continue; } if (tag === ‘h1’ || tag === ‘h2’ || tag === ‘h3’ || tag === ‘h4’) { var ht = txt(el); if (!ht) { continue; } if (!titled) { blocks.push({ t: ‘title’, text: ht }); titled = true; if (pending && pending.length) { blocks.push({ t: ‘chips’, items: pending }); pending = null; } } else { blocks.push({ t: ‘h’, text: ht }); } continue; } if (tag === ‘ul’ || tag === ‘ol’) { if (el.parentNode && (el.parentNode.tagName === ‘LI’)) { continue; } var lis = el.children, items = []; for (var l = 0; lt(l, lis.length); l++) { var s2 = visibleText(lis[l]); if (s2) { items.push(s2); } } if (items.length) { blocks.push({ t: ‘list’, ordered: tag === ‘ol’, items: items }); } continue; } if (tag === ‘div’ || tag === ‘p’) { /* one strapline, and only after the title — anything before it is the card’s own brand line, which the renderer already draws */ if (el.children.length || !titled || subDone) { continue; } var pt = visibleText(el); if (!pt || lt(pt.length, 12) || gt(pt.length, 220)) { continue; } blocks.push({ t: ‘sub’, text: pt }); subDone = true; } } if (pending && pending.length) { /* no heading came first — put the chips in anyway */ blocks.push({ t: ‘chips’, items: pending }); } return blocks; } /* Walks the card and emits a flat block list the renderer understands. */ function readCard(card) { var blocks = []; var head = card.querySelector(‘.kg-rc-head’); var body = card.querySelector(‘.kg-rc-body’); if (!head && !body) { return readGeneric(card); } if (head) { var h3 = head.querySelector(‘h3’); if (h3) { blocks.push({ t: ‘title’, text: txt(h3) }); } var ps = head.querySelectorAll(‘p’); for (var i = 0; lt(i, ps.length); i++) { var s = txt(ps[i]); /* skip the widget’s own instruction line */ if (s && gt(s.length, 24) && s.indexOf(‘?’) !== s.length – 1) { blocks.push({ t: ‘sub’, text: s }); break; } } var meta = head.querySelectorAll(‘.kg-meta li’); if (meta.length) { var chips = []; for (var m = 0; lt(m, meta.length); m++) { var lab = meta[m].querySelector(‘span’); var val = visibleText(meta[m], lab); if (val) { chips.push({ label: txt(lab), value: val }); } } if (chips.length) { blocks.push({ t: ‘chips’, items: chips }); } } } if (!body) { return blocks; } var kids = body.children; for (var n = 0; lt(n, kids.length); n++) { var el = kids[n], tag = el.tagName.toLowerCase(); if (tag === ‘h4’) { blocks.push({ t: ‘h’, text: txt(el) }); continue; } if (el.className && el.className.indexOf && has(el.className, ‘kg-sec-lbl’)) { blocks.push({ t: ‘lbl’, text: txt(el) }); continue; } if (el.className && el.className.indexOf && has(el.className, ‘kg-pc-grid’)) { var cols = el.querySelectorAll(‘.kg-pc-col’), cdata = []; for (var c2 = 0; lt(c2, cols.length); c2++) { var lis = cols[c2].querySelectorAll(‘li’), items = []; for (var l2 = 0; lt(l2, lis.length); l2++) { items.push(txt(lis[l2])); } cdata.push({ head: txt(cols[c2].querySelector(‘h5’)), items: items }); } blocks.push({ t: ‘cols’, cols: cdata }); continue; } if (tag === ‘ul’ && has(el.className, ‘kg-ing’)) { var ing = el.querySelectorAll(‘li’), ilist = []; for (var a = 0; lt(a, ing.length); a++) { ilist.push({ amt: visibleAmount(ing[a]), text: ingredientText(ing[a]) }); } blocks.push({ t: ‘ing’, items: ilist }); continue; } if (tag === ‘ol’ && has(el.className, ‘kg-steps’)) { var st = el.querySelectorAll(‘li’); for (var b = 0; lt(b, st.length); b++) { blocks.push({ t: ‘step’, n: b + 1, head: txt(st[b].querySelector(‘h4’)), text: txt(st[b].querySelector(‘p’)) }); } continue; } if (tag === ‘ol’ || tag === ‘ul’) { var g = el.querySelectorAll(‘li’), glist = []; for (var d = 0; lt(d, g.length); d++) { glist.push(txt(g[d])); } blocks.push({ t: ‘list’, ordered: tag === ‘ol’, items: glist }); continue; } if (tag === ‘p’) { var pt = txt(el); if (pt) { blocks.push({ t: ‘p’, text: pt }); } } } return blocks; } /* ———- drawing primitives —————————————- */ function rr(ctx, x, y, w, h, r) { if (gt(r, w / 2)) { r = w / 2; } if (gt(r, h / 2)) { r = h / 2; } ctx.beginPath(); ctx.moveTo(x + r, y); ctx.arcTo(x + w, y, x + w, y + h, r); ctx.arcTo(x + w, y + h, x, y + h, r); ctx.arcTo(x, y + h, x, y, r); ctx.arcTo(x, y, x + w, y, r); ctx.closePath(); } function wrap(ctx, text, maxw) { var words = String(text).split(‘ ‘), lines = [], cur = ”; for (var i = 0; lt(i, words.length); i++) { var probe = cur ? cur + ‘ ‘ + words[i] : words[i]; if (gt(ctx.measureText(probe).width, maxw) && cur) { lines.push(cur); cur = words[i]; } else { cur = probe; } } if (cur) { lines.push(cur); } return lines; } /* ———- the renderer ———————————————- */ function draw(card, opts, F, pageH, continuous, twoCol) { if (!pageH) { pageH = PH; } var P = pal(document.querySelector(‘.kg-blog’) || document.body); var blocks = readCard(card); var pages = [], ctx = null, y = 0, pageNo = 0; /* M and CW shadow the module-level page margin and content width, so every block below draws into whichever column is current without knowing that columns exist at all. */ var M0 = PAGE_M, FULLW = PAGE_CW, GUT = f(26); var colW = twoCol ? (FULLW – GUT) / 2 : FULLW; var M = M0, CW = FULLW; var col = 0, colTop = 0, inCols = false; function f(n) { return Math.round(n * F * 10) / 10; } var lastY = 0; function stripe(c, x, yy, w, h) { var g = c.createLinearGradient(x, 0, x + w, 0); g.addColorStop(0, P.vanilla); g.addColorStop(0.34, P.line); g.addColorStop(0.68, P.amber); g.addColorStop(1, P.crumb); c.fillStyle = g; c.fillRect(x, yy, w, h); } function footer(c) { c.font = ‘600 11px ‘ + SANS; c.fillStyle = P.cocoa; c.textAlign = ‘left’; if (continuous) { /* one tall image: no page numbers, the domain sits centred at the foot */ c.textAlign = ‘center’; c.font = ‘700 12px ‘ + SANS; c.fillText(opts.site || ‘kitchenguide101.com’, PW / 2, pageH – 32); c.textAlign = ‘left’; return; } c.fillText(opts.site || ‘kitchenguide101.com’, M0, pageH – 34); c.textAlign = ‘right’; c.fillText(‘Page ‘ + pageNo, PW – M0, pageH – 34); c.textAlign = ‘left’; } function newPage() { var cv = document.createElement(‘canvas’); cv.width = PW * S; cv.height = pageH * S; var c = cv.getContext(‘2d’); c.scale(S, S); c.fillStyle = P.cream; c.fillRect(0, 0, PW, pageH); /* card frame */ c.save(); rr(c, PAD, PAD, PW – PAD * 2, pageH – PAD * 2, 22); c.fillStyle = P.white; c.fill(); c.lineWidth = 3; c.strokeStyle = P.amber; c.stroke(); c.clip(); stripe(c, PAD, PAD, PW – PAD * 2, 12); c.restore(); pages.push(cv); ctx = c; pageNo = pages.length; footer(c); y = PAD + 12 + f(34); return c; } function startCols() { inCols = true; colTop = y; setCol(0); } function setCol(i) { col = i; M = M0 + i * (colW + GUT); CW = colW; y = colTop; } function ensure(h) { /* a continuous card is one image: it grows, it never breaks */ if (continuous) { return; } if (!gt(y + h, pageH – FOOT – PAD)) { return; } if (twoCol && inCols && col === 0) { setCol(1); return; } { newPage(); ctx.font = ‘700 ‘ + f(11) + ‘px ‘ + SANS; ctx.fillStyle = P.cocoa; ctx.textAlign = ‘center’; ctx.fillText((opts.title || ‘Recipe’).toUpperCase() + ‘ · CONTINUED’, PW / 2, y); ctx.textAlign = ‘left’; y += f(26); } } newPage(); for (var i = 0; lt(i, blocks.length); i++) { var b = blocks[i]; if (b.t === ‘title’) { ctx.textAlign = ‘center’; ctx.font = ‘700 ‘ + f(12) + ‘px ‘ + SANS; ctx.fillStyle = P.cocoa; ctx.fillText((opts.brand || ‘KITCHEN GUIDE 101’).toUpperCase(), M + CW / 2, y); y += f(30); ctx.font = ‘700 ‘ + f(34) + ‘px ‘ + SERIF; ctx.fillStyle = P.choc; var tl = wrap(ctx, b.text, CW); for (var t1 = 0; lt(t1, tl.length); t1++) { ctx.fillText(tl[t1], M + CW / 2, y); y += f(40); } y += f(6); ctx.textAlign = ‘left’; continue; } if (b.t === ‘sub’) { ctx.textAlign = ‘center’; ctx.font = ‘400 ‘ + f(14) + ‘px ‘ + SANS; ctx.fillStyle = P.ink; var sl = wrap(ctx, b.text, CW – 40); for (var s1 = 0; lt(s1, sl.length); s1++) { ctx.fillText(sl[s1], M + CW / 2, y); y += f(21); } y += f(12); ctx.textAlign = ‘left’; continue; } if (b.t === ‘chips’) { var per = gt(b.items.length, 4) ? 3 : b.items.length; var rows = Math.ceil(b.items.length / per); var gap = f(12), chH = f(52), pitch = f(62); var cwid = (CW – gap * (per – 1)) / per; ensure(rows * pitch + f(10)); for (var ci = 0; lt(ci, b.items.length); ci++) { var row = Math.floor(ci / per), col = ci % per; var inRow = Math.min(per, b.items.length – row * per); /* centre a short final row instead of stretching it */ var rowW = inRow * cwid + (inRow – 1) * gap; var x0 = M + (CW – rowW) / 2; var cx = x0 + col * (cwid + gap); var cy = y + row * pitch; var tint = P.tints[ci % P.tints.length]; rr(ctx, cx, cy, cwid, chH, f(14)); ctx.fillStyle = tint[0]; ctx.fill(); ctx.lineWidth = 2; ctx.strokeStyle = tint[1]; ctx.stroke(); ctx.textAlign = ‘center’; ctx.font = ‘800 ‘ + f(9) + ‘px ‘ + SANS; ctx.fillStyle = tint[2]; ctx.fillText(b.items[ci].label.toUpperCase(), cx + cwid / 2, cy + f(19)); ctx.font = ‘800 ‘ + f(13) + ‘px ‘ + SANS; ctx.fillStyle = P.choc; var vv = b.items[ci].value; while (gt(ctx.measureText(vv).width, cwid – f(14)) && gt(vv.length, 4)) { vv = vv.slice(0, vv.length – 2); } ctx.fillText(vv, cx + cwid / 2, cy + f(38)); ctx.textAlign = ‘left’; } y += rows * pitch + f(10); continue; } if (b.t === ‘h’) { if (twoCol && !inCols) { startCols(); } ensure(f(56)); ctx.textAlign = ‘center’; ctx.font = ‘700 ‘ + f(19) + ‘px ‘ + SERIF; ctx.fillStyle = P.crumb; ctx.fillText(b.text, M + CW / 2, y + f(16)); y += f(28); ctx.strokeStyle = P.line; ctx.lineWidth = 2; ctx.setLineDash([4, 5]); ctx.beginPath(); ctx.moveTo(M, y); ctx.lineTo(M + CW, y); ctx.stroke(); ctx.setLineDash([]); y += f(20); ctx.textAlign = ‘left’; continue; } if (b.t === ‘lbl’) { ensure(f(34)); y += f(8); ctx.font = ‘800 ‘ + f(10) + ‘px ‘ + SANS; ctx.fillStyle = P.cocoa; ctx.fillText(b.text.toUpperCase(), M, y + f(10)); y += f(22); continue; } if (b.t === ‘ing’) { for (var ii = 0; lt(ii, b.items.length); ii++) { var it = b.items[ii]; ctx.font = ‘800 ‘ + f(13) + ‘px ‘ + SANS; var aw = it.amt ? ctx.measureText(it.amt).width + f(8) : 0; ctx.font = ‘400 ‘ + f(13) + ‘px ‘ + SANS; var lines = wrap(ctx, it.text, CW – f(30) – aw); var hgt = Math.max(f(24), lines.length * f(19) + f(8)); ensure(hgt); ctx.strokeStyle = P.amber; ctx.lineWidth = 2.5; rr(ctx, M + 1, y + f(2), f(13), f(13), 4); ctx.stroke(); var tx = M + f(30); if (it.amt) { ctx.font = ‘800 ‘ + f(13) + ‘px ‘ + SANS; ctx.fillStyle = P.cocoa; ctx.fillText(it.amt, tx, y + f(13)); tx += aw; } ctx.font = ‘400 ‘ + f(13) + ‘px ‘ + SANS; ctx.fillStyle = P.ink; for (var li2 = 0; lt(li2, lines.length); li2++) { ctx.fillText(lines[li2], li2 === 0 ? tx : M + f(30), y + f(13) + li2 * f(19)); } y += hgt; if (lt(ii, b.items.length – 1)) { ctx.strokeStyle = P.line; ctx.lineWidth = 1.5; ctx.setLineDash([2, 4]); ctx.beginPath(); ctx.moveTo(M, y – 4); ctx.lineTo(M + CW, y – 4); ctx.stroke(); ctx.setLineDash([]); } } y += f(14); continue; } if (b.t === ‘step’) { ctx.font = ‘700 ‘ + f(15) + ‘px ‘ + SANS; var hl = wrap(ctx, b.head, CW – f(44)); ctx.font = ‘400 ‘ + f(13) + ‘px ‘ + SANS; var bl = wrap(ctx, b.text, CW – f(44)); /* never orphan a step heading: keep it with at least two body lines */ ensure(hl.length * f(21) + Math.min(2, bl.length) * f(19) + f(16)); ctx.fillStyle = P.amber; ctx.beginPath(); ctx.arc(M + f(13), y + f(9), f(13), 0, Math.PI * 2); ctx.fill(); ctx.font = ‘800 ‘ + f(13) + ‘px ‘ + SANS; ctx.fillStyle = ‘#ffffff’; ctx.textAlign = ‘center’; ctx.fillText(String(b.n), M + f(13), y + f(14)); ctx.textAlign = ‘left’; ctx.font = ‘700 ‘ + f(15) + ‘px ‘ + SANS; ctx.fillStyle = P.choc; for (var h1 = 0; lt(h1, hl.length); h1++) { ctx.fillText(hl[h1], M + f(36), y + f(14) + h1 * f(21)); } y += hl.length * f(21) + f(4); ctx.font = ‘400 ‘ + f(13) + ‘px ‘ + SANS; ctx.fillStyle = P.ink; for (var b1 = 0; lt(b1, bl.length); b1++) { ensure(f(19)); ctx.fillText(bl[b1], M + f(36), y + f(12)); y += f(19); } y += f(14); continue; } if (b.t === ‘list’) { for (var g1 = 0; lt(g1, b.items.length); g1++) { ctx.font = ‘400 13px ‘ + SANS; var gl = wrap(ctx, b.items[g1], CW – 26); ensure(gl.length * 19 + 6); ctx.fillStyle = P.amber; if (b.ordered) { ctx.font = ‘800 12px ‘ + SANS; ctx.fillText(String(g1 + 1) + ‘.’, M, y + 12); } else { ctx.beginPath(); ctx.arc(M + 4, y + 8, 3.5, 0, Math.PI * 2); ctx.fill(); } ctx.font = ‘400 13px ‘ + SANS; ctx.fillStyle = P.ink; for (var g2 = 0; lt(g2, gl.length); g2++) { ctx.fillText(gl[g2], M + 22, y + 12 + g2 * 19); } y += gl.length * 19 + 6; } y += 10; continue; } if (b.t === ‘cols’) { var nCol = b.cols.length, cgap = 14; var colw = (CW – cgap * (nCol – 1)) / nCol; var maxItems = 0; for (var q = 0; lt(q, nCol); q++) { maxItems = Math.max(maxItems, b.cols[q].items.length); } var boxh = 44 + maxItems * 18; ensure(boxh + 14); for (var cc = 0; lt(cc, nCol); cc++) { var bx = M + cc * (colw + cgap); rr(ctx, bx, y, colw, boxh, 14); ctx.fillStyle = P.vanilla; ctx.fill(); ctx.lineWidth = 2; ctx.strokeStyle = P.line; ctx.stroke(); ctx.font = ‘800 12px ‘ + SANS; ctx.fillStyle = P.crumb; ctx.fillText(b.cols[cc].head, bx + 12, y + 22); ctx.font = ‘400 11px ‘ + SANS; ctx.fillStyle = P.ink; for (var ic = 0; lt(ic, b.cols[cc].items.length); ic++) { var line = b.cols[cc].items[ic]; while (gt(ctx.measureText(line).width, colw – 32) && gt(line.length, 6)) { line = line.slice(0, line.length – 2); } if (line !== b.cols[cc].items[ic]) { line += ‘…’; } ctx.fillStyle = P.amber; ctx.beginPath(); ctx.arc(bx + 14, y + 38 + ic * 18 – 4, 2.5, 0, Math.PI * 2); ctx.fill(); ctx.fillStyle = P.ink; ctx.fillText(line, bx + 22, y + 38 + ic * 18); } } y += boxh + 16; continue; } if (b.t === ‘p’) { ctx.font = ‘400 13px ‘ + SANS; var pl = wrap(ctx, b.text, CW); ensure(pl.length * 19 + 8); ctx.fillStyle = P.ink; for (var p1 = 0; lt(p1, pl.length); p1++) { ctx.fillText(pl[p1], M, y + 12); y += 19; } y += 8; } } /* closing line on the last page */ if (!continuous && !twoCol && lt(y, pageH – FOOT – PAD – f(30))) { ctx.textAlign = ‘center’; ctx.font = ‘600 ‘ + f(11) + ‘px ‘ + SANS; ctx.fillStyle = P.cocoa; ctx.fillText(‘Saved from ‘ + (opts.site || ‘kitchenguide101.com’), PW / 2, y + f(20)); ctx.textAlign = ‘left’; } lastY = y; return { pages: pages, lastY: lastY, fill: (lastY – PAD) / (pageH – PAD * 2) }; } /* Auto-fit: a card that spills a few lines onto a near-empty second page looks like a mistake. Try progressively tighter scales and keep the first one that saves a page. The floor is 0.85 — below that the print gets too small to be worth the saved page. */ function render(card, opts) { var steps = [1, 0.95, 0.9, 0.85]; var best = null; for (var i = 0; lt(i, steps.length); i++) { var r = draw(card, opts, steps[i]); if (!best || lt(r.pages.length, best.pages.length)) { best = r; } if (r.pages.length === 1) { return r.pages; } } return best.pages; } /* A4: a real page, two columns, and only shrunk if it genuinely will not fit. Two columns buy roughly twice the content per page, so most recipes land at full size where the single-column version had to squeeze. */ function renderA4(card, opts) { var steps = [1, 0.95, 0.9, 0.85, 0.8, 0.75]; var best = null; for (var i = 0; lt(i, steps.length); i++) { var r = draw(card, opts, steps[i], PH, false, true); if (!best || lt(r.pages.length, best.pages.length)) { best = r; } if (r.pages.length === 1) { best = r; break; } } try { window.__kgCardPages = best.pages.length; } catch (e) {} return best.pages; } /* PNG wants one tall card rather than A4 pages, so measure the content first and then draw onto a canvas cut to exactly that height. */ function renderPNG(card, opts) { var probe = draw(card, opts, 1, 40000, true); var h = Math.ceil(probe.lastY + FOOT + PAD * 0.8); if (lt(h, 620)) { h = 620; } var out = draw(card, opts, 1, h, true); /* only pages[0] is saved, so a second page would mean silently lost content — the harness asserts this stays at 1 */ try { window.__kgCardPages = out.pages.length; } catch (e) {} return out.pages[0]; } window.kgRenderCard = render; window.kgRenderCardPNG = renderPNG; window.kgRenderCardA4 = renderA4; })(); (function(){ function fontsReady(cb){ try{ if(!document.fonts || !document.fonts.load){ cb(); return; } var jobs=[document.fonts.load(‘700 34px “Fredoka”‘), document.fonts.load(‘700 19px “Fredoka”‘), document.fonts.load(‘800 13px “Nunito Sans”‘), document.fonts.load(‘400 13px “Nunito Sans”‘)]; var done=false; function go(){ if(!done){ done=true; cb(); } } if(window.Promise){ Promise.all(jobs).then(go)[‘catch’](go); } setTimeout(go,1600); }catch(e){ cb(); } } function saveCanvas(cv,name,after){ function viaURL(){ try{ var a=document.createElement(‘a’); a.href=cv.toDataURL(‘image/png’); a.download=name; document.body.appendChild(a); a.click(); document.body.removeChild(a); }catch(e){} after(); } try{ if(!cv.toBlob){ viaURL(); return; } cv.toBlob(function(blob){ try{ if(!blob){ viaURL(); return; } var url=URL.createObjectURL(blob); var a=document.createElement(‘a’); a.href=url; a.download=name; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(function(){ try{ URL.revokeObjectURL(url); }catch(e2){} },4000); }catch(e3){} after(); },’image/png’); }catch(e4){ viaURL(); } } function rescueSticky(){ try{ var nav=document.querySelector(‘.kg-blog .kg-nav’); if(!nav){return;} var el=nav.parentNode; while(el && el.nodeType===1 && el!==document.body){ var st=window.getComputedStyle(el); if(st.overflowX!==’visible’ && st.overflowX!==’clip’){ el.style.setProperty(‘overflow-y’,’visible’,’important’); el.style.setProperty(‘overflow-x’,’clip’,’important’); } if(st.transform && st.transform!==’none’){ el.style.setProperty(‘transform’,’none’,’important’); } if(st.filter && st.filter!==’none’){ el.style.setProperty(‘filter’,’none’,’important’); } if(st.contain && st.contain!==’none’){ el.style.setProperty(‘contain’,’none’,’important’); } el=el.parentNode; } }catch(e){} } function init(){ try{ rescueSticky(); }catch(e0){} try{ var btn=document.getElementById(‘kg-dl-btn’); var card=document.getElementById(‘kg-rc’)||document.getElementById(‘dlCard’); if(!btn||!card){return;} btn.addEventListener(‘click’,function(){ var original=btn.innerHTML; try{ btn.innerHTML=’Preparing your card…’; fontsReady(function(){ try{ if(!window.kgRenderCardA4){ /* never fail silently again: say so on the button itself */ btn.innerHTML=’Card tool did not load — please refresh’; setTimeout(function(){ btn.innerHTML=original; },3500); return; } /* The card is DRAWN, not photographed, so nothing here depends on scroll position, ancestor CSS, custom-property support or any external library. */ var pages=window.kgRenderCardA4(card,{ brand:’KITCHEN GUIDE 101′, site:’kitchenguide101.com’, title:’Rainbow Fruit Skewer Grazing Table’ }); var i=0; function next(){ if(i===pages.length){ btn.innerHTML=original; return; } var name=’kids-grazing-table-shopping-list.png’; if(pages.length!==1){ name=name.replace(‘.png’,’-‘+(i+1)+’.png’); } var cv=pages[i]; i++; saveCanvas(cv,name,function(){ setTimeout(next,400); }); } next(); }catch(e2){ btn.innerHTML=’Card could not be made — please refresh’; setTimeout(function(){ btn.innerHTML=original; },3500); } }); }catch(e3){ btn.innerHTML=original; } }); }catch(e4){} } try{ if(document.readyState===’loading’){ document.addEventListener(‘DOMContentLoaded’,init); } else{ init(); } }catch(e5){} })();
12 Kids Grazing Table Ideas: Fun Birthday Party Spreads
The rainbow fruit skewer table from the pin, with a shopping list that scales for 10, 20, 30 or 50 guests, then eleven more spreads: snack cups, cracker stacks, roll-ups, a first birthday table, a budget table and one for a crowd.
- 12 spreads, one method
- Shopping list for 20, 30 or 50
- First birthday and budget tables
- Nut-free and halal

The table from the pin: rainbow fruit skewers on a wooden board, cheddar cubes, pretzel twists, candy cups and cupcakes on red gingham.
A kids grazing table is the easiest birthday food there is: no plates to fill, nothing to cut, and children help themselves. The skill is in the quantities and the layout. The featured table below comes with a shopping list that scales from 10 guests to 50, and the eleven ideas after it cover every kind of party.
In this post:
- Why a grazing table works for kids
- The rainbow skewer table, for 10 to 50 guests
- Five rules for a table that looks like the pin
- How much food per guest
- Where everything goes
- Six themes for the same table
- 11 more spreads: savory, sweet and every kind of party
- Budget swaps, little-kid safety and 14 FAQs
Why a Grazing Table Works for a Kids Birthday
Children serve themselves
Bite-size food at their height, in colors they recognize. Nothing needs a knife, a plate or an adult to hand it out, so the party runs while the grown-ups talk.
One shopping list, any guest count
The card below scales from 10 guests to 50, and the how-much table under it gives per-guest amounts, so nothing runs out and little goes home.
Most of it is made the day before
Cheese cubed, roll-ups rolled, dips portioned, cupcakes frosted. Only the skewers are threaded the morning of, and they keep four hours in the fridge.
Twelve tables, one method
Rainbow rows, bowls first, crunch in the gaps. The same steps build a first birthday table, a budget one or a spread for 50; only the food changes.
The Rainbow Fruit Skewer Grazing Table: Shopping List and Setup
Number 1 of 12, and the table on the pin. The card is set for 20 guests; tap 10, 30 or 50 and every quantity changes.
Rainbow Fruit Skewer Grazing Table
The table from the pin: rainbow fruit skewers on a wooden board, cheddar cubes, rolled turkey bites, crackers, pretzels, candy cups and cupcakes. Tap a guest count and the shopping list scales; print the card and take it to the store.
How many guests?
Ingredients
- 15304575 Rainbow skewers: 6-inch blunt bamboo skewers or party picks
- ¾ lb (15)1½ lb (30)2¼ lb (45)3¾ lb (75) strawberries, hulled
- 24610 mandarins, segmented (or cantaloupe chunks)
- 1½ cups3 cups4½ cups7½ cups pineapple, 1-inch chunks
- ½ lb1 lb1½ lb2½ lb seedless green and red grapes
- ½ cup1 cup1½ cups2½ cups blueberries
- 8 oz1 lb1½ lb2½ lb The board: cheddar or colby jack, ¾-inch cubes
- 6 oz12 oz18 oz30 oz halal turkey or chicken deli slices
- 2 oz4 oz6 oz10 oz cream cheese, softened (for the roll-ups)
- 24610 mini cucumbers (sticks for the roll-ups, rounds for the board)
- ½ lb1 lb1½ lb2½ lb baby carrots
- 8 oz1 lb1½ lb2½ lb round butter crackers
- 6 oz12 oz18 oz30 oz mini pretzel twists
- ¾ cup1½ cups2¼ cups3¾ cups ranch or Greek yogurt dip
- 6 oz12 oz18 oz30 oz Sweets: candy-coated chocolates
- 4 oz8 oz12 oz20 oz halal-gelatin or pectin gummy bears
- 12243660 cupcakes (or the birthday cake)
Skewers: blunt-ended bamboo or paper party picks; for under-5s, serve the same fruit in cups. Under-4s: quarter grapes lengthwise and halve blueberries. Deli slices: halal turkey or chicken; check the label. Gummies: halal gelatin or pectin.
Instructions
Prep the day before
Wash the fruit and dry it on towels. Cube the cheese and cut the pineapple. For the roll-ups, spread each deli slice with cream cheese, roll it around a cucumber stick, wrap tight and chill. Portion the dips and fill the candy cups.
Thread the skewers
The morning of, up to 4 hours ahead: strawberry through the hull end, mandarin segment, pineapple, green grape, three blueberries, red grape. Lay them on a tray, cover with a damp paper towel and chill.
Cover the table
Red gingham or kraft paper over a folding table, the largest wooden board in the middle, a cake stand at one back corner for the cupcakes and an upturned bowl under a tray for height.
Bowls first
Set the dips, candy cups and pretzel bowls across the board before any food goes down, spaced so every part of the table has one.
Lay the skewers
Line them diagonally along the front of the board in rainbow order, all pointing the same way. They are the centerpiece, and they sit at kid height.
Fill the board
Halve the roll-ups and stand them cut side up beside the cheese. Run the cheese cubes in a curve, fan the crackers, and put the carrots and cucumber rounds next to the ranch.
Close the gaps
Push pretzels and crackers into every gap until no board shows. Cupcakes go on the stand at the back, candy cups beside them.
Serve and refill
Put it out 15 minutes before guests arrive, with half the skewers and roll-ups held back in the fridge. Refill at the one-hour mark; cold food goes back in after 2 hours.
Five Rules for a Kids Grazing Table That Looks Like the Pin

Up close: strawberry, mandarin, pineapple, green grape, blueberries and red grape, in the same order on every skewer.
Rainbow order does the decorating
Red, orange, yellow, green, blue, purple, on the skewers or in rows. Color in order looks planned; the same food heaped at random looks like leftovers.
Bowls first, then the board, then the gaps
Place every bowl before any food goes down, then the big items, then crackers and pretzels pushed into each gap so no board shows.
Kid height at the front, sweets at the back
Skewers, cheese and roll-ups along the front edge where small hands reach. Cupcakes and candy at the back or on a stand, so the savory goes first.
Nothing to cut, nothing to build
Every item is one or two bites and picks up with fingers. No knives on the table, no cheese wedges, no whole fruit.
Two hours out, then refill
Put out half and keep the rest chilled on trays. After two hours (one hour above 90°F) cold food goes back in and the refill trays come out.
How Much Food for a Kids Grazing Table: 10, 20, 30 or 50 Guests
The same amounts as the card, side by side:
| Guests | Table | Fruit skewers | Roll-up bites | Cheese | Crackers + pretzels | Cupcakes |
|---|---|---|---|---|---|---|
| Guests10 | Table3-ft board or tray | Fruit skewers15 | Roll-up bites24 | Cheese8 oz | Crackers + pretzelsabout 1 lb | Cupcakes12 |
| Guests20 | Table4- to 5-ft table | Fruit skewers30 | Roll-up bites48 | Cheese1 lb | Crackers + pretzels1¾ lb | Cupcakes24 |
| Guests30 | Table6-ft table | Fruit skewers45 | Roll-up bites72 | Cheese1½ lb | Crackers + pretzels2½ lb | Cupcakes36 |
| Guests50 | TableTwo 6-ft tables | Fruit skewers75 | Roll-up bites120 | Cheese2½ lb | Crackers + pretzels4½ lb | Cupcakes60 |
| GuestsPer guest | Table— | Fruit skewers1½ | Roll-up bites2 to 3 | Cheeseabout ¾ oz | Crackers + pretzelsabout 1½ oz | Cupcakes1, plus spares |
These amounts are for a party between meals. If the party runs over lunch, add one hearty item: pinwheels, shape-cut sandwiches or mini pizzas (numbers 4 to 6), about three pieces a child.
How to Lay Out a Kids Grazing Table

Halfway there: the bowls placed first, the skewers in rows, and the crackers and pretzels still to fill the gaps.
Think of it as a line, not a pile. Guests start at one end and leave at the other:
| Zone | What goes there | Why |
|---|---|---|
| ZoneFront edge | What goes thereFruit skewers, cheese cubes, roll-up bites | WhyKid height; the fresh food is reached first |
| ZoneMiddle | What goes thereCrackers, pretzels, carrots and cucumber around the dips | WhyCrunch fills the gaps and frames the bowls |
| ZoneStart of the line | What goes thereSnack cups or small plates, napkins, wipes | WhyGuests pick up a cup and move along |
| ZoneBack, or on a stand | What goes thereCupcakes and candy cups | WhySeen from across the room, reached last |
| ZoneFar end | What goes thereDrinks and the birthday cake | WhyKeeps spills away from the board |
| ZoneThe fridge | What goes thereHalf the skewers and roll-ups on trays | WhyThe refill at the one-hour mark |
Six Themes for the Same Table
The layout stays the same; the colors, cutters and cloth change. Tap one:
Rainbow Birthday
The table above: rainbow skewers, red gingham, sky-blue bowls and balloons in the same colors. It suits any age, and any child who cannot pick a theme.
Dinosaur Dig
Kraft paper, green grapes, kiwi, broccoli “trees” and cucumber, chocolate pudding cups under cookie-crumb “dirt” with a toy dinosaur pushed in, pretzel-stick bones and dinosaur-cut sandwiches.
Pastel Unicorn
Pastels instead of the rainbow: strawberries, pineapple, green grapes and blueberries with a pink strawberry-yogurt dip, white-chocolate pretzels in pastel sprinkles, star-cut cheese and cupcakes swirled pink, lilac and mint.
Under the Sea
A blue cloth, blueberries and blue candy in bowls, fish-shaped crackers in a “school”, cucumber ribbons as seaweed, mandarin segments as tiny fish and cupcakes with blue frosting waves.
Sports Day
A green cloth marked like a field, popcorn, pretzels and cheese in team-color cups, round crackers as balls, sandwiches cut into rectangles and cupcakes topped with candy balls.
Tea Party
Mismatched saucers instead of boards, crustless finger sandwiches, strawberries, mini scones with jam, heart-cut cheese and juice poured from a teapot. The calmest of the six, and the best for under-sevens.
Savory Kids Grazing Table Ideas
Five spreads built around crackers, cheese and roll-ups. Numbers 2 to 6:
Snack Cup Station Germ-friendly
Clear cups filled the morning of, so every child takes their own: ranch or hummus in the bottom with carrot, cucumber and pepper sticks standing in it, fruit cups, pretzel-and-cheese cups and popcorn cups for the big kids. A name sticker on each, and nothing gets double-dipped.
Build-Your-Own Cracker Stacks Lunch-friendly
Round crackers, cheddar and colby slices cut into circles with a cookie cutter, halal turkey circles, cucumber rounds and cherry tomato halves, laid in rows so children stack their own. The homemade version of the boxed cracker kits, for a fraction of the price.
Rolled Deli Bites and Pinwheels Make ahead
Halal turkey or chicken slices spread with cream cheese, rolled around a cucumber stick and halved. Pinwheels too: a large tortilla with cream cheese, turkey and spinach, rolled tight, chilled an hour and sliced into eight. Both keep a day, wrapped, in the fridge.
Shape-Cut Sandwich Board Lunch-friendly
Soft-bread sandwiches cut with star, heart and dinosaur cookie cutters: cheese, egg salad, chicken salad, and jam with sunflower seed butter as a nut-free sweet one. Stack them by filling with a small label, and save the offcuts for the adults.
Mini Pizza Board Warm
English muffin or mini naan halves with tomato sauce and mozzarella, baked at 425°F for 8 to 10 minutes, halved and served warm, with bowls of peppers, sweetcorn, olives and halal beef or chicken pepperoni for a build-your-own second round.
Sweet Spreads: Candy Cups and Cupcakes

The party end of the table: cupcakes on a stand, candy cups in a row and the grazing board in front, with balloons in the same colors.
Numbers 7 and 8, kept at the back of the table:
Candy Cup Corner Big kids
Clear cups filled one color each, so the candy makes its own rainbow: candy-coated chocolates, halal or pectin gummy bears, chocolate-covered raisins, sprinkle-dipped pretzels. One small cup per child instead of open bowls, at the back of the table, with hard candy and lollipops kept away from under-4s.
Cupcake and Cookie Dessert Board Day before
Cupcakes on a tiered stand in two frosting colors from the theme, beside a board of mini cookies, chocolate-dipped pretzel rods in sprinkles, sprinkle-dipped strawberries and crispy rice treats cut into squares. It can replace the cake or sit beside it.
A Grazing Table for Every Kind of Party
Morning, first birthday, budget, big crowd. Numbers 9 to 12:
Pancake Breakfast Board Morning party
For a morning party: silver-dollar pancakes and waffle quarters kept warm in a low oven, berries, banana coins, yogurt cups, a small jug of maple syrup, whipped cream, sprinkles and halal chicken breakfast sausages. Children build their own stacks; the adults get coffee.
First Birthday Grazing Table Baby-safe
Two halves. A low tray of soft food for the babies (banana, ripe avocado, steamed carrot and sweet potato sticks, quartered blueberries, puffs, yogurt melts) and the full table for older children and adults, with the smash cake in the middle. Nothing hard, round or sticky on the baby side.
Budget DIY Grazing Table Budget
Whole fruit cut at home (clementines, bananas, watermelon, apples in lemon water), block cheese cubed yourself, stovetop popcorn, pretzels, carrots and a yogurt dip, on kraft paper over a folding table. One splurge, berries or cupcakes, in the middle. The swap table below has the rest.
The 50-Guest Party Table Big party
Two 6-foot tables end to end with the food set out double-sided, the same layout repeated on each so neither end runs out first. Half the food on the table, half on trays in the fridge, and one adult on refills at the one-hour mark.
Budget Swaps
| Instead of | Use | Why |
|---|---|---|
| Instead ofPre-cut fruit trays | UseWhole fruit cut at home | WhyYou pay a lot for the cutting |
| Instead ofBerries for everything | UseClementines, grapes, bananas, watermelon | WhyBerries as the one splurge in the middle |
| Instead ofPre-sliced cheese | UseBlock cheddar, cubed or cut with a cookie cutter | WhyCheaper, and the shapes look planned |
| Instead ofA deli platter | UsePinwheels: tortillas, cream cheese, a few turkey slices | WhyOne pack of turkey goes much further |
| Instead ofCandy by the bag | UsePopcorn tossed with sprinkles and a little candy | WhyFills cups for very little |
| Instead ofBoards and platters | UseKraft paper on a folding table, parchment under moist food | WhyLooks like the pin, nothing to buy |
| Instead ofBakery cupcakes | UseA home-baked sheet cake cut in squares | WhySame frosting, one pan |
Little-Kid and Allergy Safety
| Watch for | Do this |
|---|---|
| Watch forWhole grapes, cherry tomatoes, blueberries | Do thisQuarter grapes and tomatoes lengthwise and halve blueberries for under-4s |
| Watch forPopcorn, whole nuts, hard candy, lollipops | Do thisLeave them off for under-4s, or keep them at a separate big-kid end |
| Watch forCheese cubes and deli rolls | Do thisThin strips for toddlers instead of cubes and rounds |
| Watch forSkewers | Do thisBlunt ends and an adult nearby; for under-5s, the same fruit in cups |
| Watch forNuts | Do thisKeep the table nut-free, check cracker and chocolate labels, and say so on a small sign |
| Watch forGelatin | Do thisGummies made with halal gelatin or pectin |
| Watch forHeat | Do thisTwo hours out at most, one hour above 90°F; trays over ice outdoors |
Make Ahead: The Timeline
| When | What | Notes |
|---|---|---|
| When2 days ahead | WhatShop; bake the cupcakes and freeze them unfrosted; make the dips | NotesDips in lidded tubs in the fridge |
| WhenThe day before | WhatWash and dry fruit, cube cheese, roll the deli bites and pinwheels, cut pineapple, fill candy cups, frost cupcakes | NotesWrapped tight and chilled |
| WhenMorning of | WhatSegment mandarins, thread skewers (up to 4 hours ahead), fill snack cups | NotesSkewers under a damp paper towel in the fridge |
| When1 hour before | WhatCover the table, set bowls and stands, lay crackers and pretzels | NotesDry food first |
| When15 minutes before | WhatSkewers, cheese, roll-ups and dips go out | NotesHalf out, half on refill trays |
| WhenAt 1 hour | WhatRefill from the fridge and clear empty bowls | NotesCold food back in at 2 hours |
More grazing tables on the site:
- An all-fruit version: the fruit grazing table
- For a party over lunch: a grazing table with sandwiches
- For tighter budgets: cheap grazing table ideas
- Individual portions: grazing cups
- For the first birthday: a sugar-free smash cake
- When 50 is not enough: a grazing table for 100 people
Troubleshooting
| Problem | Likely cause | Fix |
|---|---|---|
| ProblemFruit weeping onto the board | Likely causeWashed fruit not dried, or cut too early | FixDry on towels; thread the morning of |
| ProblemStrawberries split on the skewer | Likely causePushed through the side | FixThread through the hull end, point outward |
| ProblemRoll-ups unrolling | Likely causeCut before chilling | FixWrap tight, chill 1 hour, cut with a sharp knife |
| ProblemSoft crackers | Likely causeNext to wet fruit, or out too long | FixCrackers on the dry side; refill instead of setting all out |
| ProblemBoard looks sparse | Likely causeGaps between items | FixPretzels and crackers into every gap; no board should show |
| ProblemSweets gone first | Likely causeCandy at the front | FixSweets at the back or on a stand, savory along the edge |
| ProblemToo much left over | Likely causePlanned like a meal for a snack-time party | FixUse the per-guest row; refill trays, not a fuller table |
| ProblemMessy after 30 minutes | Likely causeNo cups or plates at the start | FixSnack cups or small plates and wipes at one end |
Nutrition (approximate, per guest)
One guest’s share of the savory and fruit on the card (1½ skewers, 2 roll-up bites, cheese, crackers, pretzels, carrots and dip), before cupcakes and candy.
Kids Grazing Table: FAQs
What do you put on a kids grazing table?
Bite-size food children can pick up: fruit skewers or cut fruit, cheese cubes, crackers, pretzels, roll-up bites or pinwheels, carrot and cucumber sticks with a dip, and a few sweets such as cupcakes and candy cups. Rainbow colors, nothing that needs cutting, and the sweets at the back.
How much food do I need for a kids grazing table for 20?
For a party between meals: about 30 fruit skewers, 48 roll-up bites, 1 lb of cheese, 1¾ lb of crackers and pretzels, 1½ lb of carrots and cucumber with dips, and 24 cupcakes. The card above has the full list; tap 30 or 50 for bigger parties.
How much food for a grazing table for 50 guests?
Roughly 75 fruit skewers, 120 roll-up bites, 2½ lb of cheese, 4½ lb of crackers and pretzels and 60 cupcakes, on two 6-foot tables with half held back in the fridge. If the party runs through lunch, add pinwheels or sandwiches at three pieces a child.
How do you make a cheap kids grazing table?
Cut whole fruit and block cheese yourself, lean on popcorn, pretzels, carrots, bananas and clementines, make pinwheels instead of buying a deli tray, and lay it all on kraft paper over a folding table. Keep one splurge, berries or cupcakes, in the middle.
How far ahead can I make a grazing table?
Most of it the day before: cheese cubed, roll-ups and pinwheels rolled, dips made, cupcakes frosted, candy cups filled. Thread the skewers the morning of, up to four hours ahead, and set up the table in the last hour.
How long can a grazing table sit out?
Two hours for cheese, deli bites, dips and cut fruit, or one hour above 90°F, then back into the fridge. Crackers, pretzels, popcorn and candy can stay out. Putting out half and refilling keeps the table full and safe.
How do you make a grazing table for a first birthday?
Split it: a low tray of soft, baby-safe food (banana, avocado, steamed carrot and sweet potato sticks, quartered blueberries, puffs) for the babies, and the full table for older children and adults, with the smash cake in the middle. Number 10 above has the list.
Are fruit skewers safe for toddlers?
Not on sticks. For under-5s, serve the same fruit in cups, with grapes quartered lengthwise and blueberries halved for under-4s. For older children, use blunt-ended skewers or paper party picks and keep an adult near the table.
What is the difference between a grazing table and a charcuterie board?
A charcuterie board is built around cured meats and cheese for adults. A kids grazing table is a whole table of finger food, mostly fruit, cheese, crackers and sweets, with mild deli roll-ups instead of cured meats, set up so children serve themselves.
How do I keep the fruit from browning?
Use fruit that does not brown for the skewers: strawberries, grapes, pineapple, mandarins, blueberries, kiwi and melon. Apples and bananas need a quick dip in lemon water or go out last. Dry everything well so the board stays dry.
What are nut-free grazing table ideas?
Everything on this list can be nut-free: fruit, cheese, crackers, pretzels, roll-ups, popcorn and cupcakes. Check cracker, chocolate and candy labels for “may contain” warnings, use sunflower seed butter instead of peanut butter, and put a small sign on the table.
What theme should a kids grazing table be?
Rainbow is the easiest and suits any age, because the fruit does the decorating. Dinosaur, unicorn, under the sea, sports day and tea party versions are in the theme tabs above; the layout stays the same and only the colors and cutter shapes change.
What do you set a grazing table on?
A folding table covered with kraft paper or a gingham cloth, wooden boards and trays on top, and parchment under any moist food. Add height with a cake stand and an upturned bowl under a tray. A 6-foot table holds food for about 30 guests.
How do I keep a grazing table cold outdoors?
Set the dips, roll-ups and cheese on trays over ice, keep the table in the shade, put out smaller amounts and refill from a cooler every 30 to 45 minutes. Above 90°F, nothing cold sits out longer than an hour.
Save the pin so the shopping list, the how-much table and all 12 spreads are one tap away.
More Grazing Tables
An all-fruit table, a lunch version, the budget guide, grazing cups, the smash cake and a table for 100.
Fruit Grazing Table
The rainbow without the crackers. See the table → Lunch PartyGrazing Table with Sandwiches
For a party that runs over lunch. See the table → BudgetCheap Grazing Table Ideas
More ways to spend less. See the ideas → IndividualGrazing Cups
The snack-cup station, in full. See the cups → First BirthdaySugar-Free Smash Cake
For the middle of number 10. See the recipe → Big CrowdGrazing Table for 100 People
When 50 is not enough. See the plan →Bowls first, rainbow rows, crunch in the gaps, half held back for the refill. The table looks like the pin and the party runs itself.
Pin this kids grazing table plan for the next birthday.


