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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  | 
import {stitchArrays} from '#sugar';
export default {
  relations: (relation, entries) => ({
    heading:
      relation('generateContentHeading'),
    switcher:
      relation('generateIntrapageDotSwitcher'),
    entries:
      entries
        .map(entry => relation('generateLyricsEntry', entry)),
    annotationParts:
      entries
        .map(entry => entry.annotationParts
          .map(part => relation('transformContent', part))),
  }),
  data: (entries) => ({
    ids:
      Array.from(
        {length: entries.length},
        (_, index) => 'lyrics-entry-' + index),
  }),
  generate: (data, relations, {html, language}) =>
    language.encapsulate('releaseInfo.lyrics', capsule =>
      html.tags([
        relations.heading
          .slots({
            attributes: {id: 'lyrics'},
            title: language.$(capsule),
          }),
        html.tag('p', {class: 'lyrics-switcher'},
          {[html.onlyIfContent]: true},
          language.$(capsule, 'switcher', {
            [language.onlyIfOptions]: ['entries'],
            entries:
              relations.switcher.slots({
                initialOptionIndex: 0,
                titles:
                  relations.annotationParts
                    .map(([first, ...rest]) =>
                      language.formatUnitList([
                        html.tag('span',
                          {class: 'dot-switcher-interaction-cue'},
                          {[html.onlyIfContent]: true},
                          first?.slots({
                            mode: 'inline',
                            textOnly: true,
                          })),
                        ...rest.map(part =>
                          part.slots({
                            mode: 'inline',
                            textOnly: true,
                          })),
                      ])),
                targetIDs:
                  data.ids,
              }),
          })),
        stitchArrays({
          entry: relations.entries,
          id: data.ids,
        }).map(({entry, id}, index) =>
            entry.slots({
              attributes: [
                {id},
                index >= 1 &&
                  {style: 'display: none'},
              ],
            })),
      ])),
};
  |