LESP
  • Home
  • Research
  • People
  • Publications
  • Public Outreach
  • Join the lab
  • Plant ID Keys

Chave Interativa - Morro Santana

#| '!! shinylive warning !!': |
#|   shinylive does not work in self-contained HTML documents.
#|   Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 700
#| viewerWidth: "100%"

## file: app.R
  
# ====================================================================
# 1. CÓDIGO DO APLICATIVO
# ====================================================================
library(shiny)
library(shinyjs)
library(shinyWidgets)
library(shinythemes)
library(markdown)

#################################
### Data Loading & Processing
#################################

# Após a planilha excel pronta, Exporte apenas na hora de atualizar o app: 
# Quando a edição estiver pronta, você vai em Arquivo > Salvar Como 
# e escolhe o formato CSV UTF-8 (Delimitado por vírgulas) (*.csv).

# Salve as três abas em arquivos .csv separadamente, pois o CSV não suporta abas

# Lendo os arquivos CSV. 
# O fileEncoding = "UTF-8" garante que os acentos (á, ç, ã) não quebrem.
# O sep = "," é o padrão, mas se o seu Excel em português salvar
# separando por ponto e vírgula, troque para sep = ";"

raw_data <- read.csv("matrix.csv", sep = ";", check.names = FALSE, stringsAsFactors = FALSE)
char_info <- read.csv("info_caracteres.csv", sep = ";", stringsAsFactors = FALSE)
esp_info <- read.csv("info_especies.csv", sep = ";", stringsAsFactors = FALSE)

# Limpeza inicial
linhas_validas_raw <- (!is.na(raw_data[,1])) & (trimws(raw_data[,1]) != "")
raw_data <- raw_data[linhas_validas_raw, ]

linhas_validas_char <- (!is.na(char_info[,1])) & (trimws(char_info[,1]) != "")
char_info <- char_info[linhas_validas_char, ]

linhas_validas_esp <- (!is.na(esp_info[,1])) & (trimws(esp_info[,1]) != "")
esp_info <- esp_info[linhas_validas_esp, ]

# Função para verificar se um caractere/categoria tem Info preenchida
tem_info <- function(nome) {
  idx <- which(char_info$Caractere == nome)
  if (length(idx) > 0) {
    if (!is.na(char_info$Descricao_Texto[idx[1]]) && trimws(char_info$Descricao_Texto[idx[1]]) != "") {
      return(TRUE)
    }
    cols_foto <- grep("Foto", colnames(char_info), value = TRUE)
    for (col in cols_foto) {
      if (!is.na(char_info[[col]][idx[1]]) && trimws(char_info[[col]][idx[1]]) != "") {
        return(TRUE)
      }
    }
  }
  return(FALSE)
}

# Processamento hierárquico dos dados
sp_names <- colnames(raw_data)[-c(1,2)]
mat_binary <- data.frame()
tree_list <- list()
todas_as_opcoes <- c()

for (i in seq_len(nrow(raw_data))) {
  g <- trimws(raw_data[i, 1])
  c <- trimws(raw_data[i, 2])
  
  vals <- raw_data[i, -c(1,2)]
  vals[is.na(vals)] <- ""
  
  states <- unique(trimws(unlist(strsplit(as.character(vals), "/"))))
  states <- states[states != ""]
  
  if(length(states) == 0) next
  
  if(is.null(tree_list[[g]])) tree_list[[g]] <- list()
  if(is.null(tree_list[[g]][[c]])) tree_list[[g]][[c]] <- list()
  
  for (st in states) {
    tree_list[[g]][[c]][[st]] <- st
    todas_as_opcoes <- unique(c(todas_as_opcoes, st))
    
    bin_row <- sapply(vals, function(v) {
      if (is.na(v)) return(0)
      if (trimws(v) == "") return(0)
      parts <- trimws(unlist(strsplit(as.character(v), "/")))
      if (st %in% parts) 1 else 0
    })
    
    row_id <- paste(g, c, st, sep = "___")
    tmp_df <- data.frame(matrix(bin_row, nrow=1))
    colnames(tmp_df) <- sp_names
    rownames(tmp_df) <- row_id
    
    mat_binary <- rbind(mat_binary, tmp_df)
  }
}

mat <- mat_binary
fam <- data.frame(ID = c(1:ncol(mat)), Especie = colnames(mat), stringsAsFactors = FALSE)

