tessellate 0.1.14 → 0.1.16

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: 1aa1c754a9c03841f88f7d795dab590f57dbc0b8b665dc20d824a798ac8234ad
4
- data.tar.gz: d6cf02a3bc7282fd7ea79ff1adbd46bd2f0ad30af7dbe4d07825fd3b68225954
3
+ metadata.gz: c584471879fb80a752c142efd0922ef37d3e6d1d5ff80b985d394d0b0ba8e48f
4
+ data.tar.gz: 1f53ab4d246e3f19b587666a72a4ac7ffda76a560b1adb8b0f3369c924853470
5
5
  SHA512:
6
- metadata.gz: b0ec6cc2f6c0aa91d4a36e5e62a68d6039203cbd70c7a9468788bead233f6266c54ac5ee04a654d27e481210e6e5febfdcbcf92b048fe3d2abad750c6299e160
7
- data.tar.gz: 944f759f26dddc4044d039dd3faee7b058743bb3cc8d268c594677e32912433023f28f04e341cf9aaf48501def0a48a2554f401b06330f8f23285fbacb0943ab
6
+ metadata.gz: 8f18c09bc67316a38f2424698a0fb588d4626257363fe21fe7ae1e46a27d26a853fdbc6e577aa0ce7a9f2142dfcccedb4be61e7fe97cb730adb1c55c7d1077c3
7
+ data.tar.gz: ad9da738830a6bb677231f642c8b8c7edcfe95001bd0a5656c81aa3fb10d72fc83de6a4ed288fda09a34bdc0e416e86d280ce08b05360ba4f0531352f22fe33c
data/_config.yml CHANGED
@@ -22,6 +22,8 @@ socials:
22
22
 
23
23
  copyright: '© 2025. All rights reserved.'
24
24
 
25
+ ga: G-XXXXXXXXXX # Your Google Analytics tracking ID
26
+
25
27
 
26
28
  # These attributes are required for theme highlighting, only overwrite if you
27
29
  # know what you're doing.
@@ -1,3 +1,4 @@
1
+ {% comment %}
1
2
  <div class="row navbar">
2
3
  {% assign navigation_left = site.data.navigation | where: "side", "left" %}
3
4
  {% assign navigation_right = site.data.navigation | where: "side", "right" %}
@@ -40,4 +41,68 @@
40
41
  </div>
41
42
  {% endfor %}
42
43
  </div>
44
+ {% endcomment %}
45
+
46
+ <!-- Jekyll Navigation Implementation -->
47
+ <nav class="navbar">
48
+ <!--
49
+ <a href="#" class="logo"><i class="fas fa-cube"></i> JekyllSite</a>
50
+ -->
51
+
52
+ <button class="mobile-toggle" id="mobileToggle">
53
+ <i class="fas fa-bars"></i>
54
+ </button>
55
+
56
+ <div class="nav-items" id="navItems">
57
+ <!-- Left navigation items -->
58
+ <div class="nav-left">
59
+ {% assign navigation_left = site.data.navigation | where: "side", "left" %}
60
+ {% for item in navigation_left %}
61
+ <div class="nav-item">
62
+ <a href="{{ item.url }}" class="btn btn-primary btn-block">
63
+ <i class="{{ item.icon }}"></i> {{ item.title }}
64
+ </a>
65
+ {% if item.dropdown %}
66
+ <div class="dropdown">
67
+ {% for dropdown_item in item.dropdown %}
68
+ <a href="{{ dropdown_item.url }}" class="btn btn-primary btn-block">
69
+ {% if dropdown_item.icon %}
70
+ <i class="{{ dropdown_item.icon }}"></i>
71
+ &nbsp;
72
+ {% endif %}
73
+ {{ dropdown_item.title }}
74
+ </a>
75
+ {% endfor %}
76
+ </div>
77
+ {% endif %}
78
+ </div>
79
+ {% endfor %}
80
+ </div>
81
+
82
+ <!-- Right navigation items -->
83
+ <div class="nav-right">
84
+ {% assign navigation_right = site.data.navigation | where: "side", "right" %}
85
+ {% for item in navigation_right %}
86
+ <div class="nav-item {% if forloop.first %}first-right{% endif %}">
87
+ <a href="{{ item.url }}" class="btn btn-primary btn-block">
88
+ <i class="{{ item.icon }}"></i> {{ item.title }}
89
+ </a>
90
+ {% if item.dropdown %}
91
+ <div class="dropdown">
92
+ {% for dropdown_item in item.dropdown %}
93
+ <a href="{{ dropdown_item.url }}" class="btn btn-primary btn-block">
94
+ {% if dropdown_item.icon %}
95
+ <i class="{{ dropdown_item.icon }}"></i>
96
+ &nbsp;
97
+ {% endif %}
98
+ {{ dropdown_item.title }}
99
+ </a>
100
+ {% endfor %}
101
+ </div>
102
+ {% endif %}
103
+ </div>
104
+ {% endfor %}
105
+ </div>
106
+ </div>
107
+ </nav>
43
108
 
