Skip to contents

This function documents the structure of the dashboard with automatic layout selection and generates ranked, concept-grouped actionable UI/UX suggestions. Layout is intelligently chosen based on content analysis of previous stages using deterministic heuristics. Returns structured recommendations with specific component pointers and implementation rationales.

Usage

bid_structure(
  previous_stage,
  concepts = NULL,
  telemetry_flags = NULL,
  quiet = NULL,
  ...
)

Arguments

previous_stage

A tibble or list output from an earlier BID stage function.

concepts

A character vector of additional BID concepts to include. Concepts can be provided in natural language (e.g., "Principle of Proximity") or with underscores (e.g., "principle_of_proximity"). The function uses fuzzy matching to identify the concepts. If NULL, will detect relevant concepts from previous stages automatically.

telemetry_flags

Optional named list of telemetry flags from bid_flags(). Used to adjust layout choice and suggestion scoring based on observed user behavior patterns.

quiet

Logical indicating whether to suppress informational messages. If NULL, uses getOption("bidux.quiet", FALSE).

...

Additional parameters. If layout is provided via ..., the function will abort with a helpful error message.

Value

A bid_stage object containing:

stage

"Structure"

layout

Auto-selected layout type

suggestions

List of concept groups with ranked suggestions

concepts

Comma-separated string of all concepts used

Details

Layout Auto-Selection: For backwards compatibility with versions < 0.3.0; to be removed in 0.4.0. Uses deterministic heuristics to analyze content from previous stages and select the most appropriate layout:

  • breathable: For information overload/confusion patterns

  • dual_process: For overview vs detail needs

  • grid: For grouping/comparison requirements

  • card: For modular/chunked content

  • tabs: For categorical organization (unless telemetry shows issues)

Suggestion Engine: Generates ranked, actionable recommendations grouped by UX concepts. Each suggestion includes specific Shiny/bslib components, implementation details, and rationale. Suggestions are scored based on relevance, layout appropriateness, and contextual factors.

Examples

notice_result <- bid_interpret(
  central_question = "How can we simplify data presentation?",
  data_story = list(
    hook = "Data is too complex",
    context = "Overloaded with charts",
    tension = "Confusing layout",
    resolution = "Introduce clear grouping"
  )
) |>
  bid_notice(
    problem = "Users struggle with information overload",
    evidence = "Survey results indicate delays"
  )
#> Stage 1 (Interpret) completed.
#>   - Central question: How can we simplify data presentation?
#>   - Your data story has all key elements. Focus on making each component compelling and relevant.
#>   - Your central question is appropriately scoped.
#>   - No user personas defined 
#> Auto-suggested theory: Processing Fluency (confidence: 70%)
#> Stage 2 (Notice) completed. (40% complete)
#>   - Problem: Users struggle with information overload
#>   - Theory: Processing Fluency (auto-suggested)
#>   - Evidence: Survey results indicate delays
#>   - Theory confidence: 70%
#>   - Next: Use bid_anticipate() for Stage 3 

