askclass-course-theme 0.13.5 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '086c24d2710c4b54f4b75109b1e093f1d8394834c5c4a8be0850894611693dc5'
4
- data.tar.gz: 8128143e5d5809c197012a5f2d63a039d0f7419a401b16d9e5112f92134c51d7
3
+ metadata.gz: 2c97dd0d0d5e532f5721a54b8a0d003ebfc599c5dd275748d501c863adad803c
4
+ data.tar.gz: 52fc1f6663759fda22c98fa464af849e4989d3f24fc2c2b7ba594805d3f0a3dc
5
5
  SHA512:
6
- metadata.gz: 0f540630bdb9825b1a60baa01b7f61ec38efba779cc90eb83c80e056e8dba991cbddc8aadb01c9f8fd87b221c4758e2abe0586269e3f34f4687288d75f86b41b
7
- data.tar.gz: 02b1a307a2ca2a42468f95a810ebb72c4dfbb85f271df5c54971565bd1b9cab04f2b80b44321247c13d41e94a3faed592a4d28673ea2bc8b7a80e7fa1cbad3c6
6
+ metadata.gz: 0f7bfdc4e447483a223f7892003e193644ef3e2a2485dfc891b49fe0c0780682507c729a92103073016dd4791cd4c1a6f7fbafa7995cd70b54e3150a87469efc
7
+ data.tar.gz: 1312dd01ae62c1bcd4ae41ad5d15a95a6f97e329fe71e5bdeec647788f6ace425bf8e1da046605cb0032fe2207b804c869c14911ca51ae547130378776bb8126
data/_config.yml CHANGED
@@ -26,7 +26,7 @@ acc:
26
26
  sizes: [ 48, 96, 144, 192, 300, 512 ]
27
27
  shortcuts:
28
28
  - name: Syllabus
29
- url: https://acc.askclass.com/session/session-01
29
+ url: /session/session-01
30
30
  desc: Class syllabus and contact information
31
31
  meta:
32
32
  apple_icon: "logo-300.png"
@@ -61,6 +61,7 @@ acc:
61
61
  - Share+Tech+Mono
62
62
  - Lexend
63
63
  - Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200
64
+ icon_class: material-symbols-outlined
64
65
 
65
66
  collections_dir: content
66
67
  collections:
@@ -1,17 +1,22 @@
1
1
  {%- assign course = site.data.course -%}
2
+
2
3
  <ul class="grid">
3
4
  {%- for segment in course.segments -%}
4
5
  {%- assign info = site.data.syllabus[segment] -%}
5
6
  {%- if info -%}
6
7
  <li class="card-tab {{ info.theme }}">
7
8
  <div class="top-bar">{{ info.segment[0] }}</div>
9
+ {%- if info.segment[2] -%}
10
+ <div class="tab icon {{ symbols }}">{{ info.segment[2] }}</div>
11
+ {%- else -%}
8
12
  <div class="tab">{{ info.segment[1] }}</div>
13
+ {%- endif -%}
9
14
  <div class="header">
10
15
  <a href="/segment/{{ segment }}">
11
16
  {%- include date_range.html info=info -%}
12
17
  </a>
13
18
  </div>
14
- <div class="body">
19
+ <div class="body limit-height">
15
20
  {%- if info.desc -%}
16
21
  <h4>{{ info.desc }}</h4>
17
22
  {%- endif -%}
@@ -22,20 +27,20 @@
22
27
  {%- assign session = site.data.sessions[item] -%}
23
28
  <div class="item">
24
29
  <div class="middle-align">
25
- <span class="material-symbols-outlined">{{ session.icon }}</span>
30
+ <span class="{{ symbols }}">{{ session.icon }}</span>
26
31
  {%- if session.url -%}
27
32
  <a href="/session/{{ session.url }}" title="{{ session.title }}">
28
33
  <h3>{{ session.header }}</h3>
29
34
  </a>
30
35
  {%- else -%}
31
- <h3>{{ session.header }}</h3>
36
+ <h3>{{ session.header }}</h3>
32
37
  {%- endif -%}
33
38
  </div>
34
39
  {%- if session.due -%}
35
40
  <small class="due"
36
41
  data-date="{{ session.due }}"
37
42
  title="Due {{ session.due | date: site.acc.date_format }}">
38
- <span class="material-symbols-outlined">alarm_on</span>
43
+ <span class="icon {{ symbols }}">alarm_on</span>
39
44
  {{ session.due | date: '%b %e' }}
40
45
  </small>
41
46
  {%- endif -%}
@@ -52,7 +57,7 @@
52
57
  <a class="button" href="/segment/{{ segment }}">
53
58
  {{ info.title }}&nbsp;
54
59
  <span data-date="{{ info.end }}"
55
- class="middle-align material-symbols-outlined rocket">rocket_launch</span>
60
+ class="middle-align rocket {{ symbols }}">rocket_launch</span>
56
61
  </a>
57
62
  </div>
58
63
  </li>
@@ -78,4 +83,14 @@
78
83
  ymd2ms(el.dataset.date) < Date.now() &&
79
84
  (el.innerText = 'rocket')
80
85
  );
86
+
87
+ document.querySelectorAll('.limit-height').forEach(el => {
88
+ const check = () => {
89
+ const atBottom = el.scrollHeight - el.scrollTop <= el.clientHeight + 2;
90
+ el.classList.toggle('has-more', !atBottom);
91
+ };
92
+ check(); // run once on load
93
+ el.addEventListener('scroll', check);
94
+ new ResizeObserver(check).observe(el);
95
+ });
81
96
  </script>
@@ -4,7 +4,7 @@
4
4
  {% for item in site.acc.footer -%}
5
5
  <li>
6
6
  {%- if item.icon -%}
7
- <span class="material-symbols-outlined">{{ item.icon }}</span>
7
+ <span class="{{ symbols }}">{{ item.icon }}</span>
8
8
  {%- endif -%}
9
9
  <a href="{{ item.href }}">{{ item.text }}</a>
10
10
  </li>
