# **Play: The Occupation of Childhood** 1. **Introduction** 2. **Definition of Play** 3. **Characteristics of Play** 4. **Importance of Play** 5. **Development of Play Across Age Groups** * Birth–3 Months * 3–6 Months * 6–12 Months * 1–2 Years * 2–3 Years * 3–5 Years * 5–7 Years * 7–12 Years * Adolescence 6. **Classification of Play** * **Parten's Social Stages of Play** * Unoccupied Play * Solitary Play * Onlooker Play * Parallel Play * Associative Play * Cooperative Play * **Piaget's Cognitive Stages of Play** * Practice (Sensorimotor) Play * Symbolic (Pretend) Play * Games with Rules * **Smilansky's Functional Classification of Play** * Functional Play * Constructive Play * Dramatic (Pretend) Play * Games with Rules 7. **Comparison of Play Classifications** 8. **Red Flags in Play Development** 9. **Play Assessment** * Clinical Observation * Parent/Caregiver Interview * Standardized Play Assessments 10. **Play as an Intervention** * Occupational Therapy * Physiotherapy * Speech-Language Therapy * Psychology * Special Education 11. **Clinical Applications / Case Example** 12. **Key Take-Home Messages** 13. **Conclusion** 14. **References** send clean clear and crisp details of the above topic for me to understand deeply, you can also yse flow chart and mindmaps , but make sure the content you send is correct clinically

Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Finding Sources
Finding Sources
Reading File
Reading File
Finding Sources
Reading File
Reading File

PLAY: The Occupation of Childhood

A Complete Clinical Reference


1. INTRODUCTION

Play is universally recognized as the primary occupation of childhood. It is how children learn about themselves, others, and the world around them. For therapists - whether occupational, physio, speech-language, or psychological - understanding play is not optional; it is foundational. Play serves simultaneously as a context, a vehicle, and a goal in pediatric clinical practice.

2. DEFINITION OF PLAY

There is no single universally agreed definition. Key definitions by domain:
SourceDefinition
Reilly (OT, 1974)Play is the arena in which children practice the skills and roles necessary for adult life
Piaget (Developmental)Play is a process by which the child assimilates experience to existing cognitive schema (pure assimilation)
Rubin et al.Play is intrinsically motivated, freely chosen, process-oriented, non-literal, and actively engaged behavior
AOTAPlay is any spontaneous or organized activity that provides enjoyment, entertainment, amusement, or diversion

Core Attributes of Play (Bundy's Framework)

Play has three defining qualities:
  1. Intrinsic motivation - done for its own sake, not for external reward
  2. Internal locus of control - the child drives the action
  3. Freedom from reality - suspension of the real-world rules; "what if" is allowed

3. CHARACTERISTICS OF PLAY

CHARACTERISTICS OF PLAY
│
├── Intrinsically Motivated
│     └── Child plays because it is pleasurable, not for a reward
│
├── Freely Chosen
│     └── Self-selected; not externally directed
│
├── Process > Product
│     └── The experience matters more than the outcome
│
├── Non-literal / Symbolic
│     └── A stick can be a sword; a box can be a spaceship
│
├── Positive Affect
│     └── Generally associated with enjoyment and engagement
│
├── Active Engagement
│     └── Mental and/or physical involvement
│
└── Safe Exploration
      └── Risk-taking within a protected context ("as if" world)

4. IMPORTANCE OF PLAY

Play is not trivial. It is the engine of development across all domains:
WHY PLAY MATTERS
        │
        ├─── COGNITIVE ──── Problem-solving, creativity, symbolic thinking,
        │                    cause-and-effect, attention, memory
        │
        ├─── LANGUAGE ───── Vocabulary expansion, narrative skills,
        │                    turn-taking, pragmatics
        │
        ├─── SOCIAL ─────── Empathy, cooperation, conflict resolution,
        │                    rule understanding, Theory of Mind
        │
        ├─── EMOTIONAL ───── Self-regulation, frustration tolerance,
        │                    expression of feelings, coping
        │
        ├─── MOTOR ──────── Gross motor (balance, coordination),
        │                    Fine motor (manipulation, tool use),
        │                    Sensory integration
        │
        └─── IDENTITY ────── Sense of self, mastery, autonomy,
                              role exploration
Clinical Note: The UN Convention on the Rights of the Child (Article 31) recognizes play as a fundamental right of every child.

5. DEVELOPMENT OF PLAY ACROSS AGE GROUPS

BIRTH - 3 MONTHS

  • Primary activity: Sensory exploration and reflexive interaction
  • Attends to faces, voices, and contrasting visual stimuli
  • Social smiling emerges (~6 weeks)
  • Early turn-taking via gaze and vocalization (proto-conversations)
  • Play type: Reactive; caregiver-initiated

3 - 6 MONTHS

  • Reaches for and grasps objects
  • Mouths objects (oral exploration)
  • Enjoys rattles, textures, and visual mobiles
  • Laughter and vocalization during social games (peek-a-boo precursors)
  • Play type: Sensorimotor; cause-and-effect discovery begins

6 - 12 MONTHS

  • Bangs, drops, and throws objects (exploring properties)
  • Object permanence developing (~9 months) - peek-a-boo now makes sense
  • Imitates simple actions and sounds
  • Joint attention emerges (pointing, following gaze)
  • Plays with purpose: brings telephone to ear, comb to hair
  • Play type: Exploratory and early functional play

1 - 2 YEARS

  • Functional use of objects (cup to drink, spoon to feed)
  • Early pretend play with own body (pretends to sleep/eat)
  • Parallel play begins
  • Imitates household chores (sweeping, "cooking")
  • Sorts shapes and colors; builds 2-4 block towers
  • Play type: Functional + early symbolic
From Kaplan & Sadock: "By the age of 2, the individual can find hidden items, clearly demonstrating the achievement of object permanence. Make-believe games begin to take on a pleasurable role."

2 - 3 YEARS

  • Symbolic play expands: one object represents another (block = car)
  • Pretends with other people (feeds mother, puts baby to sleep)
  • Parallel play predominates
  • Engages in short sequences of pretend
  • Builds 6-block towers; completes simple puzzles
  • Play type: Symbolic + parallel social play

3 - 5 YEARS

  • Dramatic/pretend play flourishes (acting out roles: doctor, parent)
  • Associative play develops - plays alongside/with peers with shared themes
  • Cooperative play emerging by age 4-5
  • Imaginary companions may appear (up to 50% of children by age 3-10)
  • Understands simple rules in games
  • Play type: Dramatic, associative, and early cooperative
From Kaplan & Sadock Synopsis: "Between 2½ and 3 years, children commonly engage in parallel play... By age 3, play is often associative... By age 4, children are usually able to share and engage in cooperative play."

5 - 7 YEARS

  • Cooperative play with rules established
  • Board games, organized sports, team activities
  • Understands fairness, rules, and competition
  • Begins to link play with skill-building (drawing, music, sports)
  • Play type: Games with Rules; constructive play

7 - 12 YEARS (MIDDLE YEARS)

  • Complex team games; rule-governed play predominates
  • Hobbies emerge (collecting, crafts, organized sports)
  • Peer relationships and social hierarchy in play
  • Logical thinking governs game strategies
  • Fantasy play shifts to structured creative activities
  • Play type: Games with Rules; constructive; competitive
From Kaplan & Sadock Synopsis: "In the middle years, language expresses complex ideas... Logical exploration tends to dominate fantasy, and children show an increased interest in rules and orderliness."

ADOLESCENCE

  • Play transitions toward leisure, recreation, and social activities
  • Sports, music, art, digital games, creative writing
  • Identity exploration through hobbies and group membership
  • Peer relationships are the central "play" context
  • Play type: Recreational/leisure activities; competitive/cooperative sports

6. CLASSIFICATION OF PLAY


6A. PARTEN'S SOCIAL STAGES OF PLAY (1932)

Mildred Parten classified play based on degree of social participation. These stages are broadly sequential but not mutually exclusive - older children still use earlier forms.
PARTEN'S SOCIAL STAGES (least → most social)
│
├─ 1. UNOCCUPIED PLAY
│      Age: Birth - 3 months
│      Child makes random movements; no apparent purpose
│      Does NOT engage with toys or others
│
├─ 2. SOLITARY PLAY
│      Age: Birth - 2 years
│      Plays alone; completely independent
│      No interest in what others are doing
│      NORMAL and HEALTHY at this stage
│
├─ 3. ONLOOKER PLAY
│      Age: ~2 years
│      Watches others play but does not join
│      May talk to players but does not participate
│      Important: observational learning occurs here
│
├─ 4. PARALLEL PLAY
│      Age: 2 - 2.5 years
│      Plays BESIDE others with similar toys
│      NO interaction; no shared goals
│      Each child plays independently but in proximity
│
├─ 5. ASSOCIATIVE PLAY
│      Age: 3 - 4 years
│      Interacts with others; shares toys and space
│      Common theme BUT no organized goals or roles
│      "Playing together" without structure
│
└─ 6. COOPERATIVE PLAY
       Age: 4+ years
       Organized group play with a common goal
       Defined roles, rules, and division of labor
       Requires: turn-taking, negotiation, empathy
Clinical Significance: Regression to earlier social stages can signal developmental delay, ASD, anxiety, or social communication disorder.

6B. PIAGET'S COGNITIVE STAGES OF PLAY

Jean Piaget linked play directly to his stages of cognitive development. Play reflects how children are processing and assimilating the world.
PIAGET'S COGNITIVE STAGES OF PLAY

┌──────────────────────────────────────────────────────────────────┐
│ STAGE 1: PRACTICE (SENSORIMOTOR) PLAY                           │
│ Age: Birth - 2 years                                             │
│ Cognitive Stage: Sensorimotor                                    │
│ Description: Repetition of motor actions for pleasure            │
│ Examples: Banging blocks, splashing water, rolling a ball        │
│ Purpose: Consolidating sensorimotor schemas                      │
│ Key feature: Pure ASSIMILATION - child repeats what is known     │
└──────────────────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────────────────┐
│ STAGE 2: SYMBOLIC (PRETEND) PLAY                                 │
│ Age: 2 - 7 years                                                 │
│ Cognitive Stage: Preoperational                                  │
│ Description: Use of symbols; one thing represents another        │
│ Examples: Stick = sword; box = spaceship; doll = real baby       │
│ Purpose: Development of semiotic function; language & thought    │
│ Key feature: Deferred imitation; make-believe; role-playing      │
└──────────────────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────────────────┐
│ STAGE 3: GAMES WITH RULES                                        │
│ Age: 7 years onward                                              │
│ Cognitive Stage: Concrete Operational                            │
│ Description: Structured games governed by agreed rules           │
│ Examples: Chess, cricket, tag, board games, team sports          │
│ Purpose: Social coordination, logical reasoning, moral dev.      │
│ Key feature: Rule understanding and rule following               │
└──────────────────────────────────────────────────────────────────┘
From Kaplan & Sadock Comprehensive Textbook: "Symbols are used in play only after the sensorimotor period, in the type of play characterized by games of pretending. For example, a little girl may pretend that she is asleep, that a box is her pet cat, or that she is in a church. In each instance, symbols are generated 'to express everything in the child's life experience that cannot be formulated and assimilated by means of language alone.'"

6C. SMILANSKY'S FUNCTIONAL CLASSIFICATION OF PLAY

Sara Smilansky (1968) built on Piaget's framework, adding Constructive Play and refining practical categories. This is the most widely used classification in educational and clinical settings.
SMILANSKY'S CLASSIFICATION
│
├─ 1. FUNCTIONAL PLAY
│      Age: 0 - 2 years
│      Simple, repetitive muscle movements with or without objects
│      Examples: Running, jumping, rolling a ball, shaking a rattle
│      Purpose: Sensorimotor skill building; exploring cause-effect
│
├─ 2. CONSTRUCTIVE PLAY
│      Age: 2 - 6 years (peaks 3-6)
│      Using objects/materials to construct or create something
│      Examples: Building blocks, sand castles, drawing, puzzles
│      Purpose: Problem-solving, spatial reasoning, persistence
│      NOTE: Most common type of play in preschool settings (~50%)
│
├─ 3. DRAMATIC (PRETEND) PLAY
│      Age: 2 - 7 years
│      Role-playing; acting out real or imagined scenarios
│      Examples: Playing house, doctor-patient, superheroes
│      Purpose: Language, Theory of Mind, emotional regulation
│      Sub-type: SOCIODRAMATIC = dramatic play with 2+ children
│
└─ 4. GAMES WITH RULES
       Age: 6+ years
       Activities with pre-established rules accepted by all
       Examples: Cards, hide-and-seek, organized sports
       Purpose: Social skills, inhibition, rule-following
Developmental Milestone from Kaplan & Sadock Comprehensive:
  • 6-12 months: Exploring object characteristics (pulling, poking)
  • 12-18 months: Functional use of objects (phone to ear, comb to hair)
  • 18+ months: Early symbolic play (pretends with own body)
  • 30+ months: Complex dramatic play; uses imaginary objects; assigns roles to others

7. COMPARISON OF PLAY CLASSIFICATIONS

FeatureParten (1932)Piaget (1962)Smilansky (1968)
FocusSocial complexityCognitive levelFunctional category
BasisSocial participationDevelopmental stageEducational application
Stages6 (unoccupied → cooperative)3 (practice → rules)4 (functional → rules)
Unique contributionMaps social developmentLinks play to cognitionMost practical for classroom/clinic
Used inSocial skill assessmentDevelopmental evaluationOT, special ed, research
LimitationDoesn't capture cognitive complexityUndervalues social playStages not always sequential
KEY CLINICAL INSIGHT: These three frameworks are complementary, not competing. A child playing cooperatively (Parten) in dramatic play (Smilansky) during the preoperational stage (Piaget) is one child being described from three different lenses.

8. RED FLAGS IN PLAY DEVELOPMENT

RED FLAGS - When to be Concerned

AGE        RED FLAG
──────     ────────────────────────────────────────────────────────
3 months   Does not smile at faces; no eye contact; no response to voice
6 months   No reaching for objects; no laughing or squealing
9 months   No babbling; no joint attention (pointing/following gaze)
12 months  No gesture (waving, pointing); no functional object use
18 months  No pretend play; fewer than 10 words; no parallel play
24 months  No 2-word phrases; no symbolic play; stuck in solitary play
36 months  Cannot engage in simple dramatic play; no peer interaction
4 years    Cannot engage in cooperative play; aggressive disruption of play
5+ years   Cannot follow rules in structured games; excluded by peers
Any age    Regression to earlier play stages (especially after a stressor)
           Repetitive, stereotyped play without variation (consider ASD)
           Play that is consistently aggressive or sexualized
           Inability to shift between play themes
ASD-Specific Red Flags in Play:
  • Absent or minimal pretend/symbolic play
  • No interest in interactive or shared play
  • Repetitive, stereotyped use of objects (spinning wheels, lining up)
  • Little or no imitation of others
  • No sociodramatic play by age 3
Reference: Cummings Otolaryngology - "Lack of symbolic play is listed as one of the earliest markers differentiating ASD from typical development and from specific language impairment."

9. PLAY ASSESSMENT

OVERVIEW

PLAY ASSESSMENT APPROACH
         │
         ├── 1. CLINICAL OBSERVATION
         │         (naturalistic, structured, or semi-structured)
         │
         ├── 2. PARENT/CAREGIVER INTERVIEW
         │         (history, preferences, home play behaviors)
         │
         └── 3. STANDARDIZED ASSESSMENTS
                   (norm-referenced or criterion-referenced tools)

9.1 CLINICAL OBSERVATION

Observe the child across three domains during play:
DomainWhat to Observe
CognitiveProblem-solving, symbolic use, attention span, sequencing
Social-EmotionalEye contact, turn-taking, affect, relatedness to examiner/caregiver
SensorimotorCoordination, motor control, sensory responses, tool use
From Kaplan & Sadock Comprehensive Textbook: "During imaginative play, the clinician can observe the child's coordination and motor capacities, speech and language development, attention span, readiness to engage the interviewer, capacity for complex thought."
Structured Observation Tips:
  • Provide open-ended toys (blocks, dolls, play-dough)
  • Observe in both child-led and therapist-directed conditions
  • Note quality of play: flexibility, creativity, affect, persistence
  • Note what is absent (e.g., no imitation, no pretend, no peer engagement)

9.2 PARENT/CAREGIVER INTERVIEW

Key questions to cover:
  • What does the child enjoy playing? Alone or with others?
  • Does the child engage in pretend play? Can they describe scenarios?
  • Does the child play differently at home vs. school vs. unfamiliar settings?
  • Are there preferred objects, repetitive play patterns?
  • Has play changed recently (regression, loss of interest)?
  • Does the child invite others to play or prefer isolation?

9.3 STANDARDIZED PLAY ASSESSMENTS

ToolAge RangeWhat It MeasuresUsed By
Test of Playfulness (ToP)6 mo - 18 yrPlayfulness using Bundy's model (intrinsic motivation, internal control, freedom from reality)OT
Revised Knox Preschool Play Scale (RKPPS)0 - 6 yrSpace management, material management, imitation, participationOT
Symbolic Play Test (SPT)1 - 3 yrSymbolic play level; non-verbal cognitive abilitySLP, OT
Westby Play Scale9 mo - 5 yrSequential symbolic play developmentSLP, OT
Child-Initiated Pretend Play Assessment (ChIPPA)3 - 7 yrElaborateness and spontaneity of pretend playOT
Play History (Takata)All agesInterview-based occupational history of playOT
Transdisciplinary Play-Based Assessment (TPBA)Birth - 6 yrMulti-domain developmental assessment through playAll disciplines

10. PLAY AS AN INTERVENTION

PLAY-BASED INTERVENTION
              │
     ┌────────┼─────────────────────────────────┐
     │        │              │                  │
    OT       PT             SLP            PSYCHOLOGY /
                                          SPECIAL ED

10.1 OCCUPATIONAL THERAPY

  • Play IS both the means AND the end in OT (AOTA framework)
  • Play as means: Uses play to develop sensory processing, fine motor skills, ADL skills, social participation
  • Play as end: Restores the child's ability to engage in play as a meaningful occupation
  • Approaches: Sensory Integration (Ayres), DIR/Floortime, NDT, CO-OP, Social Thinking
  • Setting: Clinic, home, school, hospital (Child Life specialist model)

10.2 PHYSIOTHERAPY

  • Uses play to achieve motor goals: balance, coordination, strength, gait
  • Play-based exercise (obstacle courses, ball games) improves engagement
  • Used in: Cerebral palsy, developmental delay, post-surgical rehab, pediatric neurology
  • Key principle: The child doesn't know they're "doing therapy" - they're just playing

10.3 SPEECH-LANGUAGE THERAPY

  • Play provides the natural context for language intervention
  • Joint attention, turn-taking, narrative play all targeted through play
  • Symbolic play level correlates with language level - low symbolic play = language delay risk
  • Approaches: SCERTS, Hanen (It Takes Two to Talk), DIR/Floortime
  • Assesses play to determine cognitive-linguistic readiness for specific therapy targets

10.4 PSYCHOLOGY

  • Play Therapy: Structured or non-directive therapeutic use of play to address emotional/behavioral issues
  • Developed by Virginia Axline; based on client-centered principles
  • Child uses play to express what they cannot verbalize
  • Used in: Trauma, anxiety, ADHD, family disruption, grief, abuse
  • Cooperative play and trauma-processing activities shown to improve PTSD outcomes in children
From Kaplan & Sadock Comprehensive Textbook: "Subjects treated with trauma-processing activities, cooperative play, and creative-expressive elements improved and maintained improvement over 6 months in measurements of PTSD symptoms and hope."

10.5 SPECIAL EDUCATION

  • Play-based learning embedded in curriculum for children with disabilities
  • Peer-mediated play interventions for children with ASD
  • Structured play groups to build social communication
  • Sociodramatic play used to develop literacy, numeracy, and executive function

11. CLINICAL APPLICATION / CASE EXAMPLE

Case: Aarav, 3.5 years, referred for developmental concern
Presenting concern: Parents report child "plays alone all the time," "doesn't play with other kids," "lines up toys and screams when moved."
Play Assessment Findings:
  • No symbolic or pretend play observed (only functional/exploratory)
  • No imitation of examiner's actions
  • Object play: repetitive (spins wheels of car only, no functional car play)
  • Social play: no eye contact during play, does not direct examiner's attention
  • Parent report: no role-play at home, prefers same toys daily
Clinical Interpretation:
  • Social play: Solitary (Parten Stage 2) - expected for 1-2 years, not 3.5 years
  • Cognitive play: Functional only (Smilansky Stage 1) - expected for 0-2 years
  • Piaget level: Remains in sensorimotor; no evidence of symbolic/preoperational play
Red Flags identified:
  • Absent symbolic play at 3.5 years
  • No imitation
  • Repetitive stereotyped object use
  • No peer-directed play
  • => Referral for ASD evaluation + speech, OT, and developmental pediatrics
Intervention Plan:
  • OT: Sensory integration + DIR/Floortime to develop symbolic play
  • SLP: Target joint attention and early symbolic play using SCERTS framework
  • Psychology: Parent-mediated play coaching
  • Special Ed: Structured peer play group

12. KEY TAKE-HOME MESSAGES

┌─────────────────────────────────────────────────────────────────┐
│                   KEY TAKE-HOME MESSAGES                        │
│                                                                 │
│  1. Play is the PRIMARY OCCUPATION of childhood - not optional  │
│                                                                 │
│  2. Play reflects ALL domains of development simultaneously     │
│                                                                 │
│  3. THREE frameworks (Parten, Piaget, Smilansky) are           │
│     COMPLEMENTARY lenses - use all three in assessment          │
│                                                                 │
│  4. Symbolic/pretend play is the MOST sensitive early marker    │
│     of cognitive and social-communicative development           │
│                                                                 │
│  5. ABSENT pretend play by 18 months = RED FLAG for ASD        │
│                                                                 │
│  6. Play assessment = developmental assessment                  │
│     (you learn cognition, language, motor, social all at once)  │
│                                                                 │
│  7. All therapists use play - OT, PT, SLP, Psychology all have  │
│     play-based approaches specific to their domain              │
│                                                                 │
│  8. A child who cannot play cannot fully participate in         │
│     childhood occupations - this is a clinical emergency        │
└─────────────────────────────────────────────────────────────────┘

13. CONCLUSION

Play is far more than entertainment. It is the mechanism through which children develop cognitively, emotionally, socially, linguistically, and motorically. The three major classification frameworks - Parten's social stages, Piaget's cognitive stages, and Smilansky's functional categories - provide a rich multi-dimensional lens for assessment. Clinically, the absence or regression of play is a sentinel event that warrants systematic evaluation. Every pediatric clinician, regardless of discipline, must be fluent in the language of play because it is how children speak about their development.

14. REFERENCES

  • Kaplan & Sadock's Synopsis of Psychiatry, 12th Edition - Sections on Normal Child Development, Preschool Milestones, School-Age Development
  • Kaplan & Sadock's Comprehensive Textbook of Psychiatry, 11th Edition - Piaget's Theory of Stages; Child Interview; Pediatric Hospitals
  • Parten, M.B. (1932). Social participation among preschool children. Journal of Abnormal and Social Psychology, 27(3), 243-269
  • Piaget, J. (1962). Play, Dreams and Imitation in Childhood. Norton
  • Smilansky, S. (1968). The Effects of Sociodramatic Play on Disadvantaged Preschool Children. Wiley
  • Bundy, A.C. (1993). Assessment of play and leisure: Delineation of the problem. American Journal of Occupational Therapy, 47(3), 217-222
  • Westby, C.E. (1980). Assessment of cognitive and language abilities through play. Language, Speech, and Hearing Services in Schools, 11(3), 154-168
  • AOTA (2020). Occupational Therapy Practice Framework: Domain and Process, 4th Edition
  • UN Convention on the Rights of the Child, Article 31 (1989)

Tip for Study: Master Parten's 6 stages with their ages and social features. Know Piaget's 3 play stages as extensions of his cognitive stages. Know Smilansky's 4 categories as the most clinically practical framework - especially for OT, SLP, and special education settings. Always link absent symbolic play to ASD screening.

ok orris, now the thing i expect is to do a topic dicussion in paeds for abt 15 mins to my interdiciplinary team in clinic, kinda oral seminnar on play, im an occupational therapist

Asking for Preferences
Perfect. A full spoken script for an OT presenting to OT + PT + SLP + Psychologist. Here it is - timed, conversational, and pitched at the right clinical level for that team.

ORAL SEMINAR SCRIPT

"Play: The Occupation of Childhood"

Presenter: Occupational Therapist | Duration: ~15 minutes

Audience: OT, PT, SLP, Psychologist


TIMING GUIDE
  • Opening + Definition: 2 min
  • Why Play Matters: 1.5 min
  • Play Development Across Ages: 2.5 min
  • Classifications (Parten, Piaget, Smilansky): 4 min
  • Red Flags: 2 min
  • Our Roles as a Team: 2 min
  • Closing + 1 question: 1 min

OPENING (0:00 - 0:45)

[Pause. Make eye contact with the room. Then begin.]
"Good morning everyone. Thank you for joining this session.
I want to start with a question. Think back to when you were five or six years old. What were you doing after school?
You were playing.
Not because someone told you it was good for your development. Not because it was on a therapy plan. You played because it was the most important thing in your world.
That instinct - that drive to play - is what we're talking about today. Because as a team working with pediatric patients, play is not background noise. It is the primary occupation of childhood, and it is the single most powerful window we have into a child's development."

DEFINITION (0:45 - 2:00)

"So let's start with what play actually is - because it sounds obvious until you try to define it.
Occupational therapist Mary Reilly put it best: 'Play is the arena in which children practice the skills and roles necessary for adult life.'
But the most useful clinical definition comes from Bundy's framework, which most of you in OT will be familiar with. Bundy says play has three core qualities:
First - intrinsic motivation. The child is doing it purely because it is pleasurable. There's no reward on the other side.
Second - internal locus of control. The child is in charge. They're directing the action.
And third - freedom from reality. The child can suspend the rules of the real world. A stick can be a sword. A box can be a spaceship. That 'what if' space is where the magic happens developmentally.
If those three qualities are present, you have play. If they're absent - if the child is being directed, rewarded, or constrained to reality - you have something else. You have instruction. And that distinction matters clinically."

WHY PLAY MATTERS (2:00 - 3:30)

"Now I know our team doesn't need convincing that play is important. But I want to briefly frame what it builds, because each of us has a stake in a different domain.
For our SLP colleagues - play is the natural incubator for language. Vocabulary, narrative, turn-taking, pragmatics - they all emerge through play before they ever emerge in a clinic room.
For PT - gross motor coordination, balance, proprioception, strength - children build all of this on the playground, not on a mat. Play is the most ecologically valid motor therapy context we have.
For Psychology - play is the child's language. It's how they process stress, regulate emotion, and work out what they don't yet have words for. Play therapy exists because children cannot always verbalize what has happened to them.
And for us in OT - play is both the means and the end. We use play to develop skills, and we restore play as a meaningful occupation. It sits at the very heart of our practice framework.
The UN Convention on the Rights of the Child recognizes play as a fundamental right of every child. Article 31. So when a child cannot play - we are not dealing with a developmental inconvenience. We are dealing with a rights issue."

PLAY DEVELOPMENT ACROSS AGE GROUPS (3:30 - 6:00)

"Let me now walk you through what play looks like at different ages - quickly, so we can use this as a shared reference point across the team.
Birth to 6 months - play at this stage is entirely sensorimotor. The caregiver is the toy. We're talking gaze, vocal turn-taking, touching and mouthing objects. The baby is essentially running experiments on the world through their senses.
6 to 12 months - object exploration becomes purposeful. The child bangs, drops, throws, and mouths. Peek-a-boo becomes meaningful here because object permanence is developing around 9 months. Joint attention emerges - that beautiful moment where a child looks at an object, then looks at you, then back at the object. That is a massive communicative milestone, and you SLP colleagues know exactly how much work hangs on that skill.
1 to 2 years - functional use of objects. The child puts the phone to their ear. Touches the comb to their hair. Early pretend begins - they pretend to eat or sleep using their own body. Block towers go up. Shapes get sorted. This is the beginning of symbolic cognition.
2 to 3 years - symbolic play expands. Now a block becomes a car. Now they're feeding you with an empty spoon. This is the age of parallel play - playing beside another child, not with them, but aware of them.
3 to 5 years - this is the golden age of dramatic play. Children act out entire scenarios - playing house, playing doctor, playing school. Associative play transitions to cooperative play by age 4. Imaginary companions are common and perfectly normal - studies suggest up to 50% of children between 3 and 10 have one at some point.
5 to 12 years - play becomes rule-governed. Games with structure, teams, organized sports, board games, hobbies. Peer relationships dominate the social play context.
Adolescence - play transforms into leisure and recreation. Sports, music, art, social groups, gaming. The word 'play' changes but the function - exploration, identity, social connection - does not."

CLASSIFICATIONS OF PLAY (6:00 - 10:00)

"Now let's look at how we classify play - because having a shared language across our team makes assessment and communication a lot cleaner. There are three major frameworks, and I want to walk you through each one.

FRAMEWORK 1: PARTEN'S SOCIAL STAGES - 1932
Mildred Parten classified play by how socially complex it is. Six stages, broadly sequential.
Unoccupied play - no real engagement, just random movement. Birth to a few months.
Solitary play - the child plays completely alone and is not interested in what others are doing. Normal and healthy in infancy.
Onlooker play - the child watches others play but doesn't join. They're learning by watching. This is observational learning in action.
Parallel play - the child plays beside another child with similar toys, but there's no interaction. No shared goal. This is normal at 2 to 2.5 years.
Associative play - now there's interaction. They share toys, they talk, there's a loose common theme. But still no organized structure. Around age 3.
And finally, cooperative play - organized group activity with defined roles, rules, turn-taking, and a common goal. This requires empathy, negotiation, and inhibitory control. Typically emerges around age 4 and strengthens through middle childhood.
For our psychology colleagues, you'll recognize that regression to earlier social stages - particularly sustained solitary play in a 4 or 5 year old - is a clinically significant flag.

FRAMEWORK 2: PIAGET'S COGNITIVE STAGES OF PLAY
Piaget linked play directly to his cognitive stages, and his core insight was that play is the child assimilating the world - making the world fit their existing understanding.
Practice or Sensorimotor play - birth to 2 years. Repetitive actions for pleasure. Banging a spoon. Rolling a ball. The child is consolidating motor schemas. Pure repetition. Pure assimilation.
Symbolic or Pretend play - 2 to 7 years, the preoperational stage. This is where the semiotic function emerges - the ability to let one thing stand for another. Piaget himself wrote: 'a little girl may pretend that she is asleep, that a box is her pet cat, or that she is in a church. In each instance, symbols are generated to express everything in the child's life experience that cannot be formulated and assimilated by means of language alone.'
This is profound. Symbolic play is not just a cute behavior. It is evidence that the child has developed the internal cognitive machinery to represent reality.
Games with Rules - age 7 onward. Concrete operational stage. The child now not only follows rules but creates them and defends them. This is where logical reasoning enters play.

FRAMEWORK 3: SMILANSKY'S FUNCTIONAL CLASSIFICATION - 1968
Sara Smilansky built on Piaget and created the most practically useful classification for classroom and clinic settings.
Functional play - sensorimotor, repetitive, 0 to 2 years. Same as Piaget's Practice play.
Constructive play - this is Smilansky's addition. Using materials to make something. Blocks, sand, puzzles, drawing. This is the most common type of play in preschool settings - accounting for about half of all observed play. Problem-solving, spatial reasoning, and persistence all get built here.
Dramatic play - role-playing and acting out scenarios. When two or more children do this together, it becomes sociodramatic play - which is one of the highest forms of play developmentally. It demands theory of mind, shared narrative, turn-taking, and language negotiation simultaneously.
Games with rules - same as Piaget. Structured activity with agreed rules.

One final point on classification. These three frameworks are complementary lenses, not competing theories. When you assess a child, you can describe their play from all three angles at once. 'This 4-year-old is engaging in parallel play at most' - that's Parten. 'With limited symbolic representation' - that's Piaget. 'Predominantly functional, no constructive or dramatic play observed' - that's Smilansky. Three statements, one child, complete picture."

RED FLAGS IN PLAY DEVELOPMENT (10:00 - 12:00)

"Now the bit that ties it all together clinically - what should make us stop and act.
I'll keep this tight because you'll all recognize these from your own practice.
By 12 months - no functional object use. No gesture. No joint attention.
By 18 months - no pretend play of any kind. No symbolic object use. Fewer than 10 words.
By 24 months - still no symbolic play. Child cannot use one object to represent another. Stuck in solitary play only. No two-word combinations.
By 36 months - no dramatic or role play. No engagement with peers in any form of cooperative activity.
At any age - play that is repetitive and stereotyped with no variation. Play that never evolves. Objects used in ritualized, inflexible ways. These are ASD flags.
I want to emphasize one in particular that often gets missed: the child who appears to play but whose play is rigid. They might be stacking blocks perfectly - but always the same color, always the same tower, and they are distressed if it changes. That's not constructive play. That's stereotypy in the guise of play.
And from an emotional standpoint, our psychology colleagues should note: regression in play after a stressor - the 6 year old who suddenly goes back to mouthing objects, or the 8 year old who can only play in solitary mode - is a significant signal of psychological distress.
Sexualized or aggressively scripted play that the child cannot shift away from - that should always prompt a careful trauma and safeguarding screen."

OUR ROLES AS A TEAM (12:00 - 14:00)

"So what does this mean for each of us, practically, in the clinic?
As the occupational therapist, I use play as both my assessment medium and my primary intervention. I'm looking at how the child uses objects, how they engage in symbolic play, how they regulate themselves during play transitions, and how play fits into their daily occupational roles at home and school. My interventions use sensory integration, DIR/Floortime, and structured play to build the actual capacity to play.
For PT - your play-based interventions are the most motivating motor therapy a child will experience. An obstacle course is not just fun - it is targeted gross motor therapy delivered in a context the child actually wants to be in. When a child doesn't want to come to therapy, making it a play context changes everything.
For SLP - play assessment tells you the child's cognitive-linguistic readiness. A child's symbolic play level and language level are closely correlated. If I tell you this child has no symbolic play, that tells you something immediate about what language targets are realistic. And joint attention work, turn-taking, narrative building - these all live inside play.
For Psychology - play therapy gives children a way to communicate when words are not yet available or when the experience was too overwhelming for language. Non-directive play therapy, trauma-focused play work, and social skills play groups are all powerful tools that you're already using.
As a team, our shared language matters enormously. When I write in a report that a child is at the 'parallel play' level socially, when the SLP notes 'symbolic play is absent,' when PT observes 'the child cannot engage in cooperative gross motor games with peers' - we are all saying something coordinated about that child's developmental profile. That coordination is what drives a cohesive treatment plan.
The ideal is transdisciplinary play-based assessment - where we observe play together, discuss it together, and plan together. That is the gold standard."

CLOSING (14:00 - 15:00)

"To bring it home.
Play is how children speak before they have words. It's how they think before they have logic. It's how they relate before they have social scripts. It is not a break from development. It is development.
When a child in our clinic cannot play - whether because of a motor barrier, a language barrier, a sensory processing difficulty, or an emotional wound - that child is not just missing fun. They are missing the most fundamental occupation of their developmental stage.
Our job, collectively, is to understand play well enough to recognize when it's going wrong, to assess it with precision, and to intervene with intention.
I'll leave you with one question for reflection - one you can carry into your next pediatric session:
'Am I watching this child play, or am I watching a child go through the motions?'
Because the difference between those two things is the difference between a developmental strength and a clinical flag.
Thank you."
[Pause for questions.]

OPTIONAL: QUICK TALKING POINTS FOR Q&A

If someone asks about ASD and play: "Absent symbolic play by 18 months is one of the earliest and most sensitive behavioral markers. We look for: no pretend, no imitation, no sociodramatic play, stereotyped object use."
If a PT asks how they can assess play: "TPBA - Transdisciplinary Play-Based Assessment - is a wonderful tool precisely because it's designed for all of us to use together. You don't need to be an OT to observe play; you need to know what you're looking for."
If psychology asks about play therapy evidence: "There's good evidence for trauma-focused play therapy in children with PTSD. A study cited in Kaplan & Sadock showed children treated with cooperative play and creative-expressive elements maintained PTSD symptom improvement over 6 months."
If someone asks what to do when a child 'won't play' in a session: "That's itself important data. A child who refuses play is telling you something - about anxiety, sensory overwhelm, past failure experiences, or the therapeutic relationship. Don't push through it; assess it."

PRESENTER TIPS:
  • Speak at a relaxed pace - 15 minutes is generous for this content
  • Make eye contact with different team members when naming their profession
  • The opening question ("what were you doing after school?") creates immediate engagement
  • You don't need slides - but if you want one visual, write Parten's 6 stages on a whiteboard during that section
  • Your strength as the OT presenter is that you own this topic - own it confidently

generate a handwritten notes format with all important content in it

Asking for Preferences
Generating Image

Handwritten student medical/clinical notes on lined white paper, written with a blue ballpoint pen in neat but natural handwriting style. The page looks like real clinical study notes with the following content exactly: At the top center, large underlined heading: "PLAY: THE OCCUPATION OF CHILDHOOD" Below it, smaller: "OT Seminar Notes | Interdisciplinary Team" A horizontal divider line. Section heading (underlined, blue): "1. DEFINITION OF PLAY" Bullet points in handwriting: • Reilly (OT): "Play = arena where children practice skills & roles for adult life" • Bundy's 3 Core Qualities: 1. Intrinsic motivation – done for pleasure, no external reward 2. Internal locus of control – child directs the action 3. Freedom from reality – "what if" space; stick = sword, box = spaceship • Piaget: Play = pure assimilation (making world fit child's schema) • AOTA: Spontaneous/organized activity providing enjoyment & diversion Section heading (underlined): "2. CHARACTERISTICS OF PLAY" Small boxes drawn around each characteristic in a row: [ Intrinsically Motivated ] [ Freely Chosen ] [ Process > Product ] [ Non-literal / Symbolic ] [ Positive Affect ] [ Active Engagement ] [ Safe Exploration ] Short note below: "Child plays because it's pleasurable — not because it's on the therapy plan!" Section heading (underlined): "3. WHY PLAY MATTERS — Domains" A simple hand-drawn spider/mind-map with "PLAY" in a circle in the center, and 6 branches radiating out: → COGNITIVE: problem-solving, creativity, attention, memory → LANGUAGE: vocabulary, narrative, turn-taking, pragmatics → SOCIAL: empathy, cooperation, Theory of Mind, conflict resolution → EMOTIONAL: self-regulation, frustration tolerance, expression → MOTOR: gross & fine motor, sensory integration, tool use → IDENTITY: mastery, autonomy, role exploration, self-concept Small star note at bottom: "★ UN Convention on Rights of the Child, Article 31 — Play is a FUNDAMENTAL RIGHT" The page looks slightly worn, with ruled lines visible, and the handwriting is neat, genuine-looking student clinical notes. Include small arrows, underlines, stars for emphasis throughout. Page number "1" at bottom right.

