bible270 0.18.2 → 0.19.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: 93a410e7fe7730dd0b5aad9f1d0c2532999545ebfae26af4694d0199876c86c9
4
- data.tar.gz: e1efd12217adfeaf0bc834173dd3dc0d582c6fe0075169ce1849b56158749f97
3
+ metadata.gz: 4e5f2002e8da19945110a09f27e658b7de650e8d63e4d0cc429e0c9c74bf6bf6
4
+ data.tar.gz: '09e8a0851405b78ccb8bd39c2938546afe3bf2cf47cfe8e693d000f60713a16f'
5
5
  SHA512:
6
- metadata.gz: 4665e5cdbe8e8ede757497e150e61b84255d6de40374f86cb043096336969ddd78053ff79ffecf61d19f7e5a5249c2999a79bf9e2bef8c30c1b4519883e6b63a
7
- data.tar.gz: 89c03692d0c1dc038ce33c7c421b1d825da81843fdca7ace1edefabfb7b727f5b7ff061b92f3c5dda8e1c7c14c171904dee3142e3b61927eac4a0fad86b57609
6
+ metadata.gz: 516d821a92220f758959fe337d4cb2591ffe7785102f1c3e6d230ae31d801175b563d2b004dad1f77829d7fbc19cce1d5f87cb1f13a96405d77b81c0d2de7e1a
7
+ data.tar.gz: 27ba2c3d4f110bd64e8fc26a40b03e98e7b2f512cffd13f79faf267d35ba32f69e03834ec1dd678696941adc5c35ad11e804b7a6547bbeddac7561ed02e8a47f
data/CHANGELOG.md CHANGED
@@ -6,7 +6,20 @@ All notable changes to bible270. Format follows [Keep a Changelog](https://keepa
6
6
 
7
7
  See the changes since the last release:
8
8
 
9
- **[Full Changelog](https://github.com/avonderluft/bible270/compare/v0.18.1...main)**
9
+ **[Full Changelog](https://github.com/avonderluft/bible270/compare/v0.18.2...main)**
10
+
11
+ ## [0.18.2] - 2026-08-15
12
+
13
+ ### Added
14
+
15
+ - Young's Literal Translation (`YLT`) as a Bible Gateway and Blue Letter Bible reading option
16
+
17
+ ### Changed
18
+
19
+ - summarize reflection likes with one heart and a count, with all liker names displayed in a one-name-per-row tooltip
20
+ - keep the reflection heart red while at least one like remains
21
+
22
+ **[Full Changelog](https://github.com/avonderluft/bible270/compare/v0.18.1...v0.18.2)**
10
23
 
11
24
  ## [0.18.1] - 2026-08-12
12
25
 
@@ -413,6 +426,7 @@ This is the initial public release.
413
426
 
414
427
  * Email sign-in requires working Action Mailer delivery in the host application. Set `config.mailer_from`; delivery is inline by default, or set `email_sign_in_deliver_later` when a queue backend is available.
415
428
 
429
+ [0.18.2]: https://github.com/avonderluft/bible270/releases/tag/v0.18.2
416
430
  [0.18.1]: https://github.com/avonderluft/bible270/releases/tag/v0.18.1
417
431
  [0.18.0]: https://github.com/avonderluft/bible270/releases/tag/v0.18.0
418
432
  [0.17.2]: https://github.com/avonderluft/bible270/releases/tag/v0.17.2
data/Rakefile CHANGED
@@ -3,6 +3,16 @@
3
3
  require 'bundler/gem_tasks' # provides build / install / release
4
4
  require 'rake/testtask'
5
5
 
6
+ desc 'Normalize permissions for files included in the gem'
7
+ task :normalize_gem_permissions do
8
+ spec = Gem::Specification.load('bible270.gemspec')
9
+ spec.files.each do |path|
10
+ File.chmod(0o644, path) if File.file?(path)
11
+ end
12
+ end
13
+
14
+ Rake::Task[:build].enhance([:normalize_gem_permissions])
15
+
6
16
  Rake::TestTask.new(:test) do |t|
7
17
  t.libs << 'test' << 'lib'
8
18
  t.pattern = 'test/**/*_test.rb'
@@ -12,10 +12,6 @@ module Bible270
12
12
 
13
13
  def update
14
14
  problems = []
15
- # A checkbox sends nothing when unticked, so absence means off. Set before
16
- # the name check, so the preference is saved even if a name is rejected.
17
- current_reader.update_column(:notify_on_mention, params[:notify_on_mention].present?)
18
-
19
15
  problems << 'both a first and last name' unless current_reader.update_names(params[:first_name],
20
16
  params[:last_name])
21
17
  if params[:bible_version].present? && !current_reader.update_bible_version(params[:bible_version])
@@ -108,8 +108,9 @@ module Bible270
108
108
  errors.add(:parent, "is on day #{parent.day}, not #{day}")
109
109
  end
110
110
 
111
- # A mention emails the person named. Failures are logged rather than raised:
112
- # nobody should lose a reflection because the mail server is down.
111
+ # A mention always emails the person named. There is no per-reader opt-out;
112
+ # failures are logged rather than raised so nobody loses a reflection because
113
+ # the mail server is down.
113
114
  def notify_newly_mentioned_readers
114
115
  return unless saved_change_to_body?
115
116
 
@@ -123,7 +124,6 @@ module Bible270
123
124
  Reader.mentioned_in(body).each do |mentioned|
124
125
  next if mentioned.id == reader_id
125
126
  next if except.include?(mentioned.id)
126
- next unless mentioned.wants_mention_notices?
127
127
 
128
128
  notice = NoticeMailer.mentioned(comment_id: id, reader_id: mentioned.id)
129
129
  Bible270.config.registration_notice_deliver_later ? notice.deliver_later : notice.deliver_now
@@ -221,13 +221,6 @@ module Bible270
221
221
  Mentions.handles_for(first_name, last_name).include?(handle)
222
222
  end
223
223
 
224
- def wants_mention_notices?
225
- return false if email.blank?
226
- return true unless respond_to?(:notify_on_mention)
227
-
228
- notify_on_mention != false
229
- end
230
-
231
224
  # ---- staying signed in -------------------------------------------------
232
225
 
233
226
  # Generated on first use rather than at sign-up, so readers who never stay
@@ -21,7 +21,6 @@
21
21
 
22
22
  <p style="margin:22px 0 0;font-size:12px;color:#9a9082">
23
23
  You are getting this because someone wrote your name in a reflection.
24
- You can turn these off on your profile page.
25
24
  </p>
26
25
  </div>
27
26
  </body>
@@ -8,5 +8,4 @@ Read it and reply: <%= @day_url %>
8
8
  You can find it on day <%= @comment.day %> of <%= @app_name %>.
9
9
  <% end %>
10
10
  --
11
- You are getting this because someone wrote your name in a reflection. You can
12
- turn these off on your profile page.
11
+ You are getting this because someone wrote your name in a reflection.
@@ -1,6 +1,6 @@
1
- <% content_for :title, "Your profile — #{Bible270.config.app_name}" %>
2
- <p class="b270-eyebrow">Your details</p>
3
- <h1>Your profile</h1>
1
+ <% content_for :title, "Profile — #{Bible270.config.app_name}" %>
2
+ <p class="b270-eyebrow">Profile</p>
3
+ <h1>Your details</h1>
4
4
  <p class="lede">This is how you appear beside your reflections and on the community page.</p>
5
5
 
6
6
  <div class="b270-panel">
@@ -19,10 +19,6 @@
19
19
  <% end %>
20
20
  </div>
21
21
 
22
- <label class="b270-field" style="flex-direction:row;align-items:center;gap:10px">
23
- <%= check_box_tag :notify_on_mention, "1", current_reader.notify_on_mention %>
24
- <span style="margin:0">Email me when someone mentions me in a reflection</span>
25
- </label>
26
22
 
27
23
  <label class="b270-field">
28
24
  <span>First name</span>
@@ -1,6 +1,6 @@
1
1
  <% content_for :title, "Community — #{Bible270.config.app_name}" %>
2
- <p class="b270-eyebrow">Reading together</p>
3
- <h1>The community</h1>
2
+ <p class="b270-eyebrow">Community</p>
3
+ <h1>Reading together</h1>
4
4
  <p class="lede">Everyone walking through the Word, seeing each pilgrim's progress.</p>
5
5
 
6
6
  <% if @readers.any? %>
@@ -1,8 +1,8 @@
1
- <% content_for :title, "Your progress — #{Bible270.config.app_name}" %>
1
+ <% content_for :title, "My Progress — #{Bible270.config.app_name}" %>
2
2
  <% content_for :hide_day_index, true %><%# the panel is followed by its own grid below %>
3
3
 
4
- <p class="b270-eyebrow">Your progress</p>
5
- <h1><%= @reader ? @reader.display_name : "Your progress" %></h1>
4
+ <p class="b270-eyebrow">My Progress</p>
5
+ <h1>Your reading journey</h1>
6
6
 
7
7
  <%= render "bible270/shared/progress" %>
8
8
 
@@ -8,22 +8,19 @@
8
8
  </span>
9
9
  <% end %>
10
10
  </div>
11
- <nav class="b270-nav">
12
- <!--<%= link_to "Plan", root_path %>-->
13
- <%= link_to "People", community_path %>
14
- <%# Public, like the community page: anyone may read reflections. %>
15
- <%= link_to "Posts", reflections_path %>
16
- <% if signed_in? %>
17
- <%= link_to "Progress", progress_path %>
18
- <%= link_to "Profile", profile_path %>
19
- <% if Bible270.config.admin?(current_reader) %><%= link_to "Admin", admin_path %><% end %>
20
- <%= button_to "Sign out", sign_out_path, method: :delete, class: "b270-linkbtn",
21
- form: { style: "display:inline" } %>
22
- <% elsif Bible270.config.any_sign_in_method? %>
23
- <%# Always route to the sign-in page: it offers email as well as any
24
- social providers, so nobody is shut out. OmniAuth's own request phase
25
- rejects GET, so its buttons live on that page as POST forms. %>
26
- <%= link_to "Sign in", sign_in_path(origin: request.fullpath), class: "b270-signin" %>
27
- <% end %>
11
+ <nav class="b270-nav" aria-label="Primary navigation">
12
+ <div class="b270-desktopnav">
13
+ <%= render "bible270/shared/nav_links" %>
14
+ </div>
15
+ <details class="b270-navmenu">
16
+ <summary class="b270-navtoggle" aria-label="Menu">
17
+ <span class="b270-menuicon" aria-hidden="true">
18
+ <span></span><span></span><span></span>
19
+ </span>
20
+ </summary>
21
+ <div class="b270-navlinks">
22
+ <%= render "bible270/shared/nav_links" %>
23
+ </div>
24
+ </details>
28
25
  </nav>
29
26
  </header>
@@ -0,0 +1,15 @@
1
+ <%= link_to "Community", community_path %>
2
+ <%# Public, like the community page: anyone may read reflections. %>
3
+ <%= link_to "Reflections", reflections_path %>
4
+ <% if signed_in? %>
5
+ <%= link_to "My Progress", progress_path %>
6
+ <%= link_to "Profile", profile_path %>
7
+ <% if Bible270.config.admin?(current_reader) %><%= link_to "Admin", admin_path %><% end %>
8
+ <%= button_to "Sign out", sign_out_path, method: :delete, class: "b270-linkbtn",
9
+ form: { style: "display:inline" } %>
10
+ <% elsif Bible270.config.any_sign_in_method? %>
11
+ <%# Always route to the sign-in page: it offers email as well as any
12
+ social providers, so nobody is shut out. OmniAuth's own request phase
13
+ rejects GET, so its buttons live on that page as POST forms. %>
14
+ <%= link_to "Sign in", sign_in_path(origin: request.fullpath), class: "b270-signin" %>
15
+ <% end %>
@@ -34,12 +34,12 @@
34
34
 
35
35
  <%= render "bible270/shared/track_bars", reader: panel_reader %>
36
36
 
37
- <p style="margin:16px 0 0">
37
+ <div class="b270-progress-actions">
38
38
  <%= link_to "#{day_verb} reading — Day #{panel_start_day} →", day_path(panel_start_day), class: "b270-btn" %>
39
39
  <% if panel_today_day && panel_today_day != panel_start_day %>
40
- <%= link_to "Go to today (Day #{panel_today_day})", day_path(panel_today_day), style: "margin-left:12px" %>
40
+ <%= link_to "Go to today (Day #{panel_today_day})", day_path(panel_today_day), class: "b270-todaylink" %>
41
41
  <% end %>
42
- </p>
42
+ </div>
43
43
 
44
44
  <%= render "bible270/days/start_date", reader: panel_reader %>
45
45
  <% else %>
@@ -22,7 +22,9 @@
22
22
  .b270-mark svg,.b270-mark img{display:block;border-radius:8px}
23
23
  .b270-title{font-family:"Spectral",Georgia,serif;font-weight:600;font-size:22px;text-decoration:none}
24
24
  .b270-tagline{font-size:12px;color:var(--faint);letter-spacing:.04em}
25
- .b270-nav{display:flex;align-items:center;gap:16px;font-size:14px}
25
+ .b270-nav{display:flex;align-items:center;font-size:14px}
26
+ .b270-desktopnav{display:flex;align-items:center;gap:16px}
27
+ .b270-navmenu{display:none}
26
28
  .b270-nav a{color:var(--muted);text-decoration:none}
27
29
  .b270-nav a:hover{color:var(--gold)}
28
30
  /* button_to renders a form; make it a flex item so the button sits on the same
@@ -63,6 +65,9 @@
63
65
  .b270-bignum .n{font-family:"Spectral",serif;font-size:38px;font-weight:600;line-height:1}
64
66
  .b270-bignum .of{color:var(--muted);font-size:15px}
65
67
  .b270-bignum .pct{margin-left:auto;color:var(--gold);font-weight:600;font-variant-numeric:tabular-nums}
68
+ .b270-progress-actions{display:flex;flex-direction:column;align-items:flex-start;gap:7px;margin:16px 0 0}
69
+ .b270-todaylink{margin-left:16px;font-size:12px;color:var(--muted);text-decoration:none}
70
+ .b270-todaylink:hover{color:var(--gold);text-decoration:underline}
66
71
  .b270-signedout{color:var(--muted);font-size:14px;margin:4px 0 0}
67
72
 
68
73
  .b270-startdate{margin-top:18px;padding-top:16px;border-top:1px solid var(--line-soft)}
@@ -244,5 +249,31 @@
244
249
  .b270-footer p{margin:0;line-height:1.5}
245
250
  details.b270-index summary{cursor:pointer;font-family:"Spectral",serif;font-size:18px;font-weight:600;list-style:none;margin-top:30px}
246
251
  details.b270-index summary::-webkit-details-marker{display:none}
252
+ @media (max-width:620px){
253
+ .b270-topbar{flex-wrap:nowrap;align-items:center}
254
+ .b270-brand{min-width:0}
255
+ .b270-brandtext{min-width:0}
256
+ .b270-tagline{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
257
+ .b270-nav{position:relative;flex:none}
258
+ .b270-desktopnav{display:none}
259
+ .b270-navmenu{display:block}
260
+ .b270-navtoggle{display:flex;align-items:center;justify-content:center;width:40px;height:38px;
261
+ list-style:none;cursor:pointer;padding:0;border:1px solid var(--line);
262
+ border-radius:8px;background:var(--card)}
263
+ .b270-navtoggle::-webkit-details-marker{display:none}
264
+ .b270-navtoggle:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
265
+ .b270-menuicon{display:flex;flex-direction:column;gap:4px}
266
+ .b270-menuicon span{display:block;width:18px;height:2px;border-radius:2px;background:var(--ink)}
267
+ .b270-navmenu[open] .b270-menuicon span{background:var(--gold)}
268
+ .b270-navmenu:not([open])>.b270-navlinks{display:none}
269
+ .b270-navlinks{position:absolute;z-index:20;right:0;top:calc(100% + 7px);min-width:180px;
270
+ flex-direction:column;align-items:stretch;gap:0;padding:6px;
271
+ border:1px solid var(--line);border-radius:10px;background:var(--card);
272
+ box-shadow:var(--shadow)}
273
+ .b270-navlinks a,.b270-nav .b270-linkbtn{display:block;width:100%;padding:9px 10px;
274
+ border-radius:6px;text-align:left;white-space:nowrap}
275
+ .b270-navlinks a:hover,.b270-nav .b270-linkbtn:hover{background:var(--paper)}
276
+ .b270-nav form{display:block;width:100%}
277
+ }
247
278
  @media (max-width:480px){ .b270-tm{grid-template-columns:104px 1fr auto} .b270-reading{padding:14px 15px;gap:12px} .b270-reading.multi .b270-cat,.b270-reading.multi .b270-parts-meta{margin-left:38px} .b270-part{gap:12px} }
248
279
  </style>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bible270
4
- VERSION = '0.18.2'
4
+ VERSION = '0.19.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bible270
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.2
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew vonderLuft
@@ -136,6 +136,7 @@ files:
136
136
  - app/views/bible270/shared/_footer.html.erb
137
137
  - app/views/bible270/shared/_grid_legend.html.erb
138
138
  - app/views/bible270/shared/_header.html.erb
139
+ - app/views/bible270/shared/_nav_links.html.erb
139
140
  - app/views/bible270/shared/_passage_source.html.erb
140
141
  - app/views/bible270/shared/_progress.html.erb
141
142
  - app/views/bible270/shared/_reflections.html.erb