@@ -1,8 +1,8 @@
1
- {% assign acc = site.acc %}
2
- {% assign desc = page.description | default: site.description | strip_html | strip_newlines %}
3
- {% assign assets = '/assets/' | prepend: site.url %}
4
- {% assign families = acc.font_families | join: "&family=" %}
5
- {% assign og_image = acc.meta.og_image | prepend: assets %}
1
+ {%- assign acc = site.acc %}
2
+ {%- assign desc = page.description | default: site.description | strip_html | strip_newlines %}
3
+ {%- assign families = acc.font_families | join: "&family=" %}
4
+ {%- assign og_image = acc.meta.og_image | prepend: '/assets/' %}
5
+ {%- assign symbols = acc.icon_class | default: 'material-symbols-outlined' -%}
6
6
 
7
7
  <meta charset="utf-8" />
8
8
  <meta name="viewport" content="width=device-width,initial-scale=1.0" />
@@ -22,12 +22,12 @@
22
22
  <meta property="og:description" content="{{ desc }}" />
23
23
  <meta property="og:url" content="{{ site.url }}{{ page.url }}" />
24
24
  <meta property="og:image" content="{{ page.image | default: og_image }}" />
25
- {% if acc.twitter %}
25
+ {%- if acc.twitter %}
26
26
  <meta name="twitter:site" content="{{ acc.social.twitter }}" />
27
27
  <meta name="twitter:card" content="summary_large_image">
28
- {% endif % %}
28
+ {% endif -%}
29
29
 
30
- <link rel="manifest" href="{{ assets }}site.webmanifest" />
30
+ <link rel="manifest" href="/assets/site.webmanifest" />
31
31
  <link rel="preconnect" href="https://cdn.jsdelivr.net" />
32
32
  <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
33
33
  <link rel="preconnect" href="https://fonts.googleapis.com" />
@@ -35,11 +35,11 @@
35
35
  <link rel="preload" as="style"
36
36
  href="https://fonts.googleapis.com/css2?family={{ families }}&display=swap"
37
37
  onload='this.onload=null;this.rel="stylesheet"' />
38
- <link rel="shortcut icon" href="{{ assets }}{{ acc.meta.shortcut.favicon }}" />
39
- <link rel="icon" type="{{ acc.meta.shotcut.type }}" href="{{ assets}}{{ acc.meta.shortcut.image }}" />
40
- <link rel="icon" type="image/svg+xml" href="{{ assets}}{{ acc.logo.image }}" />
38
+ <link rel="shortcut icon" href="/assets/{{ acc.meta.shortcut.favicon }}" />
39
+ <link rel="icon" type="{{ acc.meta.shotcut.type }}" href="/assets/{{ acc.meta.shortcut.image }}" />
40
+ <link rel="icon" type="image/svg+xml" href="/assets/{{ acc.logo.image }}" />
41
41
 
42
- <link rel="apple-touch-icon" href="{{ assets}}{{ acc.meta.apple_icon }}" />
43
- {% for size in acc.logo.sizes %}
44
- <link rel="apple-touch-icon" sizes="{{size}}x{{size}}" href="{{ assets }}logo-square-{{size}}.png" />
45
- {% endfor %}
42
+ <link rel="apple-touch-icon" href="/assets/{{ acc.meta.apple_icon }}" />
43
+ {%- for size in acc.logo.sizes %}
44
+ <link rel="apple-touch-icon" sizes="{{size}}x{{size}}" href="/assets/logo-square-{{size}}.png" />
45
+ {% endfor -%}
@@ -1,5 +1,5 @@
1
1
  <head>
2
- {%- include head/meta.html -%}
2
+ {% include head/meta.html -%}
3
3
  {%- include head/common.html -%}
4
4
  {%- if page.collection == 'session' -%}
5
5
  {%- if session_data.type == 'Dialog' -%}
@@ -9,5 +9,5 @@
9
9
  {%- endif -%}
10
10
  {%- else -%}
11
11
  <link rel="stylesheet" href="{{ 'assets/css/segment.css' | relative_url }}" />
12
- {%- endif -%}
12
+ {% endif %}
13
13
  </head>
@@ -4,7 +4,6 @@
4
4
  {%- for item in info.items -%}
5
5
  {%- assign session = site.data.sessions[item] -%}
6
6
  <li class="card-tab {{ info.theme }}">
7
-
8
7
  {%- if session.type -%}
9
8
  <div class="top-bar">{{ session.type }}</div>
10
9
  {%- elsif session.sequence -%}
@@ -16,12 +15,12 @@
16
15
  {%- if session.sequence -%}
17
16
  <div class="tab">{{ session.sequence }}</div>
18
17
  {%- elsif session.icon -%}
19
- <div class="tab material-symbols-outlined">{{ session.icon }}</div>
18
+ <div class="tab icon {{ symbols }}">{{ session.icon }}</div>
20
19
  {%- endif -%}
21
20
 
22
21
  {%- if session.due -%}
23
22
  <div class="header">
24
- <span data-date="{{ session.due }}" class="material-symbols-outlined alarm">alarm_on</span>
23
+ <span data-date="{{ session.due }}" class="{{ symbols }} alarm">alarm_on</span>
25
24
  {{ session.due | date: '%b %e, %y' }}
26
25
  </div>
27
26
  {%- elsif session.type -%}
@@ -17,25 +17,25 @@
17
17
  {% if include.icon %}
18
18
  {{ site.data.syllabus[prev].title }}
19
19
  {% endif %}
20
- <a href="/segment/{{ prev }}" class="material-symbols-outlined md-48">navigate_before</a>
20
+ <a href="/segment/{{ prev }}" class="{{ symbols }} md-48">navigate_before</a>
21
21
  {% else %}
22
22
  &nbsp;
23
- <span class="material-symbols-outlined md-48 md-disabled">navigate_before</span>
23
+ <span class="{{ symbols }} md-48 md-disabled">navigate_before</span>
24
24
  {% endif %}
25
25
 
26
26
  {% if include.icon %}
27
- <a href="/segment/{{ include.segment }}" class="material-symbols-outlined">calendar_today</a>
27
+ <a href="/segment/{{ include.segment }}" class="{{ symbols }}">calendar_today</a>
28
28
  {% else %}