u thr?

Generating Image

Handwritten clinical student notes on ruled white paper, written in blue ballpoint pen, neat natural handwriting, genuine study notes style with lined paper visible in background. TOP CENTER - Large underlined title: "PLAY: The Occupation of Childhood" Below: "(OT Seminar | Interdisciplinary Team)" in smaller writing Thick horizontal line underneath. SECTION 1 - Bold underlined: "DEFINITION" - Reilly (OT): "Play = arena to practice skills & roles for adult life" - Bundy's 3 Core Qualities (numbered list with small checkbox bullets): 1. Intrinsic motivation → no external reward 2. Internal locus of control → child directs the action 3. Freedom from reality → "what if" space / stick = sword - Piaget → pure assimilation (world fits child's schema) - AOTA → spontaneous activity providing enjoyment & diversion Small arrow note: "If these 3 are ABSENT → it's instruction, not play!" SECTION 2 - Bold underlined: "CHARACTERISTICS OF PLAY" Seven small hand-drawn boxes in a row each containing one word, like sticky notes: [Intrinsic] [Freely Chosen] [Process>Product] [Non-literal] [+ve Affect] [Active] [Safe Exploration] SECTION 3 - Bold underlined: "WHY PLAY MATTERS" Hand-drawn mind map: circle in center with "PLAY" written inside, 6 arrows radiating outward with labels: → COGNITIVE: problem-solving, attention, memory, creativity → LANGUAGE: vocab, narrative, turn-taking, pragmatics → SOCIAL: empathy, cooperation, Theory of Mind → EMOTIONAL: self-regulation, coping, expression → MOTOR: gross/fine motor, sensory integration → IDENTITY: mastery, autonomy, role exploration Bottom of page, starred box: "★ UN CRC Article 31 = Play is a FUNDAMENTAL RIGHT of every child ★" Page number "1" at bottom right corner. Ruled lines visible throughout. Natural handwriting variation, occasional underlines and stars for emphasis.

!

404 Not Found. {'message': '{\n "error": {\n "code": 404,\n "message": "Publisher model `projects/engaged-beaker-474810-u2/locations/global/publishers/google/models/gemini-3-pro-image-preview` was not found or your project does not have access to it. Ensure you are using a valid model name and that the model is available in the specified region. For more information, see: https://docs.cloud.google.com/gemini-enterprise-agent-platform/resources/locations.",\n "status": "NOT_FOUND"\n }\n}\n', 'status': 'Not Found'}

We encountered an error while processing your request. Please try again or reach out to us for help.

again?

Yes, still here! The image generation tool is running into a backend error on my end (model unavailability) - it's not something you did wrong.
Let me try a different approach and build the handwritten notes as a downloadable PDF using Python in the sandbox, which will render it to look like handwritten notes on lined paper. That will actually give you a better, printable result anyway.
Want me to go ahead with that? It'll be ready in about a minute.

okay sure

Running Command

ls /tmp/workspace/ && pip show reportlab pillow 2>&1 | grep -E "Name|Version|not found" && python3 -c "from reportlab.lib.pagesizes import A4; print('reportlab OK')" && python3 -c "from PIL import Image; print('PIL OK')" && fc-list | grep -i "caveat\|patrick\|indie\|kalam\|handlee" | head -5

Running Command

fc-list | grep -i "handwriting\|cursive\|hand\|script\|caveat\|kalam\|indie\|patrick\|handlee\|dancing" | head -20

Running Command

pip install --user requests 2>/dev/null; python3 -c " import urllib.request, os # Download Caveat (handwriting) font from Google Fonts url = 'https://github.com/google/fonts/raw/main/ofl/caveat/Caveat-Regular.ttf' out = '/tmp/workspace/Caveat-Regular.ttf' try: urllib.request.urlretrieve(url, out) print('Downloaded:', os.path.getsize(out), 'bytes') except Exception as e: print('Failed:', e) "

Running Command

python3 -c " import urllib.request, os urls = [ 'https://github.com/google/fonts/raw/refs/heads/main/ofl/caveat/Caveat%5Bwght%5D.ttf', 'https://fonts.gstatic.com/s/caveat/v18/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9eIWpZA.woff2', ] for url in urls: try: out = '/tmp/workspace/Caveat.ttf' urllib.request.urlretrieve(url, out) print('Downloaded from', url, os.path.getsize(out), 'bytes') break except Exception as e: print('Failed', url, e) "

Writing File

~/play_notes.py

"""
Handwritten-style clinical notes PDF generator
Topic: Play - The Occupation of Childhood
"""

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import math, os, random

# ── Register handwriting font ───────────────────────────────────────────────
FONT_PATH = "/tmp/workspace/Caveat.ttf"
pdfmetrics.registerFont(TTFont("Caveat", FONT_PATH))
pdfmetrics.registerFont(TTFont("CaveatBold", FONT_PATH))   # use same for bold look

OUTPUT = "/tmp/workspace/Play_Handwritten_Notes.pdf"

W, H = A4          # 595.27 x 841.89 pt
MARGIN_L = 55
MARGIN_R = W - 30
MARGIN_TOP = H - 30
MARGIN_BOT = 40
LINE_GAP = 22       # ruled-line spacing
BLUE = colors.HexColor("#1a3a6b")
RED  = colors.HexColor("#c0392b")
GREEN= colors.HexColor("#1e6b3a")
DARK = colors.HexColor("#1c1c2e")
PENCIL= colors.HexColor("#2255aa")
RULED= colors.HexColor("#c8d8f0")
MARGIN_LINE = colors.HexColor("#f4a0a0")

random.seed(42)

# ── Helpers ──────────────────────────────────────────────────────────────────

def draw_ruled_paper(c):
    """Draw lined-paper background."""
    c.setFillColor(colors.HexColor("#fefef8"))
    c.rect(0, 0, W, H, fill=1, stroke=0)
    # horizontal lines
    c.setStrokeColor(RULED)
    c.setLineWidth(0.5)
    y = MARGIN_TOP - 10
    while y > MARGIN_BOT:
        c.line(MARGIN_L - 10, y, MARGIN_R + 5, y)
        y -= LINE_GAP
    # red margin line
    c.setStrokeColor(MARGIN_LINE)
    c.setLineWidth(1.2)
    c.line(MARGIN_L - 2, MARGIN_BOT, MARGIN_L - 2, MARGIN_TOP)

def draw_page_number(c, n, total):
    c.setFont("Caveat", 13)
    c.setFillColor(colors.gray)
    c.drawCentredString(W/2, 22, f"— {n} / {total} —")

def htext(c, x, y, txt, size=15, color=DARK, bold=False, angle=0):
    """Draw handwriting-style text."""
    c.saveState()
    c.setFont("Caveat", size)
    c.setFillColor(color)
    if angle:
        c.translate(x, y)
        c.rotate(angle)
        c.drawString(0, 0, txt)
    else:
        c.drawString(x, y, txt)
    c.restoreState()

def section_title(c, x, y, txt, color=BLUE, size=19):
    """Underlined section heading."""
    c.setFont("Caveat", size)
    c.setFillColor(color)
    c.drawString(x, y, txt)
    tw = c.stringWidth(txt, "Caveat", size)
    c.setStrokeColor(color)
    c.setLineWidth(1.8)
    c.line(x, y - 3, x + tw, y - 3)
    return y - LINE_GAP - 4

def bullet(c, x, y, txt, size=14, color=DARK, symbol="•", sym_color=BLUE):
    c.setFont("Caveat", size)
    c.setFillColor(sym_color)
    c.drawString(x, y, symbol)
    c.setFillColor(color)
    c.drawString(x + 14, y, txt)

def sub_bullet(c, x, y, txt, size=13, color=DARK):
    c.setFont("Caveat", size)
    c.setFillColor(colors.HexColor("#555555"))
    c.drawString(x, y, "→")
    c.setFillColor(color)
    c.drawString(x + 14, y, txt)

def box_text(c, x, y, txt, size=13, bg=colors.HexColor("#e8f0fe"), border=BLUE):
    tw = c.stringWidth(txt, "Caveat", size) + 12
    th = 18
    c.setFillColor(bg)
    c.setStrokeColor(border)
    c.setLineWidth(1)
    c.roundRect(x, y - 3, tw, th, 4, fill=1, stroke=1)
    c.setFont("Caveat", size)
    c.setFillColor(BLUE)
    c.drawString(x + 6, y + 2, txt)
    return x + tw + 6

def star_box(c, x, y, w, lines, size=13, bg=colors.HexColor("#fff9e0"), border=colors.HexColor("#e0b800")):
    """Starred highlight box."""
    h = len(lines) * LINE_GAP + 12
    c.setFillColor(bg)
    c.setStrokeColor(border)
    c.setLineWidth(1.5)
    c.roundRect(x, y - h + 14, w, h, 6, fill=1, stroke=1)
    cy = y
    for line in lines:
        c.setFont("Caveat", size)
        c.setFillColor(colors.HexColor("#7a5900"))
        c.drawString(x + 8, cy, line)
        cy -= LINE_GAP

def draw_arrow(c, x1, y1, x2, y2, color=BLUE):
    c.setStrokeColor(color)
    c.setLineWidth(1.2)
    c.line(x1, y1, x2, y2)
    # arrowhead
    angle = math.atan2(y2 - y1, x2 - x1)
    al = 8
    ax = math.cos(angle)
    ay = math.sin(angle)
    c.line(x2, y2, x2 - al * ax + al/2 * ay, y2 - al * ay - al/2 * ax)
    c.line(x2, y2, x2 - al * ax - al/2 * ay, y2 - al * ay + al/2 * ax)

def divider(c, y, color=BLUE):
    c.setStrokeColor(color)
    c.setLineWidth(1.5)
    c.line(MARGIN_L - 10, y, MARGIN_R, y)

# ─────────────────────────────────────────────────────────────────────────────
# PAGE BUILDERS
# ─────────────────────────────────────────────────────────────────────────────

def page1(c):
    draw_ruled_paper(c)
    y = MARGIN_TOP - 15

    # Title
    c.setFont("Caveat", 26)
    c.setFillColor(BLUE)
    c.drawCentredString(W/2, y, "PLAY: The Occupation of Childhood")
    y -= 10
    c.setLineWidth(2.5); c.setStrokeColor(BLUE)
    c.line(MARGIN_L, y, MARGIN_R, y)
    y -= 8
    c.setFont("Caveat", 14); c.setFillColor(RED)
    c.drawCentredString(W/2, y, "OT Seminar Notes  |  Interdisciplinary Team  |  Paediatrics")
    y -= LINE_GAP + 6

    divider(c, y); y -= LINE_GAP

    # Section 1 - Definition
    y = section_title(c, MARGIN_L, y, "1.  DEFINITION OF PLAY", BLUE, 20)
    y -= 4
    bullet(c, MARGIN_L, y, "Reilly (OT, 1974):  \"Arena where children practice skills & roles for adult life\"")
    y -= LINE_GAP
    bullet(c, MARGIN_L, y, "Piaget:  Play = pure assimilation  (world fits child's schema)")
    y -= LINE_GAP
    bullet(c, MARGIN_L, y, "AOTA:  Spontaneous/organized activity providing enjoyment & diversion")
    y -= LINE_GAP + 4

    # Bundy box
    c.setFont("Caveat", 15); c.setFillColor(GREEN)
    c.drawString(MARGIN_L, y, "Bundy's 3 Core Qualities  ★ MOST IMPORTANT")
    tw = c.stringWidth("Bundy's 3 Core Qualities  ★ MOST IMPORTANT", "Caveat", 15)
    c.setStrokeColor(GREEN); c.setLineWidth(1.5)
    c.line(MARGIN_L, y-3, MARGIN_L+tw, y-3)
    y -= LINE_GAP

    c.setFont("Caveat", 14); c.setFillColor(DARK)
    items = [
        ("①", "Intrinsic Motivation", "done for pleasure — NO external reward"),
        ("②", "Internal Locus of Control", "child directs the action"),
        ("③", "Freedom from Reality", "\"what if\" space  →  stick = sword, box = spaceship"),
    ]
    for num, bold_part, rest in items:
        c.setFillColor(RED); c.setFont("Caveat", 15); c.drawString(MARGIN_L + 10, y, num)
        c.setFillColor(BLUE); c.setFont("Caveat", 15); c.drawString(MARGIN_L + 28, y, bold_part)
        bw = c.stringWidth(bold_part, "Caveat", 15)
        c.setFillColor(DARK); c.setFont("Caveat", 14); c.drawString(MARGIN_L + 30 + bw, y, f"  – {rest}")
        y -= LINE_GAP

    c.setFont("Caveat", 13); c.setFillColor(RED)
    c.drawString(MARGIN_L + 10, y, "⚠  If these 3 are ABSENT → it's instruction, not play!")
    y -= LINE_GAP + 8

    divider(c, y, colors.HexColor("#aaaaaa")); y -= LINE_GAP

    # Section 2 - Characteristics
    y = section_title(c, MARGIN_L, y, "2.  CHARACTERISTICS OF PLAY", BLUE, 18)
    y -= 4

    chars = ["Intrinsically\nMotivated", "Freely\nChosen", "Process\n> Product", "Non-literal\n/ Symbolic", "Positive\nAffect", "Active\nEngagement", "Safe\nExploration"]
    box_w = 70; box_h = 36; gap = 6
    bx = MARGIN_L
    for ch in chars:
        c.setFillColor(colors.HexColor("#dceeff"))
        c.setStrokeColor(BLUE)
        c.setLineWidth(1.2)
        c.roundRect(bx, y - box_h + 14, box_w, box_h, 5, fill=1, stroke=1)
        c.setFont("Caveat", 11); c.setFillColor(BLUE)
        lines_ch = ch.split("\n")
        ty = y + 4
        for lc in lines_ch:
            c.drawCentredString(bx + box_w/2, ty, lc)
            ty -= 14
        bx += box_w + gap
    y -= box_h + 8

    divider(c, y, colors.HexColor("#aaaaaa")); y -= LINE_GAP

    # Section 3 - Why Play Matters (mind map)
    y = section_title(c, MARGIN_L, y, "3.  WHY PLAY MATTERS  — Domains", BLUE, 18)
    y -= 8

    # Draw mind map
    cx = W/2; cy = y - 55
    c.setFillColor(BLUE); c.setStrokeColor(BLUE); c.setLineWidth(2)
    c.circle(cx, cy, 32, fill=1, stroke=1)
    c.setFont("Caveat", 16); c.setFillColor(colors.white)
    c.drawCentredString(cx, cy + 4, "PLAY")

    domains = [
        (0,    "COGNITIVE", "problem-solving, attention,\nmemory, creativity"),
        (60,   "LANGUAGE",  "vocabulary, narrative,\nturn-taking, pragmatics"),
        (120,  "SOCIAL",    "empathy, cooperation,\nTheory of Mind"),
        (180,  "EMOTIONAL", "self-regulation,\ncoping, expression"),
        (240,  "MOTOR",     "gross & fine motor,\nsensory integration"),
        (300,  "IDENTITY",  "mastery, autonomy,\nrole exploration"),
    ]
    domain_colors = [BLUE, GREEN, RED, colors.HexColor("#8b00aa"), colors.HexColor("#b35900"), colors.HexColor("#006666")]

    for i, (angle_deg, domain_name, detail) in enumerate(domains):
        angle = math.radians(angle_deg)
        r_inner = 35; r_label = 100
        lx = cx + r_label * math.cos(angle)
        ly = cy + r_label * math.sin(angle)
        ex = cx + r_inner * math.cos(angle)
        ey = cy + r_inner * math.sin(angle)
        draw_arrow(c, ex, ey, lx, ly, domain_colors[i])
        c.setFont("Caveat", 13); c.setFillColor(domain_colors[i])
        dlines = detail.split("\n")
        if lx > cx:
            c.drawString(lx + 6, ly + 8, domain_name)
            c.setFont("Caveat", 11); c.setFillColor(DARK)
            for di, dl in enumerate(dlines):
                c.drawString(lx + 6, ly + 8 - (di+1)*12, dl)
        else:
            tw2 = c.stringWidth(domain_name, "Caveat", 13)
            c.drawString(lx - tw2 - 6, ly + 8, domain_name)
            c.setFont("Caveat", 11); c.setFillColor(DARK)
            for di, dl in enumerate(dlines):
                tw3 = c.stringWidth(dl, "Caveat", 11)
                c.drawString(lx - tw3 - 6, ly + 8 - (di+1)*12, dl)

    y = cy - 80

    # Star box
    star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
        "★  UN Convention on Rights of the Child — Article 31",
        "    PLAY is a FUNDAMENTAL RIGHT of every child"
    ], size=14)
    y -= LINE_GAP * 2 + 6

    draw_page_number(c, 1, 5)
    c.showPage()