data/_layouts/page.html CHANGED
@@ -7,6 +7,13 @@
7
7
  -->
8
8
  <html>
9
9
  <head>
10
+ <script async src="https://www.googletagmanager.com/gtag/js?id={{ site.ga }}"></script>
11
+ <script>
12
+ window.dataLayer = window.dataLayer || [];
13
+ function gtag(){dataLayer.push(arguments);}
14
+ gtag('js', new Date());
15
+ gtag('config', '{{ site.ga }}');
16
+ </script>
10
17
  <title>{{ title }}</title>
11
18
  <meta charset="utf-8" />
12
19
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
@@ -43,6 +50,7 @@
43
50
  <script src="/assets/js/breakpoints.min.js"></script>
44
51
  <script src="/assets/js/util.js"></script>
45
52
  <script src="/assets/js/main.js"></script>
53
+ <script src="/assets/js/navigation.js"></script>
46
54
  {% if page.extra-scripts %}
47
55
  <!-- Extra (per-page) Scripts -->
48
56
  {% endif %}
@@ -12,10 +12,7 @@
12
12
  </div>
13
13
  </header>
14
14
  {% endif %}
15
- {% assign style = style3 %}
16
- {% if page.style %}
17
- {% assign style = page.style %}
18
- {% endif %}
15
+ {% assign style = page.style | default: 'style1' %}
19
16
  <div class="content dark {{ style }}">
20
17
  <div class="container">
21
18
  {% if page.image %}
@@ -12,10 +12,7 @@
12
12
  </div>
13
13
  </header>
14
14
  {% endif %}
15
- {% assign style = style1 %}
16
- {% if page.style %}
17
- {% assign style = page.style %}
18
- {% endif %}
15
+ {% assign style = page.style | default: 'style1' %}
19
16
  <div class="content dark {{ style }} featured">
20
17
  {% assign content_split = page.content | markdown_split %}
21
18
  <div class="container">
@@ -12,10 +12,7 @@
12
12
  </div>
13
13
  </header>
14
14
  {% endif %}
15
- {% assign style = style3 %}
16
- {% if page.style %}
17
- {% assign style = page.style %}
18
- {% endif %}
15
+ {% assign style = page.style | default: 'style3' %}
19
16
  <div class="content dark {{ style }}">
20
17
  <div class="container">
21
18
  {% if page.image %}
@@ -12,10 +12,7 @@
12
12
  </div>
13
13
  </header>
14
14
  {% endif %}
15
- {% assign style = style2 %}
16
- {% if page.style %}
17
- {% assign style = page.style %}
18
- {% endif %}
15
+ {% assign style = page.style | default: 'style2' %}
19
16
  <div class="content dark {{ style }}">
20
17
  <div class="container">
21
18
  <div class="row">