29
29
  <a href="/segment/{{ include.segment }}"><h3>{{ site.data.syllabus[include.segment].title }}</h3></a>
30
30
  {% endif %}
31
31
 
32
32
  {% if next %}
33
- <a href="/segment/{{ next }}" class="material-symbols-outlined md-48">navigate_next</a>
33
+ <a href="/segment/{{ next }}" class="{{ symbols }} md-48">navigate_next</a>
34
34
  {% if include.icon %}
35
35
  {{ site.data.syllabus[next].title }}
36
36
  {% endif %}
37
37
  {% else %}
38
- <span class="material-symbols-outlined md-48 md-disabled">navigate_next</span>
38
+ <span class="{{ symbols }} md-48 md-disabled">navigate_next</span>
39
39
  {% endif %}
40
40
  </div>
41
41
  </section>
@@ -0,0 +1,3 @@
1
+ <div style="padding: 50px 0">
2
+ <div class='essential_audio' data-url='{{ include.audio }}'></div>
3
+ </div>
@@ -15,13 +15,13 @@
15
15
  {%- include date_range.html info=segment_data -%}
16
16
  </div>
17
17
 
18
- <div class="middle-align">
18
+ <div class="middle-align lesson-group">
19
19
  {%- for item in segment_data.items -%}
20
20
  {%- assign _info = site.data.sessions[item] -%}
21
21
  {%- if _info.sequence -%}
22
22
  {%- assign _mso = '' -%}
23
23
  {%- else -%}
24
- {%- assign _mso = 'material-symbols-outlined' -%}
24
+ {%- assign _mso = symbols | append: " icon" -%}
25
25
  {%- endif -%}
26
26
 
27
27
  {%- if item == session_id -%}
@@ -14,7 +14,7 @@
14
14
  {%- if _p %}
15
15
  <div class="{{ align }}">
16
16
  <span>{{ indicator }}</span>
17
- <span class="material-symbols-outlined">navigate_{{ arrow }}</span>
17
+ <span class="{{ symbols }}">navigate_{{ arrow }}</span>
18
18
  </div>
19
19
  <a href="/session/{{ _p.url }}">
20
20
  {%- if _p.header -%}
@@ -0,0 +1,6 @@
1
+ {% for audio in include.audio %}
2
+ <div class='essential_audio' data-url='{{ audio }}'></div>
3
+
4
+ {%- assign _size = include.audio | size %}
5
+ {% if forloop.index != _size %}<br /><br />{% endif -%}
6
+ {% endfor %}
@@ -17,6 +17,7 @@
17
17
  {%- include session/images.html images=session_data.images -%}
18
18
  {%- include session/points.html -%}
19
19
  {%- include session/videos.html videos=session_data.videos -%}
20
+ {%- include session/sounds.html audio=session_data.audio -%}
20
21
  {{ content }}
21
22
  {%- if page.dialogue -%}
22
23
  {%- include session/conversation.html data=page.dialogue-%}
@@ -28,5 +29,6 @@
28
29
  {%- include session/content_revealer.html -%}
29
30
  {%- include footer.html -%}
30
31
  {%- include foot/mathjax.html -%}
32
+ <script async src="/assets/js/essential-audio-player.js"></script>
31
33
  </body>
32
34
  </html>
data/_sass/_base.scss CHANGED
@@ -1,35 +1,39 @@
1
+ @use "default";
2
+
1
3
  :root {
2
- --icon-logo: #{$icon-logo};
3
-
4
- --font-special: #{$font-special};
5
- --font-mono: #{$font-mono};
6
- --font-main: #{$font-main};
7
- --font-secondary: #{$font-secondary};
8
- --font-tertiary: #{$font-tertiary};
9
- --font-samp: #{$font-samp};
10
-
11
- --color-bg: #{$color-bg};
12
- --color-fg: #{$color-fg};
13
- --color-primary: #{$color-primary};
14
- --color-secondary: #{$color-secondary};
15
- --color-tertiary: #{$color-tertiary};
16
- --color-link: #{$color-link};
17
- --color-dark: #{$color-dark};
18
- --color-theme: #{$color-theme};
19
- --color-bullet: #{$color-bullet};
20
- --color-row-odd: #{$color-row-odd};
21
- --color-row-even: #{$color-row-even};
22
-
23
- --color-card-fg: #{$color-card-fg};
24
- --color-card-bg: #{$color-card-bg};
25
- --color-code-bg: #{$color-code-bg};
26
-
27
- --content-width: #{$content-width};
28
-
29
- --grid-width: #{$grid-width};
30
- --grid-image-height: #{$grid-image-height};
31
- --card-font-size: #{$card-font-size};
32
- --samp-font-size: #{$samp-font-size};
4
+ --icon-logo: #{default.$icon-logo};
5
+ --icon-name: #{default.$icon-name};
6
+
7
+ --font-special: #{default.$font-special};
8
+ --font-mono: #{default.$font-mono};
9
+ --font-main: #{default.$font-main};
10
+ --font-secondary: #{default.$font-secondary};
11
+ --font-tertiary: #{default.$font-tertiary};
12
+ --font-samp: #{default.$font-samp};
13
+
14
+ --color-bg: #{default.$color-bg};
15
+ --color-fg: #{default.$color-fg};
16
+ --color-primary: #{default.$color-primary};
17
+ --color-secondary: #{default.$color-secondary};
18
+ --color-tertiary: #{default.$color-tertiary};
19
+ --color-link: #{default.$color-link};
20
+ --color-dark: #{default.$color-dark};
21
+ --color-theme: #{default.$color-theme};
22
+ --color-bullet: #{default.$color-bullet};
23
+ --color-row-odd: #{default.$color-row-odd};
24
+ --color-row-even: #{default.$color-row-even};
25
+
26
+ --color-card-fg: #{default.$color-card-fg};
27
+ --color-card-bg: #{default.$color-card-bg};
28
+ --color-code-bg: #{default.$color-code-bg};
29
+
30
+ --content-width: #{default.$content-width};
31
+
32
+ --grid-width: #{default.$grid-width};
33
+ --grid-image-height: #{default.$grid-image-height};
34
+ --grid-body-height: #{default.$grid-body-height};
35
+ --card-font-size: #{default.$card-font-size};
36
+ --samp-font-size: #{default.$samp-font-size};
33
37
  }
