Component library

Showing 13 components with role content.

Narrative

  • <Lead>

    sharedContentNarrative

    Opening paragraph of a section. Larger and slightly muted, sets the tone.

    When to use: Use exactly once per section, immediately after the section's H1, to summarise the section's headline finding in 1–2 sentences.

    Preview

    Across two days with Acme's operations and finance teams, we mapped twelve candidate automation use cases. Six are recommended for the first wave.

    PropTypeNotes
    childrenReactNodeRequired. The opener prose.
    classNamestringOptional. Tailwind classes appended to the wrapper.

    Examples

    <Lead>
        Across two days with Acme's operations and finance teams, we mapped
        twelve candidate automation use cases. Six are recommended for the
        first wave.
    </Lead>
  • <KeyFinding>

    workshopStatementContentNarrative

    Highlighted observation from the engagement, with severity colour-coding.

    When to use: Call out an insight that materially affects the client's decisions. A 12-page report typically has 4–8 of these.

    Preview

    Key findingHigh impact

    Order intake passes through five inboxes before reaching ERP

    Every customer order today is touched by sales, customer service, operations, finance, and operations again. Each handover is a manual email or shared inbox forward.

    PropTypeNotes
    severity"low" | "medium" | "high"Optional. Default: medium. Visual emphasis. High = red ring, medium = amber, low = neutral.Values: low, medium, highExample: high
    titlestringOptional. Optional title shown above the body.Example: Order intake passes through five inboxes
    childrenReactNodeRequired. The finding's body prose.

    Examples

    <KeyFinding severity="high" title="Order intake passes through five inboxes before reaching ERP">
        Every customer order today is touched by sales, customer service,
        operations, finance, and operations again. Each handover is a manual
        email or shared inbox forward.
    </KeyFinding>
  • <Recommendation>

    workshopAgendaContentNarrative

    Actionable next step with priority, owner, and effort.

    When to use: Whenever the report tells the client to do something. Always answer 'what should they do, and by when'. Use sparingly: a 12-page report typically has 5–8.

    Preview

    RecommendationDo nowEffort: MOwner: COO + IT Director

    Commit to a 12-week first wave covering invoice intake, order acks, and HR triage

    The three use cases share a deployment pattern (Lunnoa agent + ERP API + ticket fan-out) and together cover the largest concentration of manual hours we observed.

    PropTypeNotes
    priority"now" | "next" | "later"Optional. Default: next. Wave assignment. now = wave 1, next = wave 2, later = backlog.Values: now, next, laterExample: now
    titlestringRequired. The recommendation as an imperative sentence.Example: Commit to a 12-week first wave covering invoice intake, order acks, and HR triage
    ownerstringOptional. Named role or person responsible.Example: COO + IT Director
    effort"S" | "M" | "L" | "XL"Optional. T-shirt size estimate.Values: S, M, L, XLExample: M
    childrenReactNodeRequired. Rationale and next-step detail.

    Examples

    <Recommendation priority="now" title="Commit to a 12-week first wave covering invoice intake, order acks, and HR triage" effort="M" owner="COO + IT Director">
        The three use cases share a deployment pattern (Lunnoa agent + ERP
        API + ticket fan-out) and together cover the largest concentration of
        manual hours we observed.
    </Recommendation>
  • <Callout>

    sharedContentStatementNarrative

    Generic emphasis box for asides, important context, or warnings.

    When to use: Use when text needs visual separation from surrounding prose but isn't a finding or recommendation. Common: 'assumptions to validate', 'what we mean by X', 'next steps'.

    Preview

    PropTypeNotes
    tone"info" | "success" | "warning" | "danger"Optional. Default: info. Colour and icon.Values: info, success, warning, dangerExample: warning
    titlestringOptional. Optional headline.Example: Two assumptions to validate in week 1
    childrenReactNodeRequired. Callout body.

    Examples

    <Callout tone="warning" title="Two assumptions to validate in week 1">
        The projection above assumes the ERP middleware can be exposed within
        the first three weeks, and that the AP team is willing to triage
        exceptions in a Lunnoa queue rather than email.
    </Callout>
  • <TeamMember>

    sharedListContentNarrative

    One team member tile with avatar, name, role, department, and optional affiliation badge.

    When to use: Always inside `<TeamGrid>`. Use for delivery teams, workshop squads, or mixed client/Lunnoa rosters (up to six per grid).

    Often with: TeamGridPersonCard

    Preview

    Maria Fernandes

    Head of Finance

    Finance

    Client

    PropTypeNotes
    namestringRequired. Full name.Example: Maria Fernandes
    rolestringOptional. Job title.Example: Head of Finance
    departmentstringOptional. Team or department.Example: Finance
    avatarUrlstringOptional. Optional headshot URL.
    initialsstringOptional. Avatar fallback when no image; defaults to initials from name.Example: MF
    affiliation"Client" | "Lunnoa" | "Partner"Optional. Optional org badge for mixed teams.Values: Client, Lunnoa, PartnerExample: Client

    Examples

    <TeamMember name="Maria Fernandes" role="Head of Finance" department="Finance" affiliation="Client" initials="MF" />
  • <TeamGrid>

    sharedListContentNarrative

    Grid of up to six TeamMember cards with optional heading.

    When to use: Delivery team, workshop squad, or steering group in document reports. Use 3 columns by default; 2 for wider cards.

    Often with: TeamMemberPersonCard

    Preview

    Wave 1 delivery team

    Client sponsors and Lunnoa delivery leads

    Maria Fernandes

    Head of Finance

    Finance

    Client

    James Okafor

    Operations Manager

    Operations

    Client

    Elena Vasquez

    Engagement lead

    Lunnoa

    Lunnoa

    PropTypeNotes
    titlestringOptional. Section heading above the grid.
    descriptionstringOptional. Subtitle or roster note.
    columns2 | 3Optional. Default: 3. Desktop column count.Values: 2, 3Example: 3
    childrenReactNodeRequired. One to six <TeamMember> elements.

    Examples

    <TeamGrid title="Wave 1 delivery team" description="Client sponsors and Lunnoa delivery leads">
      <TeamMember name="Maria Fernandes" role="Head of Finance" department="Finance" affiliation="Client" initials="MF" />
      <TeamMember name="James Okafor" role="Operations Manager" department="Operations" affiliation="Client" initials="JO" />
      <TeamMember name="Elena Vasquez" role="Engagement lead" department="Lunnoa" affiliation="Lunnoa" initials="EV" />
    </TeamGrid>
  • <TwoColumn>

    sharedSplitContentNarrative

    Side-by-side blocks. Stacks vertically on mobile.

    When to use: Use to balance two related blocks (e.g., two quotes, two side notes). For 'before vs. after' use BeforeAfter instead.

    Preview

    Maria Fernandes, Head of Finance
    James Okafor, Operations Manager
    PropTypeNotes
    reversebooleanOptional. Default: false. Swap column order on desktop.
    childrenReactNodeRequired. Two children, each rendered as one column.

    Examples

    <TwoColumn>
        <Quote attribution="Maria Fernandes" role="Head of Finance">…</Quote>
        <Quote attribution="James Okafor" role="Operations Manager">…</Quote>
    </TwoColumn>