@@ -0,0 +1,224 @@
1
+ @use 'sass:color';
2
+
3
+ /* Color functions for setting text color based on background */
4
+ @function set-text-color($color) {
5
+ @if (color.channel($color, "lightness", $space: hsl) > 40) {
6
+ @return #000;
7
+ }
8
+ @else {
9
+ @return #fff;
10
+ }
11
+ }
12
+
13
+ /* Define overwritable variables */
14
+ $primary-color: #3498db;
15
+ $secondary-color: #ffee4f;
16
+ $primary-background: #ffffff;
17
+ $font-family: 'Arial', sans-serif;
18
+
19
+ /* Define text color in terms of the primary background */
20
+ $text-color: set-text-color($primary-background);
21
+ $primary-text-color: set-text-color($primary-color);
22
+ $secondary-text-color: set-text-color($secondary-color);
23
+
24
+ /* Navigation Styles */
25
+ .navbar {
26
+ display: flex;
27
+ justify-content: space-between;
28
+ align-items: center;
29
+ padding: 0 20px;
30
+ background-color: $primary-background;
31
+ position: relative;
32
+ z-index: 100;
33
+ height: 4em;
34
+ position: fixed;
35
+ top: 0;
36
+ }
37
+
38
+ .logo {
39
+ color: $primary-color;
40
+ font-size: 1.8rem;
41
+ font-weight: bold;
42
+ text-decoration: none;
43
+ padding: 15px 0;
44
+ display: flex;
45
+ align-items: center;
46
+ }
47
+
48
+ .logo i {
49
+ margin-right: 10px;
50
+ color: $primary-color;
51
+ }
52
+
53
+ .nav-items {
54
+ display: flex;
55
+ list-style: none;
56
+ width: 100%;
57
+ height: 100%;
58
+ }
59
+
60
+ .nav-item {
61
+ position: relative;
62
+ }
63
+
64
+ .nav-item > a {
65
+ display: block;
66
+ color: $text-color;
67
+ text-decoration: none;
68
+ padding: 10px 25px;
69
+ font-weight: 500;
70
+ transition: all 0.3s ease;
71
+ position: relative;
72
+ height: 100%;
73
+ vertical-align: middle;
74
+ line-height: 2.75em;
75
+ }
76
+
77
+ .nav-item > a:hover {
78
+ background-color: $primary-color;
79
+ }
80
+
81
+ .nav-item > a:hover::after {
82
+ content: '';
83
+ position: absolute;
84
+ bottom: 0;
85
+ left: 50%;
86
+ transform: translateX(-50%);
87
+ width: 70%;
88
+ height: 3px;
89
+ background-color: $secondary-color;
90
+ }
91
+
92
+ .dropdown {
93
+ position: absolute;
94
+ top: 100%;
95
+ left: 0;
96
+ background-color: $primary-background;
97
+ min-width: 220px;
98
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
99
+ border-radius: 0 0 8px 8px;
100
+ overflow: hidden;
101
+ display: none;
102
+ z-index: 1000;
103
+ transform: translateY(10px);
104
+ opacity: 0;
105
+ transition: all 0.4s ease;
106
+ }
107
+
108
+ .nav-item:hover .dropdown {
109
+ display: block;
110
+ transform: translateY(0);
111
+ opacity: 1;
112
+ }
113
+
114
+ .dropdown a {
115
+ display: block;
116
+ padding: 12px 20px;
117
+ color: $text-color;
118
+ text-decoration: none;
119
+ font-weight: 500;
120
+ border-bottom: 1px solid #f0f0f0;
121
+ transition: all 0.3s ease;
122
+ }
123
+
124
+ .dropdown a:hover {
125
+ background-color: $primary-color;
126
+ color: $primary-text-color;
127
+ padding-left: 25px;
128
+ }
129
+
130
+ .dropdown a i {
131
+ margin-right: 10px;
132
+ width: 20px;
133
+ text-align: center;
134
+ }
135
+
136
+ .nav-left, .nav-right {
137
+ display: flex;
138
+ }
139
+
140
+ .nav-right {
141
+ margin-left: auto;
142
+ }
143
+
144
+ .mobile-toggle {
145
+ display: none;
146
+ background: none;
147
+ border: none;
148
+ color: $text-color;
149
+ font-size: 1.8rem;
150
+ cursor: pointer;
151
+ padding: 15px;
152
+ &:hover {
153
+ background: none;
154
+ }
155
+ }
156
+
157
+ /* Mobile Navigation */
158
+ @media (max-width: 992px) {
159
+ .nav-items {
160
+ position: fixed;
161
+ top: 4em;
162
+ left: 0;
163
+ width: 100%;
164
+ background-color: $primary-background;
165
+ flex-direction: column;
166
+ align-items: stretch;
167
+ max-height: 0;
168
+ overflow: hidden;
169
+ transition: max-height 0.5s ease;
170
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
171
+ height: auto;
172
+ }
173
+
174
+ .nav-items.active {
175
+ max-height: 1000px;
176
+ }
177
+
178
+ .nav-item {
179
+ width: 100%;
180
+ }
181
+
182
+ .nav-item > a {
183
+ padding: 18px 10px;
184
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
185
+ }
186
+
187
+ .dropdown {
188
+ position: static;
189
+ width: 100%;
190
+ box-shadow: none;
191
+ border-radius: 0;
192
+ display: none;
193
+ transform: none;
194
+ opacity: 1;
195
+ max-height: 0;
196
+ transition: max-height 0.4s ease;
197
+ }
198
+
199
+ .dropdown.active {
200
+ display: block;
201
+ max-height: 1000px;
202
+ }
203
+
204
+ .dropdown a {
205
+ padding: 25px 30px;
206
+ background-color: $primary-color;
207
+ color: $primary-text-color;
208
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
209
+ }
210
+
211
+ .mobile-toggle {
212
+ display: block;
213
+ }
214
+
215
+ .nav-left, .nav-right {
216
+ flex-direction: column;
217
+ width: 100%;
218
+ }
219
+
220
+ .nav-right {
221
+ margin-left: 0;
222
+ }
223
+ }
224
+
@@ -4,6 +4,8 @@
4
4
  @use 'libs/breakpoints' as *;