34
38
 
35
39
  body {
data/_sass/_default.scss CHANGED
@@ -1,4 +1,5 @@
1
1
  $icon-logo: url('/assets/logo-icon.svg');
2
+ $icon-name: 'Material Symbols Outlined';
2
3
 
3
4
  $font-main: 'Open Sans', sans-serif;
4
5
  $font-mono: 'Share Tech Mono', monospace;
@@ -31,3 +32,4 @@ $content-width: 600px;
31
32
 
32
33
  $grid-width: 180px;
33
34
  $grid-image-height: 180px;
35
+ $grid-body-height: initial;
@@ -0,0 +1,177 @@
1
+ /****************************************/
2
+ /* */
3
+ /* Section 1: The Looks */
4
+ /* */
5
+ /****************************************/
6
+
7
+
8
+ /* 1. The Main Container */
9
+ div.essential_audio {
10
+ position: relative;
11
+ z-index: 0;
12
+ width: 100%;
13
+ }
14
+
15
+
16
+ /* 2. The Player Button – General */
17
+ div.essential_audio > div:nth-child(1) div {
18
+ width: 28px;
19
+ height: 28px;
20
+ margin-top: -13px;
21
+ border-radius: 14px;
22
+ color: var(--color-fg);
23
+ background-color: var(--color-link);
24
+ }
25
+ div.essential_audio > div:nth-child(1) div:after {
26
+ position: absolute;
27
+ top: 2px;
28
+ left: 2px;
29
+ width: 24px;
30
+ height: 24px;
31
+ }
32
+ /* Set here how much the button exceeds the horizontal track limits: */
33
+ /* This must not be deleted! (but can be changed, of course) */
34
+ :root {
35
+ --button-protrusion: 4px;
36
+ }
37
+
38
+ /* 2.a) The Player Button – Off */
39
+ div.essential_audio > div:nth-child(1) div.off:after {
40
+ content: url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><polygon fill='%23FFF' points='10,6.9 10,23.1 24,15' /></svg>");
41
+ }
42
+
43
+ /* 2.b) The Player Button – Loading */
44
+ div.essential_audio > div:nth-child(1) div.load:after {
45
+ content: url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><circle opacity='0.64' fill='%23FFFFFF' cx='6.5' cy='18.5' r='2'/><circle opacity='0.76' fill='%23FFFFFF' cx='6.5' cy='11.5' r='2'/><circle opacity='0.88' fill='%23FFFFFF' cx='11.5' cy='6.5' r='2'/><circle fill='%23FFFFFF' cx='18.5' cy='6.5' r='2'/><circle opacity='0.16' fill='%23FFFFFF' cx='23.5' cy='11.5' r='2'/><circle opacity='0.28' fill='%23FFFFFF' cx='23.5' cy='18.5' r='2'/><circle opacity='0.4' fill='%23FFFFFF' cx='18.5' cy='23.4' r='2'/><circle opacity='0.52' fill='%23FFFFFF' cx='11.5' cy='23.4' r='2'/></svg>");
46
+ animation: audio_load_rotate 1s infinite linear;
47
+ }
48
+ @keyframes audio_load_rotate {
49
+ from { transform: rotate(0deg); }
50
+ to { transform: rotate(360deg); }
51
+ }
52
+
53
+ /* 2.c) The Player Button – Playing */
54
+ div.essential_audio > div:nth-child(1) div.play {
55
+ background-color: var(--color-link)!important;
56
+ }
57
+ div.essential_audio > div:nth-child(1) div.play:after {
58
+ content: url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><rect fill='%23FFF' x='17' y='8' width='3' height='14' /><rect fill='%23FFF' x='10' y='8' width='3' height='14' /></svg>");
59
+ }
60
+
61
+ /* 2.d) The Player Button – Dragging */
62
+ div.essential_audio > div:nth-child(1) div.drag {
63
+ transition: left 0s!important;
64
+ /*
65
+ cursor: grab!important;
66
+ */
67
+ }
68
+
69
+ /* 2.e) The Player Button – Error */
70
+ div.essential_audio > div:nth-child(1) div.error {
71
+ background-color: rgba(0,0,0,0.35)!important;
72
+ }
73
+ div.essential_audio > div:nth-child(1) div.error:after {
74
+ content: url("data:image/svg+xml; utf8, <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path fill='%23FFF' d='M13.9,18.6c0-0.3,0-0.5,0-0.9c0-1.6,0.6-2.9,2.1-3.9l1.1-0.8c0.9-0.6,1.3-1.5,1.3-2.4c0-1.5-1-2.8-3-2.8c-2.2,0-3.1,1.6-3.1,3.2c0,0.2,0,0.4,0,0.5L10,11.9c-0.1-0.3-0.1-0.8-0.1-1.2c0-2.3,1.7-5.1,5.5-5.1c3.5,0,5.5,2.5,5.5,5c0,2-1.1,3.4-2.5,4.3l-1.2,0.8c-0.8,0.5-1.1,1.4-1.1,2.4c0,0.1,0,0.2,0,0.5H13.9z'/><path fill='%23FFF' d='M15,20.8c1,0,1.8,0.8,1.8,1.8S16,24.4,15,24.4c-1,0-1.8-0.8-1.8-1.8S14,20.8,15,20.8z'/></svg>");
75
+ }
76
+
77
+
78
+ /* 3. The Track */
79
+ div.essential_audio > div:nth-child(2) {
80
+ height: 2px;
81
+ }
82
+ div.essential_audio > div:nth-child(2):after {
83
+ content: "";
84
+ position: absolute;
85
+ z-index: 0;
86
+ background-color: #000;
87
+ opacity: 0.3;
88
+ mix-blend-mode: multiply;
89
+ top: 0px;
90
+ left: 0px;
91
+ width: 100%;
92
+ height: 100%;
93
+ }
94
+
95
+
96
+ /* 4. The Loading Progress Bar */
97
+ div.essential_audio > div:nth-child(2) div {
98
+ background-color: var(--color-link);
99
+ mix-blend-mode: multiply;
100
+ }
101
+
102
+
103
+ /* 5. The Klick & Drag Sensor */
104
+ div.essential_audio > div:nth-child(3) {
105
+ height: 12px;
106
+ margin-top: -5px;
107
+ }
108
+
109
+
110
+
111
+
112
+ /****************************************/
113
+ /* */
114
+ /* Section 2: Core Values */
115
+ /* */
116
+ /****************************************/
117
+
118
+
119
+ /* 1. The Main Container + General Settings */
120
+ div.essential_audio,
121
+ div.essential_audio * {
122
+ user-select: none;
123
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
124
+ -webkit-overflow-scrolling: auto;
125
+ }
126
+ div.essential_audio *:focus {
127
+ outline: none;
128
+ }
129
+
130
+
131
+ /* 2. The Player Button */
132
+ div.essential_audio > div:nth-child(1) div {
133
+ position: absolute;
134
+ top: 0px;
135
+ left: 0px;
136
+ cursor: pointer;
137
+ }
138
+
139
+ /* 2.a) Container for Player Button */
140
+ div.essential_audio > div:nth-child(1) {
141
+ position: absolute;
142
+ z-index: 3;
143
+ height: 0px;
144
+ top: 0px;
145
+ left: calc(var(--button-protrusion) * -1);
146
+ width: calc(100% + (2 * var(--button-protrusion)));
147
+ }
148
+
149
+
150
+ /* 3. The Track */
151
+ div.essential_audio > div:nth-child(2) {
152
+ position: relative;
153
+ width: 100%;
154
+ overflow: hidden;
155
+ }
156
+
157
+
158
+ /* 4. The Loading Progress Bar */
159
+ div.essential_audio > div:nth-child(2) div {
160
+ position: absolute;
161
+ z-index: 1;
162
+ width: 0%;
163
+ height: 100%;
164
+ top: 0px;
165
+ left: 0px;
166
+ transition: width 0.5s;
167
+ }
168
+
169
+
170
+ /* 5. The Klick & Drag Sensor */
171
+ div.essential_audio > div:nth-child(3) {
172
+ position: absolute;
173
+ z-index: 2;
174
+ width: 100%;
175
+ top: 0px;
176
+ left: 0px;
177
+ }
data/_sass/_grid.scss CHANGED
@@ -1,3 +1,5 @@
1
+ @use "tab" as *;
2
+
1
3
  ul.grid {
2
4
  list-style-type: none;
3
5
  padding-inline-start: unset;
@@ -19,5 +21,3 @@ ul.grid {
19
21
  height: var(--grid-image-height);
20
22
  }
21
23
  }
22
-
23
- @import "tab";
data/_sass/_post.scss CHANGED
@@ -1,3 +1,10 @@
1
+ @use "bullets" as *;
2
+ @use "table" as *;
3
+ @use "tab-colors" as *;
4
+ @use "paginator" as *;
5
+ @use "video" as *;
6
+ @use "essential-audio" as *;
7
+
1
8
  @mixin boxed() {
2
9
  margin-top: 100px;
3
10
  border-radius: 5px;
@@ -179,13 +186,18 @@ samp {
179
186
  }
180
187
  }
181
188
 
189
+ .lesson-group {
190
+ flex-wrap: wrap;
191
+ justify-content: center;
192
+ }
193
+
182
194
  .lesson-number {
183
195
  display: flex;
184
196
  align-items: center;
185
197
  justify-content: center;
186
198
  text-decoration: none;
187
199
  padding: 7px 5px 3px 5px;
188
- margin: 0 5px;
200
+ margin: 5px;
189
201
  background-color: var(--color-fg);
190
202
  font-family: var(--fontText);
191
203
  color: var(--color-bg);
@@ -197,10 +209,10 @@ samp {
197
209
  &.current {
198
210
  background-color: var(--color-secondary);
199
211
  }
200
- &.material-symbols-outlined {
212
+ &.icon {
201
213
  font-size: 25px;
202
214
  padding: 5px;
203
- font-family: 'Material Symbols Outlined';
215
+ font-family: var(--icon-name);
204
216
  }
205
217
  }
206
218
 
@@ -208,10 +220,3 @@ a.lesson-number{
208
220
  color: var(--color-fg);
209
221
  background-color: var(--color-link);
210
222
  }
211
-
212
- @import
213
- "bullets",
214
- "table",
215
- "tab-colors",
216
- "paginator",
217
- "video";
data/_sass/_tab.scss CHANGED
@@ -1,3 +1,5 @@
1
+ @use "tab-colors" as *;
2
+
1
3
  @mixin special() {
2
4
  color: var(--color-card-bg, 'whitesmoke');
3
5
  font-family: var(--font-special);
@@ -41,8 +43,8 @@
41
43
  display: block;
42
44
  font-size: 12px;
43
45
  }
44
- &.material-symbols-outlined {
45
- font-family: 'Material Symbols Outlined';
46
+ &.icon {
47
+ font-family: var(--icon-name);
46
48
  line-height: 0.7;
47
49
  font-size: 37px;
48
50
  }
@@ -69,6 +71,34 @@
69
71
  padding: 10px;
70
72
  overflow: hidden;
71
73
  text-align: left;
74
+ &.limit-height {
75
+ max-height: var(--grid-body-height);
76
+ position: relative;
77
+ overflow-y: auto;
78
+ padding-bottom: 0;
79
+ box-sizing: border-box;
80
+ &::after {
81
+ content: "";
82
+ position: sticky;
83
+ display: block;
84
+ bottom: 0;
85
+ left: 0;
86
+ right: 0;
87
+ height: 30px;
88
+ opacity: 0;
89
+ padding: 0;
90
+ margin: 0;
91
+ background: linear-gradient(to top,
92
+ rgba(0, 0, 0, 0.12) 0%,
93
+ transparent 100%);
94
+ pointer-events: none; /* clicks pass through */
95
+ transition: opacity 0.4s ease;
96
+ z-index: 1;
97
+ }
98
+ &.has-more::after {
99
+ opacity: 1;
100
+ }
101
+ }
72
102
  h2 {
73
103
  word-break: break-word;
74
104
  margin-top: 10px;
@@ -78,10 +108,14 @@
78
108
  color: inherit;
79
109
  margin: 5px 0;
80
110
  }
81
- .item:not(:first-child) {
82
- border-top: 1px solid;
83
- }
84
111
  .item {
112
+ &:not(:first-child) {
113
+ border-top: 1px solid;
114
+ }
115
+ &:last-child {
116
+ margin-bottom: 0;
117
+ padding-bottom: 0;
118
+ }
85
119
  margin-bottom: 20px;
86
120
  text-align: left;
87
121
  font-size: var(--card-font-size);
@@ -96,7 +130,7 @@
96
130
  border-radius: 5px;
97
131
  margin: 0 3px;
98
132
  padding: 2px 5px;
99
- .material-symbols-outlined {
133
+ .icon {
100
134
  font-size: 1.3em;
101
135
  font-variation-settings: 'FILL' 1;
102
136
  }
@@ -128,7 +162,7 @@
128
162
  padding: 5px 10px;
129
163
  color: white!important;
130
164
  background-color: var(--color-card-fg);
131
- .material-symbols-outlined {
165
+ .rocket {
132
166
  font-variation-settings: 'FILL' 1;
133
167
  }
134
168
  }
@@ -141,4 +175,3 @@
141
175
  }
142
176
  }
143
177
 
144
- @import "tab-colors";
data/_sass/init.scss CHANGED
@@ -4,3 +4,7 @@
4
4
  // Example, to overwrite default bg/fg colors specified in the file above:
5
5
  // $color-bg: black;
6
6
  // $color-fg: white;
7
+
8
+
9
+ // Make grid boxes the same height (scrollable)
10
+ // $grid-body-height: 300px;
Binary file
@@ -1,3 +1,7 @@
1
1
  ---
2
2
  ---
3
- @import "post", "bubbles", "default", "init", "base";
3
+
4
+ @use "base" as *;
5
+ @use "post" as *;
6
+ @use "bubbles" as *;
7
+ @use "init" as *;
@@ -1,3 +1,5 @@
1
1
  ---
2
2
  ---
3
- @import "grid", "default", "init", "base";
3
+ @use "base" as *;
4
+ @use "grid" as *;
5
+ @use "init" as *;
@@ -1,3 +1,5 @@
1
1
  ---
2
2
  ---
3
- @import "post", "default", "init", "base";
3
+ @use "base" as *;
4
+ @use "post" as *;
5
+ @use "init" as *;
@@ -0,0 +1,10 @@
1
+ // Essential Audio Player v1.0.3
2
+ var Essential_Audio=(()=>{var t=true;var f=false;var n=null;var A={};var b=[];var c=f;var d=f;var h=0;const g=[["mp3","mpeg"],["ogg","ogg"],["wav","wav"],["aac","mpeg"],["m4a","mpeg"]];var j;var k;var l;var m=f;var o;var p;var q=50;var pa="div.essential_audio";var pb="div:nth-child(1)";var pf="mousemove";var pg="touchmove";var ph="mouseup";var pj="touchend";var pk="";var pl=(a)=>{return a.duration};var pm=(a)=>{return a.currentTime};var pn=(a)=>{return a.buffered};var po=()=>{if(event.changedTouches){l=event.changedTouches[0].pageX}else{l=event.pageX}return l};if(document.readyState!="loading"){B()}else{document.addEventListener("DOMContentLoaded",B)};function B(){var ia=document.querySelectorAll(pa);ia.forEach((vr,ib)=>{vr.innerHTML="<div><div class=\"off\"><!----></div></div><div><div><!----></div></div><div><!----></div>";var
3
+ ic;if(vr.hasAttribute("id")){ic=vr.getAttribute("id")}else{ic=ib+1;vr.setAttribute("id",ic)}A[ic]=document.createElement("audio");var a=A[ic];a.id=ic;a.za=vr.querySelector(pb).querySelector("div");a.zb=a.za.offsetWidth;a.zc=vr.querySelector(pb).offsetWidth-a.zb;if(a.zc<0){a.zc=0}a.zd=vr.getAttribute("data-url");a.ze=0;a.zf=0;a.zh=0;a.zi=0;a.zj=f;a.zks=0;a.zl=f;a.zm=f;a.zn=f;a.zo=f;a.zp=f;a.zq=f;b[ib]=ic;a.crossOrigin="anonymous";a.preload="metadata";if(vr.hasAttribute("data-loop")){a.loop=t}if(vr.hasAttribute("data-scratch")){a.zr=t}else{a.zr=f}if(vr.hasAttribute("data-autoplay")){if(h<1){h=1;a.autoplay=t;a.preload="auto";c=a;E(a)}}if(vr.hasAttribute("data-preload")){if(!a.autoplay){a.preload="auto";E(a)}}a.za.onmousedown=(e)=>{e.stopPropagation();e.preventDefault();Ba(a)};a.za.ontouchstart=(e)=>{e.stopPropagation();e.preventDefault();Ba(a)};var
4
+ ie=vr.querySelector("div:nth-child(3)");ie.onmousedown=(e)=>{e.stopPropagation();e.preventDefault();Bb(a)};ie.ontouchstart=(e)=>{e.stopPropagation();e.preventDefault();Bb(a)}})};function Ba(a){a.zp=t;j=po();k=j-(a.za.getBoundingClientRect().left+window.scrollX);window.addEventListener(pf,Bc);var va=setTimeout(function(){window.addEventListener(pg,Bc)},100);function Bc(){if(j!=po()){m=t;if(a.zc>0){a.za.classList.add("drag")}}if(m&&(a.zc>0)){o=po()-(a.za.parentNode.getBoundingClientRect().left+window.scrollX)-k;a.zh=Math.min(Math.max(o,0),a.zc);a.za.style.left=a.zh+"px";if(a.zr&&a.zn){V(a);if(a.paused&&(pm(a)!=pl(a))){a.play()}}}};window.addEventListener(ph,Bd);window.addEventListener(pj,Bd);function
5
+ Bd(){window.removeEventListener(pf,Bc);window.removeEventListener(pg,Bc);clearTimeout(va);window.removeEventListener(ph,Bd);window.removeEventListener(pj,Bd);if(m){if(pl(a)&&(a.zc>0)){if(!a.zr||!a.zn){V(a)}if(a.zn&&a.paused&&(pm(a)!=pl(a))){a.play()}}m=f;a.za.classList.remove("drag")}else{if(c.id&&(c.id==a.id)&&a.zn){P(a)}if(!a.zl){C(a)}}a.zp=f}};function Bb(a){if(a.zc>0){a.zp=t;j=po();k=Math.floor(a.zb/2);window.addEventListener(pf,Be);window.addEventListener(pg,Be);function Be(){m=t;a.za.classList.add("drag");o=po()-a.za.parentNode.getBoundingClientRect().left-k;a.zh=Math.min(Math.max(o,0),a.zc);a.za.style.left=a.zh+"px";if(a.zr&&a.zn){V(a);if(a.paused&&(pm(a)!=pl(a))){a.play()}}};window.addEventListener(ph,Bf);window.addEventListener(pj,Bf);function
6
+ Bf(){window.removeEventListener(pf,Be);window.removeEventListener(pg,Be);window.removeEventListener(ph,Bf);window.removeEventListener(pj,Bf);if(m){if(pl(a)){if(!a.zr||a.zn){V(a)}if(a.zn&&a.paused&&(pm(a)!=pl(a))){a.play()}}m=f;a.za.classList.remove("drag")}else{p=po()-a.za.parentNode.getBoundingClientRect().left-k;a.zh=Math.min(Math.max(p,0),a.zc);a.za.style.left=a.zh+"px";if(pl(a)){V(a);if(a.zn){a.play()}}}a.zp=f}}};function C(a){if(c){if(a.id==c.id){R();return}else{ R()}}c=a;if(pl(a)){O(a)}else{if(!a.zj){a.play();a.pause();E(a)}}};function D(a,vq){a.za.setAttribute("class","");a.za.classList.add(vq)};function
7
+ E(a){D(a,"load");a.zj=t;a.zm=t;a.onplay=()=>{if(!a.zm){clearTimeout(a.td);D(a,"play")}if(a.id==d.id){c=a;d=f;a.zn=t;if(a.zc>0){a.tc=setInterval(Q,q,a)}}};a.onplaying=()=>{clearTimeout(a.td);D(a,"play")};a.onwaiting=()=>{a.td=setTimeout(()=>{D(a,"load")},50)};a.onpause=()=>{if(!a.zm&&!a.zp&&!a.ended){D(a,"off")}if(a.zn&&!a.zm&&!a.ended){R()}};a.onended=()=>{if(a.zc==0&&!a.loop){R(0)}};a.onseeking=()=>{if(a.id==d.id){P(a)}};a.onseeked=()=>{if(a.id==d.id){P(a)}};a.onloadedmetadata=()=>{a.onloadedmetadata=n;J(a)};a.onprogress=()=>{a.onprogress=n;a.ta=setInterval(U,500,a);a.zq=t};var vc=a.zd.substr(a.zd.length-4,a.zd.length);vc=vc.toLowerCase();var vd=f;for(var i=0;i<g.length;i++){if(vc=="."+g[i][0]){var ve=a.zd+pk;F(a,ve,i);vd=t;break}}if(!vd){g.forEach((vr,i)=>{var ve=a.zd+"."+vr[0]+pk;F(a,ve,i)})}};function F(a,ve,vf){var vg=new
8
+ XMLHttpRequest;vg.onreadystatechange=()=>{if(vg.readyState==2){vg.onreadystatechange=n;G(vg,a,ve,vf)}};vg.onerror=()=>{G(vg,a,ve,vf)};vg.open("HEAD",ve);vg.send()};function G(vg,a,ve,vf){if(vg.status==200){a.ze+=1;a.innerHTML+="<source id=\""+g[vf][0]+"\" src=\""+ve+"\" type=\"audio/"+g[vf][1]+"\" crossorigin=\"anonymous\">"}else{a.zf+=1;if((g.length-a.zf)==0){H(a)}}vg.onerror=n};function H(a){a.zj=f;a.zo=f;a.zn=f;a.zl=t;D(a,"error");if(a.id==c.id){c=f}};function J(a){if(a.preload=="auto"){if(/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream){a.preload="metadata"}var vi=a.play();if(vi!==undefined){vi.then(()=>{if(a.autoplay){M(a)}else{K(a)}}).catch(error=>{K(a)})}}else{if(a.readyState>2){M(a)}else{V(a);if(a.zh==a.zc){T(a)}a.tb=setInterval(L,250,a)}}};function K(a){a.pause();D(a,"off");a.currentTime=0;a.zh=0;a.zm=f;if(a.autoplay&&c){if(a.id==c.id){d=c;c=f}}};function L(a){V(a);var vj=0;for(var
9
+ i=0;i<pn(a).length;i++){if(pn(a).start(pn(a).length-1-i)<=pm(a)){vj=pn(a).end(pn(a).length-1-i);break}}if(vj>=pm(a)){clearInterval(a.tb);M(a)}};function M(a){a.zj=f;a.zm=f;if(!a.zn){if(!a.zo){O(a)}}else{R(a)}};function O(a){if(pm(a)==pl(a)){T(a)}V(a);d=f;a.zn=t;if(a.zc>0){a.tc=setInterval(Q,q,a)}a.play();var vs=setTimeout(function(){if(a.zn&&a.paused){R()}clearTimeout(vs)},25);D(a,"play")};function N(vr){if(!vr){if(d){vr=d.id}else{vr=b[0]}}var a=A[vr];if(!a.zn){C(a)}};function Q(a){if(!a.zp){P(a);if(pm(a)==pl(a)){if(a.loop){T(a)}else{R(0)}}}};function P(a){a.zh=Math.round(pm(a)*a.zc/pl(a));a.za.style.left=a.zh+"px"};function R(vp){if(c){clearInterval(c["tc"]);c.zo=t;c.zn=f;c.pause();D(c,"off");if(vp==0){T(c)}else{c.zh=c.za.offsetLeft}if(!c.zm){d=c}c=f}};function T(a){if(pl(a)){a.currentTime=0}a.zh=0;a.za.style.left=0+"px"};function S(vr){if(!vr){if(d){vr=d.id}else{vr=b[0]}}var a=A[vr];T(a)};function U(a){if(pl(a)){if(a.zc==0){var vk=0}else{var vk=Math.round(a.zh/a.zc*pl(a)*100)/100}var
10
+ vl=0;for(var i=0;i<pn(a).length;i++){if(pn(a).start(pn(a).length-1-i)<=vk){vl=pn(a).end(pn(a).length-1-i);break}}a.zi=Math.round(vl/pl(a)*100);a.za.parentNode.parentNode.querySelector("div:nth-child(2)").querySelector("div").style.width=a.zi+"%";if(a.zi==100){clearInterval(a.ta);a.zq=f}}};function V(a){if(a.zc>0){a.currentTime=a.zh/a.zc*pl(a)}};function W(){var vm=document.querySelectorAll(pa);vm.forEach((vr)=>{var vn=vr.getAttribute("id");var a=A[vn];if(a.zq){clearInterval(a.ta)}a.zb=a.za.offsetWidth;var vo=vr.querySelector(pb).offsetWidth-a.zb;if(vo<0){vo=0}if((a.za.offsetLeft>0)&&(vn!=c.id)){a.zh=Math.round(a.za.offsetLeft/a.zc*vo);a.za.style.left=a.zh+"px"}a.zc=vo;if(pl(a)&&!a.zn){V(a)}if(a.zq){a.ta=setInterval(U,500,a)}})};window.addEventListener("resize",W);return{init:B,Audio:A,Play:N,Stop:R,Reset:S,players:Xa,active:Xb,last:Xc};function Xa(){return b}function Xb(){if(c){return c.id}else{return f}}function Xc(){if(d){return d.id}else{return f}}})();
@@ -20,7 +20,12 @@
20
20
  {
21
21
  "name": "{{ sc.name }}",
22
22
  "url": "{{ sc.url }}",
23
- "description": "{{ sc.desc }}"
23
+ "description": "{{ sc.desc }}",
24
+ "icons": [{
25
+ "src": "/assets/logo-96.png",
26
+ "type": "image/png",
27
+ "sizes": "96x96"
28
+ }]
24
29
  }{%- if forloop.index != forloop.length %},{%- endif %}
25
30
  {%- endfor %}
26
31
  ],
@@ -39,6 +44,12 @@
39
44
  "type": "image/png",
40
45
  "sizes": "300x300"
41
46
  },
47
+ {
48
+ "src": "logo-512.png",
49
+ "type": "image/png",
50
+ "sizes": "312x312",
51
+ "purpose": "any"
52
+ },
42
53
  {
43
54
  "src": "logo-icon.svg",
44
55
  "type": "image/svg+xml",
@@ -48,6 +59,7 @@
48
59
  ],
49
60
  "display_override": [
50
61
  "standalone",
51
- "fullscreen"
62
+ "fullscreen",
63
+ "window-controls-overlay"
52
64
  ]
53
65
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: askclass-course-theme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.5
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AskClass
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-31 00:00:00.000000000 Z
11
+ date: 2026-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.2'
27
- description:
27
+ description:
28
28
  email:
29
29
  - team@askclass.com
30
30
  executables: []
@@ -47,6 +47,7 @@ files:
47
47
  - _includes/segment/header.html
48
48
  - _includes/segment/index.html
49
49
  - _includes/segment/nav.html
50
+ - _includes/session/audio.html
50
51
  - _includes/session/bubble.html
51
52
  - _includes/session/content_revealer.html
52
53
  - _includes/session/conversation.html
@@ -58,6 +59,7 @@ files:
58
59
  - _includes/session/paginator.html
59
60
  - _includes/session/points.html
60
61
  - _includes/session/say.html
62
+ - _includes/session/sounds.html
61
63
  - _includes/session/videos.html
62
64
  - _includes/session/youtube.html
63
65
  - _layouts/default.html
@@ -67,6 +69,7 @@ files:
67
69
  - _sass/_bubbles.scss
68
70
  - _sass/_bullets.scss
69
71
  - _sass/_default.scss
72
+ - _sass/_essential-audio.scss
70
73
  - _sass/_grid.scss
71
74
  - _sass/_paginator.scss
72
75
  - _sass/_post.scss
@@ -75,10 +78,12 @@ files:
75
78
  - _sass/_table.scss
76
79
  - _sass/_video.scss
77
80
  - _sass/init.scss
81
+ - assets/audio/appreciation.mp3
78
82
  - assets/css/dialog.scss
79
83
  - assets/css/segment.scss
80
84
  - assets/css/session.scss
81
85
  - assets/favicon.ico
86
+ - assets/js/essential-audio-player.js
82
87
  - assets/loading.svg
83
88
  - assets/logo-144.png
84
89
  - assets/logo-192.png
@@ -99,7 +104,7 @@ homepage: https://acc.askclass.com
99
104
  licenses:
100
105
  - MPL-2.0
101
106
  metadata: {}
102
- post_install_message:
107
+ post_install_message:
103
108
  rdoc_options: []
104
109
  require_paths:
105
110
  - lib
@@ -114,8 +119,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
119
  - !ruby/object:Gem::Version
115
120
  version: '0'
116
121
  requirements: []
117
- rubygems_version: 3.3.7
118
- signing_key:
122
+ rubygems_version: 3.4.19
123
+ signing_key:
119
124
  specification_version: 4
120
125
  summary: Responsive Jekyll theme for putting analog class syllabus online.
121
126
  test_files: []