def page2(c):
    draw_ruled_paper(c)
    y = MARGIN_TOP - 15

    c.setFont("Caveat", 22); c.setFillColor(BLUE)
    c.drawString(MARGIN_L, y, "PLAY DEVELOPMENT ACROSS AGE GROUPS")
    y -= 8
    c.setLineWidth(2); c.setStrokeColor(BLUE)
    c.line(MARGIN_L, y, MARGIN_R, y)
    y -= LINE_GAP + 2

    age_groups = [
        ("0 – 3 months",  RED,   [
            "Sensory exploration & reflexive interaction",
            "Attends to faces, voices, contrasting visuals",
            "Social smiling ~6 weeks",
            "Early turn-taking via gaze & vocalization (proto-conversations)",
            "Play type: Reactive; caregiver-initiated"]),
        ("3 – 6 months",  colors.HexColor("#b35900"), [
            "Reaches & grasps objects; mouths for oral exploration",
            "Enjoys rattles, textures, visual mobiles",
            "Laughter during social games (peek-a-boo precursors)",
            "Cause-and-effect discovery begins",
            "Play type: Sensorimotor"]),
        ("6 – 12 months", GREEN, [
            "Bangs, drops, throws → exploring object properties",
            "Object permanence ~9 months → peek-a-boo meaningful now",
            "Joint attention emerges (pointing, following gaze)  ← SLP key milestone",
            "Functional object use: phone to ear, comb to hair",
            "Play type: Exploratory + early functional"]),
        ("1 – 2 years",   BLUE,  [
            "Functional object use (cup, spoon)",
            "Early pretend with OWN body (pretends to eat/sleep)",
            "Parallel play begins; sorts shapes/colours",
            "Builds 2-4 block towers; make-believe begins",
            "Play type: Functional + early symbolic"]),
        ("2 – 3 years",   colors.HexColor("#8b00aa"), [
            "Symbolic play expands: block = car, feeds mother",
            "Pretend sequences emerge",
            "Parallel play predominates",
            "Builds 6-block towers; completes simple puzzles",
            "Play type: Symbolic + parallel social"]),
        ("3 – 5 years",   RED,   [
            "Dramatic/pretend play flourishes (doctor, parent, teacher)",
            "Associative → cooperative play (by age 4-5)",
            "Imaginary companions possible (up to 50% of children!)",
            "Understands simple game rules",
            "Play type: Dramatic, associative, early cooperative"]),
        ("5 – 7 years",   GREEN, [
            "Cooperative play with rules established",
            "Board games, organized sports, team activities",
            "Understands fairness, competition, turn-taking",
            "Play type: Games with Rules + constructive"]),
        ("7 – 12 years",  BLUE,  [
            "Complex team games; hobbies emerge",
            "Rule-governed play dominates; logical strategy",
            "Peer relationships & social hierarchy in play",
            "Fantasy → structured creative activities",
            "Play type: Games with Rules + competitive + constructive"]),
        ("Adolescence",   colors.HexColor("#006666"), [
            "Play → leisure, recreation, social activities",
            "Sports, music, art, digital games, creative writing",
            "Identity exploration through hobbies & group membership",
            "Play type: Recreational/leisure + competitive/cooperative"]),
    ]

    for age, col, points in age_groups:
        if y < MARGIN_BOT + 60:
            c.showPage()
            draw_ruled_paper(c)
            y = MARGIN_TOP - 20

        # Age header pill
        aw = c.stringWidth(age, "Caveat", 14) + 16
        c.setFillColor(col)
        c.setStrokeColor(col)
        c.roundRect(MARGIN_L - 4, y - 4, aw, 20, 8, fill=1, stroke=0)
        c.setFont("Caveat", 14); c.setFillColor(colors.white)
        c.drawString(MARGIN_L + 4, y + 3, age)
        y -= LINE_GAP

        for p in points:
            if y < MARGIN_BOT + 20:
                c.showPage()
                draw_ruled_paper(c)
                y = MARGIN_TOP - 20
            bold = p.startswith("Play type")
            sym = "▸" if bold else "·"
            sc = col if bold else DARK
            c.setFont("Caveat", 13 if not bold else 14)
            c.setFillColor(col if bold else colors.HexColor("#555555"))
            c.drawString(MARGIN_L + 10, y, sym)
            c.setFillColor(col if bold else DARK)
            c.drawString(MARGIN_L + 22, y, p)
            y -= LINE_GAP - 2

        y -= 6

    draw_page_number(c, 2, 5)
    c.showPage()


def page3(c):
    draw_ruled_paper(c)
    y = MARGIN_TOP - 15

    c.setFont("Caveat", 22); c.setFillColor(BLUE)
    c.drawString(MARGIN_L, y, "CLASSIFICATION OF PLAY  —  Part 1")
    y -= 8
    c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
    y -= LINE_GAP + 2

    # ── PARTEN ───────────────────────────────────────────────────────────────
    y = section_title(c, MARGIN_L, y, "A.  PARTEN'S SOCIAL STAGES  (1932)", RED, 18)
    c.setFont("Caveat", 13); c.setFillColor(DARK)
    c.drawString(MARGIN_L, y, "Classified by DEGREE OF SOCIAL PARTICIPATION  →  6 stages, broadly sequential")
    y -= LINE_GAP + 2

    parten = [
        ("1. Unoccupied Play",  "0–3 mo",  "Random movements; no apparent purpose; no toy/person engagement"),
        ("2. Solitary Play",    "0–2 yr",  "Plays completely alone; no interest in others  ✓ Normal & healthy"),
        ("3. Onlooker Play",    "~2 yr",   "Watches others play but doesn't join  →  observational learning"),
        ("4. Parallel Play",    "2–2.5 yr","Plays BESIDE others with similar toys; NO interaction; no shared goal"),
        ("5. Associative Play", "3–4 yr",  "Interacts; shares toys/space; common theme BUT no organised goal"),
        ("6. Cooperative Play", "4+ yr",   "Organised group; common goal; defined roles, rules, turn-taking\n   Requires: empathy, negotiation, inhibitory control"),
    ]
    stage_colors = [colors.HexColor("#888888"), colors.HexColor("#3377cc"),
                    colors.HexColor("#33aa77"), colors.HexColor("#cc7733"),
                    colors.HexColor("#aa33aa"), RED]

    for i, (stage, age, desc) in enumerate(parten):
        sc = stage_colors[i]
        # Stage pill
        sw = c.stringWidth(stage, "Caveat", 14) + 14
        c.setFillColor(sc); c.roundRect(MARGIN_L, y - 3, sw, 19, 7, fill=1, stroke=0)
        c.setFont("Caveat", 14); c.setFillColor(colors.white)
        c.drawString(MARGIN_L + 7, y + 3, stage)
        # Age badge
        aw = c.stringWidth(age, "Caveat", 12) + 10
        c.setFillColor(colors.HexColor("#f0f0f0")); c.setStrokeColor(sc); c.setLineWidth(1)
        c.roundRect(MARGIN_L + sw + 6, y - 2, aw, 17, 5, fill=1, stroke=1)
        c.setFont("Caveat", 12); c.setFillColor(sc)
        c.drawString(MARGIN_L + sw + 11, y + 2, age)
        y -= LINE_GAP
        desc_lines = desc.split("\n")
        for dl in desc_lines:
            c.setFont("Caveat", 13); c.setFillColor(DARK)
            c.drawString(MARGIN_L + 16, y, dl)
            y -= LINE_GAP - 2
        y -= 3

    # Clinical note
    star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
        "⚠  Clinical: Regression to earlier stages (e.g. sustained solitary play in a 4-yr-old)",
        "    is a significant developmental FLAG  →  assess for ASD, anxiety, social disorder"
    ], size=13, bg=colors.HexColor("#fff0f0"), border=RED)
    y -= LINE_GAP * 2 + 14

    divider(c, y); y -= LINE_GAP

    # ── PIAGET ───────────────────────────────────────────────────────────────
    y = section_title(c, MARGIN_L, y, "B.  PIAGET'S COGNITIVE STAGES OF PLAY", GREEN, 18)
    c.setFont("Caveat", 13); c.setFillColor(DARK)
    c.drawString(MARGIN_L, y, "Play reflects how children PROCESS & ASSIMILATE the world")
    y -= LINE_GAP + 2

    piaget = [
        ("Stage 1: Practice (Sensorimotor) Play",
         "Birth – 2 yrs  |  Sensorimotor Stage",
         ["Repetition of motor actions for PLEASURE",
          "Examples: banging blocks, splashing water, rolling a ball",
          "Purpose: consolidating sensorimotor schemas",
          "Key feature: pure ASSIMILATION  →  child repeats what is known"],
         colors.HexColor("#3377cc")),
        ("Stage 2: Symbolic (Pretend) Play",
         "2 – 7 yrs  |  Preoperational Stage",
         ["Use of SYMBOLS  →  one thing represents another",
          "Examples: stick = sword; box = spaceship; doll = real baby",
          "Piaget: \"symbols express what language alone cannot formulate\"",
          "Features: deferred imitation, make-believe, role-playing",
          "Purpose: development of semiotic function"],
         GREEN),
        ("Stage 3: Games with Rules",
         "7+ yrs  |  Concrete Operational Stage",
         ["Structured games governed by AGREED rules",
          "Examples: chess, cricket, board games, team sports",
          "Child not only follows rules but CREATES & DEFENDS them",
          "Purpose: social coordination, logical reasoning, moral development"],
         RED),
    ]

    for stage_name, subtitle, points, sc in piaget:
        if y < MARGIN_BOT + 80:
            break
        sw = c.stringWidth(stage_name, "Caveat", 15) + 16
        c.setFillColor(sc); c.roundRect(MARGIN_L - 4, y - 4, sw, 22, 8, fill=1, stroke=0)
        c.setFont("Caveat", 15); c.setFillColor(colors.white)
        c.drawString(MARGIN_L + 4, y + 4, stage_name)
        y -= LINE_GAP + 2
        c.setFont("Caveat", 12); c.setFillColor(sc)
        c.drawString(MARGIN_L + 10, y, subtitle)
        y -= LINE_GAP
        for p in points:
            c.setFont("Caveat", 13); c.setFillColor(DARK)
            c.drawString(MARGIN_L + 14, y, "→  " + p)
            y -= LINE_GAP - 2
        y -= 6

    draw_page_number(c, 3, 5)
    c.showPage()


def page4(c):
    draw_ruled_paper(c)
    y = MARGIN_TOP - 15

    c.setFont("Caveat", 22); c.setFillColor(BLUE)
    c.drawString(MARGIN_L, y, "CLASSIFICATION  —  Part 2  &  RED FLAGS")
    y -= 8
    c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
    y -= LINE_GAP + 2

    # ── SMILANSKY ─────────────────────────────────────────────────────────────
    y = section_title(c, MARGIN_L, y, "C.  SMILANSKY'S CLASSIFICATION  (1968)", colors.HexColor("#8b00aa"), 18)
    c.setFont("Caveat", 13); c.setFillColor(DARK)
    c.drawString(MARGIN_L, y, "Most PRACTICALLY USEFUL for classroom & clinic settings  →  4 categories")
    y -= LINE_GAP + 2

    smil = [
        ("1. Functional Play",   "0–2 yrs",
         "Simple repetitive muscle actions ± objects",
         "Running, jumping, banging, rolling a ball",
         colors.HexColor("#3377cc")),
        ("2. Constructive Play", "2–6 yrs",
         "Using materials to CREATE or BUILD something",
         "Blocks, sand castles, drawing, puzzles  ← most common in preschool (~50%!)",
         GREEN),
        ("3. Dramatic Play",     "2–7 yrs",
         "Role-playing; acting out real or imagined scenarios",
         "Playing house/doctor/teacher  |  Sociodramatic = 2+ children together",
         RED),
        ("4. Games with Rules",  "6+ yrs",
         "Activities with pre-established rules accepted by all",
         "Cards, hide-and-seek, organised sports",
         colors.HexColor("#8b00aa")),
    ]

    for name, age, desc, example, sc in smil:
        sw = c.stringWidth(name, "Caveat", 14) + 14
        c.setFillColor(sc); c.roundRect(MARGIN_L, y - 3, sw, 19, 7, fill=1, stroke=0)
        c.setFont("Caveat", 14); c.setFillColor(colors.white)
        c.drawString(MARGIN_L + 7, y + 3, name)
        aw = c.stringWidth(age, "Caveat", 12) + 10
        c.setFillColor(colors.HexColor("#f0f0f0")); c.setStrokeColor(sc); c.setLineWidth(1)
        c.roundRect(MARGIN_L + sw + 6, y - 2, aw, 17, 5, fill=1, stroke=1)
        c.setFont("Caveat", 12); c.setFillColor(sc)
        c.drawString(MARGIN_L + sw + 11, y + 2, age)
        y -= LINE_GAP
        c.setFont("Caveat", 13); c.setFillColor(DARK); c.drawString(MARGIN_L + 14, y, desc)
        y -= LINE_GAP - 2
        c.setFont("Caveat", 12); c.setFillColor(colors.HexColor("#555555")); c.drawString(MARGIN_L + 14, y, "eg: " + example)
        y -= LINE_GAP + 2

    # Comparison mini-table
    y -= 4
    divider(c, y); y -= LINE_GAP
    y = section_title(c, MARGIN_L, y, "COMPARISON OF 3 FRAMEWORKS", BLUE, 17)

    headers = ["Framework", "Focus", "Stages", "Best used for"]
    rows = [
        ["Parten (1932)",    "Social complexity",   "6",  "Social skill assessment"],
        ["Piaget (1962)",    "Cognitive level",      "3",  "Developmental evaluation"],
        ["Smilansky (1968)", "Functional category",  "4",  "Clinic / classroom practice"],
    ]
    col_x = [MARGIN_L, MARGIN_L + 110, MARGIN_L + 240, MARGIN_L + 290]
    col_w = [108, 128, 48, 215]

    # Header row
    for i, h in enumerate(headers):
        c.setFillColor(BLUE)
        c.rect(col_x[i], y - 4, col_w[i], 19, fill=1, stroke=0)
        c.setFont("Caveat", 12); c.setFillColor(colors.white)
        c.drawString(col_x[i] + 4, y + 2, h)
    y -= LINE_GAP + 2

    row_colors = [colors.HexColor("#eef4ff"), colors.HexColor("#efffef"), colors.HexColor("#fff4ee")]
    for ri, row in enumerate(rows):
        for i, cell in enumerate(row):
            c.setFillColor(row_colors[ri]); c.setStrokeColor(colors.HexColor("#aaaaaa"))
            c.rect(col_x[i], y - 4, col_w[i], 18, fill=1, stroke=1)
            c.setFont("Caveat", 11); c.setFillColor(DARK)
            c.drawString(col_x[i] + 4, y + 1, cell)
        y -= LINE_GAP + 1

    c.setFont("Caveat", 13); c.setFillColor(GREEN)
    c.drawString(MARGIN_L, y - 2, "★  These 3 frameworks are COMPLEMENTARY lenses — use all 3 in assessment!")
    y -= LINE_GAP + 10

    divider(c, y); y -= LINE_GAP

    # ── RED FLAGS ─────────────────────────────────────────────────────────────
    y = section_title(c, MARGIN_L, y, "RED FLAGS IN PLAY DEVELOPMENT  ⚠", RED, 18)

    flags = [
        ("12 months",  "No functional object use; no gesture; no joint attention"),
        ("18 months",  "No pretend play; no symbolic object use; < 10 words"),
        ("24 months",  "No symbolic play; stuck in solitary play; no 2-word phrases"),
        ("36 months",  "No dramatic play; no peer engagement of any kind"),
        ("4–5 years",  "Cannot engage in cooperative play; aggressive disruption"),
        ("Any age",    "Repetitive/stereotyped play with NO variation  →  ASD flag"),
        ("Any age",    "Regression to earlier play stages after a stressor"),
        ("Any age",    "Sexualized/aggressive scripted play child can't shift from  →  trauma screen"),
    ]

    for age_f, flag in flags:
        aw = c.stringWidth(age_f, "Caveat", 12) + 10
        c.setFillColor(RED); c.roundRect(MARGIN_L, y - 2, aw, 17, 5, fill=1, stroke=0)
        c.setFont("Caveat", 12); c.setFillColor(colors.white); c.drawString(MARGIN_L + 5, y + 2, age_f)
        c.setFont("Caveat", 13); c.setFillColor(DARK); c.drawString(MARGIN_L + aw + 8, y + 2, flag)
        y -= LINE_GAP

    # ASD specific
    y -= 4
    star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
        "ASD Red Flags in Play:",
        "  ✗ Absent/minimal pretend or symbolic play",
        "  ✗ No interest in interactive/shared play",
        "  ✗ Repetitive stereotyped object use (spinning, lining up)",
        "  ✗ No imitation; no sociodramatic play by age 3"
    ], size=13, bg=colors.HexColor("#fff0f0"), border=RED)

    draw_page_number(c, 4, 5)
    c.showPage()


def page5(c):
    draw_ruled_paper(c)
    y = MARGIN_TOP - 15

    c.setFont("Caveat", 22); c.setFillColor(BLUE)
    c.drawString(MARGIN_L, y, "ASSESSMENT  |  INTERVENTION  |  KEY MESSAGES")
    y -= 8
    c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
    y -= LINE_GAP + 2

    # Assessment
    y = section_title(c, MARGIN_L, y, "PLAY ASSESSMENT", BLUE, 18)

    c.setFont("Caveat", 14); c.setFillColor(GREEN)
    c.drawString(MARGIN_L, y, "3 Approaches:")
    y -= LINE_GAP

    approaches = [
        ("1. Clinical Observation",
         ["Observe: cognitive (problem-solving, symbolic), social-emotional (eye contact, affect),",
          "  sensorimotor (coordination, tool use)",
          "\"During imaginative play, observe: motor, speech/language, attention,",
          "  capacity for complex thought\"  — Kaplan & Sadock",
          "Tip: observe in CHILD-LED and THERAPIST-DIRECTED conditions"]),
        ("2. Parent/Caregiver Interview",
         ["What does child enjoy? Alone or with others?",
          "Any pretend play? Describe scenarios?",
          "Preferred objects? Repetitive patterns?",
          "Recent change in play? (regression is significant)"]),
        ("3. Standardised Play Assessments",
         []),
    ]

    for name, pts in approaches:
        c.setFillColor(BLUE); c.setFont("Caveat", 15)
        c.drawString(MARGIN_L + 6, y, name)
        tw = c.stringWidth(name, "Caveat", 15)
        c.setStrokeColor(BLUE); c.setLineWidth(1); c.line(MARGIN_L + 6, y-2, MARGIN_L + 6 + tw, y-2)
        y -= LINE_GAP
        for p in pts:
            c.setFont("Caveat", 12); c.setFillColor(DARK)
            c.drawString(MARGIN_L + 14, y, "→  " + p)
            y -= LINE_GAP - 3
        y -= 4

    # Assessment tools mini-table
    tools = [
        ("Test of Playfulness (ToP)",      "6mo–18yr", "Bundy's 3 qualities: motivation, control, freedom", "OT"),
        ("Knox Preschool Play Scale",       "0–6yr",    "Space, material, imitation, participation",         "OT"),
        ("Symbolic Play Test",              "1–3yr",    "Symbolic play level; non-verbal cognition",          "SLP/OT"),
        ("Westby Play Scale",               "9mo–5yr",  "Sequential symbolic play development",              "SLP/OT"),
        ("ChIPPA",                          "3–7yr",    "Elaborateness & spontaneity of pretend play",        "OT"),
        ("TPBA",                            "0–6yr",    "Multi-domain assessment through play — TEAM tool",  "All"),
    ]
    col_x2 = [MARGIN_L, MARGIN_L + 148, MARGIN_L + 198, MARGIN_L + 420]
    col_w2 = [146, 48, 220, 38]
    hds2 = ["Tool", "Age", "Measures", "By"]
    for i, h in enumerate(hds2):
        c.setFillColor(BLUE); c.rect(col_x2[i], y - 4, col_w2[i], 17, fill=1, stroke=0)
        c.setFont("Caveat", 11); c.setFillColor(colors.white); c.drawString(col_x2[i]+3, y+1, h)
    y -= LINE_GAP
    for ri, (t, ag, m, by) in enumerate(tools):
        bg_c = colors.HexColor("#eef4ff") if ri % 2 == 0 else colors.HexColor("#f8f8f8")
        for i, cell in enumerate([t, ag, m, by]):
            c.setFillColor(bg_c); c.setStrokeColor(colors.HexColor("#aaaaaa"))
            c.rect(col_x2[i], y-3, col_w2[i], 16, fill=1, stroke=1)
            tc = RED if by == "All" else DARK
            c.setFont("Caveat", 10); c.setFillColor(tc); c.drawString(col_x2[i]+3, y+1, cell)
        y -= LINE_GAP - 2

    y -= 8
    divider(c, y); y -= LINE_GAP

    # Play as Intervention
    y = section_title(c, MARGIN_L, y, "PLAY AS INTERVENTION  —  Team Roles", GREEN, 17)

    team_roles = [
        ("OT",          BLUE,  "Play = MEANS + END  |  Sensory integration, DIR/Floortime, CO-OP, Social Thinking"),
        ("PT",          GREEN, "Play-based motor therapy  |  Obstacle courses, ball games  |  Child doesn't know it's therapy!"),
        ("SLP",         RED,   "Natural context for language  |  Symbolic play level ≈ language level  |  SCERTS, Hanen"),
        ("Psychology",  colors.HexColor("#8b00aa"), "Play therapy (Axline)  |  Trauma-focused  |  Child expresses what words cannot"),
        ("Special Ed",  colors.HexColor("#b35900"), "Peer-mediated play  |  Social skill groups  |  Play-based curriculum"),
    ]

    for role, sc, desc in team_roles:
        rw = c.stringWidth(role, "Caveat", 14) + 14
        c.setFillColor(sc); c.roundRect(MARGIN_L, y-3, rw, 19, 7, fill=1, stroke=0)
        c.setFont("Caveat", 14); c.setFillColor(colors.white); c.drawString(MARGIN_L+7, y+3, role)
        c.setFont("Caveat", 12); c.setFillColor(DARK); c.drawString(MARGIN_L + rw + 10, y + 3, desc)
        y -= LINE_GAP + 2

    y -= 8

    # Key messages box
    star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
        "★  KEY TAKE-HOME MESSAGES",
        "1. Play = PRIMARY OCCUPATION of childhood — not optional",
        "2. Play reflects ALL domains of development simultaneously",
        "3. Parten + Piaget + Smilansky = COMPLEMENTARY lenses  (use all 3)",
        "4. Symbolic play = most SENSITIVE early marker of development",
        "5. Absent pretend play by 18 months = RED FLAG for ASD",
        "6. A child who cannot play = clinical priority for all disciplines",
        "7. Ideal: TPBA — observe play as a TEAM, plan as a TEAM",
    ], size=13, bg=colors.HexColor("#f0fff0"), border=GREEN)

    # Footer quote
    y -= LINE_GAP * 9 + 6
    c.setFont("Caveat", 14); c.setFillColor(colors.HexColor("#555555"))
    c.drawCentredString(W/2, y, "\"Play is the work of childhood.\"  — Jean Piaget")

    draw_page_number(c, 5, 5)
    c.showPage()


# ── MAIN ──────────────────────────────────────────────────────────────────────
os.makedirs("/tmp/workspace", exist_ok=True)
c = canvas.Canvas(OUTPUT, pagesize=A4)
c.setTitle("Play: The Occupation of Childhood — Handwritten Notes")
c.setAuthor("OT Seminar — Interdisciplinary Team")

page1(c)
page2(c)
page3(c)
page4(c)
page5(c)

c.save()
print("PDF saved:", OUTPUT)
import os
print("File size:", os.path.getsize(OUTPUT), "bytes")
Running Command

cd /tmp/workspace && python3 play_notes.py 2>&1

Your notes are ready! Here's the download link:

Play Handwritten Notes

PDF Document · PDF


