trmnl_preview 0.5.10 → 0.6.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 +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/trmnlp/app.rb +10 -1
- data/lib/trmnlp/context.rb +13 -5
- data/lib/trmnlp/version.rb +1 -1
- data/trmnl_preview.gemspec +1 -0
- data/web/public/index.css +60 -24
- data/web/public/index.js +19 -31
- data/web/public/trmnl-picker.js +656 -0
- data/web/views/index.erb +33 -17
- data/web/views/render_html.erb +3 -0
- metadata +17 -3
- data/web/public/trmnl-component.js +0 -782
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6604d364906853dcf54704af9027debbbe82c31e779808a2dc3e2d42f0ffa474
|
|
4
|
+
data.tar.gz: 15aab9631707afb53b78a92ce8a96301991fdc2f2dad22a90314754f191fa869
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e43e3e6fb60cd85e6f4cac273df9b8a4a3fe7ff9afa7a592e564af8364423e56236f4f8288b848e0ee21368838dcb57a044b388dc0cfa299eabec450557b802
|
|
7
|
+
data.tar.gz: 03aa20bb96d303d3f6c3e3fea96d84fde8982061b04cb33a5cd8fd3d933dcfae5e415479665c74a01a66e416715992999f337407d542dadeba9ca406d142db29
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
|
|
1
2
|
# Changelog
|
|
2
3
|
|
|
4
|
+
## 0.6.0
|
|
5
|
+
|
|
6
|
+
- Drop trmnl-component in lieu of plain iframe
|
|
7
|
+
- Add [trmnl-picker](https://github.com/usetrmnl/trmnl-picker) to support new TRMNL and BYOD screens
|
|
8
|
+
- Fix mashup layout previews
|
|
9
|
+
|
|
3
10
|
## 0.5.10
|
|
4
11
|
|
|
5
12
|
- Fix interpolation of multi-line polling URLs with custom fields
|
data/lib/trmnlp/app.rb
CHANGED
|
@@ -79,8 +79,17 @@ module TRMNLP
|
|
|
79
79
|
|
|
80
80
|
get "/render/#{view}.html" do
|
|
81
81
|
@view = view
|
|
82
|
-
@screen_classes = @context.screen_classes
|
|
82
|
+
@screen_classes = @context.screen_classes(params[:screen_classes])
|
|
83
83
|
|
|
84
|
+
case view
|
|
85
|
+
when 'half_horizontal'
|
|
86
|
+
@mashup_classes = 'mashup mashup--1Tx1B'
|
|
87
|
+
when 'half_vertical'
|
|
88
|
+
@mashup_classes = 'mashup mashup--1Lx1R'
|
|
89
|
+
when 'quadrant'
|
|
90
|
+
@mashup_classes = 'mashup mashup--2x2'
|
|
91
|
+
end
|
|
92
|
+
|
|
84
93
|
erb :render_html do
|
|
85
94
|
@context.render_template(view)
|
|
86
95
|
end
|
data/lib/trmnlp/context.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'active_support/time'
|
|
2
|
+
require 'active_support/core_ext/hash/conversions'
|
|
2
3
|
require 'erb'
|
|
3
4
|
require 'faraday'
|
|
4
5
|
require 'filewatcher'
|
|
@@ -86,7 +87,16 @@ module TRMNLP
|
|
|
86
87
|
|
|
87
88
|
puts "received #{response.body.length} bytes (#{response.status} status)"
|
|
88
89
|
if response.status == 200
|
|
89
|
-
|
|
90
|
+
content_type = response.headers['content-type'].split(';').first.strip if response.headers.include?('content-type')
|
|
91
|
+
case content_type
|
|
92
|
+
when 'application/json'
|
|
93
|
+
json = wrap_array(JSON.parse(response.body))
|
|
94
|
+
when 'text/xml', 'application/xml', 'application/rss+xml', 'application/atom+xml', 'application/soap+xml'
|
|
95
|
+
json = wrap_array(Hash.from_xml(response.body))
|
|
96
|
+
else
|
|
97
|
+
puts "unknown content type received: #{response.headers['content-type']}"
|
|
98
|
+
json = {}
|
|
99
|
+
end
|
|
90
100
|
else
|
|
91
101
|
json = {}
|
|
92
102
|
puts response.body
|
|
@@ -142,10 +152,8 @@ module TRMNLP
|
|
|
142
152
|
end)
|
|
143
153
|
end
|
|
144
154
|
|
|
145
|
-
def screen_classes
|
|
146
|
-
classes = 'screen'
|
|
155
|
+
def screen_classes(classes = 'screen')
|
|
147
156
|
classes << ' screen--no-bleed' if config.plugin.no_screen_padding == 'yes'
|
|
148
|
-
classes << ' dark-mode' if config.plugin.dark_mode == 'yes'
|
|
149
157
|
classes
|
|
150
158
|
end
|
|
151
159
|
|
|
@@ -218,4 +226,4 @@ module TRMNLP
|
|
|
218
226
|
paths.user_data.write(JSON.generate(data))
|
|
219
227
|
end
|
|
220
228
|
end
|
|
221
|
-
end
|
|
229
|
+
end
|
data/lib/trmnlp/version.rb
CHANGED
data/trmnl_preview.gemspec
CHANGED
|
@@ -60,6 +60,7 @@ Gem::Specification.new do |spec|
|
|
|
60
60
|
spec.add_dependency "oj", "~> 3.16.9"
|
|
61
61
|
spec.add_dependency "tzinfo-data", "~> 1.2025"
|
|
62
62
|
spec.add_dependency "pathname", "~> 0.4"
|
|
63
|
+
spec.add_dependency "rexml", "~> 3.4"
|
|
63
64
|
|
|
64
65
|
# For more information and examples about making a new gem, check out our
|
|
65
66
|
# guide at: https://bundler.io/guides/creating_gem.html
|
data/web/public/index.css
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
|
+
/* define var for bg color */
|
|
2
|
+
:root {
|
|
3
|
+
--bg-color: #eaebef;
|
|
4
|
+
--text-color: #000000;
|
|
5
|
+
--border-color: #c7cbd5;
|
|
6
|
+
}
|
|
7
|
+
|
|
1
8
|
body {
|
|
2
9
|
font-family: sans-serif;
|
|
3
10
|
margin: 10px;
|
|
4
|
-
background-color:
|
|
11
|
+
background-color: var(--bg-color);
|
|
12
|
+
color: var(--text-color);
|
|
5
13
|
}
|
|
6
14
|
|
|
7
15
|
main {
|
|
@@ -12,28 +20,63 @@ main {
|
|
|
12
20
|
|
|
13
21
|
menu {
|
|
14
22
|
padding: 0;
|
|
15
|
-
margin: 0;
|
|
23
|
+
margin: 0 0 1em 0;
|
|
16
24
|
display: flex;
|
|
17
25
|
justify-content: space-between;
|
|
18
26
|
max-width: 950px;
|
|
19
27
|
}
|
|
20
28
|
|
|
21
|
-
|
|
29
|
+
.tabs {
|
|
30
|
+
display: flex;
|
|
31
|
+
gap: 0.5em;
|
|
32
|
+
border-bottom: 1px solid var(--border-color);
|
|
33
|
+
margin-bottom: 1em;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.tabs > .tab {
|
|
37
|
+
padding: 0.5em 1em;
|
|
38
|
+
background: var(--bg-color);
|
|
39
|
+
border-radius: 0.5em 0.5em 0 0;
|
|
40
|
+
border: 1px solid var(--border-color);
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
display: inline-block;
|
|
43
|
+
text-decoration: none;
|
|
44
|
+
color: inherit;
|
|
45
|
+
font: inherit;
|
|
46
|
+
position: relative;
|
|
47
|
+
top: 1px;
|
|
48
|
+
transition: filter 0.1s ease-in-out;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.tabs > .tab:hover {
|
|
52
|
+
filter: brightness(95%);
|
|
53
|
+
}
|
|
54
|
+
.tabs > .tab.active {
|
|
55
|
+
border-bottom: none;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.btn {
|
|
59
|
+
appearance: none;
|
|
60
|
+
border: 1px solid var(--border-color);
|
|
61
|
+
background-color: var(--bg-color);
|
|
62
|
+
cursor: pointer;
|
|
22
63
|
padding: 0.5em 1em;
|
|
23
|
-
background: #c7cbd5;
|
|
24
64
|
border-radius: 0.5em;
|
|
25
65
|
display: inline-block;
|
|
26
66
|
text-decoration: none;
|
|
27
|
-
color:
|
|
67
|
+
color: inherit;
|
|
68
|
+
font: inherit;
|
|
69
|
+
transition: filter 0.1s ease-in-out;
|
|
28
70
|
}
|
|
29
71
|
|
|
30
|
-
|
|
31
|
-
|
|
72
|
+
.btn:hover {
|
|
73
|
+
filter: brightness(95%);
|
|
32
74
|
}
|
|
33
75
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
76
|
+
.btn:disabled, .btn:disabled:hover {
|
|
77
|
+
cursor: not-allowed;
|
|
78
|
+
filter: brightness(100%);
|
|
79
|
+
opacity: 0.5;
|
|
37
80
|
}
|
|
38
81
|
|
|
39
82
|
pre > code {
|
|
@@ -43,8 +86,9 @@ pre > code {
|
|
|
43
86
|
}
|
|
44
87
|
|
|
45
88
|
.spinner {
|
|
46
|
-
width:
|
|
47
|
-
height:
|
|
89
|
+
width: 16px;
|
|
90
|
+
height: 16px;
|
|
91
|
+
margin: 4px;
|
|
48
92
|
border: 5px solid #f3f3f3; /* Light gray */
|
|
49
93
|
border-top: 5px solid #3498db; /* Blue */
|
|
50
94
|
border-radius: 50%;
|
|
@@ -61,17 +105,9 @@ pre > code {
|
|
|
61
105
|
}
|
|
62
106
|
|
|
63
107
|
@media (prefers-color-scheme: dark) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
color: #
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
menu a {
|
|
70
|
-
background-color: #262932;
|
|
71
|
-
color: #b1b6c4;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
menu a:hover {
|
|
75
|
-
background-color: #2f333e;
|
|
108
|
+
:root {
|
|
109
|
+
--bg-color: #191b21;
|
|
110
|
+
--text-color: #eeeeee;
|
|
111
|
+
--border-color: #3a3e47;
|
|
76
112
|
}
|
|
77
113
|
}
|
data/web/public/index.js
CHANGED
|
@@ -11,8 +11,9 @@ trmnlp.connectLiveRender = function () {
|
|
|
11
11
|
const payload = JSON.parse(msg.data);
|
|
12
12
|
|
|
13
13
|
if (payload.type === "reload") {
|
|
14
|
-
trmnlp.
|
|
14
|
+
trmnlp.fetchPreview();
|
|
15
15
|
trmnlp.userData.textContent = JSON.stringify(payload.user_data, null, 2);
|
|
16
|
+
hljs.highlightAll();
|
|
16
17
|
}
|
|
17
18
|
};
|
|
18
19
|
|
|
@@ -22,28 +23,19 @@ trmnlp.connectLiveRender = function () {
|
|
|
22
23
|
};
|
|
23
24
|
};
|
|
24
25
|
|
|
25
|
-
trmnlp.setFrameColor = function () {
|
|
26
|
-
const value = trmnlp.caseSelect.value;
|
|
27
|
-
trmnlp.frame.setAttribute("color", value);
|
|
28
|
-
localStorage.setItem("trmnlp-case", value);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
trmnlp.setPreviewFormat = function () {
|
|
32
|
-
const value = trmnlp.formatSelect.value;
|
|
33
|
-
localStorage.setItem("trmnlp-format", value);
|
|
34
26
|
|
|
35
|
-
|
|
36
|
-
|
|
27
|
+
trmnlp.fetchPreview = function (pickerState) {
|
|
28
|
+
const screenClasses = (pickerState?.screenClasses || trmnlp.picker.state.screenClasses).join(" ");
|
|
29
|
+
const encodedScreenClasses = encodeURIComponent(screenClasses);
|
|
30
|
+
const src = `/render/${trmnlp.view}.${trmnlp.formatSelect.value}?screen_classes=${encodedScreenClasses}`;
|
|
37
31
|
|
|
38
|
-
trmnlp.setFrameSrc = function (src) {
|
|
39
32
|
trmnlp.spinner.style.display = "inline-block";
|
|
40
|
-
trmnlp.
|
|
33
|
+
trmnlp.iframe.src = src;
|
|
41
34
|
};
|
|
42
35
|
|
|
43
|
-
document.addEventListener("DOMContentLoaded", function () {
|
|
36
|
+
document.addEventListener("DOMContentLoaded", async function () {
|
|
44
37
|
trmnlp.view = document.querySelector("meta[name='trmnl-view']").content;
|
|
45
|
-
trmnlp.
|
|
46
|
-
trmnlp.caseSelect = document.querySelector(".select-case");
|
|
38
|
+
trmnlp.iframe = document.querySelector("iframe");
|
|
47
39
|
trmnlp.formatSelect = document.querySelector(".select-format");
|
|
48
40
|
trmnlp.userData = document.getElementById("user-data");
|
|
49
41
|
trmnlp.spinner = document.querySelector(".spinner");
|
|
@@ -54,28 +46,24 @@ document.addEventListener("DOMContentLoaded", function () {
|
|
|
54
46
|
trmnlp.connectLiveRender();
|
|
55
47
|
}
|
|
56
48
|
|
|
57
|
-
const caseValue = localStorage.getItem("trmnlp-case") || "black";
|
|
58
49
|
const formatValue = localStorage.getItem("trmnlp-format") || "html";
|
|
59
50
|
|
|
60
|
-
trmnlp.caseSelect.value = caseValue;
|
|
61
|
-
trmnlp.caseSelect.addEventListener("change", () => {
|
|
62
|
-
trmnlp.setFrameColor();
|
|
63
|
-
});
|
|
64
|
-
|
|
65
51
|
trmnlp.formatSelect.value = formatValue;
|
|
66
52
|
trmnlp.formatSelect.addEventListener("change", () => {
|
|
67
|
-
trmnlp.
|
|
53
|
+
localStorage.setItem("trmnlp-format", trmnlp.formatSelect.value);
|
|
54
|
+
trmnlp.fetchPreview();
|
|
68
55
|
});
|
|
69
56
|
|
|
70
|
-
trmnlp.
|
|
57
|
+
trmnlp.iframe.addEventListener("load", () => {
|
|
71
58
|
trmnlp.spinner.style.display = "none";
|
|
59
|
+
});
|
|
72
60
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
61
|
+
document.getElementById('picker-form').addEventListener('trmnl:change', (event) => {
|
|
62
|
+
trmnlp.iframe.style.width = `${event.detail.width}px`;
|
|
63
|
+
trmnlp.iframe.style.height = `${event.detail.height}px`;
|
|
64
|
+
|
|
65
|
+
trmnlp.fetchPreview(event.detail);
|
|
78
66
|
});
|
|
79
67
|
|
|
80
|
-
trmnlp.
|
|
68
|
+
trmnlp.picker = await TRMNLPicker.create('picker-form', { localStorageKey: 'trmnlp-picker' });
|
|
81
69
|
});
|