summaryrefslogtreecommitdiff
path: root/layouts/_partials/components/toggle-button.html
blob: edc0e930fae3837bb35831d9286d95b3c6f93214 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{{ $id := .id }}
{{ $buttonId := default (printf "%s-toggle" $id) .buttonId }}
{{ $sectionId := default (printf "%s-section" $id) .sectionId }}
{{ $countId := default (printf "%s-count" $id) .countId }}
{{ $count := default "0" .count }}
{{ $group := .group }}

<button class="dark:invert flex items-center justify-center gap-1.5 min-w-12 h-12 px-2 border-none bg-transparent text-gray-600 cursor-pointer relative transition-all duration-200 hover:bg-black/5 hover:rounded-lg group"
    id="{{ $buttonId }}" title="{{ .title }}" data-tooltip>
  <img src="{{ .icon }}" width="20" height="20"
      alt="{{ .title }}"
      class="brightness-40 flex-shrink-0 dark:brightness-70 dark:contrast-120" />
  <span class="text-xs font-bold text-gray-600 min-w-4 text-center bg-white/90 rounded-xl px-1.5 py-0.5 shadow-sm dark:text-gray-400 dark:bg-black/70"
        id="{{ $countId }}">{{ $count }}</span>
</button>

<script>
  (function() {
    document.addEventListener('DOMContentLoaded', () => {
      const button = document.getElementById("{{ $buttonId }}");
      const section = document.getElementById("{{ $sectionId }}");
      const group = "{{ $group }}";

      if (!button || !section) return;

      const entranceAnimation = 'animate-slide-in-down';
      const exitAnimation = 'animate-slide-out-up';

      const closeSection = () => {
        if (section.classList.contains('hidden')) return;

        section.classList.remove(entranceAnimation);
        section.classList.add(exitAnimation);
        setTimeout(() => {
          section.classList.add('hidden');
        }, 200);
      };

      const openSection = () => {
        section.classList.remove('hidden', exitAnimation);
        section.classList.add(entranceAnimation);
      };

      if (group) {
        document.addEventListener('toggle-group-open', (e) => {
          if (e.detail.group === group && e.detail.sourceId !== "{{ $buttonId }}") {
            closeSection();
          }
        });
      }

      button.addEventListener('click', () => {
        const isHidden = section.classList.contains('hidden');

        if (isHidden) {
          if (group) {
             const event = new CustomEvent('toggle-group-open', {
                detail: { group: group, sourceId: "{{ $buttonId }}" }
             });
             document.dispatchEvent(event);
          }
          openSection();
        } else {
          closeSection();
        }
      });
    });
  })();
</script>