What's inside - 5 pages:
PageContent
Page 1Title, Definition (Bundy's 3 Qualities), Characteristics, Why Play Matters (mind map), UN CRC note
Page 2Play Development - all 9 age groups (Birth to Adolescence) with colour-coded age pills
Page 3Parten's 6 Social Stages + Piaget's 3 Cognitive Stages - with clinical notes
Page 4Smilansky's 4 Categories, Comparison table of all 3 frameworks, Red Flags (including ASD flags)
Page 5Assessment tools table, Team roles (OT/PT/SLP/Psych/Special Ed), Key Take-home Messages, Piaget quote
Style: Caveat handwriting font on ruled cream paper with a red margin line, colour-coded section pills, mind map, star boxes, and clinical arrows throughout - designed to look like genuine neat student study notes.

Generate a quick reference 1-page visual cheat sheet on play classifications

Writing File

~/play_cheatsheet.py

"""
1-page visual cheat sheet: Play Classifications
Parten | Piaget | Smilansky  +  Comparison + Key Clinical Tips
"""

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import math, os

pdfmetrics.registerFont(TTFont("Caveat", "/tmp/workspace/Caveat.ttf"))

OUTPUT = "/tmp/workspace/Play_Classification_Cheatsheet.pdf"
W, H = A4   # landscape would be wider but let's do A4 landscape
W, H = 841.89, 595.27   # A4 landscape

MARGIN = 18
BLUE   = colors.HexColor("#1a3a8f")
RED    = colors.HexColor("#c0392b")
GREEN  = colors.HexColor("#1a7a3a")
PURPLE = colors.HexColor("#6a0dad")
ORANGE = colors.HexColor("#c55a00")
TEAL   = colors.HexColor("#007070")
DARK   = colors.HexColor("#1c1c2e")
BG     = colors.HexColor("#f8f9ff")
YELLOW = colors.HexColor("#f0c800")

def cf(size): return ("Caveat", size)

c = canvas.Canvas(OUTPUT, pagesize=(W, H))
c.setTitle("Play Classifications — Quick Reference Cheat Sheet")

# ── Background ────────────────────────────────────────────────────────────────
c.setFillColor(BG)
c.rect(0, 0, W, H, fill=1, stroke=0)

# subtle grid lines
c.setStrokeColor(colors.HexColor("#dde4f5"))
c.setLineWidth(0.4)
for yy in range(0, int(H), 20):
    c.line(0, yy, W, yy)

# ── Header bar ────────────────────────────────────────────────────────────────
c.setFillColor(BLUE)
c.rect(0, H - 42, W, 42, fill=1, stroke=0)
c.setFont("Caveat", 26)
c.setFillColor(colors.white)
c.drawCentredString(W/2, H - 28, "PLAY CLASSIFICATIONS  —  Quick Reference Cheat Sheet")
c.setFont("Caveat", 13)
c.setFillColor(colors.HexColor("#aac8ff"))
c.drawCentredString(W/2, H - 40, "Parten (Social)  |  Piaget (Cognitive)  |  Smilansky (Functional)          OT Seminar  ·  Paediatrics")

# ── helper fns ────────────────────────────────────────────────────────────────
def pill(c, x, y, txt, bg, fg=colors.white, fs=12):
    tw = c.stringWidth(txt, "Caveat", fs) + 12
    c.setFillColor(bg); c.roundRect(x, y - 3, tw, 18, 6, fill=1, stroke=0)
    c.setFont("Caveat", fs); c.setFillColor(fg); c.drawString(x + 6, y + 2, txt)
    return tw

def col_header(c, x, y, w, title, sub, bg):
    c.setFillColor(bg)
    c.roundRect(x, y - 28, w, 32, 8, fill=1, stroke=0)
    c.setFont("Caveat", 17); c.setFillColor(colors.white)
    c.drawCentredString(x + w/2, y - 10, title)
    c.setFont("Caveat", 11); c.setFillColor(colors.HexColor("#ddeeff"))
    c.drawCentredString(x + w/2, y - 23, sub)

def stage_row(c, x, y, w, num, name, age, desc, numcol, namecol, descsize=11):
    # number circle
    c.setFillColor(numcol); c.circle(x + 12, y + 5, 10, fill=1, stroke=0)
    c.setFont("Caveat", 13); c.setFillColor(colors.white); c.drawCentredString(x + 12, y + 1, num)
    # name
    c.setFont("Caveat", 13); c.setFillColor(namecol); c.drawString(x + 26, y + 6, name)
    # age badge
    aw = c.stringWidth(age, "Caveat", 10) + 8
    c.setFillColor(colors.HexColor("#eef2ff")); c.setStrokeColor(namecol); c.setLineWidth(0.7)
    c.roundRect(x + 26, y - 5, aw, 13, 4, fill=1, stroke=1)
    c.setFont("Caveat", 10); c.setFillColor(namecol); c.drawString(x + 30, y - 2, age)
    # desc
    c.setFont("Caveat", descsize); c.setFillColor(DARK)
    c.drawString(x + 26 + aw + 5, y + 1, desc)

def draw_divider(c, x, y, h, col):
    c.setStrokeColor(col); c.setLineWidth(1.5)
    c.setDash(4, 3)
    c.line(x, y, x, y - h)
    c.setDash()

# ── LAYOUT: 3 columns + comparison strip + tips ────────────────────────────────
top_y   = H - 52
col_h   = 330
bot_y   = top_y - col_h

COL1_X  = MARGIN
COL2_X  = MARGIN + 267
COL3_X  = MARGIN + 534
COL_W   = 257

# ── COLUMN 1: PARTEN ──────────────────────────────────────────────────────────
col_header(c, COL1_X, top_y, COL_W, "PARTEN'S SOCIAL STAGES", "1932  |  Social Participation", RED)

parten_stages = [
    ("1", "Unoccupied",   "Birth–3m", "Random movements; no purpose or engagement",          colors.HexColor("#999999")),
    ("2", "Solitary",     "0–2 yr",   "Plays alone; unaware/uninterested in others",          colors.HexColor("#3399cc")),
    ("3", "Onlooker",     "~2 yr",    "Watches others; doesn't join; observational learning", colors.HexColor("#33aaaa")),
    ("4", "Parallel",     "2–2.5yr",  "Beside others; same toys; NO interaction",             colors.HexColor("#33aa55")),
    ("5", "Associative",  "3–4 yr",   "Shares toys/space; common theme; no goal/role",        colors.HexColor("#cc7733")),
    ("6", "Cooperative",  "4+ yr",    "Organised; goal; roles; rules; turn-taking",           RED),
]

y = top_y - 38
for num, name, age, desc, nc in parten_stages:
    # alternating row bg
    ri = int(num) - 1
    bg_row = colors.HexColor("#fff0f0") if ri % 2 == 0 else colors.HexColor("#ffffff")
    c.setFillColor(bg_row)
    c.roundRect(COL1_X + 2, y - 8, COL_W - 4, 26, 4, fill=1, stroke=0)
    stage_row(c, COL1_X + 6, y, COL_W - 8, num, name, age, desc, nc, nc, descsize=10)
    y -= 30

# Arrow showing progression
c.setStrokeColor(RED); c.setLineWidth(1.5)
arrow_x = COL1_X + COL_W - 14
c.line(arrow_x, top_y - 38, arrow_x, y + 30)
c.line(arrow_x, y + 30, arrow_x - 5, y + 38)
c.line(arrow_x, y + 30, arrow_x + 5, y + 38)
c.setFont("Caveat", 9); c.setFillColor(RED)
c.saveState(); c.translate(arrow_x + 8, (top_y - 38 + y + 30)/2)
c.rotate(270); c.drawCentredString(0, 0, "Least → Most Social"); c.restoreState()

# note
c.setFont("Caveat", 10); c.setFillColor(RED)
c.drawString(COL1_X + 4, y - 4, "⚠ Regression = clinical flag")

# ── COLUMN 2: PIAGET ──────────────────────────────────────────────────────────
col_header(c, COL2_X, top_y, COL_W, "PIAGET'S COGNITIVE STAGES", "1962  |  Cognitive Development", BLUE)

piaget_stages = [
    ("1", "Practice Play",  "0–2 yr",
     ["Sensorimotor stage",
      "Repetitive motor actions for pleasure",
      "Banging, rolling, splashing",
      "Pure ASSIMILATION",
      "Consolidates sensorimotor schemas"],
     colors.HexColor("#3377cc"), colors.HexColor("#eef4ff")),
    ("2", "Symbolic Play",  "2–7 yr",
     ["Preoperational stage",
      "One thing represents another",
      "Stick = sword; box = spaceship",
      "Semiotic function emerges",
      "Deferred imitation, make-believe"],
     BLUE, colors.HexColor("#e0eaff")),
    ("3", "Games w/ Rules", "7+ yr",
     ["Concrete Operational stage",
      "Structured; agreed rules",
      "Chess, cricket, team sports",
      "Child creates & defends rules",
      "Logical reasoning + moral dev."],
     colors.HexColor("#1a5fa0"), colors.HexColor("#d0e0ff")),
]

y2 = top_y - 38
for num, name, age, pts, nc, bgc in piaget_stages:
    bh = len(pts) * 15 + 26
    c.setFillColor(bgc); c.roundRect(COL2_X + 2, y2 - bh + 18, COL_W - 4, bh, 6, fill=1, stroke=0)
    # header row
    c.setFillColor(nc); c.circle(COL2_X + 14, y2 + 5, 11, fill=1, stroke=0)
    c.setFont("Caveat", 13); c.setFillColor(colors.white); c.drawCentredString(COL2_X + 14, y2 + 1, num)
    c.setFont("Caveat", 14); c.setFillColor(nc); c.drawString(COL2_X + 30, y2 + 6, name)
    aw = c.stringWidth(age, "Caveat", 11) + 8
    c.setFillColor(colors.white); c.setStrokeColor(nc); c.setLineWidth(0.8)
    c.roundRect(COL2_X + COL_W - aw - 8, y2 - 2, aw, 15, 4, fill=1, stroke=1)
    c.setFont("Caveat", 11); c.setFillColor(nc); c.drawString(COL2_X + COL_W - aw - 4, y2 + 1, age)
    y2 -= 20
    for pt in pts:
        c.setFont("Caveat", 10); c.setFillColor(DARK)
        c.drawString(COL2_X + 16, y2, "· " + pt)
        y2 -= 14
    y2 -= 8

c.setFont("Caveat", 10); c.setFillColor(BLUE)
c.drawString(COL2_X + 4, y2 - 4, "⚠ Absent symbolic play by 18mo = ASD red flag")

# ── COLUMN 3: SMILANSKY ───────────────────────────────────────────────────────
col_header(c, COL3_X, top_y, COL_W, "SMILANSKY'S FUNCTIONAL", "1968  |  Most Used Clinically", GREEN)

smil_stages = [
    ("1", "Functional",    "0–2 yr",
     ["Simple repetitive actions ± objects",
      "Running, banging, rolling",
      "Builds sensorimotor skill",
      "= Piaget's Practice Play"],
     colors.HexColor("#3399aa"), colors.HexColor("#e0f5f5")),
    ("2", "Constructive",  "2–6 yr",
     ["CREATE/BUILD with materials",
      "Blocks, drawing, puzzles, sand",
      "~50% of all preschool play",
      "Spatial reasoning + persistence"],
     GREEN, colors.HexColor("#e0ffe0")),
    ("3", "Dramatic",      "2–7 yr",
     ["Role-play; act out scenarios",
      "Playing house / doctor / teacher",
      "Sociodramatic = 2+ children",
      "ToM, language, self-regulation"],
     RED, colors.HexColor("#fff0e0")),
    ("4", "Games w/ Rules","6+ yr",
     ["Pre-established; agreed rules",
      "Cards, sports, board games",
      "= Piaget's Games with Rules",
      "Social coordination + inhibition"],
     PURPLE, colors.HexColor("#f5eeff")),
]

y3 = top_y - 38
for num, name, age, pts, nc, bgc in smil_stages:
    bh = len(pts) * 14 + 24
    c.setFillColor(bgc); c.roundRect(COL3_X + 2, y3 - bh + 18, COL_W - 4, bh, 6, fill=1, stroke=0)
    c.setFillColor(nc); c.circle(COL3_X + 14, y3 + 5, 11, fill=1, stroke=0)
    c.setFont("Caveat", 13); c.setFillColor(colors.white); c.drawCentredString(COL3_X + 14, y3 + 1, num)
    c.setFont("Caveat", 14); c.setFillColor(nc); c.drawString(COL3_X + 30, y3 + 6, name)
    aw = c.stringWidth(age, "Caveat", 11) + 8
    c.setFillColor(colors.white); c.setStrokeColor(nc); c.setLineWidth(0.8)
    c.roundRect(COL3_X + COL_W - aw - 8, y3 - 2, aw, 15, 4, fill=1, stroke=1)
    c.setFont("Caveat", 11); c.setFillColor(nc); c.drawString(COL3_X + COL_W - aw - 4, y3 + 1, age)
    y3 -= 20
    for pt in pts:
        c.setFont("Caveat", 10); c.setFillColor(DARK)
        c.drawString(COL3_X + 16, y3, "· " + pt)
        y3 -= 13
    y3 -= 8

c.setFont("Caveat", 10); c.setFillColor(GREEN)
c.drawString(COL3_X + 4, y3 - 4, "★ Constructive = most common in preschool!")

# ── Vertical dividers ─────────────────────────────────────────────────────────
draw_divider(c, COL2_X - 5, top_y + 4, col_h + 10, colors.HexColor("#aaaacc"))
draw_divider(c, COL3_X - 5, top_y + 4, col_h + 10, colors.HexColor("#aaaacc"))

# ── COMPARISON STRIP ─────────────────────────────────────────────────────────
strip_y = bot_y - 14
strip_h = 80
c.setFillColor(colors.HexColor("#1a2a5a"))
c.roundRect(MARGIN, strip_y - strip_h, W - 2*MARGIN, strip_h + 4, 8, fill=1, stroke=0)

c.setFont("Caveat", 14); c.setFillColor(colors.white)
c.drawString(MARGIN + 10, strip_y - 14, "COMPARISON AT A GLANCE")
tw = c.stringWidth("COMPARISON AT A GLANCE", "Caveat", 14)
c.setStrokeColor(YELLOW); c.setLineWidth(1.5); c.line(MARGIN + 10, strip_y - 17, MARGIN + 10 + tw, strip_y - 17)

headers = ["Feature", "Parten (1932)", "Piaget (1962)", "Smilansky (1968)"]
rows_cmp = [
    ["Focus",       "Social participation",   "Cognitive stage",       "Functional category"],
    ["# Stages",    "6",                       "3",                     "4"],
    ["Key addition","Social complexity ladder","Play ↔ cognition link",  "Constructive Play"],
    ["Best for",    "Social skill Ax",         "Developmental eval",    "Clinic / classroom"],
]
hcols = [130, 170, 170, 170]
hx = [MARGIN + 10, MARGIN + 148, MARGIN + 324, MARGIN + 500]

for i, h in enumerate(headers):
    c.setFont("Caveat", 12)
    hcol = [YELLOW, colors.HexColor("#ffaaaa"), colors.HexColor("#aaaaff"), colors.HexColor("#aaffaa")]
    c.setFillColor(hcol[i])
    c.drawString(hx[i], strip_y - 30, h)

for ri, row in enumerate(rows_cmp):
    ry = strip_y - 44 - ri * 14
    for ci, cell in enumerate(row):
        tc = colors.HexColor("#cccccc") if ci == 0 else colors.white
        c.setFont("Caveat", 11); c.setFillColor(tc)
        c.drawString(hx[ci], ry, cell)

# ── BOTTOM TIPS STRIP ────────────────────────────────────────────────────────
tips_y = strip_y - strip_h - 6
tips_h = 52
c.setFillColor(colors.HexColor("#fff8e0"))
c.setStrokeColor(YELLOW); c.setLineWidth(1.5)
c.roundRect(MARGIN, tips_y - tips_h, W - 2*MARGIN, tips_h + 4, 8, fill=1, stroke=1)

c.setFont("Caveat", 13); c.setFillColor(colors.HexColor("#7a5900"))
c.drawString(MARGIN + 10, tips_y - 12, "★  CLINICAL PEARLS")

tips = [
    "Use ALL 3 frameworks together — Parten tells you HOW social, Piaget tells you WHAT cognitive level, Smilansky tells you WHAT TYPE of play",
    "Symbolic play level ≈ Language level  |  Absent pretend play by 18 months = RED FLAG (ASD screen)  |  Regression in play = psychosocial stress flag",
    "Ideal assessment: TPBA (Transdisciplinary Play-Based Assessment) — observe as a team, plan as a team",
]
ty = tips_y - 24
for tip in tips:
    c.setFont("Caveat", 10); c.setFillColor(DARK)
    c.drawString(MARGIN + 10, ty, "→  " + tip)
    ty -= 13

# ── Footer ────────────────────────────────────────────────────────────────────
c.setFont("Caveat", 10); c.setFillColor(colors.HexColor("#888888"))
c.drawCentredString(W/2, 8, "\"Play is the work of childhood.\" — Jean Piaget  |  OT Seminar · Paediatrics · Interdisciplinary Team")

c.save()
print("Done:", OUTPUT)
print("Size:", os.path.getsize(OUTPUT), "bytes")
Running Command

cd /tmp/workspace && python3 play_cheatsheet.py 2>&1

Done! Here's your cheat sheet:

Play Classification Cheatsheet

PDF Document · PDF


What's on the single A4 landscape page:
SectionContent
Header barTitle + framework names at a glance
Column 1 — PartenAll 6 social stages with age badges, colour-coded rows, progression arrow
Column 2 — Piaget3 cognitive stages with bullet details, cognitive stage label, age badges
Column 3 — Smilansky4 functional categories with colour-coded cards and clinical notes
Comparison stripDark panel comparing all 3 frameworks: focus, stages, key addition, best use
Clinical Pearls strip3 key takeaways: how to use all 3 together, symbolic play = language level, ASD flag, TPBA
FooterPiaget quote
Print it A4 landscape - it fits perfectly as a desk reference or handout for your team.

hey whydidnt you add takata ,piaget, florey and all in that pdf

Writing File

~/play_cheatsheet_v2.py

"""
COMPREHENSIVE Play Classifications Cheat Sheet - 2 pages A4 landscape
Covers: Parten, Piaget, Smilansky, Takata, Florey, Reilly, Knox, Bundy
"""

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os

pdfmetrics.registerFont(TTFont("Caveat", "/tmp/workspace/Caveat.ttf"))

OUTPUT = "/tmp/workspace/Play_Classifications_Complete_Cheatsheet.pdf"
W, H = 841.89, 595.27   # A4 landscape

MARGIN = 16

# Colour palette
BLUE   = colors.HexColor("#1a3a8f")
RED    = colors.HexColor("#c0392b")
GREEN  = colors.HexColor("#1a7a3a")
PURPLE = colors.HexColor("#6a0dad")
ORANGE = colors.HexColor("#c55a00")
TEAL   = colors.HexColor("#007070")
DKRED  = colors.HexColor("#8b0000")
NAVY   = colors.HexColor("#001a5e")
DARK   = colors.HexColor("#1c1c2e")
YELLOW = colors.HexColor("#e0a800")
BG1    = colors.HexColor("#f4f6ff")
BG2    = colors.HexColor("#f4fff8")

cv = canvas.Canvas(OUTPUT, pagesize=(W, H))
cv.setTitle("Play Classifications — Complete Quick Reference")

# ─── Helpers ──────────────────────────────────────────────────────────────────

def bg_page(cv, col=BG1):
    cv.setFillColor(col)
    cv.rect(0, 0, W, H, fill=1, stroke=0)
    cv.setStrokeColor(colors.HexColor("#dde4f5"))
    cv.setLineWidth(0.35)
    for yy in range(0, int(H), 18):
        cv.line(0, yy, W, yy)

def header_bar(cv, title, subtitle, pg, total, bg=BLUE):
    cv.setFillColor(bg)
    cv.rect(0, H - 40, W, 40, fill=1, stroke=0)
    cv.setFont("Caveat", 23); cv.setFillColor(colors.white)
    cv.drawCentredString(W/2, H - 24, title)
    cv.setFont("Caveat", 12); cv.setFillColor(colors.HexColor("#aac8ff"))
    cv.drawCentredString(W/2, H - 37, subtitle)
    # page badge
    cv.setFillColor(colors.HexColor("#ffffff33"))
    cv.roundRect(W - 60, H - 36, 48, 24, 6, fill=1, stroke=0)
    cv.setFont("Caveat", 12); cv.setFillColor(colors.white)
    cv.drawCentredString(W - 36, H - 27, f"Page {pg}/{total}")

def section_card(cv, x, y, w, h, title, year, author_note, bg, header_col):
    """Draw a coloured card with header."""
    cv.setFillColor(bg)
    cv.roundRect(x, y - h, w, h, 8, fill=1, stroke=0)
    # header strip
    cv.setFillColor(header_col)
    cv.roundRect(x, y - 28, w, 30, 8, fill=1, stroke=0)
    cv.rect(x, y - 28, w, 14, fill=1, stroke=0)  # square bottom corners
    cv.setFont("Caveat", 15); cv.setFillColor(colors.white)
    cv.drawString(x + 8, y - 13, title)
    cv.setFont("Caveat", 10); cv.setFillColor(colors.HexColor("#ddeeff"))
    cv.drawString(x + 8, y - 24, f"{year}  |  {author_note}")

def pill(cv, x, y, txt, bg, fg=colors.white, fs=11):
    tw = cv.stringWidth(txt, "Caveat", fs) + 10
    cv.setFillColor(bg); cv.roundRect(x, y - 2, tw, 15, 5, fill=1, stroke=0)
    cv.setFont("Caveat", fs); cv.setFillColor(fg)
    cv.drawString(x + 5, y + 2, txt)
    return tw

def row_item(cv, x, y, num, name, age, desc, nc, small=False):
    fs = 10 if small else 11
    fs_desc = 9 if small else 10
    # number
    cv.setFillColor(nc); cv.circle(x + 10, y + 4, 8, fill=1, stroke=0)
    cv.setFont("Caveat", 11); cv.setFillColor(colors.white)
    cv.drawCentredString(x + 10, y + 1, str(num))
    # name
    cv.setFont("Caveat", fs); cv.setFillColor(nc)
    cv.drawString(x + 22, y + 5, name)
    nw = cv.stringWidth(name, "Caveat", fs)
    # age tag
    aw = cv.stringWidth(age, "Caveat", 9) + 8
    cv.setFillColor(colors.HexColor("#eeeeee")); cv.setStrokeColor(nc); cv.setLineWidth(0.6)
    cv.roundRect(x + 24 + nw, y - 1, aw, 13, 4, fill=1, stroke=1)
    cv.setFont("Caveat", 9); cv.setFillColor(nc)
    cv.drawString(x + 27 + nw, y + 2, age)
    # desc
    cv.setFont("Caveat", fs_desc); cv.setFillColor(DARK)
    cv.drawString(x + 22, y - 8, desc)

def dot_list(cv, x, y, items, col=DARK, fs=10, gap=13):
    for item in items:
        cv.setFont("Caveat", fs); cv.setFillColor(col)
        cv.drawString(x, y, "·  " + item)
        y -= gap
    return y

def hdivider(cv, x1, x2, y, col=colors.HexColor("#cccccc")):
    cv.setStrokeColor(col); cv.setLineWidth(0.8); cv.setDash(3,3)
    cv.line(x1, y, x2, y); cv.setDash()

def vdivider(cv, x, y1, y2, col=colors.HexColor("#bbbbcc")):
    cv.setStrokeColor(col); cv.setLineWidth(1.2); cv.setDash(4,3)
    cv.line(x, y1, x, y2); cv.setDash()

# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 1 — Parten | Piaget | Smilansky | Takata
# ═══════════════════════════════════════════════════════════════════════════════
bg_page(cv, BG1)
header_bar(cv,
    "PLAY CLASSIFICATIONS — Complete Quick Reference  (Page 1 of 2)",
    "Parten · Piaget · Smilansky · Takata  |  OT Seminar · Paediatrics",
    1, 2, BLUE)

TOP   = H - 48
BOT   = 68
AVAIL = TOP - BOT
CW    = (W - 2*MARGIN - 9) / 4   # 4 columns

C1X = MARGIN
C2X = MARGIN + CW + 3
C3X = MARGIN + 2*(CW + 3)
C4X = MARGIN + 3*(CW + 3)

# ── COL 1: PARTEN ─────────────────────────────────────────────────────────────
section_card(cv, C1X, TOP, CW, AVAIL,
    "PARTEN'S SOCIAL STAGES", "1932", "Social Participation",
    colors.HexColor("#fff0f0"), RED)

y = TOP - 34
parten = [
    (1, "Unoccupied",   "0–3m",    "Random mvmt; no purpose",        colors.HexColor("#999999")),
    (2, "Solitary",     "0–2yr",   "Plays alone; ignores others",     colors.HexColor("#3399cc")),
    (3, "Onlooker",     "~2yr",    "Watches; doesn't join",           colors.HexColor("#33aaaa")),
    (4, "Parallel",     "2–2.5yr", "Beside others; NO interaction",   colors.HexColor("#33aa55")),
    (5, "Associative",  "3–4yr",   "Shares toys; no goal/roles",      ORANGE),
    (6, "Cooperative",  "4+yr",    "Goal + roles + rules + turns",    RED),
]
for num, name, age, desc, nc in parten:
    row_item(cv, C1X + 4, y, num, name, age, desc, nc, small=True)
    y -= 26

y -= 4
cv.setFont("Caveat", 10); cv.setFillColor(RED)
cv.drawString(C1X + 4, y, "Least → Most Social ▲")
y -= 13
cv.setFont("Caveat", 9); cv.setFillColor(DARK)
cv.drawString(C1X + 4, y, "★ All stages coexist; regression = flag")
y -= 12
cv.drawString(C1X + 4, y, "★ Cooperative needs empathy +")
y -= 11
cv.drawString(C1X + 6, y, "   negotiation + inhibitory control")

# ── COL 2: PIAGET ─────────────────────────────────────────────────────────────
section_card(cv, C2X, TOP, CW, AVAIL,
    "PIAGET'S COGNITIVE STAGES", "1962", "Cognitive Development",
    colors.HexColor("#eef4ff"), BLUE)

y2 = TOP - 34
piaget = [
    ("1", "Practice Play",   "0–2yr",
     ["Sensorimotor stage",
      "Repetitive motor actions",
      "Banging · rolling · splash",
      "Pure ASSIMILATION",
      "Consolidates schemas"],
     colors.HexColor("#3377cc"), colors.HexColor("#d8e8ff")),
    ("2", "Symbolic Play",   "2–7yr",
     ["Preoperational stage",
      "1 thing represents another",
      "Stick=sword; box=spaceship",
      "Semiotic function emerges",
      "Deferred imitation / pretend"],
     BLUE, colors.HexColor("#c8daff")),
    ("3", "Games w/ Rules",  "7+yr",
     ["Concrete Operational",
      "Agreed structured rules",
      "Chess · cricket · sport",
      "Child creates & defends rules",
      "Logical reasoning + moral dev"],
     colors.HexColor("#0a2a80"), colors.HexColor("#b8caff")),
]
for num, name, age, pts, nc, bgc in piaget:
    bh = len(pts)*12 + 22
    cv.setFillColor(bgc); cv.roundRect(C2X+3, y2 - bh + 16, CW-6, bh, 5, fill=1, stroke=0)
    cv.setFillColor(nc); cv.circle(C2X+12, y2+4, 9, fill=1, stroke=0)
    cv.setFont("Caveat", 11); cv.setFillColor(colors.white); cv.drawCentredString(C2X+12, y2+1, num)
    cv.setFont("Caveat", 13); cv.setFillColor(nc); cv.drawString(C2X+25, y2+5, name)
    nw = cv.stringWidth(name,"Caveat",13)
    aw = cv.stringWidth(age,"Caveat",10)+8
    cv.setFillColor(colors.white); cv.setStrokeColor(nc); cv.setLineWidth(0.7)
    cv.roundRect(C2X+CW-aw-6, y2-1, aw, 13, 4, fill=1, stroke=1)
    cv.setFont("Caveat",10); cv.setFillColor(nc); cv.drawString(C2X+CW-aw-2, y2+2, age)
    y2 -= 18
    for pt in pts:
        cv.setFont("Caveat",9); cv.setFillColor(DARK)
        cv.drawString(C2X+14, y2, "· "+pt); y2 -= 12
    y2 -= 6

cv.setFont("Caveat",9); cv.setFillColor(BLUE)
cv.drawString(C2X+4, y2-4, "⚠ Absent symbolic play by 18mo = ASD flag")

# ── COL 3: SMILANSKY ──────────────────────────────────────────────────────────
section_card(cv, C3X, TOP, CW, AVAIL,
    "SMILANSKY'S FUNCTIONAL", "1968", "Most Used Clinically",
    colors.HexColor("#f0fff0"), GREEN)

y3 = TOP - 34
smil = [
    ("1","Functional",   "0–2yr",
     ["Repetitive actions ± objects",
      "Running, banging, rolling",
      "Builds sensorimotor skill",
      "= Piaget Practice Play"],
     TEAL, colors.HexColor("#d8f5f5")),
    ("2","Constructive", "2–6yr",
     ["CREATE or BUILD w/ materials",
      "Blocks, drawing, puzzles, sand",
      "~50% of all preschool play ★",
      "Spatial reasoning + persistence"],
     GREEN, colors.HexColor("#c8f0c8")),
    ("3","Dramatic",     "2–7yr",
     ["Role-play; act out scenarios",
      "House/doctor/teacher",
      "Sociodramatic = 2+ children",
      "ToM, language, self-reg"],
     RED, colors.HexColor("#ffe8d8")),
    ("4","Games w/ Rules","6+yr",
     ["Pre-established agreed rules",
      "Cards, sport, board games",
      "= Piaget Games with Rules",
      "Inhibition + coordination"],
     PURPLE, colors.HexColor("#f0e0ff")),
]
for num, name, age, pts, nc, bgc in smil:
    bh = len(pts)*12+20
    cv.setFillColor(bgc); cv.roundRect(C3X+3,y3-bh+16,CW-6,bh,5,fill=1,stroke=0)
    cv.setFillColor(nc); cv.circle(C3X+12,y3+4,9,fill=1,stroke=0)
    cv.setFont("Caveat",11); cv.setFillColor(colors.white); cv.drawCentredString(C3X+12,y3+1,num)
    cv.setFont("Caveat",13); cv.setFillColor(nc); cv.drawString(C3X+25,y3+5,name)
    nw2 = cv.stringWidth(name,"Caveat",13)
    aw2 = cv.stringWidth(age,"Caveat",10)+8
    cv.setFillColor(colors.white); cv.setStrokeColor(nc); cv.setLineWidth(0.7)
    cv.roundRect(C3X+CW-aw2-6,y3-1,aw2,13,4,fill=1,stroke=1)
    cv.setFont("Caveat",10); cv.setFillColor(nc); cv.drawString(C3X+CW-aw2-2,y3+2,age)
    y3 -= 18
    for pt in pts:
        cv.setFont("Caveat",9); cv.setFillColor(DARK)
        cv.drawString(C3X+14,y3,"· "+pt); y3-=12
    y3 -= 6

cv.setFont("Caveat",9); cv.setFillColor(GREEN)
cv.drawString(C3X+4,y3-4,"★ Constructive = most common in preschool!")

# ── COL 4: TAKATA ─────────────────────────────────────────────────────────────
section_card(cv, C4X, TOP, CW, AVAIL,
    "TAKATA'S PLAY EPOCHS", "1974", "OT Play History Model",
    colors.HexColor("#fffbe0"), ORANGE)

y4 = TOP - 34
takata_epochs = [
    (1, "Sensorimotor",    "0–2yr",
     ["Sensory + motor exploration",
      "Pleasure from body movement",
      "Object manipulation begins",
      "No rules; self-focused"]),
    (2, "Symbolic/Simple", "2–4yr",
     ["Imitation of adult roles",
      "Make-believe + pretend",
      "Begins cooperating briefly",
      "Fantasy predominates"]),
    (3, "Dramatic/Complex","4–7yr",
     ["Elaborate role-play",
      "Peers essential in play",
      "Constructive creation",
      "Rules understood simply"]),
    (4, "Games/Skills",    "7–12yr",
     ["Rule-governed games",
      "Competition + team play",
      "Skill building (sports/crafts)",
      "Peer approval important"]),
    (5, "Recreational",    "12+yr",
     ["Leisure & hobbies",
      "Identity through play",
      "Social & creative expression",
      "Play → adult recreation"]),
]
for num, name, age, pts in takata_epochs:
    bh = len(pts)*11+20
    cv.setFillColor(colors.HexColor("#fff8e0"))
    cv.roundRect(C4X+3,y4-bh+16,CW-6,bh,5,fill=1,stroke=0)
    cv.setFillColor(ORANGE); cv.circle(C4X+12,y4+4,9,fill=1,stroke=0)
    cv.setFont("Caveat",11); cv.setFillColor(colors.white); cv.drawCentredString(C4X+12,y4+1,str(num))
    cv.setFont("Caveat",12); cv.setFillColor(ORANGE); cv.drawString(C4X+25,y4+5,name)
    nw3 = cv.stringWidth(name,"Caveat",12)
    aw3 = cv.stringWidth(age,"Caveat",9)+8
    cv.setFillColor(colors.white); cv.setStrokeColor(ORANGE); cv.setLineWidth(0.7)
    cv.roundRect(C4X+CW-aw3-6,y4-1,aw3,13,4,fill=1,stroke=1)
    cv.setFont("Caveat",9); cv.setFillColor(ORANGE); cv.drawString(C4X+CW-aw3-2,y4+2,age)
    y4 -= 17
    for pt in pts:
        cv.setFont("Caveat",9); cv.setFillColor(DARK)
        cv.drawString(C4X+14,y4,"· "+pt); y4-=11
    y4 -= 5

cv.setFont("Caveat",9); cv.setFillColor(ORANGE)
cv.drawString(C4X+4,y4-4,"★ Basis for PLAY HISTORY assessment (OT)")
y4 -= 13
cv.drawString(C4X+4,y4-4,"★ OT interviews caregiver about each epoch")

# ── Vertical dividers ─────────────────────────────────────────────────────────
for dx in [C2X-3, C3X-3, C4X-3]:
    vdivider(cv, dx, TOP+2, BOT+40)

# ── BOTTOM COMPARISON BAND ────────────────────────────────────────────────────
band_y = BOT + 36
cv.setFillColor(colors.HexColor("#1a2a5a"))
cv.roundRect(MARGIN, BOT, W-2*MARGIN, band_y - BOT, 8, fill=1, stroke=0)

cv.setFont("Caveat",12); cv.setFillColor(YELLOW)
cv.drawString(MARGIN+10, band_y - 14, "QUICK COMPARE (Page 1):")
cols_lbl = ["Framework","Focus","# Stages","Based on","OT relevance"]
cxs = [MARGIN+160, MARGIN+300, MARGIN+380, MARGIN+480, MARGIN+600]
for i,lbl in enumerate(cols_lbl):
    cv.setFont("Caveat",11); cv.setFillColor(colors.HexColor("#aaccff"))
    cv.drawString(cxs[i], band_y-14, lbl)
rows_cmp = [
    ["Parten (1932)","Social participation","6","Observation","Social skills Ax"],
    ["Piaget (1962)","Cognitive stage","3","Development theory","Cognitive-play link"],
    ["Smilansky (1968)","Functional type","4","Piaget + education","Clinic/classroom use"],
    ["Takata (1974)","Play history epochs","5","OT model","Play History interview"],
]
row_cols = [colors.HexColor("#ffcccc"), colors.HexColor("#cce0ff"),
            colors.HexColor("#ccffcc"), colors.HexColor("#ffeebb")]
for ri, row in enumerate(rows_cmp):
    ry = band_y - 26 - ri*12
    cv.setFont("Caveat",10); cv.setFillColor(row_cols[ri])
    cv.drawString(MARGIN+12, ry, row[0])
    for ci,cell in enumerate(row[1:]):
        cv.setFont("Caveat",10); cv.setFillColor(colors.white)
        cv.drawString(cxs[ci], ry, cell)

cv.setFont("Caveat",9); cv.setFillColor(colors.HexColor("#888888"))
cv.drawCentredString(W/2, 8, "\"Play is the work of childhood.\" — Jean Piaget  |  OT Seminar · Paediatrics · Interdisciplinary Team")

cv.showPage()

# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 2 — Florey | Reilly | Knox | Bundy  +  Master Comparison + Clinical Pearls
# ═══════════════════════════════════════════════════════════════════════════════
bg_page(cv, BG2)
header_bar(cv,
    "PLAY CLASSIFICATIONS — Complete Quick Reference  (Page 2 of 2)",
    "Florey · Reilly · Knox · Bundy  |  OT-Specific Frameworks",
    2, 2, colors.HexColor("#1a6a3a"))

TOP2  = H - 48
BOT2  = 68
AVAIL2= TOP2 - BOT2

# 4 columns same widths
D1X = MARGIN
D2X = MARGIN + CW + 3
D3X = MARGIN + 2*(CW+3)
D4X = MARGIN + 3*(CW+3)

# ── COL 1: FLOREY ─────────────────────────────────────────────────────────────
section_card(cv, D1X, TOP2, CW, AVAIL2,
    "FLOREY'S PLAY MODEL", "1971", "OT — Intrinsic Motivation",
    colors.HexColor("#e8fff8"), TEAL)

y = TOP2 - 34
cv.setFont("Caveat",11); cv.setFillColor(DARK)
cv.drawString(D1X+4,y,"Core Premise:"); y-=13
cv.setFont("Caveat",10); cv.setFillColor(TEAL)
cv.drawString(D1X+4,y,"Play = intrinsically motivated"); y-=11
cv.drawString(D1X+4,y,"behaviour that is ends-in-itself"); y-=15

cv.setFont("Caveat",12); cv.setFillColor(TEAL)
cv.drawString(D1X+4,y,"Key Concepts:"); y-=13

concepts_florey = [
    ("Intrinsic motivation","No external reward needed"),
    ("Exploratory drive","Child naturally seeks novelty"),
    ("Effectance motivation","Child seeks to affect environment"),
    ("Process focus","Enjoyment in the doing, not product"),
    ("Freedom from external rules","Child sets own agenda"),
    ("Voluntary participation","Cannot be forced; must be chosen"),
]
for concept, explain in concepts_florey:
    cv.setFillColor(colors.HexColor("#c0f0e8"))
    cw2 = cv.stringWidth(concept,"Caveat",10)+10
    cv.roundRect(D1X+4,y-3,cw2,14,4,fill=1,stroke=0)
    cv.setFont("Caveat",10); cv.setFillColor(TEAL); cv.drawString(D1X+8,y+1,concept)
    y-=14
    cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D1X+10,y,"→ "+explain); y-=13