5
5
  @use 'libs/html-grid' as *;
6
6
 
7
+ @use 'navigation';
8
+
7
9
  @import url("fontawesome-all.min.css");
8
10
  @import url("https://fonts.googleapis.com/css?family=Roboto:100,100italic,300,300italic,400,400italic");
9
11
 
@@ -95,6 +97,7 @@
95
97
  }
96
98
 
97
99
  /* Navigation Menu */
100
+ /*
98
101
  .row.navbar {
99
102
  margin: 0;
100
103
  }
@@ -152,6 +155,7 @@
152
155
  margin-right: 1em;
153
156
  }
154
157
  }
158
+ */
155
159
 
156
160
  /* Basic */
157
161
 
@@ -998,7 +1002,7 @@
998
1002
 
999
1003
  #header {
1000
1004
  position: relative;
1001
- margin: 0;
1005
+ margin: 4em 0 0 0;
1002
1006
  background-image: url('images/overlay.png'), url('../../images/header.jpg');
1003
1007
  background-size: auto, cover;
1004
1008
  background-position: top left, center center;
@@ -1181,12 +1185,12 @@
1181
1185
  /* Sections/Article */
1182
1186
 
1183
1187
  section, article {
1184
- margin: 0 0 2.5em 0 !important;
1188
+ margin: 0 0 2.5em 0;
1185
1189
  }
1186
1190
 
1187
1191
  .row > {
1188
1192
  section, article {
1189
- margin: 0 0 2.5em 0 !important;
1193
+ margin: 0 0 2.5em 0;
1190
1194
  }
1191
1195
  }
1192
1196
 
@@ -1202,7 +1206,7 @@
1202
1206
  /* Header */
1203
1207
 
1204
1208
  #header {
1205
- margin: 0 !important;
1209
+ margin: 4em 0 0 0;
1206
1210
  padding: 8em 2em 8em 2em;
1207
1211
 