Dashboard

  • <MaturityRadar>

    sharedChartContentDashboard

    Radar chart of dimensions (axes) vs. maturity score (radial). Optional target overlay.

    When to use: Use to show a multi-dimensional capability assessment, typically in 'current state' or 'executive summary' sections. Works for SEO maturity too (e.g. Technical, Content, Authority, Measurement, Governance as axes), where the pillar bars of <PillarScoreCard> would be too coarse.

    Preview

    Acme automation maturity — current vs. 6-month target

    Scores from 11 stakeholder interviews using the Lunnoa maturity framework (1 = ad hoc, 5 = optimised).

    Current Target
    PropTypeNotes
    dimensionsstring[]Required. Axis labels, in order.Example: ["Data", "Tooling", "Process", "Governance", "Skills"]
    currentnumber[]Required. Current scores, same order as dimensions.Example: [3, 2, 3, 2, 2]
    targetnumber[]Optional. Optional target scores, drawn as a dashed overlay.
    maxnumberOptional. Default: 5. Maximum value on the radial axis.
    titlestringOptional. Chart title.
    descriptionstringOptional. Subtitle / methodology note.

    Examples

    <MaturityRadar
        dimensions={["Data quality", "Tooling", "Process clarity", "Governance", "Automation skills"]}
        current={[3, 2, 3, 2, 2]}
        target={[4, 4, 4, 4, 3]}
        title="Acme automation maturity — current vs. 6-month target"
        description="Scores from 11 stakeholder interviews using the Lunnoa maturity framework (1 = ad hoc, 5 = optimised)."
    />
  • <MaturityHeatmap>

    sharedChartContentDataDashboard

    Stage-based maturity table (rows = dimensions, columns = levels). One highlighted cell per row.

    When to use: Use as an alternative to MaturityRadar when the maturity framework is stage-based (e.g. CMMI-style: ad hoc / repeatable / defined / managed / optimised).

    Preview

    Current vs 6-month target

    DimensionAd hocRepeatableDefinedManagedOptimised
    Data quality
    Tooling
    Current Target
    PropTypeNotes
    rowsstring[]Required. Row labels (dimensions).Example: ["Data quality", "Tooling", "Process clarity"]
    columnsstring[]Required. Column labels (maturity levels).Example: ["Ad hoc", "Repeatable", "Defined", "Managed", "Optimised"]
    currentboolean[][]Required. 2D array [row][col]. Each row should have at most one true cell.
    targetboolean[][]Optional. Optional target cells, drawn as a ring.
    titlestringOptional. Chart title.

    Examples

    <MaturityHeatmap
        rows={["Data quality", "Tooling"]}
        columns={["Ad hoc", "Repeatable", "Defined", "Managed", "Optimised"]}
        current={[[false, false, true, false, false], [false, true, false, false, false]]}
        target={[[false, false, false, true, false], [false, false, false, true, false]]}
        title="Current vs 6-month target"
    />
  • <OpportunityMatrix>

    sharedChartCompareContentDashboard

    Effort × impact scatter plot (effort increases left to right, impact increases bottom to top). Top-left (low effort, high impact) is the usual quick-win zone. Optional category (or name) tabs match the DataTable filter pattern.

    When to use: Use to visualise a portfolio of candidate use cases / opportunities scored on two dimensions. Typically immediately before the recommended use case grid. Also fits SEO analyses: plot keyword clusters or content opportunities as effort × impact, with categories like Technical, Content, and Authority as tabs.

    Preview

    Twelve use cases scored on effort and impact

    FinanceOperationsPeople

    Portfolio by function

    FinanceOperations
    PropTypeNotes
    items{ name: string; effort: number; impact: number; category?: string }[]Required. Each item is plotted as a dot. effort and impact are 1–5.
    titlestringOptional. Chart title.
    descriptionstringOptional. Subtitle.
    tabs{ id: string; label: string }[]Optional. Optional filter tabs (same pattern as DataTable). Include `{ id: "all", label: "All" }` first. Other tab ids slug-match `tabFilterKey` on each item (default: category names, e.g. `finance` for Finance).
    tabFilterKey"category" | "name"Optional. Default: category. Which item field tab ids match after slugify.Values: category, name

    Examples

    <OpportunityMatrix
        title="Twelve use cases scored on effort and impact"
        items={[
            { name: "Supplier invoice intake", effort: 2, impact: 5, category: "Finance" },
            { name: "Order acknowledgements", effort: 2, impact: 4, category: "Operations" },
            { name: "HR ticket triage", effort: 1, impact: 3, category: "People" }
        ]}
    />
    <OpportunityMatrix
        title="Portfolio by function"
        tabs={[
            { id: "all", label: "All" },
            { id: "finance", label: "Finance" },
            { id: "operations", label: "Operations" }
        ]}
        items={[
            { name: "Invoice intake", effort: 2, impact: 5, category: "Finance" },
            { name: "Order acknowledgements", effort: 2, impact: 4, category: "Operations" }
        ]}
    />
  • <RoadmapTimeline>

    sharedTimelineAgendaContentDashboard

    Vertical phased timeline with status badges per phase.

    When to use: Use in roadmap / delivery plan sections to sequence work across phases (typically 3–5 phases). In SEO reports, use it for the remediation and content roadmap (e.g. technical fixes → content production → authority building).

    Preview

    Wave 1 — 12-week delivery

    1. Phase 1 — Foundation
      Weeks 1–3
      • ERP middleware exposed
      • Lunnoa platform deployed
    2. Phase 2 — Build the three flows
      Weeks 4–8
      • HR triage live week 5
      • Invoice intake live week 8
    PropTypeNotes
    phases{ label: string; when: string; status?: 'done'|'active'|'planned'; items?: string[] }[]Required. Phases in chronological order.
    titlestringOptional. Section title for the timeline.
    descriptionstringOptional. Subtitle.

    Examples

    <RoadmapTimeline
        title="Wave 1 — 12-week delivery"
        phases={[
            { label: "Phase 1 — Foundation", when: "Weeks 1–3", status: "active", items: ["ERP middleware exposed", "Lunnoa platform deployed"] },
            { label: "Phase 2 — Build the three flows", when: "Weeks 4–8", status: "planned", items: ["HR triage live week 5", "Invoice intake live week 8"] }
        ]}
    />
  • <UseCaseCard>

    workshopContentListDashboard

    One use case tile with priority, area, owner, impact, effort, and time-to-value.

    When to use: Use to surface recommended automation use cases. Always inside <UseCaseGrid>.

    Often with: UseCaseGrid

    Preview

    Wave 1 Finance

    Supplier invoice intake

    Automate three-way matching between supplier invoices, purchase orders, and goods receipts.
    Impact
    ≈ 220 hrs / month
    Effort
    M
    TTV
    6 weeks
    Owner: Maria Fernandes
    PropTypeNotes
    titlestringRequired. Short use case name.Example: Supplier invoice intake
    descriptionReactNodeRequired. One-paragraph description of what gets automated.
    areastringOptional. Functional area.Example: Finance
    ownerstringOptional. Process owner.Example: Maria Fernandes
    priority"now" | "next" | "later"Optional. Default: next. Wave assignment.Values: now, next, laterExample: now
    impactstringOptional. Estimated impact.Example: ≈ 220 hrs / month
    effortstringOptional. Estimated effort, T-shirt size or duration.Example: M
    timeToValuestringOptional. Estimated time to first value.Example: 6 weeks

    Examples

    <UseCaseCard
        title="Supplier invoice intake"
        priority="now"
        area="Finance"
        owner="Maria Fernandes"
        impact="≈ 220 hrs / month"
        effort="M"
        timeToValue="6 weeks"
        description="Automate three-way matching between supplier invoices, purchase orders, and goods receipts."
    />
  • <UseCaseGrid>

    workshopContentListDashboard

    Grid of UseCaseCards.

    When to use: Wrap recommended use cases together. Use 2 columns by default; 3 only if you have many small cards.

    Often with: UseCaseCard

    Preview

    Wave 1 Finance

    Supplier invoice intake

    Automate three-way matching between supplier invoices, purchase orders, and goods receipts.
    Impact
    ≈ 220 hrs / month
    Effort
    M
    TTV
    6 weeks
    Owner: Maria Fernandes
    Wave 1 Operations

    Order acknowledgements

    Auto-generate acknowledgement emails within five minutes.
    Impact
    ≈ 90 hrs / month
    Effort
    S
    TTV
    4 weeks
    Owner: James Okafor
    PropTypeNotes
    columns2 | 3Optional. Default: 2. Desktop column count.Values: 2, 3Example: 2
    childrenReactNodeRequired. One or more <UseCaseCard> elements.

    Examples

    <UseCaseGrid columns={2}>
        <UseCaseCard
            title="Supplier invoice intake"
            priority="now"
            area="Finance"
            owner="Maria Fernandes"
            impact="≈ 220 hrs / month"
            effort="M"
            timeToValue="6 weeks"
            description="Automate three-way matching between supplier invoices, purchase orders, and goods receipts."
        />
        <UseCaseCard
            title="Order acknowledgements"
            priority="now"
            area="Operations"
            owner="James Okafor"
            impact="≈ 90 hrs / month"
            effort="S"
            timeToValue="4 weeks"
            description="Auto-generate acknowledgement emails within five minutes."
        />
    </UseCaseGrid>