y-=4
cv.setFont("Caveat",11); cv.setFillColor(TEAL)
cv.drawString(D1X+4,y,"Clinical Relevance:"); y-=12
items_f = [
    "Helps distinguish true play from",
    "  directed/structured activity",
    "If child is not intrinsically driven",
    "  → it is NOT play",
    "Grounds OT's non-directive",
    "  play therapy approach",
    "Florey stressed: play develops",
    "  competence for adult roles",
]
for item in items_f:
    cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D1X+6,y,item); y-=11

y-=4
cv.setFont("Caveat",9); cv.setFillColor(TEAL)
cv.drawString(D1X+4,y,"★ Influenced Bundy's playfulness model")
y-=11
cv.drawString(D1X+4,y,"★ Closely linked to Reilly's OB theory")

# ── COL 2: REILLY ─────────────────────────────────────────────────────────────
section_card(cv, D2X, TOP2, CW, AVAIL2,
    "REILLY'S OCCUPATIONAL BEHAVIOUR", "1974", "Play as Occupation",
    colors.HexColor("#fff8e8"), ORANGE)

y2 = TOP2 - 34
cv.setFont("Caveat",11); cv.setFillColor(DARK)
cv.drawString(D2X+4,y2,"Core Premise:"); y2-=13
cv.setFont("Caveat",10); cv.setFillColor(ORANGE)
cv.drawString(D2X+4,y2,"\"Play is the arena in which children"); y2-=11
cv.drawString(D2X+4,y2,"practice skills & roles for adult life\""); y2-=15

cv.setFont("Caveat",12); cv.setFillColor(ORANGE)
cv.drawString(D2X+4,y2,"Reilly's Hierarchy of Play:"); y2-=13

reilly_hier = [
    ("1. Exploratory","Birth–2yr","Sensory/motor; curiosity drive"),
    ("2. Competency", "2–7yr",   "Practice; mastery motivation"),
    ("3. Achievement","7+yr",    "Rules; competition; standards"),
]
for stage, age, desc in reilly_hier:
    cv.setFillColor(colors.HexColor("#ffe8c0"))
    cv.roundRect(D2X+4,y2-3,CW-10,14,4,fill=1,stroke=0)
    cv.setFont("Caveat",11); cv.setFillColor(ORANGE); cv.drawString(D2X+8,y2+2,stage)
    sw2 = cv.stringWidth(stage,"Caveat",11)
    aw2 = cv.stringWidth(age,"Caveat",9)+6
    cv.setFillColor(colors.white); cv.setStrokeColor(ORANGE); cv.setLineWidth(0.6)
    cv.roundRect(D2X+10+sw2,y2-1,aw2,12,3,fill=1,stroke=1)
    cv.setFont("Caveat",9); cv.setFillColor(ORANGE); cv.drawString(D2X+12+sw2,y2+2,age)
    y2-=15
    cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D2X+10,y2,"→ "+desc); y2-=13

y2-=4
cv.setFont("Caveat",11); cv.setFillColor(ORANGE)
cv.drawString(D2X+4,y2,"Key Contributions:"); y2-=12
reilly_pts = [
    "Play = preparation for adult work",
    "Play is the child's OCCUPATION",
    "3 play motives: curiosity →",
    "  competency → achievement",
    "First OT theorist to frame play",
    "  as purposeful occupation",
    "Foundation of OT's occupation-",
    "  based practice with children",
    "Play develops habits, roles,",
    "  skills for life performance",
]
for pt in reilly_pts:
    cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D2X+6,y2,pt); y2-=11

y2-=4
cv.setFont("Caveat",9); cv.setFillColor(ORANGE)
cv.drawString(D2X+4,y2,"★ Basis of modern OT paediatric practice")
y2-=11
cv.drawString(D2X+4,y2,"★ Play deprivation = occupational deprivation")

# ── COL 3: KNOX ───────────────────────────────────────────────────────────────
section_card(cv, D3X, TOP2, CW, AVAIL2,
    "KNOX PRESCHOOL PLAY SCALE", "1974/1997", "Revised Knox Play Scale (RKPPS)",
    colors.HexColor("#f0eeff"), PURPLE)

y3 = TOP2 - 34
cv.setFont("Caveat",11); cv.setFillColor(DARK)
cv.drawString(D3X+4,y3,"Core Premise:"); y3-=13
cv.setFont("Caveat",10); cv.setFillColor(PURPLE)
cv.drawString(D3X+4,y3,"Observational assessment of play"); y3-=11
cv.drawString(D3X+4,y3,"across 4 dimensions  |  Age: 0–6 yr"); y3-=15

cv.setFont("Caveat",12); cv.setFillColor(PURPLE)
cv.drawString(D3X+4,y3,"4 Dimensions of Play:"); y3-=13

knox_dims = [
    ("1. Space Management",
     ["Use of body in space",
      "Gross motor; body control",
      "Rough & tumble; running",
      "Interest in outdoor play"]),
    ("2. Material Management",
     ["How child handles objects",
      "Manipulation, construction",
      "Interest & attention to toys",
      "Purpose + creativity w/ objects"]),
    ("3. Imitation",
     ["Social knowledge development",
      "Imitates people & situations",
      "Pretend & symbolic use",
      "Understanding social world"]),
    ("4. Participation",
     ["Degree of social involvement",
      "Type & amount of interaction",
      "Lang. used in play contexts",
      "Cooperation & independence"]),
]
dim_cols = [PURPLE, colors.HexColor("#8833bb"), colors.HexColor("#aa22cc"), colors.HexColor("#5500aa")]
for i,(dim_name,pts) in enumerate(knox_dims):
    nc3 = dim_cols[i]
    bh3 = len(pts)*11+18
    cv.setFillColor(colors.HexColor("#ece0ff"))
    cv.roundRect(D3X+3,y3-bh3+16,CW-6,bh3,5,fill=1,stroke=0)
    cv.setFillColor(nc3); cv.roundRect(D3X+3,y3-14,CW-6,18,5,fill=1,stroke=0)
    cv.setFont("Caveat",11); cv.setFillColor(colors.white)
    cv.drawString(D3X+7,y3-7,dim_name)
    y3-=16
    for pt in pts:
        cv.setFont("Caveat",9); cv.setFillColor(DARK)
        cv.drawString(D3X+10,y3,"· "+pt); y3-=11
    y3-=5

y3-=4
cv.setFont("Caveat",10); cv.setFillColor(PURPLE)
cv.drawString(D3X+4,y3,"Each dimension scored 0–6yr"); y3-=11
cv.drawString(D3X+4,y3,"in 6-month intervals"); y3-=13
cv.setFont("Caveat",9); cv.setFillColor(DARK)
cv.drawString(D3X+4,y3,"★ Naturalistic observation (indoor/outdoor)"); y3-=11
cv.drawString(D3X+4,y3,"★ No standard tasks required"); y3-=11
cv.drawString(D3X+4,y3,"★ Semi-structured; ecological validity")

# ── COL 4: BUNDY ──────────────────────────────────────────────────────────────
section_card(cv, D4X, TOP2, CW, AVAIL2,
    "BUNDY'S PLAYFULNESS MODEL", "1993", "Test of Playfulness (ToP)",
    colors.HexColor("#fff0ff"), colors.HexColor("#990099"))

BPURP = colors.HexColor("#990099")
y4 = TOP2 - 34
cv.setFont("Caveat",11); cv.setFillColor(DARK)
cv.drawString(D4X+4,y4,"Core Premise:"); y4-=13
cv.setFont("Caveat",10); cv.setFillColor(BPURP)
cv.drawString(D4X+4,y4,"Play is not just an activity —"); y4-=11
cv.drawString(D4X+4,y4,"it is a DISPOSITION (playfulness)"); y4-=15

cv.setFont("Caveat",12); cv.setFillColor(BPURP)
cv.drawString(D4X+4,y4,"3 Elements of Playfulness:"); y4-=13

bundy_elems = [
    ("1. Intrinsic Motivation",
     ["Doing for OWN sake",
      "Not for external reward",
      "Drives engagement"]),
    ("2. Internal Locus of Control",
     ["Child DIRECTS the action",
      "Chooses what/how to play",
      "Sense of agency & autonomy"]),
    ("3. Freedom from Reality",
     ["Suspend real-world rules",
      "\"What if\" thinking",
      "Stick = sword; box = castle"]),
]
for elem_name,pts in bundy_elems:
    bh4 = len(pts)*12+18
    cv.setFillColor(colors.HexColor("#f5e0ff"))
    cv.roundRect(D4X+3,y4-bh4+16,CW-6,bh4,5,fill=1,stroke=0)
    cv.setFillColor(BPURP); cv.roundRect(D4X+3,y4-14,CW-6,18,5,fill=1,stroke=0)
    cv.setFont("Caveat",11); cv.setFillColor(colors.white); cv.drawString(D4X+7,y4-7,elem_name)
    y4-=16
    for pt in pts:
        cv.setFont("Caveat",10); cv.setFillColor(DARK)
        cv.drawString(D4X+10,y4,"· "+pt); y4-=12
    y4-=6

y4-=4
cv.setFont("Caveat",11); cv.setFillColor(BPURP)
cv.drawString(D4X+4,y4,"Test of Playfulness (ToP):"); y4-=12
top_pts = [
    "Age: 6 months – 18 years",
    "Observational; 30 items",
    "Rates: extent · intensity · skill",
    "Measures QUALITY of play",
    "  not just play TYPE",
    "Setting: natural play environment",
    "Score helps identify children who",
    "  lack playful engagement",
    "4th element (context) added later",
    "  — environment supports play?",
]
for pt in top_pts:
    cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D4X+6,y4,pt); y4-=11

y4-=4
cv.setFont("Caveat",9); cv.setFillColor(BPURP)
cv.drawString(D4X+4,y4,"★ Built on Florey + Reilly foundations")
y4-=11
cv.drawString(D4X+4,y4,"★ Most OT-specific play measure available")

# ── Vertical dividers ─────────────────────────────────────────────────────────
for dx in [D2X-3, D3X-3, D4X-3]:
    vdivider(cv, dx, TOP2+2, BOT2+40)

# ── MASTER COMPARISON BAND ────────────────────────────────────────────────────
band2_y = BOT2 + 36
cv.setFillColor(colors.HexColor("#0d3320"))
cv.roundRect(MARGIN, BOT2, W-2*MARGIN, band2_y-BOT2, 8, fill=1, stroke=0)

cv.setFont("Caveat",12); cv.setFillColor(YELLOW)
cv.drawString(MARGIN+10, band2_y-14, "ALL 8 FRAMEWORKS — MASTER SUMMARY:")

hxs = [MARGIN+12, MARGIN+148, MARGIN+258, MARGIN+368, MARGIN+490, MARGIN+610, MARGIN+718]
hdrs2 = ["Framework","Year","Focus","# Stages","Unique Contribution","Tool/Method","Best for"]
for i,h in enumerate(hdrs2):
    cv.setFont("Caveat",10); cv.setFillColor(colors.HexColor("#88ddaa")); cv.drawString(hxs[i],band2_y-27,h)

all_rows = [
    ["Parten",     "1932","Social participation","6","Social complexity ladder","Observation","Social skills Ax"],
    ["Piaget",     "1962","Cognitive stage",      "3","Play ↔ cognition link",   "Play, Dreams & Imitation","Dev. evaluation"],
    ["Smilansky",  "1968","Functional category",  "4","Added constructive play", "Classroom/clinic Ax","Clinic/classroom"],
    ["Takata",     "1974","Play history epochs",  "5","OT play history method",  "Play History Interview","OT Ax tool"],
    ["Florey",     "1971","Intrinsic motivation", "-","Play = ends-in-itself",   "Theoretical model","OT theory base"],
    ["Reilly",     "1974","Occupational behav.",  "3","Play as child's occupation","OB Theory","OT practice model"],
    ["Knox",       "1997","4 play dimensions",    "-","Naturalistic observation", "RKPPS (0–6yr)","Preschool OT Ax"],
    ["Bundy",      "1993","Playfulness quality",  "3","Playfulness disposition",  "Test of Playfulness","Quality of play"],
]
row_cols2 = [colors.HexColor("#ffdddd"), colors.HexColor("#ddeeff"),
             colors.HexColor("#ddffdd"), colors.HexColor("#ffeedd"),
             colors.HexColor("#ddfff8"), colors.HexColor("#fff0dd"),
             colors.HexColor("#f0ddff"), colors.HexColor("#ffeeff")]
for ri,row in enumerate(all_rows):
    ry = band2_y - 38 - ri*11
    cv.setFont("Caveat",9); cv.setFillColor(row_cols2[ri])
    cv.drawString(hxs[0], ry, row[0])
    cv.setFillColor(colors.white)
    for ci,cell in enumerate(row[1:]):
        cv.drawString(hxs[ci+1], ry, cell)

# Footer
cv.setFont("Caveat",9); cv.setFillColor(colors.HexColor("#888888"))
cv.drawCentredString(W/2, 8, "\"Play is the work of childhood.\" — Jean Piaget  |  OT Seminar · Paediatrics · Interdisciplinary Team")

cv.save()
print("Done:", OUTPUT)
print("Size:", os.path.getsize(OUTPUT), "bytes")
Running Command

cd /tmp/workspace && python3 play_cheatsheet_v2.py 2>&1

Here's the complete version:

Play Classifications Complete Cheatsheet

PDF Document · PDF


2 pages, A4 landscape, all 8 frameworks:
PageFrameworks
Page 1Parten (6 Social Stages) · Piaget (3 Cognitive Stages) · Smilansky (4 Functional Categories) · Takata (5 Play Epochs)
Page 2Florey (Intrinsic Motivation Model) · Reilly (Occupational Behaviour + 3-level hierarchy) · Knox (4 Dimensions + RKPPS) · Bundy (Playfulness + ToP)
Bottom of each page:
  • Page 1 - side-by-side comparison strip of the 4 social/cognitive/functional frameworks
  • Page 2 - Master Summary table of all 8 frameworks in one row: year, focus, stages, unique contribution, assessment tool, best use
Again, sorry for the first version missing the OT-specific ones - Takata, Reilly, Florey, Knox, and Bundy are the backbone of OT's approach to play and should have been there from the start.

can you all those details to this notes pls

Reading File
Writing File

~/play_notes_extra_pages.py

"""
Generate extra pages (Page 6 & 7) in the SAME handwritten style as the original notes.
Then merge with the original Play_Handwritten_Notes.pdf
"""

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from pypdf import PdfWriter, PdfReader
import os, math

pdfmetrics.registerFont(TTFont("Caveat", "/tmp/workspace/Caveat.ttf"))

EXTRA_PDF  = "/tmp/workspace/play_notes_pages6_7.pdf"
ORIG_PDF   = "/tmp/workspace/attachments/57b0a518-4742-4d01-b26f-256be626e53f/Play_Handwritten_Notes.pdf"
OUTPUT     = "/tmp/workspace/Play_Handwritten_Notes_Complete.pdf"

W, H = A4
MARGIN_L  = 55
MARGIN_R  = W - 30
MARGIN_TOP= H - 30
MARGIN_BOT= 40
LINE_GAP  = 22

# Colour palette — identical to original script
BLUE   = colors.HexColor("#1a3a6b")
RED    = colors.HexColor("#c0392b")
GREEN  = colors.HexColor("#1e6b3a")
DARK   = colors.HexColor("#1c1c2e")
ORANGE = colors.HexColor("#c55a00")
PURPLE = colors.HexColor("#6a0dad")
TEAL   = colors.HexColor("#007070")
BPURP  = colors.HexColor("#880088")
RULED  = colors.HexColor("#c8d8f0")
MARGIN_LINE = colors.HexColor("#f4a0a0")
YELLOW = colors.HexColor("#e0a800")

# ── Helpers (same as original notes) ─────────────────────────────────────────

