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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1284d072dad9c13fd87baa49b1f98c58983413fd498662e958c5b911186db022
4
- data.tar.gz: bf31cbce6a209ea388e43893f5a5c2a31eea6ce84543cf9ca4b0aa9bf5292fcf
3
+ metadata.gz: 6604d364906853dcf54704af9027debbbe82c31e779808a2dc3e2d42f0ffa474
4
+ data.tar.gz: 15aab9631707afb53b78a92ce8a96301991fdc2f2dad22a90314754f191fa869
5
5
  SHA512:
6
- metadata.gz: 242011496ca09a5072ee9adbc97904b7eedadc1871ab0c7c195b634d352d6b8436a40a1316a477bc781e258f11a70768211abd7cc109b2429ac0d187ceb31508
7
- data.tar.gz: e45fa96ea8020fd09b2710894cb4e3107b86959a2a41ff3c62437ce6ad750c5f8e047bd96e086e398b3108dd5f87e8ae1e8c44ecece3137df271e91e0864979a
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
@@ -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
- json = wrap_array(JSON.parse(response.body))
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TRMNLP
4
- VERSION = "0.5.10".freeze
4
+ VERSION = "0.6.0".freeze
5
5
  end
@@ -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: #eaebef;
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
- menu a {
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: black;
67
+ color: inherit;
68
+ font: inherit;
69
+ transition: filter 0.1s ease-in-out;
28
70
  }
29
71
 
30
- menu a:hover {
31
- background: #ccc;
72
+ .btn:hover {
73
+ filter: brightness(95%);
32
74
  }
33
75
 
34
- menu a.active {
35
- background: #333;
36
- color: white;
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: 22px;
47
- height: 22px;
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
- body {
65
- background-color: #191b21;
66
- color: #ffffff;
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.setFrameSrc(trmnlp.frame._src);
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
- trmnlp.setFrameSrc(`/render/${trmnlp.view}.${value}`);
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.frame.setSrc(src);
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.frame = document.querySelector("trmnl-frame");
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.setPreviewFormat();
53
+ localStorage.setItem("trmnlp-format", trmnlp.formatSelect.value);
54
+ trmnlp.fetchPreview();
68
55
  });
69
56
 
70
- trmnlp.frame._iframe.addEventListener("load", () => {
57
+ trmnlp.iframe.addEventListener("load", () => {
71
58
  trmnlp.spinner.style.display = "none";
59
+ });
72
60
 
73
- // On page load, trmnl-frame loads "about:blank", so wait for that to load
74
- // before updating the src to the preview.
75
- if (trmnlp.frame._src === null) {
76
- trmnlp.setPreviewFormat();
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.setFrameColor();
68
+ trmnlp.picker = await TRMNLPicker.create('picker-form', { localStorageKey: 'trmnlp-picker' });
81
69
  });