Files
mmpSearch/pages/plugin.md
T
2025-12-06 00:00:50 -03:00

16 KiB

layout, title, permalink
layout title permalink
default Projetos com a tag Plugin /plugin/

  <div class="tabs is-centered is-boxed is-medium mb-6">
    {% include sidebar.html %}
  </div>

  <details
    class="box mb-5 p-0 collapse-card"
    open
    style="
      border: 1px solid #cfe8fc;
      overflow: hidden;
      background-color: #fff;
      box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
      height: fit-content !important;
      min-height: unset;
    "
  >
    <summary
      class="p-4 is-flex is-justify-content-space-between is-align-items-center"
      style="cursor: pointer; background-color: #f8fbff; user-select: none"
    >
      <div class="is-flex is-align-items-center">
        <span class="icon has-text-info mr-2"
          ><i class="fa-solid fa-list"></i
        ></span>
        <span class="has-text-grey-dark has-text-weight-bold"
          >Todos os Plugins Disponíveis</span
        >
        <span
          id="filter-counter"
          class="tag is-info is-light ml-3 is-hidden"
          >0 selecionados</span
        >
      </div>
      <span class="icon has-text-grey-light chevron-icon"
        ><i class="fa-solid fa-chevron-down"></i
      ></span>
    </summary>

    <div
      class="p-4"
      style="background-color: #fff; border-top: 1px solid #cfe8fc"
    >
      <div class="tags is-centered are-medium mb-0">
        {% assign all_items_string = "" %} {% for p in site.data.all %} {%
        if p.tags.plugin %} {% for item in p.tags.plugin %} {% if item != ""
        %} {% unless all_items_string contains item %} {% assign
        all_items_string = all_items_string | append: item | append: "|||"
        %} {% endunless %} {% endif %} {% endfor %} {% endif %} {% endfor %}
        {% assign unique_items = all_items_string | split: "|||" | sort %}
        {% for item in unique_items %} {% if item != "" %}
        <a
          href="#"
          class="tag is-white plugin-filter-item clickable-tag"
          data-value="{{ item }}"
          style="
            border: 1px solid #deeaf6;
            color: #5b7da3;
            margin-bottom: 0.5rem;
            transition: all 0.2s;
          "
        >
          {{ item }}
        </a>
        {% endif %} {% endfor %}
      </div>
    </div>
  </details>

  <div class="columns is-mobile is-vcentered mb-5">
    <div class="column is-auto">
      <h2 class="title is-4 has-text-grey-dark">
        <span class="icon has-text-info mr-2"
          ><i class="fa-solid fa-filter"></i
        ></span>
        Filtro:
        <code id="filter-display-name" style="color: #d63384">(todos)</code>
      </h2>
    </div>
    <div class="column is-narrow">
      <button
        id="clearFilterButton"
        class="button is-small is-danger is-light"
      >
        <span class="icon is-small"><i class="fa-solid fa-xmark"></i></span>
        <span>Limpar Tudo</span>
      </button>
    </div>
  </div>

  <div id="project-list" class="columns is-multiline">
    {% for projeto in site.data.all %} {% if projeto.tags.TAG contains
    "plugin" %}

    <div
      class="column is-12-mobile is-6-tablet is-4-desktop is-3-widescreen project-item"
      data-plugins="{{ projeto.tags.plugin | join: ',' }}"
    >
      <div
        class="card project-card"
        style="
          height: 100%;
          background-color: #f0f8ff;
          border: 1px solid #cfe8fc;
          border-radius: 12px;
          display: flex;
          flex-direction: column;
          position: relative;
        "
      >
        {% assign file_url = projeto.file | downcase | replace: ' ', '-' |
        replace: 'ç', 'c' | replace: 'ã', 'a' | replace: 'á', 'a' | replace:
        'â', 'a' | replace: 'é', 'e' | replace: 'ê', 'e' | replace: 'í', 'i'
        | replace: 'ó', 'o' | replace: 'ô', 'o' | replace: 'õ', 'o' |
        replace: 'ú', 'u' %} {% assign page_url = '../projetos/' | append:
        file_url | append: '.html' %}

        <a
          href="{{ page_url }}"
          style="
            text-decoration: none;
            flex: 1;
            display: flex;
            flex-direction: column;
          "
        >
          <div
            class="card-content has-text-centered p-4"
            style="flex: 1; display: flex; flex-direction: column"
          >
            <div
              style="
                width: 50px;
                height: 50px;
                background-color: #fff;
                border-radius: 50%;
                display: flex;
                align-items: center;
                justify-content: center;
                margin: 0 auto 0.5rem auto;
                box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
              "
            >
              <span class="icon" style="color: #3273dc"
                ><i class="fa-solid fa-music fa-lg"></i
              ></span>
            </div>

            <p
              class="title is-6 mb-2"
              style="
                color: #205081;
                word-break: break-word;
                font-weight: 700;
                line-height: 1.2;
              "
            >
              {{ projeto.file }}
            </p>

            {% if projeto.bpm %}
            <div class="mb-3">
              <span
                class="tag is-dark is-rounded is-light"
                style="
                  font-size: 0.7rem;
                  font-weight: bold;
                  border: 1px solid #ccc;
                "
              >
                🎵 {{ projeto.bpm }} BPM
              </span>
            </div>
            {% else %}
            <div class="mb-3" style="height: 24px"></div>
            {% endif %}

            <div style="flex: 1"></div>

            {% if projeto.tags.plugin and projeto.tags.plugin.size > 0 %}
            <div
              class="tags is-centered is-gapless mb-0 mt-2"
              style="gap: 4px; justify-content: center"
            >
              {% for item in projeto.tags.plugin %} {% if item != "" %}
              <span
                class="tag is-white project-tag-item clickable-tag"
                data-value="{{ item }}"
                style="
                  font-size: 0.65rem;
                  border: 1px solid #deeaf6;
                  color: #5b7da3;
                  padding: 0 6px;
                  height: 1.5em;
                  text-decoration: none;
                  cursor: pointer;
                "
              >
                {{ item | truncate: 15 }}
              </span>
              {% endif %} {% endfor %}
            </div>
            {% endif %}
          </div>
        </a>

        <footer
          class="card-footer"
          style="
            border-top: 1px solid #cfe8fc;
            background-color: #fff;
            border-radius: 0 0 12px 12px;
            overflow: hidden;
          "
        >
          <a
            href="#"
            class="card-footer-item js-open-modal"
            data-target-url="{{ page_url }}"
            data-modal-title="Detalhes: {{ projeto.file }}"
            data-full-btn-text="Ir para Página"
            data-full-btn-link="{{ page_url }}"
            style="
              color: #5b7da3;
              font-size: 0.8rem;
              font-weight: 600;
              border-right: 1px solid #eee;
              transition: background 0.2s;
            "
            >Ver</a
          >
          {% assign creation_url = '/mmpSearch/creation.html?project=' |
          append: projeto.file %} {% assign embed_url = creation_url |
          append: '&embed=true' %}
          <a
            href="#"
            class="card-footer-item js-open-modal"
            data-target-url="{{ embed_url }}"
            data-modal-title="Editor: {{ projeto.file }}"
            data-full-btn-text="Abrir Editor"
            data-full-btn-link="{{ creation_url }}"
            style="color: #3273dc; font-size: 0.8rem; font-weight: 600"
            >Editar</a
          >
        </footer>
      </div>
    </div>
    {% endif %} {% endfor %}
  </div>
