{
  "schema_version": "2.0",
  "page_type": "crochet_pattern_article",
  "source_id": null,
  "slug": "african-flower-granny-square-handbag-free-pattern",
  "title": "African Flower Granny Square Handbag – Free Crochet Pattern",
  "meta_description": "Crochet a bold African flower granny square handbag with this free pattern — dramatic black and hot pink cotton blooms, plus strap and lining tips",
  "published_at": "2026-07-10",
  "updated_at": "2026-07-11",
  "author": "Ruby",
  "thumbnail_url": "data/images/african-flower-granny-square-handbag-free-pattern-hero.webp",
  "meta": {
    "title": "African Flower Granny Square Handbag – Free Crochet Pattern",
    "pattern_name": "African Flower Granny Square Handbag – Free Crochet Pattern",
    "difficulty": "Intermediate",
    "time_needed": "10-14 Hours",
    "rating": 4.8,
    "made_count": "2.4K",
    "taxonomy": {
      "category": "Bags & Accessories",
      "skill_level": "Intermediate",
      "yarn_weight": "Lace",
      "tags": [
        "african flower",
        "granny square",
        "crochet handbag",
        "free crochet pattern",
        "crochet bag",
        "cotton yarn",
        "summer accessories",
        "flower motif",
        "crochet purse",
        "colorwork",
        "handmade gift",
        "intermediate crochet"
      ]
    }
  },
  "cards": [
    {
      "order": 1,
      "card_type": "hero",
      "code": "hero",
      "title": "African Flower Granny Square Handbag – Free Crochet Pattern",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "hero-info-1",
          "label": "Intermediate Level",
          "value": "Comfortable with granny squares, color changes, and simple seaming",
          "raw_text": "Comfortable with granny squares, color changes, and simple seaming",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "info",
          "code": "hero-info-2",
          "label": "Multi-Evening Project",
          "value": "Roughly 10-14 hours of soothing flower-making and assembly",
          "raw_text": "Roughly 10-14 hours of soothing flower-making and assembly",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "hero-info-3",
          "label": "Statement Summer Bag",
          "value": "Dramatic black-and-pink blooms in firm, cool cotton — a showstopper gift",
          "raw_text": "Dramatic black-and-pink blooms in firm, cool cotton — a showstopper gift",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 2,
      "card_type": "about",
      "code": "about",
      "title": "About",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "about-info-1",
          "label": "",
          "value": "This free pattern turns a stack of African flower granny squares into a petite, structured handbag with serious personality. Worked mostly in black cotton with hot pink edges, each square holds a dramatic dark-centered bloom that glows against its pink framing. It's perfect for crocheters who adore making granny squares but want a finish line beyond another blanket — and because each motif is small and portable, it makes a wonderful take-along project for commutes, waiting rooms, and slow porch evenings",
          "raw_text": "This free pattern turns a stack of African flower granny squares into a petite, structured handbag with serious personality. Worked mostly in black cotton with hot pink edges, each square holds a dramatic dark-centered bloom that glows against its pink framing. It's perfect for crocheters who adore making granny squares but want a finish line beyond another blanket — and because each motif is small and portable, it makes a wonderful take-along project for commutes, waiting rooms, and slow porch evenings",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "info",
          "code": "about-info-2",
          "label": "",
          "value": "Each square is built in 8 rounds: rounds 1 through 6 grow the openwork African flower itself, with colors flowing gently from the center outward, while rounds 7 and 8 add a tidy border that frames the round bloom into a crisp square, ready for joining. You'll also work a short 2-round second piece and seam everything together with a darning needle. I'd call it a confident-beginner-to-intermediate make, and most crocheters finish over several relaxed evenings — roughly 10 to 14 hours in total",
          "raw_text": "Each square is built in 8 rounds: rounds 1 through 6 grow the openwork African flower itself, with colors flowing gently from the center outward, while rounds 7 and 8 add a tidy border that frames the round bloom into a crisp square, ready for joining. You'll also work a short 2-round second piece and seam everything together with a darning needle. I'd call it a confident-beginner-to-intermediate make, and most crocheters finish over several relaxed evenings — roughly 10 to 14 hours in total",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "about-info-3",
          "label": "",
          "value": "The finished handbag stands about 7.87 inches tall on a base of roughly 8.27 by 3.74 inches — just right for a phone, wallet, keys, and a small notebook. Because it's worked in super-strength cotton at a deliberately firm gauge, the bag holds its shape beautifully and stays cool against your side in summer heat. Add a fabric lining and it becomes a genuinely useful everyday bag — and an unforgettable handmade gift for a flower-loving friend",
          "raw_text": "The finished handbag stands about 7.87 inches tall on a base of roughly 8.27 by 3.74 inches — just right for a phone, wallet, keys, and a small notebook. Because it's worked in super-strength cotton at a deliberately firm gauge, the bag holds its shape beautifully and stays cool against your side in summer heat. Add a fabric lining and it becomes a genuinely useful everyday bag — and an unforgettable handmade gift for a flower-loving friend",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 3,
      "card_type": "why_love",
      "code": "why-love",
      "title": "Why You'll Love This Pattern",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "why-love-1",
          "label": "",
          "value": "I have made more granny squares than I can count, and the African flower is still the motif that makes me sigh happily every single time. There's a lovely rhythm to rounds 1 through 6 — watching that openwork bloom unfurl from the center, the hot pink edging suddenly making the black petals look velvety and dramatic. Then rounds 7 and 8 do this quietly satisfying thing where the round flower becomes a perfectly behaved square, ready to line up with its siblings. The squares are small — just 3.54 inches — so each one is a tidy little win you can finish with one cup of tea. I also love how customizable this bag is: I added stitches to lengthen the strap for shoulder wear, and slip-stitching a spare square inside as a pocket for my keys took ten minutes and made it feel like a real boutique bag. Firm cotton, bold contrast, zero floppiness — this one collects compliments every single time I carry it",
          "raw_text": "I have made more granny squares than I can count, and the African flower is still the motif that makes me sigh happily every single time. There's a lovely rhythm to rounds 1 through 6 — watching that openwork bloom unfurl from the center, the hot pink edging suddenly making the black petals look velvety and dramatic. Then rounds 7 and 8 do this quietly satisfying thing where the round flower becomes a perfectly behaved square, ready to line up with its siblings. The squares are small — just 3.54 inches — so each one is a tidy little win you can finish with one cup of tea. I also love how customizable this bag is: I added stitches to lengthen the strap for shoulder wear, and slip-stitching a spare square inside as a pocket for my keys took ten minutes and made it feel like a real boutique bag. Firm cotton, bold contrast, zero floppiness — this one collects compliments every single time I carry it",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 5,
      "card_type": "common_mistakes",
      "code": "common-mistakes",
      "title": "Common Mistakes & How to Fix Them",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "mistake",
          "code": "mistake-1",
          "label": "Squares come out slightly different sizes, so the bag assembles crooked",
          "value": "African flower motifs are sensitive to tension drift across their many color changes. Measure your first finished square against the 3.54-inch target before making the rest, keep the same 3.00 mm hook throughout, and block all squares to a uniform size before joining — small differences multiply across a whole row",
          "raw_text": "African flower motifs are sensitive to tension drift across their many color changes. Measure your first finished square against the 3.54-inch target before making the rest, keep the same 3.00 mm hook throughout, and block all squares to a uniform size before joining — small differences multiply across a whole row",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "mistake",
          "code": "mistake-2",
          "label": "Losing track of petal and stitch counts in the openwork flower rounds (1–6)",
          "value": "Count your stitches at the end of every round rather than only at the end of the square, and drop a stitch marker into the first stitch of each round. Catching a missed petal one round late is a two-minute frog; catching it at round 8 means redoing most of the square",
          "raw_text": "Count your stitches at the end of every round rather than only at the end of the square, and drop a stitch marker into the first stitch of each round. Catching a missed petal one round late is a two-minute frog; catching it at round 8 means redoing most of the square",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "mistake",
          "code": "mistake-3",
          "label": "Muddy, knotted joins where one color hands off to the next",
          "value": "Complete the very last yarn-over of a round with the new color instead of tying the new yarn on afterward. Leave 4–6 inch tails and weave them in as you go — with several color changes per square across the whole bag, the tail pile grows fast if you save them all for the end",
          "raw_text": "Complete the very last yarn-over of a round with the new color instead of tying the new yarn on afterward. Leave 4–6 inch tails and weave them in as you go — with several color changes per square across the whole bag, the tail pile grows fast if you save them all for the end",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 4,
          "row_type": "mistake",
          "code": "mistake-4",
          "label": "The framing rounds (7–8) don't produce a true, flat square",
          "value": "The corners are where flowers become squares, so mark the four corner spaces before starting round 7 and double-check placement as you pass each one. If the border ruffles or cups, your stitch placement drifted — rip back the border only (the flower underneath is fine) and rework it",
          "raw_text": "The corners are where flowers become squares, so mark the four corner spaces before starting round 7 and double-check placement as you pass each one. If the border ruffles or cups, your stitch placement drifted — rip back the border only (the flower underneath is fine) and rework it",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "mistake",
          "code": "mistake-5",
          "label": "Joining the squares with the flowers rotated inconsistently",
          "value": "African flower petals have a visible direction, and one rotated square jumps out on a finished bag. Lay out the entire arrangement first, snap a quick photo for reference, and seam with your darning needle following that layout square by square",
          "raw_text": "African flower petals have a visible direction, and one rotated square jumps out on a finished bag. Lay out the entire arrangement first, snap a quick photo for reference, and seam with your darning needle following that layout square by square",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 6,
          "row_type": "mistake",
          "code": "mistake-6",
          "label": "A floppy bag that slouches and won't hold its shape",
          "value": "The firm pairing of a 3.00 mm hook with light cotton is intentional — it creates a dense fabric that stands up on its own. If your fabric feels loose and drapey, go down a hook size, and add the fabric lining the designer recommends for extra structure",
          "raw_text": "The firm pairing of a 3.00 mm hook with light cotton is intentional — it creates a dense fabric that stands up on its own. If your fabric feels loose and drapey, go down a hook size, and add the fabric lining the designer recommends for extra structure",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 6,
      "card_type": "materials",
      "code": "materials",
      "title": "Materials",
      "raw_heading": "",
      "quantity": 1,
      "groups": [
        {
          "order": 1,
          "group_code": "group-1",
          "group_name": "",
          "rows": [
            {
              "order": 1,
              "row_type": "item",
              "code": "mat-1-1",
              "label": "",
              "value": "This project uses super-strength cotton yarn throughout, creating a sturdy bag that stays cool in summer heat. You’ll need 3 balls of black yarn and 1 ball of hot pink in total. We used 1.00mm light cotton yarn and a 3.00mm hook for this petite, adorable size. If you want a bigger one, simply use worsted or bulky-weight yarn with a correspondingly larger hook.",
              "raw_text": "This project uses super-strength cotton yarn throughout, creating a sturdy bag that stays cool in summer heat. You’ll need 3 balls of black yarn and 1 ball of hot pink in total. We used 1.00mm light cotton yarn and a 3.00mm hook for this petite, adorable size. If you want a bigger one, simply use worsted or bulky-weight yarn with a correspondingly larger hook."
            },
            {
              "order": 2,
              "row_type": "item",
              "code": "mat-1-2",
              "label": "",
              "value": "A pair of scissors and a darning needle to sew are also needed.",
              "raw_text": "A pair of scissors and a darning needle to sew are also needed."
            }
          ]
        }
      ],
      "rows": []
    },
    {
      "order": 7,
      "card_type": "abbreviations",
      "code": "abbreviations",
      "title": "Abbreviations",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "abbrev",
          "code": "abbrev-ch",
          "label": "ch",
          "value": "chain stitch",
          "raw_text": "ch = chain stitch",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "ch",
          "meaning": "chain stitch"
        },
        {
          "order": 2,
          "row_type": "abbrev",
          "code": "abbrev-dc",
          "label": "dc",
          "value": "double crochet",
          "raw_text": "dc = double crochet",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "dc",
          "meaning": "double crochet"
        },
        {
          "order": 3,
          "row_type": "abbrev",
          "code": "abbrev-hdc",
          "label": "hdc",
          "value": "half treble crochet",
          "raw_text": "hdc = half treble crochet",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "hdc",
          "meaning": "half treble crochet"
        },
        {
          "order": 4,
          "row_type": "abbrev",
          "code": "abbrev-sc",
          "label": "sc",
          "value": "single crochet",
          "raw_text": "sc = single crochet",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "sc",
          "meaning": "single crochet"
        },
        {
          "order": 5,
          "row_type": "abbrev",
          "code": "abbrev-sl-st",
          "label": "Sl St",
          "value": "slip stitch for joining to different round",
          "raw_text": "Sl St = slip stitch for joining to different round",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "Sl St",
          "meaning": "slip stitch for joining to different round"
        },
        {
          "order": 6,
          "row_type": "abbrev",
          "code": "abbrev-ch-sp",
          "label": "ch-sp",
          "value": "chain space",
          "raw_text": "ch-sp = chain space",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "ch-sp",
          "meaning": "chain space"
        },
        {
          "order": 7,
          "row_type": "abbrev",
          "code": "abbrev-st",
          "label": "st",
          "value": "stitch",
          "raw_text": "st = stitch",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "st",
          "meaning": "stitch"
        },
        {
          "order": 8,
          "row_type": "abbrev",
          "code": "abbrev-inc",
          "label": "inc",
          "value": "increase",
          "raw_text": "inc = increase",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "inc",
          "meaning": "increase"
        },
        {
          "order": 9,
          "row_type": "abbrev",
          "code": "abbrev-sk",
          "label": "sk",
          "value": "skip",
          "raw_text": "sk = skip",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": "sk",
          "meaning": "skip"
        },
        {
          "order": 10,
          "row_type": "abbrev",
          "code": "abbrev-rep",
          "label": "rep",
          "value": "repeat",
          "raw_text": "rep = repeat",
          "abbr": "rep",
          "meaning": "repeat"
        },
        {
          "order": 11,
          "row_type": "abbrev",
          "code": "abbrev-bl",
          "label": "BL",
          "value": "back loop",
          "raw_text": "BL = back loop",
          "abbr": "BL",
          "meaning": "back loop"
        }
      ]
    },
    {
      "order": 8,
      "card_type": "part",
      "code": "main-pattern",
      "title": "Main Pattern",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "instruction",
          "code": "special-0",
          "label": "Steps",
          "value": "Special stitch — standing stitch: Begin the round with a chain worked as a standing stitch: ch counts as sc, ch2 counts as hdc, ch3 counts as dc.",
          "raw_text": "Special stitch — standing stitch: Begin the round with a chain worked as a standing stitch: ch counts as sc, ch2 counts as hdc, ch3 counts as dc.",
          "round_start": null,
          "round_end": null,
          "is_range": false
        },
        {
          "order": 2,
          "row_type": "instruction",
          "code": "special-1",
          "label": "Steps",
          "value": "Special stitch — encasing sc: Work a sc into the hdc from Round 2 corresponding to the next st, so the stitch encases Round 3.",
          "raw_text": "Special stitch — encasing sc: Work a sc into the hdc from Round 2 corresponding to the next st, so the stitch encases Round 3.",
          "round_start": null,
          "round_end": null,
          "is_range": false
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "main-pattern-enr-e0",
          "label": "Info",
          "value": "In this part we only add single crochet for two rounds to the current bag body. At the beginning of each round, make ch1 as a standing st, while at the end, sl st to the first true sc.",
          "raw_text": "In this part we only add single crochet for two rounds to the current bag body. At the beginning of each round, make ch1 as a standing st, while at the end, sl st to the first true sc."
        },
        {
          "order": 4,
          "row_type": "round",
          "code": "main-pattern-round-1",
          "label": "Round 1",
          "value": "Start with a magic loop, ch as a standing st, 10sc in this loop, pull the tail tightly, sl st to the top of the first sc, fasten off.",
          "raw_text": "Round 1 Start with a magic loop, ch as a standing st, 10sc in this loop, pull the tail tightly, sl st to the top of the first sc, fasten off.",
          "round_start": 1,
          "round_end": 1,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "info",
          "code": "main-pattern-enr-e2",
          "label": "Info",
          "value": "The top edge serves as a sturdy foundation for the straps while reinforcing the bag's opening; this reinforcement distributes weight evenly, maintains the bag's shape, and keeps the opening accessible. If you want a higher edge, just add to the number of rounds.",
          "raw_text": "The top edge serves as a sturdy foundation for the straps while reinforcing the bag's opening; this reinforcement distributes weight evenly, maintains the bag's shape, and keeps the opening accessible. If you want a higher edge, just add to the number of rounds."
        },
        {
          "order": 6,
          "row_type": "round",
          "code": "main-pattern-round-2",
          "label": "Round 2",
          "value": "Add new yarn in any st, ch2 as a standing st(count as hdc), make another hdc in this st to form a hdc inc. hdc inc in the remaining sts, sl st to the top of the first ch2.",
          "raw_text": "Round 2 Add new yarn in any st, ch2 as a standing st(count as hdc), make another hdc in this st to form a hdc inc. hdc inc in the remaining sts, sl st to the top of the first ch2.",
          "round_start": 2,
          "round_end": 2,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 7,
          "row_type": "info",
          "code": "main-pattern-enr-e4",
          "label": "Info",
          "value": "Spread the petals. Mix several stitches in different heights on purpose, drawing the shape of each petal.",
          "raw_text": "Spread the petals. Mix several stitches in different heights on purpose, drawing the shape of each petal."
        },
        {
          "order": 8,
          "row_type": "round",
          "code": "main-pattern-round-3",
          "label": "Round 3",
          "value": "ch as a standing st, sc in this st, hdc+dc, dc inc, dc+hdc. *sc, hdc+dc, dc inc, dc+hdc* rep 4 times, sl st to the top of the first sc, fasten off.",
          "raw_text": "Round 3 ch as a standing st, sc in this st, hdc+dc, dc inc, dc+hdc. *sc, hdc+dc, dc inc, dc+hdc* rep 4 times, sl st to the top of the first sc, fasten off.",
          "round_start": 3,
          "round_end": 3,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 9,
          "row_type": "info",
          "code": "main-pattern-enr-e6",
          "label": "Info",
          "value": "Place single crochet stitches thoughtfully, choosing the color that matches the flower center to create visual continuity.",
          "raw_text": "Place single crochet stitches thoughtfully, choosing the color that matches the flower center to create visual continuity."
        },
        {
          "order": 10,
          "row_type": "round",
          "code": "main-pattern-round-4",
          "label": "Round 4",
          "value": "Add new yarn in any sc, ch+sc in this st, 5sc,  sc in the hdc from Round 2  corresponding to the next st, so we can encase Round 3.",
          "raw_text": "Round 4 Add new yarn in any sc, ch+sc in this st, 5sc,  sc in the hdc from Round 2  corresponding to the next st, so we can encase Round 3.",
          "round_start": 4,
          "round_end": 4,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 11,
          "row_type": "instruction",
          "code": "main-pattern-enr-s8",
          "label": "Steps",
          "value": "Add new yarn in any sc, ch+sc in this st, 5sc, sc in the hdc from Round 2 corresponding to the next st to encase Round 3; then work *6sc, sc in the next corresponding hdc from Round 2 to encase Round 3* rep 4 times, sl st to the top of the first sc, fasten off.",
          "raw_text": "Step by step: Add new yarn in any sc, ch+sc in this st, 5sc, sc in the hdc from Round 2 corresponding to the next st to encase Round 3; then work *6sc, sc in the next corresponding hdc from Round 2 to encase Round 3* rep 4 times, sl st to the top of the first sc, fasten off.",
          "round_start": null,
          "round_end": null,
          "is_range": false
        },
        {
          "order": 12,
          "row_type": "instruction",
          "code": "main-pattern-info-1",
          "label": "Steps",
          "value": "*6sc,  sc in the next corresponding hdc from Round 2  to encase Round 3* rep 4 times, sl st to the top of the first sc, fasten off.",
          "raw_text": "*6sc,  sc in the next corresponding hdc from Round 2  to encase Round 3* rep 4 times, sl st to the top of the first sc, fasten off.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 13,
          "row_type": "info",
          "code": "main-pattern-enr-e10",
          "label": "Info",
          "value": "In this round, the openwork area is established using only chain spaces and single crochet.",
          "raw_text": "In this round, the openwork area is established using only chain spaces and single crochet."
        },
        {
          "order": 14,
          "row_type": "round",
          "code": "main-pattern-round-5",
          "label": "Round 5",
          "value": "Add new yarn in any encasing sc, ch as a standing st, sc+ch5 in this st, sk3, sc+ch5 in the next st, [sk2, sc+ch5 in the next encasing sc, sk3, sc+ch5 in the next st] repeat 4 times, sl st to the first sc.",
          "raw_text": "Round 5 Add new yarn in any encasing sc, ch as a standing st, sc+ch5 in this st, sk3, sc+ch5 in the next st, [sk2, sc+ch5 in the next encasing sc, sk3, sc+ch5 in the next st] repeat 4 times, sl st to the first sc.",
          "round_start": 5,
          "round_end": 5,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 15,
          "row_type": "info",
          "code": "main-pattern-enr-e12",
          "label": "Info",
          "value": "Still single crochet in this round. Work in the chain space to keep and strengthen the openwork design.",
          "raw_text": "Still single crochet in this round. Work in the chain space to keep and strengthen the openwork design."
        },
        {
          "order": 16,
          "row_type": "round",
          "code": "main-pattern-round-6",
          "label": "Round 6",
          "value": "sl st to the next ch sp.ch as a standing st, 6sc in this ch-sp.*6sc in the next ch-sp* rep 9 times, sl st to the first sc.",
          "raw_text": "Round 6 sl st to the next ch sp.ch as a standing st, 6sc in this ch-sp.*6sc in the next ch-sp* rep 9 times, sl st to the first sc.",
          "round_start": 6,
          "round_end": 6,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 17,
          "row_type": "info",
          "code": "main-pattern-enr-e14",
          "label": "Info",
          "value": "In the next two rounds, we move from the flower to creating the border. These border rounds not only frame and protect the flower design but also provide crucial stability when the squares are joined into a handbag.",
          "raw_text": "In the next two rounds, we move from the flower to creating the border. These border rounds not only frame and protect the flower design but also provide crucial stability when the squares are joined into a handbag."
        },
        {
          "order": 18,
          "row_type": "round",
          "code": "main-pattern-round-7",
          "label": "Round 7",
          "value": "ch3 as a standing st(count as dc), dc, 2hdc, 2dc. *2dc, 2hdc, 2dc*rep 9 times, sl st to the top of the first ch3.",
          "raw_text": "Round 7 ch3 as a standing st(count as dc), dc, 2hdc, 2dc. *2dc, 2hdc, 2dc*rep 9 times, sl st to the top of the first ch3.",
          "round_start": 7,
          "round_end": 7,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 19,
          "row_type": "instruction",
          "code": "main-pattern-enr-s16",
          "label": "Steps",
          "value": "ch3 as a standing st (count as dc), dc, 2hdc, 2dc; then work *2dc + 2hdc + 2dc in the next ch-sp* rep 9 times, sl st to the top of the first ch3.",
          "raw_text": "Step by step: ch3 as a standing st (count as dc), dc, 2hdc, 2dc; then work *2dc + 2hdc + 2dc in the next ch-sp* rep 9 times, sl st to the top of the first ch3.",
          "round_start": null,
          "round_end": null,
          "is_range": false
        },
        {
          "order": 20,
          "row_type": "round",
          "code": "main-pattern-round-8",
          "label": "Round 8",
          "value": "ch3 as a standing st(count as dc), 3hdc, 3sc, 3hdc, 3dc, ch3, 2dc. *dc, 3hdc, 3sc, 3hdc, 3dc, ch3, 2dc*rep 3 times, sl st to the top of the first ch3, fasten off.",
          "raw_text": "Round 8 ch3 as a standing st(count as dc), 3hdc, 3sc, 3hdc, 3dc, ch3, 2dc. *dc, 3hdc, 3sc, 3hdc, 3dc, ch3, 2dc*rep 3 times, sl st to the top of the first ch3, fasten off.",
          "round_start": 8,
          "round_end": 8,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 21,
          "row_type": "info",
          "code": "main-pattern-info-2",
          "label": "Info",
          "value": "Two Flowers on the Strap Only  repeat Round 1 to Round 4  to finish two appealing African flowers.",
          "raw_text": "Two Flowers on the Strap Only  repeat Round 1 to Round 4  to finish two appealing African flowers.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 22,
          "row_type": "subhead",
          "code": "main-pattern-info-3",
          "label": "",
          "value": "Join the Basic Squares",
          "raw_text": "Join the Basic Squares",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 23,
          "row_type": "info",
          "code": "main-pattern-info-4",
          "label": "Info",
          "value": "Make a knot on your hook. Insert the hook through the  BL of the matching stitches  of two adjacent squares. Work sl st along this edge to join. Join all 14 patterns in the same way according to the layout shown.",
          "raw_text": "Make a knot on your hook. Insert the hook through the  BL of the matching stitches  of two adjacent squares. Work sl st along this edge to join. Join all 14 patterns in the same way according to the layout shown.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 24,
          "row_type": "subhead",
          "code": "main-pattern-info-5",
          "label": "",
          "value": "Top Edge",
          "raw_text": "Top Edge",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 9,
      "card_type": "part",
      "code": "part-2",
      "title": "Part 2",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "part-2-enr-e0",
          "label": "Info",
          "value": "In this part we only add single crochet for two rounds to the current bag body. At the beginning of each round, make ch1 as a standing st, while at the end, sl st to the first true sc.",
          "raw_text": "In this part we only add single crochet for two rounds to the current bag body. At the beginning of each round, make ch1 as a standing st, while at the end, sl st to the first true sc."
        },
        {
          "order": 2,
          "row_type": "round",
          "code": "part-2-round-1",
          "label": "Round 1",
          "value": "Add new yarn in any st, ch, sc in each st around, sc in each slst at the seam, and 2sc in each corner as you go, sl st to the first sc.",
          "raw_text": "Round1: Add new yarn in any st, ch, sc in each st around, sc in each slst at the seam, and 2sc in each corner as you go, sl st to the first sc.",
          "round_start": 1,
          "round_end": 1,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "part-2-enr-e2",
          "label": "Info",
          "value": "The top edge serves as a sturdy foundation for the straps while reinforcing the bag's opening; this reinforcement distributes weight evenly, maintains the bag's shape, and keeps the opening accessible. If you want a higher edge, just add to the number of rounds.",
          "raw_text": "The top edge serves as a sturdy foundation for the straps while reinforcing the bag's opening; this reinforcement distributes weight evenly, maintains the bag's shape, and keeps the opening accessible. If you want a higher edge, just add to the number of rounds."
        },
        {
          "order": 4,
          "row_type": "round",
          "code": "part-2-round-2",
          "label": "Round 2",
          "value": "ch, sc in each st around, sl st to the top of the first sc, fasten off. Bag Strap",
          "raw_text": "Round 2:ch, sc in each st around, sl st to the top of the first sc, fasten off. Bag Strap",
          "round_start": 2,
          "round_end": 2,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "instruction",
          "code": "part-2-info-1",
          "label": "Steps",
          "value": "Start with a knot, ch4, sk the 4th ch, sc in the third loop of each ch.",
          "raw_text": "Start with a knot, ch4, sk the 4th ch, sc in the third loop of each ch.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 6,
          "row_type": "instruction",
          "code": "part-2-info-2",
          "label": "Steps",
          "value": "Turn. ch to start, work sc in each st across. Repeat [turn over, ch1 to start, and work sc in each st], until the strap reaches your desired length.",
          "raw_text": "Turn. ch to start, work sc in each st across. Repeat [turn over, ch1 to start, and work sc in each st], until the strap reaches your desired length.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 7,
          "row_type": "info",
          "code": "part-2-info-3",
          "label": "Info",
          "value": "Sew the long edges of each strap together to form a rope-like tube.  Leave both ends unsewn and flat for attaching to the bag.",
          "raw_text": "Sew the long edges of each strap together to form a rope-like tube.  Leave both ends unsewn and flat for attaching to the bag.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 8,
          "row_type": "info",
          "code": "part-2-info-4",
          "label": "Info",
          "value": "Assemble Sew the two straps to the top edge of the bag body.",
          "raw_text": "Assemble Sew the two straps to the top edge of the bag body.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 9,
          "row_type": "info",
          "code": "part-2-info-5",
          "label": "Info",
          "value": "Place the strap between two flower pieces, aligning them perfectly so the patterns match on both sides. Using matching yarn colors,  sew   around the edges  of the flowers to join them together, catching only the flower pieces not the strap. Keep your stitches  loose enough  that the joined flowers can slide freely along the strap.",
          "raw_text": "Place the strap between two flower pieces, aligning them perfectly so the patterns match on both sides. Using matching yarn colors,  sew   around the edges  of the flowers to join them together, catching only the flower pieces not the strap. Keep your stitches  loose enough  that the joined flowers can slide freely along the strap.",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        }
      ]
    },
    {
      "order": 10,
      "card_type": "important_notes",
      "code": "important-notes",
      "title": "Important Notes",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "info",
          "code": "note-1",
          "label": "Note",
          "value": "💡 The 3.00 mm hook paired with the light 1.00 mm cotton is intentionally snug — that dense fabric is what gives this handbag its structure. If your first square feels stiff to work, you're doing it right; don't size up the hook or the bag will slouch",
          "raw_text": "💡 The 3.00 mm hook paired with the light 1.00 mm cotton is intentionally snug — that dense fabric is what gives this handbag its structure. If your first square feels stiff to work, you're doing it right; don't size up the hook or the bag will slouch",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 2,
          "row_type": "info",
          "code": "note-2",
          "label": "Note",
          "value": "💡 Buy all three black balls from the same dye lot before you start. Black cotton varies between lots more than you'd expect, and one off-shade square is very visible once the bag is assembled",
          "raw_text": "💡 Buy all three black balls from the same dye lot before you start. Black cotton varies between lots more than you'd expect, and one off-shade square is very visible once the bag is assembled",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "info",
          "code": "note-3",
          "label": "Note",
          "value": "💡 Weave in your ends after every finished square instead of saving them for the end — each 8-round square carries several color-change tails, and across a full bag that's a mountain of ends",
          "raw_text": "💡 Weave in your ends after every finished square instead of saving them for the end — each 8-round square carries several color-change tails, and across a full bag that's a mountain of ends",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 4,
          "row_type": "info",
          "code": "note-4",
          "label": "Note",
          "value": "💡 Wet-block your squares to a uniform 3.54 inches before joining. Even tiny size differences compound across a row and can twist the bag body out of shape",
          "raw_text": "💡 Wet-block your squares to a uniform 3.54 inches before joining. Even tiny size differences compound across a row and can twist the bag body out of shape",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "info",
          "code": "note-5",
          "label": "Note",
          "value": "💡 Test the strap length before fastening off: pin the bag together, drape the strap over your shoulder in a mirror, and add stitches now if you want a longer drop — lengthening after everything is seamed is much fussier",
          "raw_text": "💡 Test the strap length before fastening off: pin the bag together, drape the strap over your shoulder in a mirror, and add stitches now if you want a longer drop — lengthening after everything is seamed is much fussier",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 6,
          "row_type": "info",
          "code": "note-6",
          "label": "Note",
          "value": "💡 If you're adding the fabric lining, insert it before attaching the pocket: slip stitch a spare granny square to the lining on three sides, leaving the top open, so the pocket's weight pulls on the lining instead of stretching the crochet fabric",
          "raw_text": "💡 If you're adding the fabric lining, insert it before attaching the pocket: slip stitch a spare granny square to the lining on three sides, leaving the top open, so the pocket's weight pulls on the lining instead of stretching the crochet fabric",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": null,
          "answer": null,
          "abbr": null,
          "meaning": null
        },
        {
          "order": 7,
          "row_type": "info",
          "code": "note-enr-6",
          "label": "Note",
          "value": "🎨 Colors: While cotton creates firm summer bags, soft wool or acrylic yarns offer cozy alternatives for colder weather. For a striking variation, mostly black with hot pink edges creates dramatic dark-centered flowers. You could also introduce multiple colors for a rainbow effect, add colorful petals to each flower, or work a multicolored border. In Round 4, choose the color that matches the flower center to create visual continuity.",
          "raw_text": "🎨 Colors: While cotton creates firm summer bags, soft wool or acrylic yarns offer cozy alternatives for colder weather. For a striking variation, mostly black with hot pink edges creates dramatic dark-centered flowers. You could also introduce multiple colors for a rainbow effect, add colorful petals to each flower, or work a multicolored border. In Round 4, choose the color that matches the flower center to create visual continuity."
        },
        {
          "order": 8,
          "row_type": "info",
          "code": "note-enr-7",
          "label": "Note",
          "value": "🧩 16 pieces in total: 14 African flower granny squares for the bag body, plus 2 flower pieces without a border for the strap. Each full square is 8 rounds — Rounds 1-6 build the flower, Rounds 7-8 add the border; the two strap flowers only repeat Round 1 to Round 4.",
          "raw_text": "🧩 16 pieces in total: 14 African flower granny squares for the bag body, plus 2 flower pieces without a border for the strap. Each full square is 8 rounds — Rounds 1-6 build the flower, Rounds 7-8 add the border; the two strap flowers only repeat Round 1 to Round 4."
        },
        {
          "order": 9,
          "row_type": "info",
          "code": "note-enr-8",
          "label": "Note",
          "value": "🧩 Lay out the 14 squares one by one in the recommended arrangement before joining, then join with slip stitches: make a knot on your hook, insert the hook through the back loops of matching stitches of two adjacent squares, and work sl st along the edge.",
          "raw_text": "🧩 Lay out the 14 squares one by one in the recommended arrangement before joining, then join with slip stitches: make a knot on your hook, insert the hook through the back loops of matching stitches of two adjacent squares, and work sl st along the edge."
        },
        {
          "order": 10,
          "row_type": "info",
          "code": "note-enr-9",
          "label": "Note",
          "value": "🧩 Bag strap: start with a knot, ch4, sk the 4th ch, sc in the third loop of each ch; turn, ch1 to start, sc in each st across, and repeat until the strap reaches your desired length. Fold each strap and sew the long edges together into a rope-like tube to make it stronger and less stretchy, leaving both ends flat and unsewn for attaching to the bag.",
          "raw_text": "🧩 Bag strap: start with a knot, ch4, sk the 4th ch, sc in the third loop of each ch; turn, ch1 to start, sc in each st across, and repeat until the strap reaches your desired length. Fold each strap and sew the long edges together into a rope-like tube to make it stronger and less stretchy, leaving both ends flat and unsewn for attaching to the bag."
        },
        {
          "order": 11,
          "row_type": "info",
          "code": "note-enr-10",
          "label": "Note",
          "value": "🧩 Sew the two straps onto the top edge of the bag body.",
          "raw_text": "🧩 Sew the two straps onto the top edge of the bag body."
        },
        {
          "order": 12,
          "row_type": "info",
          "code": "note-enr-11",
          "label": "Note",
          "value": "🧩 Sliding flower decor: place the strap between the two flower pieces, aligning them so the flowers match on both sides, then sew around the edges of the flowers with matching yarn, catching only the flower pieces (not the strap) and keeping the stitches loose enough that the joined flowers slide freely along the strap.",
          "raw_text": "🧩 Sliding flower decor: place the strap between the two flower pieces, aligning them so the flowers match on both sides, then sew around the edges of the flowers with matching yarn, catching only the flower pieces (not the strap) and keeping the stitches loose enough that the joined flowers slide freely along the strap."
        }
      ]
    },
    {
      "order": 11,
      "card_type": "faq",
      "code": "faq",
      "title": "FAQ",
      "raw_heading": "",
      "quantity": 1,
      "groups": [],
      "rows": [
        {
          "order": 1,
          "row_type": "faq",
          "code": "faq-1",
          "label": "How many African flower squares do I need for this handbag?",
          "value": "It depends on the size you want — each finished square measures 3.54 inches, and the sample bag stands 7.87 inches tall on a base of roughly 8.27 by 3.74 inches. Make a handful of squares first, arrange them into the body shape, then add or remove squares to adjust capacity, exactly as the designer suggests",
          "raw_text": "It depends on the size you want — each finished square measures 3.54 inches, and the sample bag stands 7.87 inches tall on a base of roughly 8.27 by 3.74 inches. Make a handful of squares first, arrange them into the body shape, then add or remove squares to adjust capacity, exactly as the designer suggests",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": "How many African flower squares do I need for this handbag?",
          "answer": "It depends on the size you want — each finished square measures 3.54 inches, and the sample bag stands 7.87 inches tall on a base of roughly 8.27 by 3.74 inches. Make a handful of squares first, arrange them into the body shape, then add or remove squares to adjust capacity, exactly as the designer suggests",
          "abbr": null,
          "meaning": null
        },
        {
          "order": 3,
          "row_type": "faq",
          "code": "faq-3",
          "label": "Do I really need to add a lining?",
          "value": "It's optional but worth it. The firm cotton holds its shape well on its own, but a fabric lining adds structure, stops small items from poking through the openwork flower centers, and gives you a base for the slip-stitched pocket square",
          "raw_text": "It's optional but worth it. The firm cotton holds its shape well on its own, but a fabric lining adds structure, stops small items from poking through the openwork flower centers, and gives you a base for the slip-stitched pocket square",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": "Do I really need to add a lining?",
          "answer": "It's optional but worth it. The firm cotton holds its shape well on its own, but a fabric lining adds structure, stops small items from poking through the openwork flower centers, and gives you a base for the slip-stitched pocket square",
          "abbr": null,
          "meaning": null
        },
        {
          "order": 4,
          "row_type": "faq",
          "code": "faq-4",
          "label": "Is this pattern beginner friendly?",
          "value": "I'd rate it intermediate — you'll want to be comfortable with basic granny squares and clean color changes. That said, the 8-round square is repetitive in the best way: once your first flower is done, the rest become relaxing muscle memory",
          "raw_text": "I'd rate it intermediate — you'll want to be comfortable with basic granny squares and clean color changes. That said, the 8-round square is repetitive in the best way: once your first flower is done, the rest become relaxing muscle memory",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": "Is this pattern beginner friendly?",
          "answer": "I'd rate it intermediate — you'll want to be comfortable with basic granny squares and clean color changes. That said, the 8-round square is repetitive in the best way: once your first flower is done, the rest become relaxing muscle memory",
          "abbr": null,
          "meaning": null
        },
        {
          "order": 5,
          "row_type": "faq",
          "code": "faq-5",
          "label": "What yarn should I use if I can't find super-strength cotton?",
          "value": "Any firm mercerized cotton at a similar weight works beautifully — Scheepjes Catona and DMC Petra are reliable picks. Avoid soft, drapey yarns for the summer version, though a wool or acrylic swap makes a lovely cozier cold-weather bag, as the designer notes",
          "raw_text": "Any firm mercerized cotton at a similar weight works beautifully — Scheepjes Catona and DMC Petra are reliable picks. Avoid soft, drapey yarns for the summer version, though a wool or acrylic swap makes a lovely cozier cold-weather bag, as the designer notes",
          "round_start": null,
          "round_end": null,
          "is_range": false,
          "stitch_count": null,
          "question": "What yarn should I use if I can't find super-strength cotton?",
          "answer": "Any firm mercerized cotton at a similar weight works beautifully — Scheepjes Catona and DMC Petra are reliable picks. Avoid soft, drapey yarns for the summer version, though a wool or acrylic swap makes a lovely cozier cold-weather bag, as the designer notes",
          "abbr": null,
          "meaning": null
        }
      ]
    }
  ],
  "conflicts": [],
  "validation_warnings": [],
  "images": [
    "data/images/african-flower-granny-square-handbag-free-pattern-hero.webp",
    "data/images/african-flower-granny-square-handbag-free-pattern-step-2.webp",
    "data/images/african-flower-granny-square-handbag-free-pattern-step-3-v2.webp",
    "data/images/african-flower-granny-square-handbag-free-pattern-step-4.webp"
  ],
  "source_url": null,
  "thumbnail_images": [
    {
      "url": "data/images/african-flower-granny-square-handbag-free-pattern-hero.webp",
      "alt": "African Flower Granny Square Handbag – Free Crochet Pattern — photo 1",
      "is_featured": true
    }
  ],
  "gallery_images": [
    {
      "url": "data/images/african-flower-granny-square-handbag-free-pattern-hero.webp",
      "alt": "African Flower Granny Square Handbag – Free Crochet Pattern — photo 1",
      "is_featured": true
    },
    {
      "url": "data/images/african-flower-granny-square-handbag-free-pattern-step-2.webp",
      "alt": "African Flower Granny Square Handbag – Free Crochet Pattern — photo 2",
      "is_featured": false
    },
    {
      "url": "data/images/african-flower-granny-square-handbag-free-pattern-step-3-v2.webp",
      "alt": "African Flower Granny Square Handbag – Free Crochet Pattern — photo 3",
      "is_featured": false
    },
    {
      "url": "data/images/african-flower-granny-square-handbag-free-pattern-step-4.webp",
      "alt": "African Flower Granny Square Handbag – Free Crochet Pattern — photo 4",
      "is_featured": false
    }
  ],
  "_sanitized_holiday_count": 3
}