#################################
### UI (Interface do Usuário)
#################################
ui <- fluidPage(
  tags$head(
    tags$style(HTML("
      body { padding-top: 80px !important; }
      details > summary { list-style-type: '▶ '; }
      details[open] > summary { list-style-type: '▼ '; }
    "))
  ),
  
  navbarPage("Trepadeiras do Morro Santana", theme = shinytheme("lumen"), position="fixed-top",
             tabPanel("Identificação", 
                      sidebarLayout(
                        sidebarPanel(
                          useShinyjs(),
                          titlePanel("Caracteres"),
                          helpText("Navegue pelas pastas e selecione as características observadas. Clique em [Info] para fotos e descrições."),
                          br(),
                          
                          uiOutput("native_tree"),
                          
                          tags$hr(),
                          actionButton("clean.button.1", "Limpar Seleção", icon=icon("refresh", lib="glyphicon"))
                        ),
                        mainPanel( 
                          titlePanel("Espécie(s)"),
                          helpText("Clique no nome da espécie para ver fotos e texto com caracteres adicionais."),
                          br(),
                          textOutput("especies.n"),
                          textOutput("caracteres.n"),
                          br(),
                          uiOutput("especies.keep"),
                          tags$hr(), 
                          uiOutput("titulo.excluidas"),
                          uiOutput("especies.excluidas")
                        )
                      )
             ),
             tabPanel("Comparação", 
                      titlePanel("Comparação"),
                      sidebarLayout(
                        sidebarPanel(
                          useShinyjs(),
                          titlePanel("Espécies"),
                          helpText("Selecione 1 ou mais espécies para comparar."),
                          dropdown(checkboxGroupInput(inputId = "especies.sel",
                                                      label = "Espécies:",
                                                      choices = fam$Especie), 
                                   label = "Selecionar Espécies"),
                          br(),
                          radioButtons(inputId = "chars.sel",
                                       label = "Mostrar Caracteres:",
                                       choices = c(
                                         "Distintivos" = "distintivos",
                                         "Semelhantes" = "semelhantes",
                                         "Todos" = "todos"), selected="distintivos"
                          ),
                          br(),
                          actionButton("clean.button.2", "Limpar", icon=icon("refresh", lib="glyphicon"))
                        ),
                        mainPanel( 
                          titlePanel("Tabela comparativa"),
                          textOutput("especies.sel.n"),
                          textOutput("chars.sel.n"),
                          br(),
                          tableOutput("especies.comp")
                        )
                      )
             ),
             tabPanel("Sobre", 
                      fluidPage(
                        includeMarkdown("about.Rmd")
                      )
             )
  )
)

#################################
### Server (Lógica do Servidor)
#################################
server <- function(input, output, session) {
  
  output$native_tree <- renderUI({
    tagList(
      lapply(names(tree_list), function(g) {
        
        char_ui <- lapply(names(tree_list[[g]]), function(c) {
          states_orig <- names(tree_list[[g]][[c]])
          
          # ORDENAÇÃO: Separar os que começam com "sem" e o resto
          is_sem <- grepl("^sem\\b", tolower(states_orig))
          states_sem <- sort(states_orig[is_sem])
          states_other <- sort(states_orig[!is_sem])
          states <- c(states_sem, states_other)
          
          choice_values <- paste(g, c, states, sep = "___")
          
          # Renderiza Info condicional para cada ESTADO final
          choice_names <- lapply(states, function(st) {
            if (tem_info(st)) {
              evt_click <- paste0("event.stopPropagation(); event.preventDefault(); Shiny.setInputValue('link_char_clicado', '", st, "', {priority: 'event'}); return false;")
              HTML(paste0(st, ' <a href="#" style="font-size: 13px; margin-left: 6px; color: #337ab7; text-decoration: none;" onclick="', evt_click, '">[Info]</a>'))
            } else {
              HTML(st)
            }
          })
          
          # NEGRITO para o CHARACTER (Subcategoria)
          c_label <- HTML(paste0("<b>", c, "</b>"))
          if (tem_info(c)) {
            evt_click_c <- paste0("event.stopPropagation(); event.preventDefault(); Shiny.setInputValue('link_char_clicado', '", c, "', {priority: 'event'}); return false;")
            c_label <- HTML(paste0("<b>", c, "</b>", ' <a href="#" style="font-size: 13px; margin-left: 6px; color: #337ab7; text-decoration: none;" onclick="', evt_click_c, '">[Info]</a>'))
          }
          
          checkboxGroupInput(
            inputId = paste("cb", gsub("[^a-zA-Z0-9]", "", g), gsub("[^a-zA-Z0-9]", "", c), sep = "_"),
            label = c_label,
            choiceNames = choice_names,
            choiceValues = choice_values
          )
        })
        
        # Renderiza Info condicional para o GROUP (Categoria Principal)
        g_label <- tags$strong(g, style="font-size: 16px; color: #337ab7; cursor: pointer;")
        if (tem_info(g)) {
          evt_click_g <- paste0("event.stopPropagation(); event.preventDefault(); Shiny.setInputValue('link_char_clicado', '", g, "', {priority: 'event'}); return false;")
          g_label <- tagList(
            g_label,
            HTML(paste0(' <a href="#" style="font-size: 13px; margin-left: 6px; color: #e67e22; text-decoration: none;" onclick="', evt_click_g, '">[Info]</a>'))
          )
        }
        
        tags$details(
          style = "margin-bottom: 10px;",
          tags$summary(g_label),
          tags$div(style = "margin-left: 20px; margin-top: 10px;", char_ui)
        )
      })
    )
  })
  
  chars_selecionados <- reactive({
    sel <- c()
    for (g in names(tree_list)) {
      for (c in names(tree_list[[g]])) {
        id <- paste("cb", gsub("[^a-zA-Z0-9]", "", g), gsub("[^a-zA-Z0-9]", "", c), sep = "_")
        if (!is.null(input[[id]])) {
          sel <- c(sel, input[[id]])
        }
      }
    }
    sel
  })
  
  observeEvent(chars_selecionados(), {
    x_limpo <- chars_selecionados()
    
    if (length(x_limpo) > 0) {
      char.n <- length(x_limpo)
      m0 <- mat[rownames(mat) %in% x_limpo, , drop = FALSE]
      m0_soma <- colSums(m0)
      especies_keep <- colnames(m0)[m0_soma == nrow(m0)]
      especies_excluidas <- colnames(m0)[m0_soma < nrow(m0)]
    } else {
      char.n <- 0
      especies_keep <- fam$Especie
      especies_excluidas <- character(0)
    }
    
    especies_keep <- sort(especies_keep)
    especies_excluidas <- sort(especies_excluidas)
    
    output$especies.n <- renderText(paste(length(especies_keep), "espécie(s) restante(s)"))
    output$caracteres.n <- renderText(paste(char.n, "caractere(s) selecionado(s)"))
    
    if(length(especies_keep) > 0) {
      links_especies <- lapply(especies_keep, function(esp) {
        evt_click <- paste0("Shiny.setInputValue('especie_clicada', '", esp, "', {priority: 'event'}); return false;")
        HTML(paste0('<div style="margin-bottom: 5px;"><a href="#" style="font-size: 16px;" onclick="', evt_click, '">', esp, '</a></div>'))
      })
      output$especies.keep <- renderUI({ tagList(links_especies) })
    } else {
      output$especies.keep <- renderUI({ HTML("<b>Nenhuma espécie atende aos critérios selecionados.</b>") })
    }
    
    if(length(especies_excluidas) > 0) {
      output$titulo.excluidas <- renderUI({ h4(paste(length(especies_excluidas), "espécie(s) excluída(s):")) })
      links_excluidas <- lapply(especies_excluidas, function(esp) {
        evt_click <- paste0("Shiny.setInputValue('especie_excluida_clicada', '", esp, "', {priority: 'event'}); return false;")
        HTML(paste0('<div style="margin-bottom: 5px;"><s style="color: #888; font-size: 14px;">', esp, '</s> <a href="#" style="font-size: 12px; margin-left: 5px; color: #d9534f;" onclick="', evt_click, '">[Motivo]</a></div>'))
      })
      output$especies.excluidas <- renderUI({ tagList(links_excluidas) })
    } else {
      output$titulo.excluidas <- renderUI({ HTML("") })
      output$especies.excluidas <- renderUI({ HTML("") })
    }
    
    updateCheckboxGroupInput(session = session, inputId = "especies.sel", choices = fam$Especie)
  }, ignoreNULL = FALSE)
  
  observeEvent(input$link_char_clicado, {
    char_nome <- input$link_char_clicado
    dados_char <- char_info[char_info$Caractere == char_nome, ]
    texto <- "Dados não encontrados para este estado/caractere. Verifique se o nome confere com o arquivo de informações."
    fotos_html <- ""
    
    if(nrow(dados_char) > 0) {
      texto <- dados_char$Descricao_Texto[1]
      if (is.na(texto) || trimws(texto) == "") {
        texto <- "Sem descrição disponível."
      }
      
      colunas_foto <- grep("Foto", colnames(dados_char), value = TRUE)
      fotos_validas <- c()
      for (col in colunas_foto) {
        if (!is.na(dados_char[[col]]) && trimws(dados_char[[col]]) != "") {
          fotos_validas <- c(fotos_validas, trimws(dados_char[[col]]))
        }
      }
      
      if(length(fotos_validas) > 0) {
        id_carrossel <- paste0("carrossel_char_", gsub("[^a-zA-Z0-9]", "", char_nome))
        items <- ""
        
        for (i in seq_along(fotos_validas)) {
          active_class <- ifelse(i == 1, "item active", "item")
          # Limitando altura máxima em 55vh para não estourar a tela
          items <- paste0(items, '<div class="', active_class, '"><img src="', fotos_validas[i], '" style="max-width: 100%; height: auto; max-height: 65vh; margin: 0 auto; display: block; object-fit: contain; border-radius: 5px; border: 1px solid #ddd;"></div>')
        }
        
        if(length(fotos_validas) > 1) {
          # Carrossel clássico: as setas ficam sobre a imagem (não ocupam espaço de largura)
          fotos_html <- paste0('
          <div id="', id_carrossel, '" class="carousel slide" data-ride="carousel" data-interval="false" style="margin-top: 20px;">
            <div class="carousel-inner">', items, '</div>
            <a class="left carousel-control" href="#', id_carrossel, '" data-slide="prev" style="background-image: none; width: 10%;">
              <span class="glyphicon glyphicon-chevron-left" style="color: #337ab7; text-shadow: none;"></span>
            </a>
            <a class="right carousel-control" href="#', id_carrossel, '" data-slide="next" style="background-image: none; width: 10%;">
              <span class="glyphicon glyphicon-chevron-right" style="color: #337ab7; text-shadow: none;"></span>
            </a>
          </div>')
        } else {
          fotos_html <- paste0('<div style="margin-top: 20px; text-align: center;"><img src="', fotos_validas[1], '" style="max-width: 100%; height: auto; max-height: 65vh; margin: 0 auto; display: block; object-fit: contain; border-radius: 5px; border: 1px solid #ddd;"></div>')
        }
      }
    }
    
    showModal(modalDialog(
      title = char_nome,
      size = "xl", 
      p(texto, style = "font-size: 15px; text-align: justify;"),
      HTML(fotos_html),
      easyClose = TRUE,
      footer = modalButton("Fechar")
    ))
  })
  
  observeEvent(input$especie_clicada, {
    esp_nome <- input$especie_clicada
    dados_esp <- esp_info[esp_info$Especie == esp_nome, ]
    texto <- "Dados não encontrados para esta espécie."
    fotos_html <- ""
    
    if(nrow(dados_esp) > 0) {
      texto <- dados_esp$Descricao_Texto[1]
      if (is.na(texto) || trimws(texto) == "") {
        texto <- "Sem descrição disponível."
      }
      
      colunas_foto <- grep("Foto", colnames(dados_esp), value = TRUE)
      fotos_validas <- c()
      for (col in colunas_foto) {
        if (!is.na(dados_esp[[col]]) && trimws(dados_esp[[col]]) != "") {
          fotos_validas <- c(fotos_validas, trimws(dados_esp[[col]]))
        }
      }
      
      if(length(fotos_validas) > 0) {
        id_carrossel <- paste0("carrossel_esp_", gsub("[^a-zA-Z0-9]", "", esp_nome))
        items <- ""
        for (i in seq_along(fotos_validas)) {
          active_class <- ifelse(i == 1, "item active", "item")
          items <- paste0(items, '<div class="', active_class, '"><img src="', fotos_validas[i], '" style="max-width: 100%; height: auto; max-height: 65vh; margin: 0 auto; display: block; object-fit: contain; border-radius: 5px; border: 1px solid #ddd;"></div>')
        }
        
        if(length(fotos_validas) > 1) {
          fotos_html <- paste0('
          <div id="', id_carrossel, '" class="carousel slide" data-ride="carousel" data-interval="false" style="margin-top: 20px;">
            <div class="carousel-inner">', items, '</div>
            <a class="left carousel-control" href="#', id_carrossel, '" data-slide="prev" style="background-image: none; width: 10%;">
              <span class="glyphicon glyphicon-chevron-left" style="color: #337ab7; text-shadow: none;"></span>
            </a>
            <a class="right carousel-control" href="#', id_carrossel, '" data-slide="next" style="background-image: none; width: 10%;">
              <span class="glyphicon glyphicon-chevron-right" style="color: #337ab7; text-shadow: none;"></span>
            </a>
          </div>')
        } else {
          fotos_html <- paste0('<div style="margin-top: 20px; text-align: center;"><img src="', fotos_validas[1], '" style="max-width: 100%; height: auto; max-height: 65vh; margin: 0 auto; display: block; object-fit: contain; border-radius: 5px; border: 1px solid #ddd;"></div>')
        }
      }
    }
    
    showModal(modalDialog(
      title = esp_nome,
      size = "xl", 
      p(texto, style = "font-size: 15px; text-align: justify;"),
      HTML(fotos_html),
      easyClose = TRUE,
      footer = modalButton("Fechar")
    ))
  })
  
  observeEvent(input$especie_excluida_clicada, {
    esp_nome <- input$especie_excluida_clicada
    x_limpo <- chars_selecionados()
    
    if(length(x_limpo) > 0) {
      m_esp <- mat[x_limpo, esp_nome, drop = FALSE]
      chars_faltantes <- rownames(m_esp)[m_esp[,1] == 0]
      
      texto_motivo <- paste0("<p>A espécie <b>", esp_nome, "</b> foi excluída pois <b>não possui</b> o(s) seguinte(s) caractere(s) selecionado(s):</p><ul>")
      for (c in chars_faltantes) {
        nome_bonito <- gsub("___", " > ", c)
        texto_motivo <- paste0(texto_motivo, "<li>", nome_bonito, "</li>")
      }
      texto_motivo <- paste0(texto_motivo, "</ul>")
    } else {
      texto_motivo <- "Nenhum caractere selecionado."
    }
    
    showModal(modalDialog(
      title = paste("Motivo da exclusão:", esp_nome),
      size = "xl",
      HTML(texto_motivo),
      easyClose = TRUE,
      footer = modalButton("Fechar")
    ))
  })
  
  observeEvent(input$clean.button.1, { 
    for (g in names(tree_list)) {
      for (c in names(tree_list[[g]])) {
        id <- paste("cb", gsub("[^a-zA-Z0-9]", "", g), gsub("[^a-zA-Z0-9]", "", c), sep = "_")
        updateCheckboxGroupInput(session, id, selected = character(0))
      }
    }
  })
  
  observeEvent(c(input$especies.sel, input$chars.sel), {
    f0 <- input$especies.sel
    chars.sel.option <- input$chars.sel
    
    if (length(f0) > 0) {
      m0 <- mat[, colnames(mat) %in% f0, drop = FALSE]
      
      if (chars.sel.option == "semelhantes" && length(f0) > 0) {
        row_sums <- rowSums(m0)
        keep_rows <- as.logical(row_sums == ncol(m0))
        m0 <- m0[keep_rows, , drop = FALSE]
      }
      if (chars.sel.option == "distintivos" && length(f0) > 1) {
        row_sums <- rowSums(m0)
        keep_rows <- as.logical(row_sums > 0 & row_sums < ncol(m0))
        m0 <- m0[keep_rows, , drop = FALSE]
      }
      
      m0_texto <- as.data.frame(lapply(m0, function(coluna) {
        ifelse(coluna == 1, "X", "")
      }), stringsAsFactors = FALSE, check.names = FALSE)
      
      rownames(m0_texto) <- gsub("___", " > ", rownames(m0))
      
      output$especies.sel.n <- renderText(paste(length(f0), "espécie(s) selecionada(s)"))
      output$chars.sel.n <- renderText(paste(nrow(m0_texto), "caractere(s) mostrado(s)"))
      
      output$especies.comp <- renderTable({ 
        if(nrow(m0_texto) > 0) {
          res <- cbind(Caractere = rownames(m0_texto), m0_texto)
          res
        } else {
          data.frame(Mensagem = "Nenhum caractere compartilhado pelas espécies selecionadas.")
        }
      }, bordered = TRUE, rownames = FALSE, na = "")
      
    } else {
      output$especies.sel.n <- renderText("0 espécie(s) selecionada(s)")
      output$chars.sel.n <- renderText("0 caractere(s) mostrado(s)")
      output$especies.comp <- renderTable({ data.frame() })
    }
  })
  
  observeEvent(input$clean.button.2, { 
    updateCheckboxGroupInput(session = session, inputId = "especies.sel", selected = character(0))
  })
}

shinyApp(ui = ui, server = server)



# ====================================================================
# 2. ARQUIVOS DE DADOS (CSVs e Rmd)
# ====================================================================
# Para que o app leia os arquivos, você declara cada um usando "## file: nome_do_arquivo" 
# e cola o texto bruto embaixo dele. 
# Dica: Abra seus CSVs no próprio RStudio ou Bloco de Notas para copiar o texto.

## file: matrix.csv
Group;Character;Gomphrena vaga;Araujia sericifera;Ditassa burchellii;Fischeria stellata;Forsteronia glabrescens;Forsteronia thyrsoidea;Gonolobus parviflorus;Gonolobus rostratus;Macropharynx peltata;Mandevilla pentlandiana;Orthosia florida;Orthosia urceolata;Oxypetalum appendiculatum;Oxypetalum tomentosum;Oxypetalum wightianum;Prestonia coalita;Temnadenia odorifera;Aristolochia triangularis;Baccharis anomala;Baccharis trinervis;Calea pinnatifida;Lepidaploa balansae;Mikania campanulata;Mikania cordifolia;Mikania glomerata;Mikania involucrata;Mikania laevigata;Mikania micrantha;Mikania ternata;Mikania ulei;Mutisia coccinea;Mutisia speciosa;Piptocarpha sellowii;Amphilophium crucigerum;Amphilophium paniculatum;Bignonia callistegioides;Dolichandra cynanchoides;Dolichandra quadrivalvis;Dolichandra unguis-cati;Pyrostegia venusta;Tanaecium selloi;Tynanthus cognatus;Myriopus breviflorus;Varronia polycephala;Celtis spinosa;Celtis spinosissima;Valeriana scandens;Pristimera celastroides;Combretum fruticosum;Convolvulus crenatifolius;Ipomoea alba;Ipomoea bonariensis;Ipomoea cairica;Ipomoea indica;Ipomoea indivisa;Ipomoea uruguayensis;Cayaponia alarici;Cayaponia martiana;Cayaponia trilobata;Melothria cucumis;Sicydium gracile;Scleria secans;Dioscorea multiflora;Dalechampia stenosepala;Tragia volubilis;Ancistrotropis clitorioides;Canavalia bonariensis;Centrosema virginianum;Dalbergia frutescens;Desmodium uncinatum;Helicotropis hookeri;Lathyrus crassipes;Lathyrus nervosus;Lathyrus subulatus;Macropsychanthus violaceus;Macroptilium erythroloma;Macroptilium prostratum;Macroptilium psammodes;Schnella microstachya;Senegalia tucumanensis;Vigna diffusa;Strychnos brasiliensis;Heteropterys aenea;Heteropterys microcarpa;Janusia guaranitica;Stigmaphyllon jatrophifolium;Marcgravia polyantha;Cissampelos pareira;Hyperbaena domingensis;Odontocarya acuparata;Pisonia aculeata;Passiflora alata;Passiflora caerulea;Passiflora elegans;Passiflora suberosa;Passiflora tenuifila;Seguieria aculeata;Chusquea tenella;Lasiacis divaricata;Melica sarmentosa;Securidaca lanceolata;Clematis bonariensis;Clematis denticulata;Clematis discolor;Rubus imperialis;Rubus urticifolius;Chiococca alba;Galium hypocarpium;Cardiospermum halicacabum;Paullinia trigonia;Serjania glabrata;Serjania laruotteana;Smilax campestris;Smilax cognata;Solanum laxum;Tropaeolum pentaphyllum;Lantana camara;Anchietea pyrifolia;Cissus verticillata;Clematicissus striata
Folha;Tipo;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;composta;composta;simples;composta;composta;composta;composta;composta;composta;composta;composta;composta;simples;simples;simples;simples;simples/composta;simples;simples;simples;simples;simples;simples;simples;simples;simples;composta;simples;simples;simples;simples;simples;simples;composta;simples;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;composta;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;simples;composta;composta;composta;composta;composta;simples;simples;composta;composta;composta;composta;simples;simples;simples;composta;simples;simples;simples;composta
Folha;Subtipo;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples pinatissecta/simples palmatissecta/simples palmatífida;simples pinatissecta;composta pinada paripinada;composta pinada paripinada;simples inteira;composta bifoliolada/composta trifoliolada;composta bifoliolada/composta trifoliolada;composta bifoliolada;composta bifoliolada;composta bifoliolada;composta bifoliolada;composta bifoliolada/composta trifoliolada;composta bifoliolada/composta trifoliolada;composta bifoliolada/composta trifoliolada;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira/composta trifoliolada;simples inteira;simples inteira;simples inteira;simples inteira/simples palmatilobada/simples trilobada;simples inteira/simples palmatilobada;simples palmatissecta;simples inteira/simples trilobada;simples inteira;simples inteira;composta trifoliolada/composta palmada;simples trilobada/simples palmatilobada;simples trilobada;simples inteira/simples trilobada;simples inteira;simples inteira;simples inteira;composta trifoliolada;simples inteira;composta trifoliolada;composta trifoliolada;composta trifoliolada;composta pinada imparipinada;composta trifoliolada;composta trifoliolada;composta bifoliolada;composta bifoliolada;composta bifoliolada;composta trifoliolada;composta trifoliolada;composta trifoliolada;composta trifoliolada;composta unifoliolada emarginada a bipartida;composta bipinada;composta trifoliolada;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira/simples palmatilobada;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;simples palmatilobada;simples trilobada;simples trilobada;simples trilobada;simples inteira;simples inteira;simples inteira;simples inteira;simples inteira;composta trifoliolada;composta pinada imparipinada/composta bipinada;composta pinada imparipinada/composta bipinada;composta trifoliolada/composta palmada;composta trifoliolada/composta palmada;simples inteira;simples inteira;composta biternada;composta biternada;composta biternada;composta biternada;simples inteira;simples inteira;simples inteira/simples pinatilobada;composta palmada;simples inteira;simples inteira;simples inteira;composta palmada
Folha;Filotaxia;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;alterna;alterna;alterna;oposta;alterna;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;alterna;alterna;alterna;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;oposta;alterna;alterna;alterna;alterna;oposta;oposta;oposta;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;oposta;oposta;oposta;oposta;oposta;alterna;alterna;alterna;alterna;oposta;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;oposta;oposta;oposta;alterna;alterna;oposta;oposta;alterna;alterna;alterna;alterna;alterna;alterna;alterna;alterna;oposta;alterna;alterna;alterna
Exsudatos;Látex;sem látex;branco;branco;branco;branco;branco;branco;branco;hialino;branco;branco;branco;branco;branco;branco;hialino;branco;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;branco;hialino;branco;branco;hialino;branco;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex;sem látex
Mecanismo de escalada;Tipo principal;apoiante;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;apoiante;apoiante;apoiante;apoiante;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;gavinha;gavinha;apoiante;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;apoiante;apoiante;apoiante;apoiante;volúvel;ramo secundário volúvel;apoiante;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;gavinha;gavinha;gavinha;gavinha;gavinha;apoiante;volúvel;volúvel;volúvel;volúvel;volúvel;volúvel;ramo secundário volúvel;apoiante;volúvel;gavinha;gavinha;gavinha;volúvel;volúvel;volúvel;volúvel;gavinha;apoiante;volúvel;apoiante;volúvel;volúvel;volúvel;volúvel;raízes grampiformes;volúvel;volúvel;volúvel;apoiante;gavinha;gavinha;gavinha;gavinha;gavinha;apoiante;apoiante;apoiante;gavinha;apoiante;pecíolos volúveis;pecíolos volúveis;pecíolos volúveis;apoiante;apoiante;apoiante;apoiante;gavinha;gavinha;gavinha;gavinha;gavinha;gavinha;pecíolos volúveis;pecíolos volúveis;apoiante;volúvel;gavinha;gavinha
Mecanismo de escalada;Projeções auxiliares na escalada;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;espinhos;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;tricomas aderentes retrorsos ou uncinados;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;tricomas aderentes retrorsos ou uncinados;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;acúleos;sem projeções;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;espinhos;sem projeções;sem projeções;tricomas aderentes retrorsos ou uncinados;sem projeções;sem projeções;sem projeções;sem projeções;acúleos;acúleos;sem projeções;tricomas aderentes retrorsos ou uncinados;sem projeções;sem projeções;sem projeções;sem projeções;espinhos;espinhos;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções;sem projeções
Mecanismo de escalada;Tipo de gavinha;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;ramificadas;ramificadas;sem gavinhas;discos adesivos;ramificadas;ramificadas;uncinadas;uncinadas;uncinadas;ramificadas;ramificadas;ramificadas/discos adesivos;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas/ramificadas;ramificadas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;não ramificadas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;não ramificadas;discos adesivos
Mecanismo de escalada;Localização da gavinha;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;no folíolo terminal;no folíolo terminal;sem gavinhas;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;no folíolo central;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;axilar;axilar;axilar;axilar;axilar;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;axilar;axilar;axilar;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;axilar;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;axilar;axilar;axilar;axilar;axilar;sem gavinhas;sem gavinhas;sem gavinhas;no ápice da folha;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;na inflorescência;na inflorescência;na inflorescência;na inflorescência;no pecíolo;no pecíolo;sem gavinhas;sem gavinhas;sem gavinhas;sem gavinhas;no pecíolo;oposta às folhas


## file: info_caracteres.csv
Caractere;Categoria_Tree;Descricao_Texto;Foto1;Foto2;Foto3
branco;Exsudatos;;;;
hialino;Exsudatos;;;;
sem látex;Exsudatos;;;;
Tipo;Folha;O tipo de folha define se ela possui apenas uma lâmina contínua (simples) ou se é dividida em várias lâminas menores chamadas folíolos (composta).;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_simples_vs_composta.jpg;;
composta;Folha;;;;
simples;Folha;;;;
Subtipo;Folha;As folhas simples e compostas podem apresentar diferentes morfologias e terminologias descritas nas imagens.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_subtipo_simples.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_subtipo_composta.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_subtipo_composta2.jpg
composta bipinada;Folha;;;;
composta bifoliolada;Folha;;;;
composta biternada;Folha;;;;
composta palmada;Folha;;;;
composta pinada imparipinada;Folha;;;;
composta pinada paripinada;Folha;;;;
composta trifoliolada;Folha;;;;
composta unifoliolada emarginada a bipartida;Folha;;;;
simples inteira;Folha;;;;
simples palmatífida;Folha;;;;
simples palmatissecta;Folha;;;;
simples palmatilobada;Folha;;;;
simples pinatilobada;Folha;;;;
simples pinatissecta;Folha;;;;
simples trilobada;Folha;;;;
Filotaxia;Folha;Disposição das folhas nos nós caulinares.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/folha_filotaxia.jpg;;
alterna;Folha;;;;
oposta;Folha;;;;
apoiante;Mecanismo de escalada;Em contato com o suporte ocorrem ramificações formando uma rede, possibilitando a planta crescer sem cair. Podem apresentar acúleos, espinhos ou tricomas (ver Projeções auxiliares na escalada) que auxiliam evitando o desprendimento da planta no suporte.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_apoiante.jpg;;
gavinha;Mecanismo de escalada;Órgãos modificados para se enrolar ou prender. A imagem é uma gavinha simples não ramificada. Para outros tipos veja Tipo de gavinha e Origem da gavinha no painel de seleção.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_gavinha2.jpg;;
pecíolos volúveis;Mecanismo de escalada;Pecíolos de folhas simples ou compostas se enrolam para prender a planta.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_peciolo.jpg;;
raízes grampiformes;Mecanismo de escalada;Raízes adventícias prendem a planta ao forófito.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_raiz.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_raiz2.jpg;
ramo secundário volúvel;Mecanismo de escalada;Caules/ramos secundários se enrolam.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_ramo_sec_voluvel.jpg;;
volúvel;Mecanismo de escalada;Caule principal se enrola.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_voluvel.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/escalada_voluvel2.jpg;
sem projeções;Mecanismo de escalada;;;;
acúleos;Mecanismo de escalada;Projeções não vascularizadas, geralmente curvadas, auxiliando a planta a se prender no suporte e evitando seu desprendimento.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/projeções_aculeos.jpg;;
espinhos;Mecanismo de escalada;Projeções vascularizadas, geralmente curvadas, auxiliando a planta a se prender no suporte e evitando seu desprendimento.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/projeções_espinhos.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/projeções_espinhos2.jpg;
tricomas aderentes retrorsos ou uncinados;Mecanismo de escalada;;;;
não ramificadas;Mecanismo de escalada;Gavinhas que se enrolam no suporte e não apresentam ramificações.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_simples.jpg;;
ramificadas;Mecanismo de escalada;Gavinhas que se enrolam no suporte e apresentam duas ou mais ramificações.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_ramificada.jpg;;
uncinadas;Mecanismo de escalada;Gavinhas com ápices modificados em garras, geralmente tripartidas.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinhas_uncinadas.jpg;;
discos adesivos;Mecanismo de escalada;Gavinhas ramificadas, cujos ápices são modificados em discos adesivos que se prendem/colam no suporte.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_discos.jpg;;
sem gavinhas;Mecanismo de escalada;;;;
axilar;Mecanismo de escalada;Gavinhas se originam na axila da folha com o ramo.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_simples.jpg;;
na inflorescência;Mecanismo de escalada;Gavinha se localiza na inflorescência, nesse caso no ápice do pedunculo e na base da raque floral.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_inflorescencia.jpg;;
no ápice da folha;Mecanismo de escalada;Gavinhas sem ramificações em que o ápice foliar se enrola no suporte.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_apice_folha.jpg;;
no folíolo central;Mecanismo de escalada;O folíolo terminal de folhas compostas bifolioladas se modifica em uma gavinha.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_foliolo_central.jpg;;
no folíolo terminal;Mecanismo de escalada;O folíolo terminal de folhas compostas pinadas se modifica em uma gavinha.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_ramificada.jpg;;
no pecíolo;Mecanismo de escalada;Gavinhas se originam no pecíolo foliar.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_peciolo.jpg;;
oposta às folhas;Mecanismo de escalada;Gavinhas se originam nos nós caulinares opostas às folhas.;https://www.ufrgs.br/segerlab/imagens_chave_santana/traits/gavinha_oposta.jpg;;



## file: info_especies.csv
Especie;Descricao_Texto;Foto1;Foto2;Foto3
Gomphrena vaga;Características adicionais: Folhas com indumento seríceo esbranquiçado na face abaxial.;;;
Araujia sericifera;;;;
Ditassa burchellii;Características adicionais: Folhas elípticas ou obovadas, nervuras secundárias conspícuas, margem revoluta.;;;
Fischeria stellata;Características adicionais: Folhas lanceoladas, nervuras secundárias inconspícuas, margem plana.;;;
Forsteronia glabrescens;;;;
Forsteronia thyrsoidea;;;;
Gonolobus parviflorus;;;;
Gonolobus rostratus;;;;
Macropharynx peltata;;;;
Mandevilla pentlandiana;;;;
Orthosia florida;;;;
Orthosia urceolata;;;;
Oxypetalum appendiculatum;;;;
Oxypetalum tomentosum;Características adicionais: Flor com apêndice estilar branco a levemente rosado, bifurcado no ápice. Fruto do tipo folículo, liso e verde.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/oxypetalum_tomentosum.jpg;;
Oxypetalum wightianum;Características adicionais: Flor com apêndice estilar vináceo bifurcado no ápice. Fruto do tipo folículo, verrucoso e verde.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/oxypetalum_wightianum.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/oxypetalum_wightianum2.jpg;
Prestonia coalita;;;;
Temnadenia odorifera;;;;
Aristolochia triangularis;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/aristolochia_triangularis.jpg;;
Baccharis anomala;Características adicionais: Folhas trinervadas, margem recortada.;;;
Baccharis trinervis;Características adicionais: Folhas trinervadas, margem inteira.;;;
Calea pinnatifida;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/calea_pinnatifida.jpg;;
Lepidaploa balansae;;;;
Mikania campanulata;Características adicionais: Folhas discolores, roxas na face abaxial, mais evidente em plantas jovens.;;;
Mikania cordifolia;;;;
Mikania glomerata;;;;
Mikania involucrata;Características adicionais: Folhas ovado-triangulares de base truncada ou cordada, ramos jovens avermelhados.;;;
Mikania laevigata;;;;
Mikania micrantha;;;;
Mikania ternata;;;;
Mikania ulei;;;;
Mutisia coccinea;Características adicionais: Lobos foliares discolores.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/mutisia_coccinea.jpg;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/mutisia_coccinea2.jpg;
Mutisia speciosa;Características adicionais: Lobos foliares concolores.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/mutisia_speciosa.jpg;;
Piptocarpha sellowii;;;;
Amphilophium crucigerum;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/amphilophium_crucigerum.jpg;;
Amphilophium paniculatum;;;;
Bignonia callistegioides;;;;
Dolichandra cynanchoides;Características adicionais: Profilos axilares lanceolados ou deltóides, lisos.;;;
Dolichandra quadrivalvis;;;;
Dolichandra unguis-cati;Características adicionais: Profilos axilares ovados, estriados.;;;
Pyrostegia venusta;Características adicionais: Folíolos ovados, base obtusa, profilos axilares inconspícuos, caule lenhoso maduro com ritidoma se desprendendo em placas.;;;
Tanaecium selloi;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/tanaecium_selloi.jpg;;
Tynanthus cognatus;;;;
Myriopus breviflorus;;;;
Varronia polycephala;;;;
Celtis spinosa;;;;
Celtis spinosissima;;;;
Valeriana scandens;Características adicionais: base da folha assimétrica.;;;
Pristimera celastroides;;;;
Combretum fruticosum;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/combretum_fruticosum.jpg;;
Convolvulus crenatifolius;;;;
Ipomoea alba;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/ipomoea_alba.jpg;;
Ipomoea bonariensis;;;;
Ipomoea cairica;Características adicionais: Lâminas foliares palmatisectas, com cinco segmentos lanceolados ou elípticos.;;;
Ipomoea indica;;;;
Ipomoea indivisa;;;;
Ipomoea uruguayensis;;;;
Cayaponia alarici;;;;
Cayaponia martiana;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/cayaponia_martiana.jpg;;
Cayaponia trilobata;;;;
Melothria cucumis;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/melothria_cucumis.jpg;;
Sicydium gracile;;;;
Scleria secans;;;;
Dioscorea multiflora;;;;
Dalechampia stenosepala;;;;
Tragia volubilis;;;;
Ancistrotropis clitorioides;;;;
Canavalia bonariensis;Características adicionais: ramos e pecíolos glabrescentes, folhas elípticas.;;;
Centrosema virginianum;;;;
Dalbergia frutescens;;;;
Desmodium uncinatum;;;;
Helicotropis hookeri;;;;
Lathyrus crassipes;Características adicionais: ramos alados.;;;
Lathyrus nervosus;Características adicionais: ramos não alados.;;;
Lathyrus subulatus;;;;
Macropsychanthus violaceus;Características adicionais: ramos e pecíolos hirsutos, folhas orbiculares ou largo-obovadas.;;;
Macroptilium erythroloma;Características adicionais: folíolos romboides, velutinos na face abaxial.;;;
Macroptilium prostratum;;;;
Macroptilium psammodes;Características adicionais: folíolos ovado-triangulares, seríceos em ambas as faces.;;;
Schnella microstachya;Características adicionais: frutos anemocóricos do tipo sâmara.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/schnella_microstachya.jpg;;
Senegalia tucumanensis;;;;
Vigna diffusa;;;;
Strychnos brasiliensis;;;;
Heteropterys aenea;Características adicionais: Folhas discolores, com a face abaxial marcadamente dourada.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/heteropterys_aenea.jpg;;
Heteropterys microcarpa;;;;
Janusia guaranitica;;;;
Stigmaphyllon jatrophifolium;;;;
Marcgravia polyantha;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/marcgravia_polyantha.jpg;;
Cissampelos pareira;Características adicionais: Folhas reniformes, ápice obtuso, apiculado.;;;
Hyperbaena domingensis;Características adicionais: Folhas ovadas ou elípticas.;;;
Odontocarya acuparata;Características adicionais: Folhas reniformes, ápice acuminado.;;;
Pisonia aculeata;;;;
Passiflora alata;;;;
Passiflora caerulea;;;;
Passiflora elegans;Características adicionais: Nectários extraflorais na margem do limbo foliar e no pecíolo, estípulas foliáceas, folhas com os lobos suborbiculares.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/passiflora_elegans.jpg;;
Passiflora suberosa;Características adicionais: Nectários extraflorais apenas no pecíolo, estípulas linear-subuladas.;;;
Passiflora tenuifila;Características adicionais: Nectários extraflorais na margem do limbo foliar e no pecíolo, estípulas foliáceas, folhas com os lobos oblongos a ovais.;;;
Seguieria aculeata;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/seguieria_aculeata.jpg;;
Chusquea tenella;;;;
Lasiacis divaricata;;;;
Melica sarmentosa;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/gavinha_apice_folha.jpg;;
Securidaca lanceolata;;;;
Clematis bonariensis;Características adicionais: base da folha simétrica.;;;
Clematis denticulata;Características adicionais: indumento hialino.;;;
Clematis discolor;Características adicionais: indumento dourado.;;;
Rubus imperialis;Características adicionais: ramos sem cerdas, folíolos com menos de 10 pares de nervuras secundárias, glabros na face adaxial.;;;
Rubus urticifolius;Características adicionais: ramos com longas cerdas, folíolos com mais de 10 pares de nervuras secundárias, tomentosos na face adaxial.;;;
Chiococca alba;Características adicionais: com estípulas interpeciolares que podem ser caducas, frutos endozoocóricos do tipo baga e cor branca.;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/chiococca_alba.jpg;;
Galium hypocarpium;;;;
Cardiospermum halicacabum;Características adicionais: herbáceas, com folíolos membranáceos.;;;
Paullinia trigonia;;;;
Serjania glabrata;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/serjania_glabrata.jpg;;
Serjania laruotteana;;;;
Smilax campestris;Características adicionais: Folhas com a margem plana.;;;
Smilax cognata;Características adicionais: Folhas com a margem espessada.;;;
Solanum laxum;;;;
Tropaeolum pentaphyllum;;https://www.ufrgs.br/segerlab/imagens_chave_santana/species/tropaeolum_pentaphyllum.jpg;;
Lantana camara;;;;
Anchietea pyrifolia;;;;
Cissus verticillata;;;;
Clematicissus striata;;;;

## file: about.Rmd
---
title: "Sobre"
author: "Guilherme D. S. Seger"
date: "August 09, 2026"
output: html_document
---

### Identificação de espécies trepadeiras do Morro Santana, Porto Alegre, RS, Brasil

Esta chave interativa foi desenvolvida como ferramenta de auxílio para a identificação de espécies de trepadeiras do Morro Santana.

Nem todas as espécies e caracteres possuem textos e imagens, que estão sendo continuamente adicionadas.


### Fonte dos dados
Essa chave iterativa foi desenvolvida com dados provenientes do manuscrito científico em desenvolvimento:

* [Seger et al. 2027](https://www.xxx)


### Código

O código utilizado para gerar está página foi originalmente gerado pelo Prof. Marcelo Reginato e obtido em: (https://github.com/mreginato/Chave_familias_BR).

O código foi adaptado para espécies e modificado com auxílio de Inteligência Artificial (IA) Google Gemini Pro. 

Dentre as novidades incluídas estão as funcionalidades de links para fotos e textos nas espécies e para os caracteres. Além disso, o código para o app foi feito no formato shinyLive para possibilitar a funcionalidade da chave diretamente no site sem a necessidade de hospedá-la em um servidor.

O novo código estará em breve disponível em [download](https://github.com/GuiSeger/XXX).

:::
::::::
:::::::

<!-- Script para tornar a navbar responsiva ao scroll -->

<script>
document.addEventListener("DOMContentLoaded", function() {
    const navbar = document.querySelector('.navbar');
    
    if (navbar) {
        window.addEventListener('scroll', function() {
            // Quando rolar mais de 50px para baixo, adiciona a cor
            if (window.scrollY > 50) {
                navbar.classList.add('navbar-scrolled');
            } else {
                // Ao voltar para o topo, volta a ficar transparente
                navbar.classList.remove('navbar-scrolled');
            }
        });
    }
});
</script>