</div>

Preview

Fechar Abrir
<style> .project-card:hover { transform: translateY(-5px); box-shadow: 0 8px 20px rgba(50, 115, 220, 0.15); border-color: #3273dc !important; background-color: #fff !important; } /* Tag normal */ .clickable-tag:hover { background-color: #e3effd !important; color: #3273dc !important; border-color: #3273dc !important; transform: scale(1.05); } /* Tag ATIVA (Selecionada) */ .tag.is-active-filter { background-color: #3273dc !important; color: #fff !important; border-color: #3273dc !important; font-weight: bold; box-shadow: 0 2px 5px rgba(50, 115, 220, 0.3); } /* Animação do Accordion */ .collapse-card summary { list-style: none; transition: background 0.2s; } .collapse-card summary::-webkit-details-marker { display: none; } .collapse-card[open] summary .chevron-icon { transform: rotate(180deg); } .chevron-icon { transition: transform 0.3s ease; } </style> <script> document.addEventListener("DOMContentLoaded", function () { const projects = document.querySelectorAll(".project-item"); const filterDisplayName = document.getElementById("filter-display-name"); const filterCounter = document.getElementById("filter-counter"); // --- ESTADO GLOBAL DOS FILTROS --- let activeFilters = []; // Array de strings // --- FUNÇÃO PRINCIPAL DE FILTRAGEM --- function applyFilters() { // 1. Atualiza Texto do Título if (activeFilters.length > 0) { filterDisplayName.textContent = activeFilters.join(" + "); filterCounter.textContent = activeFilters.length + " selecionados"; filterCounter.classList.remove("is-hidden"); } else { filterDisplayName.textContent = "(todos)"; filterCounter.classList.add("is-hidden"); } // 2. Atualiza visual das Tags (Nuvem e Cards) document.querySelectorAll("[data-value]").forEach((tag) => { const val = tag.getAttribute("data-value"); if (activeFilters.includes(val)) { tag.classList.add("is-active-filter"); } else { tag.classList.remove("is-active-filter"); } }); // 3. Mostra/Esconde Projetos projects.forEach((project) => { const projectPluginsStr = project.getAttribute("data-plugins"); const projectPlugins = projectPluginsStr .split(",") .map((s) => s.trim()); if (activeFilters.length === 0) { // Sem filtro: mostra tudo project.style.display = "block"; } else { // Com filtro: Lógica "OU" (Mostra se tiver pelo menos UM dos selecionados) // Se quiser lógica "E" (tem que ter TODOS), troque .some() por .every() const hasMatch = activeFilters.some((filter) => projectPlugins.includes(filter) ); project.style.display = hasMatch ? "block" : "none"; } }); // 4. Atualiza URL const newUrl = new URL(window.location.href); if (activeFilters.length > 0) { newUrl.searchParams.set("plugin", activeFilters.join(",")); } else { newUrl.searchParams.delete("plugin"); } window.history.replaceState({}, "", newUrl); } // --- GERENCIADOR DE CLIQUES (TOGGLE) --- function toggleFilter(val) { const index = activeFilters.indexOf(val); if (index > -1) { activeFilters.splice(index, 1); // Remove se já existe } else { activeFilters.push(val); // Adiciona se não existe } applyFilters(); } // --- INICIALIZAÇÃO --- // 1. Lê URL ao carregar const urlParams = new URLSearchParams(window.location.search); const pluginParam = urlParams.get("plugin"); if (pluginParam) { // Suporta ?plugin=a,b,c activeFilters = pluginParam .split(",") .map((s) => s.trim()) .filter((s) => s !== ""); applyFilters(); } // 2. Eventos de Clique (Nuvem e Cards) // Usamos event delegation ou selecionamos todos const allClickableTags = document.querySelectorAll( ".plugin-filter-item, .project-tag-item" ); allClickableTags.forEach((tag) => { tag.addEventListener("click", function (e) { e.preventDefault(); const val = this.getAttribute("data-value"); toggleFilter(val); }); }); // 3. Botão Limpar document .querySelector("#clearFilterButton") .addEventListener("click", function () { activeFilters = []; applyFilters(); }); // --- MODAL (Padrão) --- const modal = document.getElementById("preview-modal"); const iframe = document.getElementById("preview-iframe"); const modalTitle = document.getElementById("modal-title"); const fullEditBtn = document.getElementById("full-edit-btn"); const closeButtons = document.querySelectorAll( ".modal-background, .modal-card-head .delete, #close-modal-btn" ); function openModal(url, title, btnText, btnLink) { modalTitle.textContent = title; iframe.src = url; fullEditBtn.textContent = btnText; fullEditBtn.href = btnLink; modal.classList.add("is-active"); document.documentElement.classList.add("is-clipped"); } function closeModal() { modal.classList.remove("is-active"); document.documentElement.classList.remove("is-clipped"); iframe.src = ""; } document.querySelectorAll(".js-open-modal").forEach((btn) => { btn.addEventListener("click", (e) => { e.preventDefault(); openModal( btn.dataset.targetUrl, btn.dataset.modalTitle, btn.dataset.fullBtnText, btn.dataset.fullBtnLink ); }); }); iframe.addEventListener("load", () => { try { const iframeDoc = iframe.contentDocument || iframe.contentWindow.document; const style = iframeDoc.createElement("style"); style.textContent = `.tabs, .navbar, .sidebar-wrapper, .main-header { display: none !important; } .publication { padding-top: 0 !important; } body { background-color: #fff !important; }`; iframeDoc.head.appendChild(style); } catch (e) {} }); closeButtons.forEach((el) => el.addEventListener("click", closeModal)); document.addEventListener("keydown", (e) => { if (e.key === "Escape") closeModal(); }); }); </script>