def draw_ruled_paper(c):
    c.setFillColor(colors.HexColor("#fefef8"))
    c.rect(0, 0, W, H, fill=1, stroke=0)
    c.setStrokeColor(RULED); c.setLineWidth(0.5)
    y = MARGIN_TOP - 10
    while y > MARGIN_BOT:
        c.line(MARGIN_L - 10, y, MARGIN_R + 5, y)
        y -= LINE_GAP
    c.setStrokeColor(MARGIN_LINE); c.setLineWidth(1.2)
    c.line(MARGIN_L - 2, MARGIN_BOT, MARGIN_L - 2, MARGIN_TOP)

def draw_page_number(c, n, total):
    c.setFont("Caveat", 13); c.setFillColor(colors.gray)
    c.drawCentredString(W/2, 22, f"— {n} / {total} —")

def section_title(c, x, y, txt, color=BLUE, size=19):
    c.setFont("Caveat", size); c.setFillColor(color)
    c.drawString(x, y, txt)
    tw = c.stringWidth(txt, "Caveat", size)
    c.setStrokeColor(color); c.setLineWidth(1.8)
    c.line(x, y - 3, x + tw, y - 3)
    return y - LINE_GAP - 4

def bullet(c, x, y, txt, size=14, color=DARK, symbol="•", sym_color=BLUE):
    c.setFont("Caveat", size); c.setFillColor(sym_color)
    c.drawString(x, y, symbol)
    c.setFillColor(color); c.drawString(x + 14, y, txt)

def sub_bullet(c, x, y, txt, size=13, color=DARK):
    c.setFont("Caveat", size); c.setFillColor(colors.HexColor("#555555"))
    c.drawString(x, y, "→"); c.setFillColor(color)
    c.drawString(x + 14, y, txt)

def divider(c, y, color=BLUE):
    c.setStrokeColor(color); c.setLineWidth(1.5)
    c.line(MARGIN_L - 10, y, MARGIN_R, y)

def star_box(c, x, y, w, lines, size=13, bg=colors.HexColor("#fff9e0"), border=colors.HexColor("#e0b800")):
    h = len(lines) * LINE_GAP + 12
    c.setFillColor(bg); c.setStrokeColor(border); c.setLineWidth(1.5)
    c.roundRect(x, y - h + 14, w, h, 6, fill=1, stroke=1)
    cy = y
    for line in lines:
        c.setFont("Caveat", size); c.setFillColor(colors.HexColor("#7a5900"))
        c.drawString(x + 8, cy, line); cy -= LINE_GAP

def stage_pill(c, x, y, txt, bg, fg=colors.white, fs=14):
    tw = c.stringWidth(txt, "Caveat", fs) + 14
    c.setFillColor(bg); c.roundRect(x, y - 4, tw, 20, 8, fill=1, stroke=0)
    c.setFont("Caveat", fs); c.setFillColor(fg); c.drawString(x + 7, y + 3, txt)
    return tw

def age_badge(c, x, y, age, col):
    aw = c.stringWidth(age, "Caveat", 12) + 10
    c.setFillColor(colors.HexColor("#f0f0f0")); c.setStrokeColor(col); c.setLineWidth(1)
    c.roundRect(x, y - 2, aw, 17, 5, fill=1, stroke=1)
    c.setFont("Caveat", 12); c.setFillColor(col); c.drawString(x + 5, y + 2, age)
    return aw

def info_box(c, x, y, w, lines, bg, border, size=13):
    h = len(lines) * (LINE_GAP - 2) + 14
    c.setFillColor(bg); c.setStrokeColor(border); c.setLineWidth(1.2)
    c.roundRect(x, y - h + 12, w, h, 6, fill=1, stroke=1)
    cy = y
    for line in lines:
        c.setFont("Caveat", size); c.setFillColor(DARK)
        c.drawString(x + 8, cy, line); cy -= (LINE_GAP - 2)

# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 6 — Takata + Florey + Reilly
# ═══════════════════════════════════════════════════════════════════════════════

def page6(c):
    draw_ruled_paper(c)
    y = MARGIN_TOP - 15

    # Page heading
    c.setFont("Caveat", 22); c.setFillColor(BLUE)
    c.drawString(MARGIN_L, y, "OT-SPECIFIC PLAY FRAMEWORKS  —  Part 1")
    y -= 8
    c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
    y -= LINE_GAP + 2

    # ── TAKATA ────────────────────────────────────────────────────────────────
    y = section_title(c, MARGIN_L, y, "A.  TAKATA'S PLAY EPOCHS  (1974)", ORANGE, 18)
    c.setFont("Caveat", 13); c.setFillColor(DARK)
    c.drawString(MARGIN_L, y, "Basis for the PLAY HISTORY interview in OT  →  5 developmental epochs across the lifespan")
    y -= LINE_GAP + 2

    takata_epochs = [
        ("Epoch 1", "Sensorimotor",       "0–2 yr",
         "Sensory + motor exploration; pleasure from body movement; object manipulation; self-focused; no rules",
         colors.HexColor("#cc8800")),
        ("Epoch 2", "Symbolic/Simple",    "2–4 yr",
         "Imitates adult roles; make-believe + pretend; begins brief cooperation; fantasy predominates",
         colors.HexColor("#aa6600")),
        ("Epoch 3", "Dramatic/Complex",   "4–7 yr",
         "Elaborate role-play; peers essential; constructive creation; simple rules understood",
         ORANGE),
        ("Epoch 4", "Games / Skills",     "7–12 yr",
         "Rule-governed games; competition + team play; skill building (sports, crafts); peer approval central",
         colors.HexColor("#884400")),
        ("Epoch 5", "Recreational",       "12+ yr",
         "Leisure and hobbies; identity through play; social + creative expression; play → adult recreation",
         colors.HexColor("#662200")),
    ]

    for ep_num, ep_name, age, desc, col in takata_epochs:
        pw = stage_pill(c, MARGIN_L, y, ep_num, col)
        c.setFont("Caveat", 14); c.setFillColor(col)
        c.drawString(MARGIN_L + pw + 6, y + 3, ep_name)
        nw = c.stringWidth(ep_name, "Caveat", 14)
        aw = age_badge(c, MARGIN_L + pw + nw + 12, y, age, col)
        y -= LINE_GAP
        c.setFont("Caveat", 12); c.setFillColor(DARK)
        c.drawString(MARGIN_L + 16, y, desc)
        y -= LINE_GAP + 2

    star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
        "★  Takata's Play History: OT interviews caregiver about play across ALL 5 epochs",
        "    Tells us: what child played, with whom, where, how long, and what was enjoyed",
        "★  Deprivation in any epoch = occupational deprivation  →  assess + address in OT plan"
    ], size=13, bg=colors.HexColor("#fff4e0"), border=ORANGE)
    y -= LINE_GAP * 3 + 14

    divider(c, y); y -= LINE_GAP

    # ── FLOREY ────────────────────────────────────────────────────────────────
    y = section_title(c, MARGIN_L, y, "B.  FLOREY'S PLAY MODEL  (1971)", TEAL, 18)
    c.setFont("Caveat", 13); c.setFillColor(DARK)
    c.drawString(MARGIN_L, y, "Core premise: Play = intrinsically motivated behaviour that is ENDS-IN-ITSELF")
    y -= LINE_GAP + 2

    florey_concepts = [
        ("Intrinsic motivation",    "No external reward needed; child plays because it IS pleasurable"),
        ("Exploratory drive",       "Child naturally seeks novelty and new stimuli"),
        ("Effectance motivation",   "Drive to affect and master the environment"),
        ("Process focus",           "Enjoyment is in the DOING, not the product or outcome"),
        ("Freedom from ext. rules", "Child sets own agenda; cannot be imposed from outside"),
        ("Voluntary participation", "Play cannot be forced; if forced → it is NOT play"),
    ]

    # 2-column layout for Florey
    col1_x = MARGIN_L
    col2_x = MARGIN_L + (W - MARGIN_L - 30) // 2 + 10
    col_w  = (W - MARGIN_L - 30) // 2 - 14
    left_items  = florey_concepts[:3]
    right_items = florey_concepts[3:]
    base_y = y

    for concept, explain in left_items:
        cw = c.stringWidth(concept, "Caveat", 13) + 12
        c.setFillColor(colors.HexColor("#c0f0e8")); c.setStrokeColor(TEAL); c.setLineWidth(0.8)
        c.roundRect(col1_x, y - 3, cw, 17, 5, fill=1, stroke=1)
        c.setFont("Caveat", 13); c.setFillColor(TEAL); c.drawString(col1_x + 6, y + 2, concept)
        y -= LINE_GAP - 2
        c.setFont("Caveat", 12); c.setFillColor(DARK); c.drawString(col1_x + 10, y, "→ " + explain)
        y -= LINE_GAP

    y_right = base_y
    for concept, explain in right_items:
        cw = c.stringWidth(concept, "Caveat", 13) + 12
        c.setFillColor(colors.HexColor("#c0f0e8")); c.setStrokeColor(TEAL); c.setLineWidth(0.8)
        c.roundRect(col2_x, y_right - 3, cw, 17, 5, fill=1, stroke=1)
        c.setFont("Caveat", 13); c.setFillColor(TEAL); c.drawString(col2_x + 6, y_right + 2, concept)
        y_right -= LINE_GAP - 2
        c.setFont("Caveat", 12); c.setFillColor(DARK); c.drawString(col2_x + 10, y_right, "→ " + explain)
        y_right -= LINE_GAP

    y = min(y, y_right) - 4

    c.setFont("Caveat", 13); c.setFillColor(TEAL)
    c.drawString(MARGIN_L, y, "Clinical Relevance:")
    y -= LINE_GAP
    florey_clinical = [
        "Helps distinguish true play from directed/structured activity in assessment",
        "If child is not intrinsically driven → it is NOT play (even if play-like)",
        "Grounds OT's non-directive play therapy approach",
        "Closely linked to Reilly's Occupational Behaviour theory",
        "Influenced Bundy's playfulness model directly",
    ]
    for pt in florey_clinical:
        bullet(c, MARGIN_L, y, pt, size=13, sym_color=TEAL)
        y -= LINE_GAP - 2

    draw_page_number(c, 6, 7)
    c.showPage()


# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 7 — Reilly + Knox + Bundy  +  Master Comparison
# ═══════════════════════════════════════════════════════════════════════════════

def page7(c):
    draw_ruled_paper(c)
    y = MARGIN_TOP - 15

    c.setFont("Caveat", 22); c.setFillColor(BLUE)
    c.drawString(MARGIN_L, y, "OT-SPECIFIC PLAY FRAMEWORKS  —  Part 2  +  Master Comparison")
    y -= 8
    c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
    y -= LINE_GAP + 2

    # ── REILLY ────────────────────────────────────────────────────────────────
    y = section_title(c, MARGIN_L, y, "C.  REILLY'S OCCUPATIONAL BEHAVIOUR  (1974)", RED, 17)
    c.setFont("Caveat", 13); c.setFillColor(DARK)
    c.drawString(MARGIN_L, y, "\"Play is the arena in which children practice the skills & roles necessary for adult life\"  — Mary Reilly")
    y -= LINE_GAP + 2

    # Reilly's 3-level hierarchy
    c.setFont("Caveat", 14); c.setFillColor(RED)
    c.drawString(MARGIN_L, y, "Reilly's Hierarchy of Play:")
    y -= LINE_GAP

    reilly_hier = [
        ("1. Exploratory", "Birth–2yr",
         "Sensory/motor curiosity; intrinsic drive to explore; no goal; sensation-seeking",
         colors.HexColor("#cc3333")),
        ("2. Competency",  "2–7yr",
         "Practice and repetition; mastery motivation; trying harder; skill development",
         colors.HexColor("#aa1111")),
        ("3. Achievement", "7+ yr",
         "Rules, competition, standards; external validation; performance in play",
         RED),
    ]
    for stage, age, desc, col in reilly_hier:
        pw = stage_pill(c, MARGIN_L, y, stage, col, fs=13)
        aw = age_badge(c, MARGIN_L + pw + 8, y, age, col)
        y -= LINE_GAP
        c.setFont("Caveat", 12); c.setFillColor(DARK)
        c.drawString(MARGIN_L + 16, y, desc)
        y -= LINE_GAP

    reilly_pts = [
        "First OT theorist to frame play as PURPOSEFUL OCCUPATION",
        "Play develops habits, roles & skills for adult life performance",
        "Play deprivation = occupational deprivation (clinical + ethical concern)",
        "Foundation of ALL modern OT paediatric occupation-based practice",
    ]
    for pt in reilly_pts:
        bullet(c, MARGIN_L, y, pt, size=13, sym_color=RED)
        y -= LINE_GAP - 2
    y -= 4

    divider(c, y, colors.HexColor("#aaaaaa")); y -= LINE_GAP

    # ── KNOX + BUNDY side by side ─────────────────────────────────────────────
    half_w = (W - MARGIN_L - 30) // 2 - 8
    col1_x = MARGIN_L
    col2_x = MARGIN_L + half_w + 16

    # Knox heading
    c.setFont("Caveat", 16); c.setFillColor(PURPLE)
    c.drawString(col1_x, y, "D.  KNOX PRESCHOOL PLAY SCALE  (1974 / rev. 1997)")
    tw = c.stringWidth("D.  KNOX PRESCHOOL PLAY SCALE  (1974 / rev. 1997)", "Caveat", 16)
    c.setStrokeColor(PURPLE); c.setLineWidth(1.5); c.line(col1_x, y-3, col1_x+tw, y-3)
    # Bundy heading
    c.setFont("Caveat", 16); c.setFillColor(BPURP)
    c.drawString(col2_x, y, "E.  BUNDY'S PLAYFULNESS  /  ToP  (1993)")
    tw2 = c.stringWidth("E.  BUNDY'S PLAYFULNESS  /  ToP  (1993)", "Caveat", 16)
    c.setStrokeColor(BPURP); c.setLineWidth(1.5); c.line(col2_x, y-3, col2_x+tw2, y-3)
    y -= LINE_GAP + 4

    # Knox content
    y_k = y
    c.setFont("Caveat", 12); c.setFillColor(DARK)
    c.drawString(col1_x, y_k, "Observational scale  |  Age: 0–6 yr")
    y_k -= LINE_GAP
    c.drawString(col1_x, y_k, "4 Dimensions assessed in 6-month intervals:")
    y_k -= LINE_GAP

    knox_dims = [
        ("1. Space Management",
         ["Use of body in space", "Gross motor; body control", "Rough + tumble; running", "Outdoor + indoor interest"]),
        ("2. Material Management",
         ["How child handles objects", "Manipulation + construction", "Attention + interest in toys", "Purpose + creativity w/ objects"]),
        ("3. Imitation",
         ["Social knowledge development", "Imitates people + situations", "Pretend + symbolic use", "Understanding social world"]),
        ("4. Participation",
         ["Degree of social involvement", "Amount + type of interaction", "Language used in play", "Cooperation + independence"]),
    ]
    dim_cols = [PURPLE, colors.HexColor("#7a22bb"), colors.HexColor("#9900cc"), colors.HexColor("#5500aa")]
    for i, (dim, pts) in enumerate(knox_dims):
        dc = dim_cols[i]
        dw = c.stringWidth(dim, "Caveat", 13) + 12
        c.setFillColor(colors.HexColor("#ece0ff")); c.setStrokeColor(dc); c.setLineWidth(0.8)
        c.roundRect(col1_x, y_k - 3, dw, 17, 5, fill=1, stroke=1)
        c.setFont("Caveat", 13); c.setFillColor(dc); c.drawString(col1_x + 6, y_k + 2, dim)
        y_k -= LINE_GAP
        for pt in pts:
            c.setFont("Caveat", 11); c.setFillColor(DARK)
            c.drawString(col1_x + 12, y_k, "· " + pt); y_k -= 14
        y_k -= 4

    c.setFont("Caveat", 12); c.setFillColor(PURPLE)
    c.drawString(col1_x, y_k, "★ No standard tasks needed")
    y_k -= LINE_GAP - 4
    c.drawString(col1_x, y_k, "★ Naturalistic; high ecological validity")
    y_k -= LINE_GAP - 4
    c.drawString(col1_x, y_k, "★ Semi-structured; indoor AND outdoor")

    # Bundy content
    y_b = y
    c.setFont("Caveat", 12); c.setFillColor(DARK)
    c.drawString(col2_x, y_b, "Play = a DISPOSITION (playfulness), not just an activity")
    y_b -= LINE_GAP + 2
    c.setFont("Caveat", 13); c.setFillColor(BPURP)
    c.drawString(col2_x, y_b, "3 Core Elements of Playfulness:")
    y_b -= LINE_GAP

    bundy_elems = [
        ("① Intrinsic Motivation",
         "Doing for OWN sake; no external reward",
         ["Drives genuine engagement", "Child must WANT to play"]),
        ("② Internal Locus of Control",
         "Child DIRECTS the action",
         ["Chooses what/how to play", "Sense of agency + autonomy"]),
        ("③ Freedom from Reality",
         "Suspend real-world rules",
         ["\"What if\" thinking space", "Stick=sword; box=castle"]),
    ]
    belem_cols = [BPURP, colors.HexColor("#aa00aa"), colors.HexColor("#660066")]
    for i, (elem, tagline, pts) in enumerate(bundy_elems):
        bc = belem_cols[i]
        ew = c.stringWidth(elem, "Caveat", 13) + 12
        c.setFillColor(colors.HexColor("#f5e0ff")); c.setStrokeColor(bc); c.setLineWidth(0.8)
        c.roundRect(col2_x, y_b - 3, ew, 17, 5, fill=1, stroke=1)
        c.setFont("Caveat", 13); c.setFillColor(bc); c.drawString(col2_x + 6, y_b + 2, elem)
        y_b -= LINE_GAP - 2
        c.setFont("Caveat", 12); c.setFillColor(DARK); c.drawString(col2_x + 10, y_b, "→ " + tagline)
        y_b -= 14
        for pt in pts:
            c.setFont("Caveat", 11); c.setFillColor(DARK)
            c.drawString(col2_x + 16, y_b, "· " + pt); y_b -= 13
        y_b -= 5

    c.setFont("Caveat", 13); c.setFillColor(BPURP)
    c.drawString(col2_x, y_b, "Test of Playfulness (ToP):")
    y_b -= LINE_GAP - 2
    top_pts = [
        "Age: 6 months – 18 years",
        "30 items; rates extent, intensity + skill",
        "Measures QUALITY of play (not just type)",
        "Setting: natural play environment",
        "4th element added later: CONTEXT",
        "  (does environment support play?)",
        "Built on Florey + Reilly foundations",
        "Most OT-specific play measure available",
    ]
    for pt in top_pts:
        c.setFont("Caveat", 11); c.setFillColor(DARK)
        c.drawString(col2_x + 10, y_b, "· " + pt); y_b -= 13

    y = min(y_k, y_b) - 8

    # ── MASTER COMPARISON TABLE ───────────────────────────────────────────────
    divider(c, y); y -= LINE_GAP

    y = section_title(c, MARGIN_L, y, "MASTER COMPARISON — ALL 8 FRAMEWORKS", BLUE, 16)

    # Table headers
    col_xs = [MARGIN_L, MARGIN_L + 95, MARGIN_L + 148, MARGIN_L + 200, MARGIN_L + 300, MARGIN_L + 430, MARGIN_L + 530]
    col_labels = ["Framework", "Year", "Focus", "Stages", "Unique Contribution", "Tool/Method", "Best Used For"]
    for i, lbl in enumerate(col_labels):
        c.setFillColor(BLUE); c.setFont("Caveat", 11)
        bw = c.stringWidth(lbl, "Caveat", 11) + 8
        c.roundRect(col_xs[i], y - 3, bw if i < len(col_labels)-1 else W-MARGIN_L-30-col_xs[i]+MARGIN_L, 16, 3, fill=1, stroke=0)
        c.setFillColor(colors.white); c.drawString(col_xs[i] + 4, y + 1, lbl)
    y -= LINE_GAP

    all_rows = [
        ["Parten",     "1932", "Social participation",    "6", "Social complexity ladder",        "Observation",            "Social skills Ax"],
        ["Piaget",     "1962", "Cognitive stage",          "3", "Play ↔ cognition link",           "Play, Dreams, Imitation","Dev. evaluation"],
        ["Smilansky",  "1968", "Functional category",      "4", "Added constructive play",         "Classroom/clinic Ax",    "Clinic/classroom"],
        ["Takata",     "1974", "Play history epochs",      "5", "OT play history interview",       "Play History (OT)",      "OT Ax + history"],
        ["Florey",     "1971", "Intrinsic motivation",     "–", "Play = ends-in-itself",           "Theoretical model",      "OT theory base"],
        ["Reilly",     "1974", "Occupational behaviour",   "3", "Play as child's occupation",      "OB Theory",              "OT practice model"],
        ["Knox",       "1997", "4 play dimensions",        "–", "Naturalistic observation",        "RKPPS (0–6yr)",          "Preschool OT Ax"],
        ["Bundy",      "1993", "Playfulness quality",      "3", "Playfulness as disposition",      "Test of Playfulness",    "Quality of play"],
    ]
    row_bgs = [
        colors.HexColor("#fff0f0"), colors.HexColor("#eef4ff"), colors.HexColor("#efffef"),
        colors.HexColor("#fff4e0"), colors.HexColor("#e0fff8"), colors.HexColor("#fff0e8"),
        colors.HexColor("#f0e8ff"), colors.HexColor("#ffe8ff"),
    ]
    row_fgs = [RED, BLUE, GREEN, ORANGE, TEAL, RED, PURPLE, BPURP]

    for ri, row in enumerate(all_rows):
        c.setFillColor(row_bgs[ri]); c.setStrokeColor(colors.HexColor("#cccccc")); c.setLineWidth(0.5)
        c.rect(MARGIN_L, y - 4, W - MARGIN_L - 30, 16, fill=1, stroke=1)
        for ci, cell in enumerate(row):
            tc = row_fgs[ri] if ci == 0 else DARK
            c.setFont("Caveat", 11 if ci == 0 else 10)
            c.setFillColor(tc); c.drawString(col_xs[ci] + 3, y + 1, cell)
        y -= LINE_GAP - 4

    y -= 8
    # Final pearl
    star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
        "★  KEY CLINICAL PEARL: Use Parten (HOW social) + Piaget (WHAT cognitive level) + Smilansky (WHAT type)",
        "    + Takata (HISTORY of play) + Bundy (QUALITY of playfulness) for a COMPLETE play assessment picture",
        "★  Florey + Reilly = OT's theoretical BASE  |  Knox + Bundy = OT's ASSESSMENT TOOLS"
    ], size=13, bg=colors.HexColor("#f0fff0"), border=GREEN)

    draw_page_number(c, 7, 7)
    c.showPage()


# ── Generate extra pages ───────────────────────────────────────────────────────
c = canvas.Canvas(EXTRA_PDF, pagesize=A4)
c.setTitle("Play Notes — Pages 6-7")
page6(c)
page7(c)
c.save()
print("Extra pages saved:", EXTRA_PDF, os.path.getsize(EXTRA_PDF), "bytes")

# ── Merge with original ────────────────────────────────────────────────────────
writer = PdfWriter()

orig = PdfReader(ORIG_PDF)
for page in orig.pages:
    writer.add_page(page)
print(f"Original: {len(orig.pages)} pages")

extra = PdfReader(EXTRA_PDF)
for page in extra.pages:
    writer.add_page(page)
print(f"Extra: {len(extra.pages)} pages")

writer.add_metadata({
    "/Title": "Play: The Occupation of Childhood — Complete Handwritten Notes",
    "/Author": "OT Seminar — Interdisciplinary Team"
})

with open(OUTPUT, "wb") as f:
    writer.write(f)

print(f"Merged PDF: {OUTPUT}")
print(f"Total pages: {len(writer.pages)}")
print(f"File size: {os.path.getsize(OUTPUT)} bytes")
Running Command

cd /tmp/workspace && python3 play_notes_extra_pages.py 2>&1

Done! Your complete notes are ready:

Play Handwritten Notes Complete

PDF Document · PDF


What was added (Pages 6 & 7), same handwritten style as your original:
Page 6 — OT Frameworks Part 1
  • Takata (1974) - All 5 Play Epochs with descriptions + clinical note on Play History interview
  • Florey (1971) - 6 core concepts (intrinsic motivation, effectance drive, process focus, etc.) + clinical relevance in OT
Page 7 — OT Frameworks Part 2 + Master Table
  • Reilly (1974) - 3-level hierarchy (Exploratory → Competency → Achievement) + OT significance
  • Knox (1974/1997) - All 4 dimensions of RKPPS (Space, Material, Imitation, Participation) with bullet details
  • Bundy (1993) - 3 elements of playfulness + full details on Test of Playfulness (ToP)
  • Master Comparison Table - All 8 frameworks in one row: year, focus, stages, unique contribution, tool, best use
  • Final Clinical Pearl - How to combine all frameworks for a complete OT play assessment
Full PDF is now 8 pages total (your original 5 + new classification page from before was already there + 2 new OT-specific pages).

ok js leave all tose you created , keep in mind i got a oral presentation to do in front of my intrerdiciplinary team and i want to give all details abt play and each ppl deinition and yr of findinf with brief classifications coorectly in a pdf format you also add Introduction** 2. **Definition of Play** 3. **Characteristics of Play** 4. **Importance of Play**Comparison of Play Classifications** 8. **Red Flags in Play Development** 9. **Play Assessment**Play as an Intervention** * Occupational Therapy * Physiotherapy * Speech-Language Therapy * Psychology * Special Education 11. **Clinical Applications / Case Example** 12. **Key Take-Home Messages** 13. **Conclusion* make the notes in handwritten format with clear spacing and no overlaping

yoo send me pls

Writing File

~/play_final.py

"""
PLAY: The Occupation of Childhood
Complete Handwritten-Style Notes PDF
All 13 sections | All theorists | Clear spacing | No overlap
"""

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os

pdfmetrics.registerFont(TTFont("Caveat", "/tmp/workspace/Caveat.ttf"))

OUTPUT = "/tmp/workspace/Play_Complete_Notes_FINAL.pdf"
W, H = A4  # 595 x 842

# --- Margins & spacing
LM = 52       # left margin
RM = W - 28   # right margin
TM = H - 28   # top margin
BM = 38       # bottom margin
LG = 23       # line gap (standard)

# --- Colours
BL   = colors.HexColor("#1a3a8f")
RD   = colors.HexColor("#b52020")
GR   = colors.HexColor("#1a6a2a")
OR   = colors.HexColor("#b55000")
PU   = colors.HexColor("#6600aa")
TE   = colors.HexColor("#006666")
BPU  = colors.HexColor("#880088")
DK   = colors.HexColor("#1c1c1c")
GY   = colors.HexColor("#555555")
RULE = colors.HexColor("#ccd8f0")
MARG = colors.HexColor("#f4a0a0")
YB   = colors.HexColor("#fff8d0")
YBD  = colors.HexColor("#c8a000")
RB   = colors.HexColor("#fff0f0")
RBD  = colors.HexColor("#cc4444")
GB   = colors.HexColor("#f0fff4")
GBD  = colors.HexColor("#2a8a2a")
BB   = colors.HexColor("#eef4ff")
BBD  = BL
OB   = colors.HexColor("#fff5ea")
OBD  = OR
PB   = colors.HexColor("#f8eeff")
PBD  = PU