1208
1212
  header p {
@@ -1217,7 +1221,7 @@
1217
1221
  /* Main Sections */
1218
1222
 
1219
1223
  .main {
1220
- margin: 0 !important;
1224
+ margin: 0;
1221
1225
 
1222
1226
  > header {
1223
1227
  padding: 3.5em 2em 3.5em 2em;
@@ -1239,7 +1243,7 @@
1239
1243
  padding: 3.5em 20px 3.5em 20px;
1240
1244
 
1241
1245
  > .container > :last-child {
1242
- margin-bottom: 0 !important;
1246
+ margin-bottom: 0;
1243
1247
  }
1244
1248
  }
1245
1249
  }
@@ -1247,7 +1251,7 @@
1247
1251
  /* Footer */
1248
1252
 
1249
1253
  #footer {
1250
- margin: 0 !important;
1254
+ margin: 0;
1251
1255
  padding: 3em 0 3em 0;
1252
1256
 
1253
1257
  .copyright {
@@ -1270,12 +1274,12 @@
1270
1274
  /* Sections/Article */
1271
1275
 
1272
1276
  section, article {
1273
- margin: 0 0 1.5em 0 !important;
1277
+ margin: 0 0 1.5em 0;
1274
1278
  }
1275
1279
 
1276
1280
  .row > {
1277
1281
  section, article {
1278
- margin: 0 0 1.5em 0 !important;
1282
+ margin: 0 0 1.5em 0;
1279
1283
  }
1280
1284
  }
1281
1285
 
@@ -0,0 +1,45 @@
1
+ // script.js
2
+ document.addEventListener('DOMContentLoaded', function() {
3
+ const mobileToggle = document.getElementById('mobileToggle');
4
+ const navItems = document.getElementById('navItems');
5
+ const navItemsList = document.querySelectorAll('.nav-item');
6
+
7
+ // Toggle mobile menu
8
+ mobileToggle.addEventListener('click', function() {
9
+ navItems.classList.toggle('active');
10
+ this.querySelector('i').classList.toggle('fa-bars');
11
+ this.querySelector('i').classList.toggle('fa-times');
12
+ });
13
+
14
+ // Handle dropdowns on mobile
15
+ navItemsList.forEach(item => {
16
+ const dropdown = item.querySelector('.dropdown');
17
+ const link = item.querySelector('a');
18
+
19
+ if (dropdown) {
20
+ link.addEventListener('click', function(e) {
21
+ // On mobile, prevent default and toggle dropdown
22
+ if (window.innerWidth <= 992) {
23
+ e.preventDefault();
24
+ dropdown.classList.toggle('active');
25
+ }
26
+ });
27
+ }
28
+ });
29
+
30
+ // Close mobile menu when clicking outside
31
+ document.addEventListener('click', function(e) {
32
+ if (window.innerWidth <= 992 && navItems.classList.contains('active') &&
33
+ !e.target.closest('.navbar') && !e.target.closest('#navItems')) {
34
+ navItems.classList.remove('active');
35
+ mobileToggle.querySelector('i').classList.add('fa-bars');
36
+ mobileToggle.querySelector('i').classList.remove('fa-times');
37
+
38
+ // Also close any open dropdowns
39
+ document.querySelectorAll('.dropdown').forEach(dd => {
40
+ dd.classList.remove('active');
41
+ });
42
+ }
43
+ });
44
+ });
45
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tessellate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.14
4
+ version: 0.1.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Preston Hager
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-06-05 00:00:00.000000000 Z
11
+ date: 2025-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -52,6 +52,7 @@ files:
52
52
  - _sass/libs/_mixins.scss
53
53
  - _sass/libs/_vars.scss
54
54
  - _sass/libs/_vendor.scss
55
+ - _sass/navigation.scss
55
56
  - _sass/tessellate.scss
56
57
  - assets/css/fontawesome-all.min.css
57
58
  - assets/css/images/arrow.svg
@@ -94,6 +95,7 @@ files:
94
95
  - assets/js/jquery.min.js
95
96
  - assets/js/jquery.scrolly.min.js
96
97
  - assets/js/main.js
98
+ - assets/js/navigation.js
97
99
  - assets/js/util.js
98
100
  - assets/webfonts/fa-brands-400.eot
99
101
  - assets/webfonts/fa-brands-400.svg