# Auto-selected layout with concept-grouped suggestions
structure_result <- bid_structure(previous_stage = notice_result)
#>  Auto-selected layout: breathable
#>  Detected information overload patterns; choosing 'breathable' to reduce cognitive load.
#> Warning: Layout auto-selection is deprecated and will be removed in bidux 0.4.0. The BID framework will focus on concept-based suggestions instead. Existing code will continue to work until 0.4.0.
#>  Tip: Learn more about any concept via bid_concept("<concept>").
#> Stage 4 (Structure) completed.
#>   - Auto-selected layout: breathable
#>   - Concept groups generated: 4
#>   - Total concepts: 4 
print(structure_result$layout) # Auto-selected layout
#> [1] "breathable" "breathable" "breathable" "breathable"
print(structure_result$suggestions) # Ranked suggestions by concept
#> [[1]]
#> [[1]]$concept
#> [1] "Cognitive Load Theory"
#> 
#> [[1]]$suggestions
#> [[1]]$suggestions[[1]]
#> [[1]]$suggestions[[1]]$title
#> [1] "Limit initial choices"
#> 
#> [[1]]$suggestions[[1]]$details
#> [1] "Show only core filters by default; defer advanced options to secondary views or accordions."
#> 
#> [[1]]$suggestions[[1]]$components
#> [1] "bslib::accordion"            "shiny::conditionalPanel"    
#> [3] "shiny::updateSelectizeInput"
#> 
#> [[1]]$suggestions[[1]]$rationale
#> [1] "Reduces initial cognitive load for new users while preserving functionality."
#> 
#> [[1]]$suggestions[[1]]$score
#> [1] 1
#> 
#> 
#> [[1]]$suggestions[[2]]
#> [[1]]$suggestions[[2]]$title
#> [1] "Use progressive complexity"
#> 
#> [[1]]$suggestions[[2]]$details
#> [1] "Start with simple views and allow users to add complexity incrementally."
#> 
#> [[1]]$suggestions[[2]]$components
#> [1] "shiny::tabsetPanel"  "bslib::accordion"    "shiny::actionButton"
#> 
#> [[1]]$suggestions[[2]]$rationale
#> [1] "Prevents overwhelming users with too many options at once."
#> 
#> [[1]]$suggestions[[2]]$score
#> [1] 0.91
#> 
#> 
#> [[1]]$suggestions[[3]]
#> [[1]]$suggestions[[3]]$title
#> [1] "Provide smart defaults"
#> 
#> [[1]]$suggestions[[3]]$details
#> [1] "Pre-select commonly used filters and settings to reduce decision fatigue."
#> 
#> [[1]]$suggestions[[3]]$components
#> [1] "shiny::selectInput"   "shiny::checkboxInput" "bslib::input_switch" 
#> 
#> [[1]]$suggestions[[3]]$rationale
#> [1] "Leverages the Default Effect to reduce cognitive burden."
#> 
#> [[1]]$suggestions[[3]]$score
#> [1] 0.88
#> 
#> 
#> 
#> 
#> [[2]]
#> [[2]]$concept
#> [1] "Visual Hierarchy"
#> 
#> [[2]]$suggestions
#> [[2]]$suggestions[[1]]
#> [[2]]$suggestions[[1]]$title
#> [1] "Establish clear information priority"
#> 
#> [[2]]$suggestions[[1]]$details
#> [1] "Use size, color, and spacing to guide attention to key metrics first."
#> 
#> [[2]]$suggestions[[1]]$components
#> [1] "bslib::card"      "shiny::h1"        "shiny::h2"        "bslib::value_box"
#> 
#> [[2]]$suggestions[[1]]$rationale
#> [1] "Helps users quickly identify what matters most in the interface."
#> 
#> [[2]]$suggestions[[1]]$score
#> [1] 0.9
#> 
#> 
#> [[2]]$suggestions[[2]]
#> [[2]]$suggestions[[2]]$title
#> [1] "Group related content visually"
#> 
#> [[2]]$suggestions[[2]]$details
#> [1] "Use consistent spacing and visual containers to show relationships."
#> 
#> [[2]]$suggestions[[2]]$components
#> [1] "bslib::layout_columns" "bslib::card"           "shiny::fluidRow"      
#> 
#> [[2]]$suggestions[[2]]$rationale
#> [1] "Leverages Gestalt principles to reduce cognitive processing."
#> 
#> [[2]]$suggestions[[2]]$score
#> [1] 0.87
#> 
#> 
#> 
#> 
#> [[3]]
#> [[3]]$concept
#> [1] "Progressive Disclosure"
#> 
#> [[3]]$suggestions
#> [[3]]$suggestions[[1]]
#> [[3]]$suggestions[[1]]$title
#> [1] "Use collapsible advanced filters"
#> 
#> [[3]]$suggestions[[1]]$details
#> [1] "Place seldom-used filters in accordion sections or 'Show more' toggles."
#> 
#> [[3]]$suggestions[[1]]$components
#> [1] "bslib::accordion"        "shiny::conditionalPanel"
#> 
#> [[3]]$suggestions[[1]]$rationale
#> [1] "Reveals complexity on demand without overwhelming the interface."
#> 
#> [[3]]$suggestions[[1]]$score
#> [1] 0.88
#> 
#> 
#> [[3]]$suggestions[[2]]
#> [[3]]$suggestions[[2]]$title
#> [1] "Implement drill-down navigation"
#> 
#> [[3]]$suggestions[[2]]$details
#> [1] "Allow users to start with summaries and progressively reveal details."
#> 
#> [[3]]$suggestions[[2]]$components
#> [1] "shiny::actionButton"  "DT::datatable"        "reactable::reactable"
#> 
#> [[3]]$suggestions[[2]]$rationale
#> [1] "Matches user mental models of exploration from general to specific."
#> 
#> [[3]]$suggestions[[2]]$score
#> [1] 0.84
#> 
#> 
#> 
#> 
#> [[4]]
#> [[4]]$concept
#> [1] "Processing Fluency"
#> 
#> [[4]]$suggestions
#> [[4]]$suggestions[[1]]
#> [[4]]$suggestions[[1]]$title
#> [1] "Apply Processing Fluency principles"
#> 
#> [[4]]$suggestions[[1]]$details
#> [1] "Consider how Processing Fluency applies to your breathable layout design."
#> 
#> [[4]]$suggestions[[1]]$components
#> [1] "bslib::card"           "shiny::fluidRow"       "bslib::layout_columns"
#> 
#> [[4]]$suggestions[[1]]$rationale
#> [1] "Systematic application of Processing Fluency can improve user experience."
#> 
#> [[4]]$suggestions[[1]]$score
#> [1] 0.75
#> 
#> 
#> 
#> 

summary(structure_result)
#> === BID Framework: Structure Stage Summary ===
#> 
#> Metadata:
#>    layout_type : breathable 
#>    auto_selected_layout : Yes 
#>    concepts_count : 4 
#>    suggestion_groups_count : 4 
#>    stage_number : 4 
#>    stage_number_previous : 3 
#>    total_stages : 5 
#> 
#> Stage Data:
#>    stage : Structure 
#>    layout : breathable 
#>    concepts : Cognitive Load Theory, Visual Hierarchy, Progressive Disclosure, Processing F... 
#>    previous_problem : Users struggle with information overload 
#>    previous_theory : Processing Fluency 
#>    suggestions : list(concept = "Cognitive Load Theory", suggestions = list(list(title = "Limi... 
#> 
#> Generated: 2025-09-23 23:04:52