cv = canvas.Canvas(OUTPUT, pagesize=A4)
cv.setTitle("Play: The Occupation of Childhood — Complete Notes")

# =========================================================================
# CORE DRAWING HELPERS
# =========================================================================

def ruled_bg(cv):
    cv.setFillColor(colors.HexColor("#fefef6"))
    cv.rect(0, 0, W, H, fill=1, stroke=0)
    cv.setStrokeColor(RULE); cv.setLineWidth(0.5)
    y = TM
    while y > BM:
        cv.line(LM - 12, y, RM + 4, y)
        y -= LG
    cv.setStrokeColor(MARG); cv.setLineWidth(1.2)
    cv.line(LM - 3, BM, LM - 3, TM + 4)

def pgnum(cv, n, total):
    cv.setFont("Caveat", 12); cv.setFillColor(colors.gray)
    cv.drawCentredString(W/2, 18, f"— {n} / {total} —")

def sec_title(cv, x, y, txt, col=BL, fs=18):
    """Draw underlined section title, return new y."""
    cv.setFont("Caveat", fs); cv.setFillColor(col)
    cv.drawString(x, y, txt)
    tw = cv.stringWidth(txt, "Caveat", fs)
    cv.setStrokeColor(col); cv.setLineWidth(1.8)
    cv.line(x, y-3, x+tw, y-3)
    return y - LG - 6

def write(cv, x, y, txt, fs=13, col=DK):
    cv.setFont("Caveat", fs); cv.setFillColor(col)
    cv.drawString(x, y, txt)

def bul(cv, x, y, txt, fs=13, col=DK, sym="•", scol=BL):
    cv.setFont("Caveat", fs); cv.setFillColor(scol)
    cv.drawString(x, y, sym)
    cv.setFillColor(col); cv.drawString(x+16, y, txt)

def subbul(cv, x, y, txt, fs=12, col=GY):
    cv.setFont("Caveat", fs); cv.setFillColor(col)
    cv.drawString(x+4, y, "→  "+txt)

def divline(cv, y, col=colors.HexColor("#bbbbcc")):
    cv.setStrokeColor(col); cv.setLineWidth(1.0)
    cv.setDash(4, 3); cv.line(LM-10, y, RM, y); cv.setDash()

def pill(cv, x, y, txt, bg, fg=colors.white, fs=13):
    tw = cv.stringWidth(txt, "Caveat", fs) + 14
    cv.setFillColor(bg); cv.roundRect(x, y-3, tw, 19, 7, fill=1, stroke=0)
    cv.setFont("Caveat", fs); cv.setFillColor(fg); cv.drawString(x+7, y+3, txt)
    return tw

def agebadge(cv, x, y, age, col):
    aw = cv.stringWidth(age, "Caveat", 11) + 10
    cv.setFillColor(colors.HexColor("#f0f0f0"))
    cv.setStrokeColor(col); cv.setLineWidth(0.8)
    cv.roundRect(x, y-2, aw, 16, 4, fill=1, stroke=1)
    cv.setFont("Caveat", 11); cv.setFillColor(col); cv.drawString(x+5, y+2, age)
    return aw

def colbox(cv, x, y, w, lines, bg, bdr, fs=12, title=None, tcol=None):
    """Box with optional title strip + content lines. Returns bottom y."""
    lh = LG - 3
    content_h = len(lines) * lh + 10
    title_h = 22 if title else 0
    total_h = content_h + title_h
    # background
    cv.setFillColor(bg); cv.setStrokeColor(bdr); cv.setLineWidth(1.2)
    cv.roundRect(x, y - total_h, w, total_h, 6, fill=1, stroke=1)
    if title:
        cv.setFillColor(bdr)
        cv.roundRect(x, y - title_h, w, title_h, 6, fill=1, stroke=0)
        cv.rect(x, y - title_h, w, title_h/2, fill=1, stroke=0)
        cv.setFont("Caveat", 13); cv.setFillColor(colors.white)
        cv.drawString(x+8, y - title_h + 6, title)
    cy = y - title_h - 14
    for line in lines:
        cv.setFont("Caveat", fs); cv.setFillColor(DK)
        cv.drawString(x+8, cy, line); cy -= lh
    return y - total_h - 6

def starbox(cv, x, y, w, lines, bg=YB, bdr=YBD, fs=12):
    """Yellow star highlight box. Returns bottom y."""
    lh = LG - 2
    h = len(lines) * lh + 14
    cv.setFillColor(bg); cv.setStrokeColor(bdr); cv.setLineWidth(1.5)
    cv.roundRect(x, y - h, w, h, 6, fill=1, stroke=1)
    cy = y - 10
    for line in lines:
        cv.setFont("Caveat", fs); cv.setFillColor(colors.HexColor("#6a4800"))
        cv.drawString(x+8, cy, line); cy -= lh
    return y - h - 6

def page_header(cv, title, subtitle=None):
    """Big title block at top of each page."""
    y = TM - 12
    cv.setFont("Caveat", 20); cv.setFillColor(BL)
    cv.drawString(LM, y, title)
    y -= 7
    cv.setStrokeColor(BL); cv.setLineWidth(2)
    cv.line(LM, y, RM, y)
    y -= 5
    if subtitle:
        cv.setFont("Caveat", 13); cv.setFillColor(GY)
        cv.drawString(LM, y, subtitle)
        y -= 5
    return y - LG

# =========================================================================
# CONTENT PAGES
# =========================================================================
TOTAL_PAGES = 10

# ─────────────────────────────────────────────────────────────────────────
# PAGE 1 — Cover + Introduction + Definition of Play
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)

# Cover title block
y = TM - 10
cv.setFont("Caveat", 28); cv.setFillColor(BL)
cv.drawCentredString(W/2, y, "PLAY: The Occupation of Childhood")
y -= 10
cv.setStrokeColor(BL); cv.setLineWidth(2.5)
cv.line(LM, y, RM, y)
y -= 8
cv.setFont("Caveat", 14); cv.setFillColor(RD)
cv.drawCentredString(W/2, y, "OT Oral Seminar  ·  Interdisciplinary Team  ·  Paediatrics")
y -= LG + 4

divline(cv, y); y -= LG

# 1. INTRODUCTION
y = sec_title(cv, LM, y, "1.  INTRODUCTION", BL, 17)
intro_lines = [
    "Play is the PRIMARY OCCUPATION of childhood — it is how children learn, grow, relate,",
    "and make sense of the world around them.",
    "For ALL members of our interdisciplinary team — OT, PT, SLP, Psychologist — understanding",
    "play is not optional. It is the FOUNDATION of paediatric clinical practice.",
    "Play is the child's natural medium for development across cognitive, social, emotional,",
    "language, and motor domains simultaneously.",
    "The UN Convention on the Rights of the Child (Article 31) recognises play as a",
    "FUNDAMENTAL RIGHT of every child.",
    "When a child cannot play → they are missing their primary occupation → clinical priority.",
]
for line in intro_lines:
    write(cv, LM, y, line, fs=13); y -= LG - 1
y -= 6

divline(cv, y); y -= LG

# 2. DEFINITION OF PLAY
y = sec_title(cv, LM, y, "2.  DEFINITION OF PLAY", BL, 17)
write(cv, LM, y, "No single universal definition — key definitions by theorist:", fs=13, col=GY)
y -= LG + 2

defs = [
    (RD,  "Reilly (1974)",   "\"Play is the arena in which children practice the skills & roles necessary for adult life\""),
    (BL,  "Piaget (1962)",   "Play = pure ASSIMILATION  →  child makes the world fit their existing schema"),
    (GR,  "Florey (1971)",   "Play = intrinsically motivated behaviour that is ends-in-itself; no external reward"),
    (OR,  "AOTA",            "Spontaneous or organised activity that provides enjoyment, entertainment & diversion"),
    (TE,  "Bundy (1993)",    "Play is a DISPOSITION (playfulness) defined by 3 qualities: see below"),
    (PU,  "Takata (1974)",   "Play is the child's occupational behaviour; assessed via Play History across epochs"),
]
for col, who, defi in defs:
    pw = pill(cv, LM, y, who, col, fs=12)
    cv.setFont("Caveat", 12); cv.setFillColor(DK)
    # wrap if needed
    if cv.stringWidth(defi, "Caveat", 12) > (RM - LM - pw - 12):
        mid = len(defi)//2
        # find nearest space
        split = defi.rfind(" ", 0, mid+20)
        cv.drawString(LM + pw + 8, y + 2, defi[:split])
        y -= LG - 4
        cv.drawString(LM + pw + 8, y + 2, defi[split+1:])
    else:
        cv.drawString(LM + pw + 8, y + 2, defi)
    y -= LG + 2

y -= 4
# Bundy box
y = starbox(cv, LM, y, RM - LM, [
    "★  BUNDY'S 3 CORE QUALITIES (most cited in OT):",
    "    ①  Intrinsic Motivation  →  done for pleasure; NO external reward",
    "    ②  Internal Locus of Control  →  child DIRECTS the action; sense of agency",
    "    ③  Freedom from Reality  →  'what if' space; stick = sword; box = spaceship",
    "    If ANY of these 3 are absent  →  it is INSTRUCTION, not play",
], fs=12)

pgnum(cv, 1, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 2 — Characteristics + Importance of Play
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "3.  CHARACTERISTICS OF PLAY  &  4.  IMPORTANCE OF PLAY")

# Characteristics
y = sec_title(cv, LM, y, "3.  CHARACTERISTICS OF PLAY", BL, 17)
write(cv, LM, y, "7 universally accepted characteristics — must ALL be present for true play:", fs=13, col=GY)
y -= LG + 2

chars = [
    (BL, "Intrinsically Motivated",   "Done purely for pleasure; no external reward or goal"),
    (GR, "Freely Chosen",             "Self-selected; child voluntarily chooses to engage"),
    (RD, "Process over Product",      "The experience & enjoyment matter MORE than the outcome"),
    (OR, "Non-literal / Symbolic",    "Suspension of reality; 'what if' thinking is allowed"),
    (PU, "Positive Affect",           "Generally associated with enjoyment, fun, and enthusiasm"),
    (TE, "Active Engagement",         "Physical and/or mental involvement of the child"),
    (BPU,"Safe Exploration",          "Risk-taking occurs within a protected, non-threatening context"),
]
for col, char, explain in chars:
    pw = pill(cv, LM, y, char, col, fs=12)
    cv.setFont("Caveat", 12); cv.setFillColor(DK)
    cv.drawString(LM + pw + 8, y + 2, explain)
    y -= LG + 3
y -= 8

divline(cv, y); y -= LG

# Importance
y = sec_title(cv, LM, y, "4.  IMPORTANCE OF PLAY", BL, 17)
write(cv, LM, y, "Play builds ALL domains of child development simultaneously:", fs=13, col=GY)
y -= LG + 4

domains = [
    (BL, "COGNITIVE",   ["Problem-solving, creativity, cause-and-effect", "Attention, memory, executive function", "Symbolic thinking, concept formation"]),
    (GR, "LANGUAGE",    ["Vocabulary expansion, narrative skills", "Turn-taking, pragmatics, conversational rules", "Joint attention and shared reference"]),
    (RD, "SOCIAL",      ["Empathy, cooperation, conflict resolution", "Theory of Mind (understanding others' perspective)", "Rule understanding, negotiation"]),
    (OR, "EMOTIONAL",   ["Self-regulation, frustration tolerance", "Expression of feelings, coping skills", "Resilience and emotional literacy"]),
    (PU, "MOTOR",       ["Gross motor: balance, coordination, strength", "Fine motor: manipulation, tool use", "Sensory integration and body awareness"]),
    (TE, "IDENTITY",    ["Sense of self, mastery, autonomy", "Role exploration and identity formation", "Confidence and self-efficacy"]],
]

# 2-column layout
col1x = LM; col2x = LM + (RM-LM)//2 + 8
cw = (RM - LM)//2 - 10
left  = domains[:3]
right = domains[3:]
base_y = y

for col, dom, pts in left:
    write(cv, col1x, y, dom, fs=14, col=col)
    cv.setStrokeColor(col); cv.setLineWidth(1)
    cv.line(col1x, y-2, col1x + cv.stringWidth(dom,"Caveat",14), y-2)
    y -= LG - 2
    for pt in pts:
        subbul(cv, col1x, y, pt, fs=12); y -= LG - 5
    y -= 6

y2 = base_y
for col, dom, pts in right:
    write(cv, col2x, y2, dom, fs=14, col=col)
    cv.setStrokeColor(col); cv.setLineWidth(1)
    cv.line(col2x, y2-2, col2x + cv.stringWidth(dom,"Caveat",14), y2-2)
    y2 -= LG - 2
    for pt in pts:
        subbul(cv, col2x, y2, pt, fs=12); y2 -= LG - 5
    y2 -= 6

y = min(y, y2) - 8
y = starbox(cv, LM, y, RM-LM, [
    "★  UN CRC Article 31: Play is a FUNDAMENTAL RIGHT of every child",
    "★  Play is not a break from development — it IS development",
    "★  A child deprived of play is experiencing OCCUPATIONAL DEPRIVATION (Reilly, 1974)",
], fs=12)

pgnum(cv, 2, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 3 — Play Development Across Age Groups (Birth–7 yr)
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "5.  PLAY DEVELOPMENT ACROSS AGE GROUPS  (Part 1)")

age_groups_1 = [
    (RD,  "Birth – 3 months",
     ["Sensory exploration; reflexive interaction",
      "Attends to faces, voices, contrasting visuals",
      "Social smiling emerges ~6 weeks",
      "Early turn-taking via gaze + vocalisation (proto-conversations)",
      "Play type: Reactive; caregiver-initiated"]),
    (OR,  "3 – 6 months",
     ["Reaches + grasps objects; mouths for oral exploration",
      "Enjoys rattles, textures, visual mobiles",
      "Laughter + vocalisation during social games",
      "Cause-and-effect discovery begins",
      "Play type: Sensorimotor"]),
    (GR,  "6 – 12 months",
     ["Bangs, drops, throws → exploring object properties",
      "Object permanence ~9 months → peek-a-boo is now meaningful",
      "Joint attention emerges: pointing + following gaze  ← SLP key milestone",
      "Functional object use begins: phone to ear, comb to hair",
      "Play type: Exploratory + early functional"]),
    (BL,  "1 – 2 years",
     ["Functional object use (cup to drink, spoon to feed)",
      "Early pretend with OWN body (pretends to eat, sleep)",
      "Parallel play begins; sorts shapes + colours",
      "Builds 2–4 block towers; make-believe begins",
      "Play type: Functional + early symbolic"]),
    (PU,  "2 – 3 years",
     ["Symbolic play expands: block = car; feeds mother with empty spoon",
      "Pretend sequences emerge (cooking then eating)",
      "Parallel play predominates — plays BESIDE others, not WITH",
      "Builds 6-block towers; completes simple puzzles",
      "Play type: Symbolic + parallel social"]),
    (TE,  "3 – 5 years",
     ["Dramatic/pretend play flourishes (doctor, parent, teacher)",
      "Associative play → cooperative play by age 4–5",
      "Imaginary companions common (up to 50% of children age 3–10!)",
      "Understands simple rules in games",
      "Play type: Dramatic, associative, early cooperative"]),
    (RD,  "5 – 7 years",
     ["Cooperative play with rules established",
      "Board games, organised sports, team activities",
      "Understands fairness, competition, turn-taking",
      "Play type: Games with Rules + constructive"]),
]

for col, age, pts in age_groups_1:
    if y < BM + 60:
        pgnum(cv, 3, TOTAL_PAGES); cv.showPage()
        ruled_bg(cv); y = page_header(cv, "5.  PLAY DEVELOPMENT  (continued)")
    pw = pill(cv, LM, y, age, col, fs=13)
    y -= LG + 2
    for pt in pts:
        is_type = pt.startswith("Play type")
        sym = "▸" if is_type else "·"
        sc  = col if is_type else GY
        fc  = col if is_type else DK
        cv.setFont("Caveat", 12 if not is_type else 13)
        cv.setFillColor(sc); cv.drawString(LM+14, y, sym)
        cv.setFillColor(fc); cv.drawString(LM+24, y, pt)
        y -= LG - 4
    y -= 6

pgnum(cv, 3, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 4 — Play Development 7–Adolescence + Parten's Social Stages
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "5.  PLAY DEVELOPMENT  (Part 2)  +  6.  CLASSIFICATIONS — PARTEN")

age_groups_2 = [
    (BL,  "7 – 12 years",
     ["Complex team games; hobbies emerge (collecting, sports, crafts)",
      "Rule-governed play dominates; logical strategy involved",
      "Peer relationships and social hierarchy appear in play",
      "Fantasy shifts to structured creative activities",
      "Play type: Games with Rules + constructive + competitive"]),
    (GR,  "Adolescence",
     ["Play transitions to leisure, recreation, social activities",
      "Sports, music, art, digital games, creative writing",
      "Identity exploration through hobbies + group membership",
      "Peer relationships are the central 'play' context",
      "Play type: Recreational/leisure + competitive/cooperative"]),
]
for col, age, pts in age_groups_2:
    pw = pill(cv, LM, y, age, col, fs=13)
    y -= LG + 2
    for pt in pts:
        is_type = pt.startswith("Play type")
        sc = col if is_type else GY; fc = col if is_type else DK
        cv.setFont("Caveat", 12 if not is_type else 13)
        cv.setFillColor(sc); cv.drawString(LM+14, y, "▸" if is_type else "·")
        cv.setFillColor(fc); cv.drawString(LM+24, y, pt)
        y -= LG - 4
    y -= 8

divline(cv, y); y -= LG

# PARTEN
y = sec_title(cv, LM, y, "6A.  PARTEN'S SOCIAL STAGES OF PLAY  (1932)", RD, 17)
write(cv, LM, y, "Classified by DEGREE OF SOCIAL PARTICIPATION  →  6 stages; broadly sequential but not mutually exclusive", fs=12, col=GY)
y -= LG + 4

parten_stages = [
    (1, "Unoccupied Play",  "Birth–3m",  "Random movements; no purpose; not engaging with toys or people",
     colors.HexColor("#999999")),
    (2, "Solitary Play",    "0–2 yr",    "Plays completely alone; no interest in others  ✓ Normal & healthy at this age",
     colors.HexColor("#3388cc")),
    (3, "Onlooker Play",    "~2 yr",     "Watches others play but does NOT join; observational learning still occurring",
     colors.HexColor("#33aaaa")),
    (4, "Parallel Play",    "2–2.5 yr",  "Plays BESIDE others with similar toys; NO interaction; no shared goal",
     colors.HexColor("#33aa55")),
    (5, "Associative Play", "3–4 yr",    "Interacts; shares toys + space; common theme BUT no organised goal or roles",
     OR),
    (6, "Cooperative Play", "4+ yr",     "Organised group; shared goal; defined roles + rules + turn-taking; needs empathy",
     RD),
]

for num, name, age, desc, col in parten_stages:
    # row background
    bg = colors.HexColor("#fff5f5") if num % 2 == 0 else colors.HexColor("#ffffff")
    cv.setFillColor(bg); cv.roundRect(LM, y-6, RM-LM, 22, 4, fill=1, stroke=0)
    # number circle
    cv.setFillColor(col); cv.circle(LM+10, y+5, 9, fill=1, stroke=0)
    cv.setFont("Caveat", 12); cv.setFillColor(colors.white); cv.drawCentredString(LM+10, y+2, str(num))
    # name pill
    nw = pill(cv, LM+24, y, name, col, fs=12)
    # age badge
    aw = agebadge(cv, LM+26+nw, y, age, col)
    # description
    cv.setFont("Caveat", 12); cv.setFillColor(DK)
    cv.drawString(LM+30+nw+aw, y+2, desc)
    y -= LG + 4

y -= 4
y = starbox(cv, LM, y, RM-LM, [
    "⚠  CLINICAL NOTE: Regression to earlier social stages in older children = significant flag",
    "    Sustained solitary play in a 4-yr-old  →  assess for ASD, anxiety, social communication disorder",
    "★  Stages are SEQUENTIAL in development but can ALL coexist in older children",
], fs=12)

pgnum(cv, 4, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 5 — Piaget + Smilansky + Takata
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "6.  CLASSIFICATIONS  —  PIAGET  |  SMILANSKY  |  TAKATA")

# PIAGET
y = sec_title(cv, LM, y, "6B.  PIAGET'S COGNITIVE STAGES OF PLAY  (1962)", BL, 17)
write(cv, LM, y, "Play reflects how children PROCESS + ASSIMILATE the world  →  linked directly to cognitive development stage", fs=12, col=GY)
y -= LG + 4

piaget_stages = [
    (BL, "Stage 1: Practice (Sensorimotor) Play",  "Birth – 2 yrs  |  Sensorimotor Stage",
     ["Repetitive motor actions performed for PLEASURE",
      "Examples: banging blocks, splashing water, rolling a ball",
      "Purpose: consolidating sensorimotor schemas",
      "Key feature: pure ASSIMILATION — repeating what is already known"]),
    (colors.HexColor("#3355cc"), "Stage 2: Symbolic (Pretend) Play", "2 – 7 yrs  |  Preoperational Stage",
     ["USE OF SYMBOLS — one thing represents another",
      "Examples: stick = sword; box = spaceship; doll = real baby",
      "Piaget: 'symbols express what language alone cannot formulate'",
      "Features: deferred imitation, make-believe, role-play, symbolisation",
      "Semiotic function emerges here (language + thought connection)"]),
    (colors.HexColor("#0a2080"), "Stage 3: Games with Rules", "7+ yrs  |  Concrete Operational Stage",
     ["Structured games governed by AGREED rules",
      "Examples: chess, cricket, board games, team sports",
      "Child not only FOLLOWS rules but CREATES + DEFENDS them",
      "Purpose: social coordination, logical reasoning, moral development"]),
]
for col, sname, subtitle, pts in piaget_stages:
    pw = pill(cv, LM, y, sname, col, fs=12)
    y -= LG - 2
    cv.setFont("Caveat", 11); cv.setFillColor(col); cv.drawString(LM+10, y, subtitle)
    y -= LG - 2
    for pt in pts:
        cv.setFont("Caveat", 12); cv.setFillColor(DK)
        cv.drawString(LM+14, y, "→  "+pt); y -= LG - 4
    y -= 6

divline(cv, y); y -= LG

# SMILANSKY
y = sec_title(cv, LM, y, "6C.  SMILANSKY'S FUNCTIONAL CLASSIFICATION  (1968)", GR, 17)
write(cv, LM, y, "Built on Piaget; MOST PRACTICALLY USED in clinic + classroom  →  4 categories", fs=12, col=GY)
y -= LG + 4

smil_stages = [
    (TE,   "1. Functional Play",   "0–2 yr",
     "Simple repetitive actions ± objects  |  Running, banging, rolling  |  = Piaget Practice Play  |  Builds sensorimotor skill"),
    (GR,   "2. Constructive Play", "2–6 yr",
     "Using materials to CREATE/BUILD  |  Blocks, sand, drawing, puzzles  |  ~50% of all preschool play  |  Spatial reasoning + persistence"),
    (RD,   "3. Dramatic Play",     "2–7 yr",
     "Role-play + acting out scenarios  |  Playing house/doctor/teacher  |  Sociodramatic = 2+ children  |  ToM, language, self-regulation"),
    (PU,   "4. Games with Rules",  "6+ yr",
     "Pre-established rules accepted by all  |  Cards, sports, board games  |  = Piaget Games with Rules  |  Inhibitory control + social coord."),
]
for col, sname, age, desc in smil_stages:
    pw = pill(cv, LM, y, sname, col, fs=13)
    aw = agebadge(cv, LM+pw+8, y, age, col)
    y -= LG
    # split desc at |
    parts = [p.strip() for p in desc.split("|")]
    line1 = "  ·  ".join(parts[:2])
    line2 = "  ·  ".join(parts[2:]) if len(parts) > 2 else ""
    cv.setFont("Caveat", 12); cv.setFillColor(DK)
    cv.drawString(LM+12, y, line1); y -= LG - 4
    if line2:
        cv.drawString(LM+12, y, line2); y -= LG - 4
    y -= 5

divline(cv, y); y -= LG

# TAKATA
y = sec_title(cv, LM, y, "6D.  TAKATA'S PLAY EPOCHS  (1974)", OR, 17)
write(cv, LM, y, "OT-SPECIFIC model  →  basis for the PLAY HISTORY assessment interview  |  5 epochs across the lifespan", fs=12, col=GY)
y -= LG + 4

takata_epochs = [
    (1, "Sensorimotor",      "0–2 yr",  "Sensory/motor exploration; pleasure from movement; object manipulation; no rules; self-focused"),
    (2, "Symbolic/Simple",   "2–4 yr",  "Imitates adult roles; make-believe + pretend; brief cooperation; fantasy predominates"),
    (3, "Dramatic/Complex",  "4–7 yr",  "Elaborate role-play; peers essential; constructive creation; simple rules understood"),
    (4, "Games / Skills",    "7–12 yr", "Rule-governed games; competition + team play; skill building (sports, crafts); peer approval important"),
    (5, "Recreational",      "12+ yr",  "Leisure + hobbies; identity through play; social + creative expression; play → adult recreation"),
]
for num, ename, age, desc in takata_epochs:
    col = OR
    cv.setFillColor(colors.HexColor("#fff5e0")); cv.roundRect(LM, y-6, RM-LM, 22, 4, fill=1, stroke=0)
    cv.setFillColor(OR); cv.circle(LM+10, y+5, 9, fill=1, stroke=0)
    cv.setFont("Caveat", 12); cv.setFillColor(colors.white); cv.drawCentredString(LM+10, y+2, str(num))
    nw = pill(cv, LM+24, y, ename, OR, fs=12)
    aw = agebadge(cv, LM+26+nw, y, age, OR)
    cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+30+nw+aw, y+2, desc)
    y -= LG + 4

y = starbox(cv, LM, y, RM-LM, [
    "★  Takata's Play History: OT interviews caregiver about play across ALL 5 epochs",
    "    Covers: what child played, with whom, where, for how long, what was enjoyed",
    "★  Absence of play in any epoch = occupational deprivation → must address in OT plan",
], fs=12)

pgnum(cv, 5, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 6 — Florey, Reilly, Knox, Bundy
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "6.  CLASSIFICATIONS  —  FLOREY  |  REILLY  |  KNOX  |  BUNDY")

# FLOREY
y = sec_title(cv, LM, y, "6E.  FLOREY'S PLAY MODEL  (1971)", TE, 17)
write(cv, LM, y, "Core premise: Play = intrinsically motivated behaviour that is ENDS-IN-ITSELF", fs=13)
y -= LG + 2
florey_pts = [
    ("Intrinsic motivation",     "No external reward needed — child plays because it IS pleasurable"),
    ("Exploratory drive",        "Child naturally seeks novelty and new stimuli in the environment"),
    ("Effectance motivation",    "Drive to AFFECT and master the environment builds competence"),
    ("Process focus",            "Enjoyment is in the DOING, not the product or outcome"),
    ("Freedom from ext. rules",  "Child sets own agenda; cannot be externally imposed"),
    ("Voluntary participation",  "Cannot be forced; if forced → it is NOT play by definition"),
]
for concept, explain in florey_pts:
    cw2 = cv.stringWidth(concept, "Caveat", 12) + 12
    cv.setFillColor(colors.HexColor("#c0f0ea")); cv.setStrokeColor(TE); cv.setLineWidth(0.8)
    cv.roundRect(LM+4, y-2, cw2, 16, 4, fill=1, stroke=1)
    cv.setFont("Caveat", 12); cv.setFillColor(TE); cv.drawString(LM+8, y+2, concept)
    cv.setFont("Caveat", 12); cv.setFillColor(DK)
    cv.drawString(LM+cw2+12, y+2, "→  "+explain)
    y -= LG + 1
y -= 4
bul(cv, LM, y, "Influenced Bundy's playfulness model  |  Closely linked to Reilly's Occupational Behaviour theory", fs=12, scol=TE); y -= LG
y -= 6

divline(cv, y); y -= LG

# REILLY
y = sec_title(cv, LM, y, "6F.  REILLY'S OCCUPATIONAL BEHAVIOUR  (1974)", RD, 17)
write(cv, LM, y, "\"Play is the arena in which children practice the skills & roles necessary for adult life\"  — Mary Reilly", fs=13, col=RD)
y -= LG + 4
write(cv, LM, y, "Reilly's 3-Level Hierarchy of Play:", fs=14, col=RD); y -= LG + 2

reilly_hier = [
    ("1. Exploratory", "Birth–2yr", "Sensory/motor curiosity; intrinsic drive to explore; no goal; sensation-seeking"),
    ("2. Competency",  "2–7yr",    "Practice + repetition; mastery motivation; trying harder; skill development"),
    ("3. Achievement", "7+ yr",    "Rules, competition, standards; external validation; performance in play"),
]
for stage, age, desc in reilly_hier:
    pw = pill(cv, LM, y, stage, RD, fs=13)
    aw = agebadge(cv, LM+pw+8, y, age, RD)
    cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+pw+aw+14, y+2, desc)
    y -= LG + 4

reilly_pts = [
    "First OT theorist to frame play as PURPOSEFUL OCCUPATION of childhood",
    "Play develops habits, roles + skills for adult life performance",
    "Play deprivation = OCCUPATIONAL DEPRIVATION  (clinical + ethical concern)",
    "Foundation of ALL modern OT paediatric occupation-based practice",
]
for pt in reilly_pts:
    bul(cv, LM, y, pt, fs=12, scol=RD); y -= LG - 2
y -= 8

divline(cv, y); y -= LG

# KNOX
y = sec_title(cv, LM, y, "6G.  KNOX PRESCHOOL PLAY SCALE  (1974; revised 1997)", PU, 17)
write(cv, LM, y, "Observational scale  |  Age: 0–6 yr  |  Scored in 6-month intervals  |  Naturalistic; no standard tasks needed", fs=12, col=GY)
y -= LG + 4
write(cv, LM, y, "4 Dimensions of Play:", fs=14, col=PU); y -= LG + 2

knox_dims = [
    (PU, "1. Space Management",    "Use of body in space; gross motor control; rough & tumble; outdoor + indoor interest"),
    (colors.HexColor("#7a22bb"), "2. Material Management", "How child handles objects; manipulation + construction; attention + creativity with objects"),
    (colors.HexColor("#9900cc"), "3. Imitation",           "Social knowledge dev.; imitates people + situations; pretend + symbolic use; understanding social world"),
    (colors.HexColor("#5500aa"), "4. Participation",       "Degree of social involvement; type + amount of interaction; language in play; cooperation"),
]
for col, dim, desc in knox_dims:
    dw = cv.stringWidth(dim, "Caveat", 13) + 12
    cv.setFillColor(colors.HexColor("#ece0ff")); cv.setStrokeColor(col); cv.setLineWidth(0.8)
    cv.roundRect(LM+4, y-2, dw, 16, 4, fill=1, stroke=1)
    cv.setFont("Caveat", 13); cv.setFillColor(col); cv.drawString(LM+8, y+2, dim)
    cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+dw+14, y+2, desc)
    y -= LG + 2
y -= 8

divline(cv, y); y -= LG

# BUNDY
y = sec_title(cv, LM, y, "6H.  BUNDY'S PLAYFULNESS MODEL  +  TEST OF PLAYFULNESS  (1993)", BPU, 17)
write(cv, LM, y, "Play = a DISPOSITION (playfulness) — not just an activity type  |  Quality of play matters more than category", fs=12, col=GY)
y -= LG + 4

bundy_elems = [
    (BPU, "① Intrinsic Motivation",       "0–2yr", "Doing for OWN sake; no external reward; drives genuine engagement"),
    (colors.HexColor("#aa00aa"), "② Internal Locus of Control", "2–7yr", "Child DIRECTS the action; chooses what/how to play; sense of agency"),
    (colors.HexColor("#660066"), "③ Freedom from Reality",      "7+yr",  "Suspend real-world rules; 'what if' thinking; stick=sword; box=castle"),
]
for col, elem, age, desc in bundy_elems:
    pw = pill(cv, LM, y, elem, col, fs=13)
    cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+pw+10, y+2, desc)
    y -= LG + 3

y -= 2
write(cv, LM, y, "Test of Playfulness (ToP):", fs=14, col=BPU); y -= LG - 2
top_pts = [
    "Age range: 6 months – 18 years",
    "30 observational items; rates EXTENT, INTENSITY + SKILL of playfulness",
    "Measures QUALITY of play — not just play type or category",
    "Setting: natural play environment (NOT a clinic room with standard tasks)",
    "4th element added later: CONTEXT (does the environment support play?)",
    "Most OT-specific, clinically validated play measure available",
]
for pt in top_pts:
    bul(cv, LM, y, pt, fs=12, scol=BPU); y -= LG - 2

pgnum(cv, 6, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 7 — Comparison Table + Red Flags
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "7.  COMPARISON OF CLASSIFICATIONS  +  8.  RED FLAGS")

y = sec_title(cv, LM, y, "7.  COMPARISON OF ALL PLAY CLASSIFICATION FRAMEWORKS", BL, 17)

# Table
headers = ["Framework", "Year", "Focus", "Stages", "Unique Contribution", "OT Tool / Method"]
col_xs  = [LM, LM+105, LM+165, LM+225, LM+345, LM+480]
col_ws  = [103, 58,    58,    118,    133,    W-LM-30-480+LM]

# header row
cv.setFillColor(BL)
cv.rect(LM, y-4, RM-LM, 18, fill=1, stroke=0)
for i, h in enumerate(headers):
    cv.setFont("Caveat", 11); cv.setFillColor(colors.white)
    cv.drawString(col_xs[i]+3, y+1, h)
y -= LG + 2

table_rows = [
    ["Parten (1932)",     "1932", "Social participation",    "6", "Social complexity ladder",      "Observation"],
    ["Piaget (1962)",     "1962", "Cognitive stage",          "3", "Play ↔ cognition link",         "Play, Dreams & Imitation"],
    ["Smilansky (1968)",  "1968", "Functional type",          "4", "Added Constructive Play",       "Classroom / clinic Ax"],
    ["Takata (1974)",     "1974", "Play history epochs",      "5", "OT Play History interview",     "Play History (OT)"],
    ["Florey (1971)",     "1971", "Intrinsic motivation",     "–", "Play = ends-in-itself",         "Theoretical model"],
    ["Reilly (1974)",     "1974", "Occupational behaviour",   "3", "Play as child's occupation",    "OB Theory"],
    ["Knox (1974/1997)",  "1997", "4 play dimensions",        "–", "Naturalistic observation tool", "RKPPS (0–6 yr)"],
    ["Bundy (1993)",      "1993", "Playfulness quality",      "3", "Playfulness as disposition",    "Test of Playfulness"],
]
row_bgs = [colors.HexColor("#fff0f0"), colors.HexColor("#eef4ff"), colors.HexColor("#efffef"),
           colors.HexColor("#fff4e0"), colors.HexColor("#e8fff8"), colors.HexColor("#fff0e0"),
           colors.HexColor("#f0e8ff"), colors.HexColor("#fff0ff")]
row_fgs = [RD, BL, GR, OR, TE, RD, PU, BPU]

for ri, row in enumerate(table_rows):
    cv.setFillColor(row_bgs[ri]); cv.setStrokeColor(colors.HexColor("#cccccc")); cv.setLineWidth(0.5)
    cv.rect(LM, y-4, RM-LM, 17, fill=1, stroke=1)
    for ci, cell in enumerate(row):
        cv.setFont("Caveat", 11 if ci == 0 else 10)
        cv.setFillColor(row_fgs[ri] if ci == 0 else DK)
        cv.drawString(col_xs[ci]+3, y, cell)
    y -= LG

y -= 4
y = starbox(cv, LM, y, RM-LM, [
    "★  These frameworks are COMPLEMENTARY — use multiple lenses for one child",
    "    Parten → HOW social  |  Piaget → WHAT cognitive level  |  Smilansky → WHAT type",
    "    Takata → play HISTORY  |  Bundy → QUALITY of playfulness  |  Knox → 4 DIMENSIONS",
], fs=12)

divline(cv, y); y -= LG

# RED FLAGS
y = sec_title(cv, LM, y, "8.  RED FLAGS IN PLAY DEVELOPMENT", RD, 17)
write(cv, LM, y, "When to be concerned — act early!", fs=13, col=RD); y -= LG + 4

red_flags = [
    ("12 months",  "No functional object use  |  No gesture  |  No joint attention"),
    ("18 months",  "No pretend play of ANY kind  |  No symbolic object use  |  < 10 words"),
    ("24 months",  "No symbolic play  |  Stuck in solitary play  |  No 2-word phrases"),
    ("36 months",  "No dramatic or role play  |  No peer engagement of any kind"),
    ("4–5 years",  "Cannot engage in cooperative play  |  Aggressive disruption of games"),
    ("Any age",    "Repetitive / stereotyped play with NO variation  →  ASD red flag"),
    ("Any age",    "Regression to earlier play stages after a stressor  →  psychological concern"),
    ("Any age",    "Sexualised or aggressively scripted play child cannot shift away from  →  trauma screen"),
]
for age_f, flag in red_flags:
    aw = cv.stringWidth(age_f, "Caveat", 12) + 10
    cv.setFillColor(RD); cv.roundRect(LM, y-2, aw, 17, 5, fill=1, stroke=0)
    cv.setFont("Caveat", 12); cv.setFillColor(colors.white); cv.drawString(LM+5, y+2, age_f)
    cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+aw+8, y+2, flag)
    y -= LG + 2

y = starbox(cv, LM, y, RM-LM, [
    "ASD-Specific Red Flags in Play:",
    "  ✗  Absent or minimal pretend / symbolic play",
    "  ✗  No interest in interactive or shared play with others",
    "  ✗  Repetitive stereotyped object use (spinning wheels, lining up objects)",
    "  ✗  No imitation of others  |  No sociodramatic play by age 3",
    "  → Any 2+ flags: refer for ASD assessment + OT + SLP + developmental paediatrics",
], fs=12, bg=colors.HexColor("#fff0f0"), bdr=RD)

pgnum(cv, 7, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 8 — Play Assessment
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "9.  PLAY ASSESSMENT")

y = sec_title(cv, LM, y, "9.  PLAY ASSESSMENT", BL, 17)
write(cv, LM, y, "3 complementary approaches — use in combination for complete picture:", fs=13, col=GY)
y -= LG + 6

# 9.1 Clinical Observation
y = sec_title(cv, LM, y, "9.1  Clinical Observation", GR, 15)
write(cv, LM, y, "Observe the child across 3 domains:", fs=13); y -= LG + 2

obs_domains = [
    (BL, "Cognitive",       "Problem-solving, symbolic use, attention span, sequencing, creativity"),
    (GR, "Social-Emotional","Eye contact, turn-taking, affect, relatedness to examiner + caregiver"),
    (RD, "Sensorimotor",    "Coordination, motor control, sensory responses, tool use, body awareness"),
]
for col, dom, desc in obs_domains:
    pw = pill(cv, LM+4, y, dom, col, fs=12)
    cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+pw+12, y+2, desc)
    y -= LG + 2
y -= 4
obs_tips = [
    "Provide open-ended toys: blocks, dolls, play-dough, cars, kitchen set",
    "Observe in CHILD-LED and THERAPIST-DIRECTED conditions",
    "Note: flexibility, creativity, affect, persistence, frustration tolerance",
    "Note what is ABSENT: no imitation, no pretend, no peer engagement",
    "Kaplan & Sadock: 'during imaginative play, clinician observes coordination,",
    "   speech + language, attention span, readiness to engage, capacity for complex thought'",
]
for pt in obs_tips:
    bul(cv, LM, y, pt, fs=12, scol=GR); y -= LG - 2
y -= 8

divline(cv, y, GY); y -= LG

# 9.2 Parent/Caregiver Interview
y = sec_title(cv, LM, y, "9.2  Parent / Caregiver Interview", OR, 15)
interview_qs = [
    "What does the child enjoy playing? Alone or with others?",
    "Does the child engage in pretend play? Can they describe scenarios?",
    "Does the child play differently at home vs school vs unfamiliar settings?",
    "Are there preferred objects? Any repetitive or rigid play patterns?",
    "Has play changed recently? (regression is clinically significant)",
    "Does the child invite others to play or prefer isolation?",
]
for q in interview_qs:
    bul(cv, LM, y, q, fs=12, sym="Q:", scol=OR); y -= LG - 2
y -= 8

divline(cv, y, GY); y -= LG

# 9.3 Standardised Tools
y = sec_title(cv, LM, y, "9.3  Standardised Play Assessments", PU, 15)

tools = [
    ("Test of Playfulness (ToP)",          "6mo–18yr",  "Bundy's 3 qualities; extent, intensity + skill; naturalistic",  "OT"),
    ("Knox RKPPS",                          "0–6yr",     "4 dimensions: space, material, imitation, participation",       "OT"),
    ("Symbolic Play Test (SPT)",            "1–3yr",     "Symbolic play level; non-verbal cognitive ability",              "SLP / OT"),
    ("Westby Play Scale",                   "9mo–5yr",   "Sequential symbolic play development milestones",               "SLP / OT"),
    ("ChIPPA",                              "3–7yr",     "Elaborateness + spontaneity of pretend play",                   "OT"),
    ("Play History (Takata)",               "All ages",  "OT interview-based occupational history of play",               "OT"),
    ("TPBA (Transdisciplinary PBA)",        "0–6yr",     "Multi-domain developmental assessment through play — TEAM tool","ALL"),
]
t_xs  = [LM, LM+164, LM+216, LM+396]
t_hds = ["Tool", "Age", "Measures", "Used By"]

cv.setFillColor(PU); cv.rect(LM, y-4, RM-LM, 17, fill=1, stroke=0)
for i, h in enumerate(t_hds):
    cv.setFont("Caveat", 11); cv.setFillColor(colors.white); cv.drawString(t_xs[i]+3, y, h)
y -= LG

for ri, (tool, age, meas, by) in enumerate(tools):
    bg2 = colors.HexColor("#f8f0ff") if ri % 2 == 0 else colors.HexColor("#ffffff")
    cv.setFillColor(bg2); cv.setStrokeColor(colors.HexColor("#cccccc")); cv.setLineWidth(0.4)
    cv.rect(LM, y-4, RM-LM, 17, fill=1, stroke=1)
    cv.setFont("Caveat", 11); cv.setFillColor(PU if by=="OT" else (RD if by=="ALL" else GR))
    cv.drawString(t_xs[0]+3, y, tool)
    cv.setFillColor(DK); cv.drawString(t_xs[1]+3, y, age)
    cv.drawString(t_xs[2]+3, y, meas)
    cv.setFillColor(RD if by=="ALL" else BL); cv.drawString(t_xs[3]+3, y, by)
    y -= LG

y = starbox(cv, LM, y, RM-LM, [
    "★  GOLD STANDARD: TPBA — observe play as a TEAM; all disciplines together",
    "★  Play assessment = developmental assessment: you learn cognitive + language + motor + social simultaneously",
], fs=12)

pgnum(cv, 8, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 9 — Play as Intervention + Clinical Case
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "10.  PLAY AS INTERVENTION  +  11.  CLINICAL CASE EXAMPLE")

y = sec_title(cv, LM, y, "10.  PLAY AS AN INTERVENTION", BL, 17)

disciplines = [
    (BL,  "Occupational Therapy",
     ["Play is BOTH the MEANS and the END in OT (AOTA Framework)",
      "Play as MEANS: use play to build sensory processing, fine motor, ADL, social skills",
      "Play as END: restore child's ability to engage in play as a meaningful occupation",
      "Approaches: Sensory Integration (Ayres), DIR/Floortime, NDT, CO-OP, Social Thinking",
      "Setting: clinic, home, school, hospital Child Life programmes"]),
    (GR,  "Physiotherapy",
     ["Uses play to achieve motor goals: balance, coordination, strength, gait",
      "Play-based exercise (obstacle courses, ball games) increases engagement + motivation",
      "Used in: cerebral palsy, developmental delay, post-surgical rehab, paediatric neurology",
      "Key principle: child doesn't know they are 'doing therapy' — they are just playing"]),
    (RD,  "Speech-Language Therapy",
     ["Play provides the NATURAL CONTEXT for language intervention",
      "Joint attention, turn-taking, narrative play all targeted through play",
      "Symbolic play level ≈ language level  →  low symbolic play = language delay risk",
      "Approaches: SCERTS, Hanen 'It Takes Two to Talk', DIR/Floortime",
      "Assess play → determines cognitive-linguistic READINESS for therapy targets"]),
    (OR,  "Psychology",
     ["Play Therapy (Axline): structured or non-directive; child expresses through play",
      "Child uses play to communicate what they cannot yet verbalise",
      "Used in: trauma, anxiety, ADHD, family disruption, grief, abuse",
      "Evidence: cooperative play + creative-expressive activities improve PTSD outcomes",
      "(Kaplan & Sadock: maintained improvement over 6 months in PTSD symptoms + hope)"]),
    (PU,  "Special Education",
     ["Play-based learning embedded in curriculum for children with disabilities",
      "Peer-mediated play interventions for children with ASD",
      "Structured play groups to build social communication + executive function",
      "Sociodramatic play used to develop literacy, numeracy, and joint planning skills"]),
]

for col, disc, pts in disciplines:
    if y < BM + 55:
        pgnum(cv, 9, TOTAL_PAGES); cv.showPage()
        ruled_bg(cv); y = page_header(cv, "10.  PLAY AS INTERVENTION  (continued)")
    pw = pill(cv, LM, y, disc, col, fs=13)
    y -= LG + 2
    for pt in pts:
        cv.setFont("Caveat", 12); cv.setFillColor(col); cv.drawString(LM+12, y, "▸")
        cv.setFillColor(DK); cv.drawString(LM+22, y, pt)
        y -= LG - 3
    y -= 6

divline(cv, y); y -= LG

# CASE EXAMPLE
y = sec_title(cv, LM, y, "11.  CLINICAL CASE EXAMPLE", GR, 17)
write(cv, LM, y, "Aarav, 3.5 years — referred for developmental concern", fs=14, col=GR); y -= LG + 2

case_lines = [
    "PRESENTING CONCERN: 'Plays alone all the time; doesn't play with other kids;",
    "   lines up toys and screams when moved'",
    "",
    "PLAY ASSESSMENT FINDINGS:",
    "  · No symbolic or pretend play (only functional/exploratory)",
    "  · No imitation of examiner's actions",
    "  · Object play: repetitive (spins wheels only — no functional car play)",
    "  · No eye contact during play; does not direct examiner's attention",
    "  · Parent report: no role-play at home; prefers same toys daily",
    "",
    "CLINICAL INTERPRETATION:",
    "  · Social play level: Solitary (Parten Stage 2) — expected 0–2yr, not 3.5yr",
    "  · Cognitive play: Functional only (Smilansky Stage 1) — expected 0–2yr",
    "  · Piaget level: remains in sensorimotor; no evidence of symbolic/preoperational play",
    "  · ASD Red Flags: absent symbolic play, no imitation, stereotyped object use",
    "",
    "OUTCOME: Referred for ASD evaluation + OT + SLP + Developmental Paediatrics",
    "",
    "INTERVENTION PLAN:",
    "  · OT: Sensory Integration + DIR/Floortime to develop symbolic play",
    "  · SLP: Joint attention + early symbolic play via SCERTS framework",
    "  · Psychology: Parent-mediated play coaching",
    "  · Special Ed: Structured peer play group",
]
for line in case_lines:
    if line == "":
        y -= 5; continue
    col2 = GR if line.endswith(":") else DK
    fs2 = 13 if line.startswith("PRESENTING") or line.startswith("PLAY") or line.startswith("CLINICAL") or line.startswith("OUTCOME") or line.startswith("INTERVENTION") else 12
    write(cv, LM + (0 if not line.startswith(" ") else 10), y, line, fs=fs2, col=col2)
    y -= LG - 3

pgnum(cv, 9, TOTAL_PAGES)
cv.showPage()

# ─────────────────────────────────────────────────────────────────────────
# PAGE 10 — Key Take-Home Messages + Conclusion
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "12.  KEY TAKE-HOME MESSAGES  +  13.  CONCLUSION")

y = sec_title(cv, LM, y, "12.  KEY TAKE-HOME MESSAGES", BL, 17)

messages = [
    (BL,  "1", "Play = PRIMARY OCCUPATION of childhood — not trivial, not optional"),
    (GR,  "2", "Play reflects ALL domains of development simultaneously"),
    (RD,  "3", "Use Parten + Piaget + Smilansky + Takata + Knox + Bundy as COMPLEMENTARY lenses"),
    (OR,  "4", "Symbolic play is the MOST SENSITIVE early marker of cognitive + social-communicative dev."),
    (PU,  "5", "ABSENT pretend play by 18 months = RED FLAG for ASD — act immediately"),
    (TE,  "6", "Play assessment = developmental assessment (cognitive + language + motor + social at once)"),
    (BPU, "7", "Every team member has a play-based approach specific to their domain — know yours"),
    (RD,  "8", "A child who CANNOT play = missing their primary occupation = clinical priority"),
    (GR,  "9", "Florey + Reilly = OT's THEORETICAL BASE  |  Knox + Bundy = OT's ASSESSMENT TOOLS"),
    (BL, "10", "TPBA = gold standard: observe play as a team; plan as a team"),
]

for col, num, msg in messages:
    # numbered circle
    cv.setFillColor(col); cv.circle(LM+10, y+5, 10, fill=1, stroke=0)
    cv.setFont("Caveat", 12); cv.setFillColor(colors.white); cv.drawCentredString(LM+10, y+2, num)
    cv.setFont("Caveat", 13); cv.setFillColor(DK); cv.drawString(LM+26, y+2, msg)
    y -= LG + 4

y -= 8
divline(cv, y); y -= LG

# CONCLUSION
y = sec_title(cv, LM, y, "13.  CONCLUSION", BL, 17)
conclusion_lines = [
    "Play is far more than entertainment. It is the mechanism through which children develop",
    "cognitively, emotionally, socially, linguistically, and motorically.",
    "",
    "The eight classification frameworks — Parten, Piaget, Smilansky, Takata, Florey, Reilly,",
    "Knox, and Bundy — each offer a unique and complementary lens through which we can observe,",
    "assess, and interpret a child's play behaviour.",
    "",
    "Clinically, the ABSENCE or REGRESSION of play is a sentinel event that warrants systematic",
    "evaluation. Every paediatric clinician, regardless of discipline, must be fluent in the",
    "language of play — because it is how children speak about their development.",
    "",
    "Our job as an interdisciplinary team is to understand play well enough to recognise when",
    "it is going wrong, assess it with precision, and intervene with intention.",
]
for line in conclusion_lines:
    if line == "":
        y -= 6; continue
    write(cv, LM, y, line, fs=13); y -= LG - 2

y -= 12
# Final quote box
cv.setFillColor(colors.HexColor("#eef4ff")); cv.setStrokeColor(BL); cv.setLineWidth(2)
cv.roundRect(LM, y-32, RM-LM, 36, 8, fill=1, stroke=1)
cv.setFont("Caveat", 16); cv.setFillColor(BL)
cv.drawCentredString(W/2, y-8, "\"Play is the work of childhood.\"")
cv.setFont("Caveat", 13); cv.setFillColor(GY)
cv.drawCentredString(W/2, y-24, "— Jean Piaget")
y -= 44

y -= 10
# References line
write(cv, LM, y, "Key References: Kaplan & Sadock (Synopsis + Comprehensive Textbook) | Reilly 1974 | Piaget 1962 | Parten 1932", fs=11, col=GY)
y -= LG - 4
write(cv, LM, y, "Smilansky 1968 | Takata 1974 | Florey 1971 | Knox 1997 | Bundy 1993 | AOTA 2020 | UN CRC Article 31", fs=11, col=GY)

pgnum(cv, 10, TOTAL_PAGES)
cv.showPage()

# ─── SAVE ─────────────────────────────────────────────────────────────────────
cv.save()
print("DONE:", OUTPUT)
print("Size:", os.path.getsize(OUTPUT), "bytes")
Running Command

cd /tmp/workspace && python3 play_final.py 2>&1

Editing File

~/play_final.py

Successfully replaced 1 instance(s) of the string in '/tmp/workspace/play_final.py'
Running Command

cd /tmp/workspace && python3 play_final.py 2>&1

Here you go — the one complete, clean PDF:

Play Complete Notes FINAL

PDF Document · PDF


10 pages, A4 portrait, handwritten style — here's exactly what's inside:
PageContent
1Introduction + Definitions (Reilly, Piaget, Florey, AOTA, Bundy, Takata) with years
2Characteristics of Play (7 qualities) + Importance of Play (6 domains, mind map layout)
3Play Development: Birth → 5 years (age-by-age with play types)
4Play Development: 7yr → Adolescence + Parten's 6 Social Stages
5Piaget's 3 Cognitive Stages + Smilansky's 4 Functional Categories + Takata's 5 Epochs
6Florey + Reilly (3-level hierarchy) + Knox (4 dimensions, RKPPS) + Bundy (ToP)
7Master Comparison Table (all 8 frameworks) + Red Flags with ASD-specific flags
8Play Assessment: Clinical observation + Parent interview + All standardised tools table
9Play as Intervention (OT, PT, SLP, Psychology, Special Ed) + Clinical Case (Aarav, 3.5yr)
10Key Take-Home Messages (10 numbered) + Conclusion + Piaget quote + References
Every theorist has their year, their core concept, and their clinical relevance. Clear spacing throughout — no overlap.
This is a shared conversation. Sign in to Orris to start your own chat.