bible270 1.15.0 → 1.15.1

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: a682ef9e0099682fb05d4fcde854169ba1f47add452ac6adef9da455680fa801
4
- data.tar.gz: 3c3eb36fb2bab664ce3e2c0891ab5d770afd47c69fdb1e0b5fd8f8eb61e1e83a
3
+ metadata.gz: 73a1a19dba81da8ae39a2f00b51a4964a0006826428c64590f073e9eeeed790a
4
+ data.tar.gz: f2bf329540f56e22be230c899bc4be5b6cabd21140c595ec42bcd5c0a4b50aef
5
5
  SHA512:
6
- metadata.gz: 120ef747f43ba910288881479331892daf84cdeac530786666632b652c7354267ceda0b2d82094d7fae359e3e80cf1bf76c6a03918955795b5a87fdc249cf5e9
7
- data.tar.gz: 4b21a0e51b306daa5c8e39d7b248ac15d09f4b16db8abbc471c338f1f41736d46c1705bb55c010b575170b519e3607d780f2c710938f6b4fc9f8b885a71ab988
6
+ metadata.gz: bdd71f5e6262ec117a990cba9e3258223cd10d335850f42d83eb908d2538dab494aa8442b3518bafc12a5ecd4f9293c1e48e1746fcec9804a75cfc88a0413d24
7
+ data.tar.gz: caf2bc1d453d8b9590b985a7687e352a5f0edc521dc5c40e43541e511d2dbb2e8d35c8f0433acc79c15b5816d4a1975f1396b71c6b26278f8141508c09d13053
data/CHANGELOG.md CHANGED
@@ -4,11 +4,19 @@ Notable changes, following [Keep a Changelog](https://keepachangelog.com/en/1.1.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ### Fixed
8
+
9
+ - standardize dropdown arrows, spacing, keyboard focus, and disabled styling across reflections, filters, Profile, and Admin; keep header theme and reminder-time selectors compact
10
+
11
+ ## [1.15.0] - 2026-11-06
12
+
7
13
  ### Added
8
14
 
9
- - show a compact progress bar and completed-day count beside each Community reader for signed-in users, including non-admin preview; retain alphabetical order and restrict management links and schedule status to admins
10
- - use muted, theme-matched Community progress colors, including warm tan for Cedar, with distinct fills and tracks
11
- - mark today with a thin line in Community progress bars using each reader's active schedule, with a tooltip and accessible day description
15
+ - show Community progress bars and completed-day counts to signed-in readers, including non-admin preview; retain alphabetical order and admin-only management links and written schedule status
16
+ - use muted, theme-matched bar colors, including warm tan for Cedar, with at least 3:1 fill-to-track contrast
17
+ - mark today on each reader's active schedule with a thin line, tooltip, and accessible day description; omit markers for undated, future, and ended schedules
18
+
19
+ Counts include only fully completed days and use one bulk progress query. Visitor listings are unchanged; no migration is required.
12
20
 
13
21
  ## [1.14.0] - 2026-11-06
14
22
 
@@ -805,7 +813,8 @@ This is the initial public release.
805
813
 
806
814
  - 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.
807
815
 
808
- [Unreleased]: https://github.com/avonderluft/bible270/compare/v1.14.0...main
816
+ [Unreleased]: https://github.com/avonderluft/bible270/compare/v1.15.0...main
817
+ [1.15.0]: https://github.com/avonderluft/bible270/compare/v1.14.0...v1.15.0
809
818
  [1.14.0]: https://github.com/avonderluft/bible270/compare/v1.13.5...v1.14.0
810
819
  [1.13.5]: https://github.com/avonderluft/bible270/compare/v1.13.3...v1.13.5
811
820
  [1.13.3]: https://github.com/avonderluft/bible270/compare/v1.13.2...v1.13.3
@@ -71,7 +71,9 @@
71
71
  <%= form_with url: admin_path, method: :get, class: "b270-admin-reader-sort" do %>
72
72
  <label>
73
73
  <span>Sort readers by</span>
74
- <%= select_tag :sort, options_for_select(@reader_sort_options.map { |value, label| [label, value] }, @reader_sort) %>
74
+ <span class="b270-select-wrap">
75
+ <%= select_tag :sort, options_for_select(@reader_sort_options.map { |value, label| [label, value] }, @reader_sort) %>
76
+ </span>
75
77
  </label>
76
78
  <%= submit_tag "Sort", class: "b270-btn" %>
77
79
  <% end %>
@@ -195,7 +197,9 @@
195
197
  data: { turbo_confirm: "Send this message to the selected recipients?" } do %>
196
198
  <div class="b270-broadcast-audience">
197
199
  <label for="b270-broadcast-audience" class="b270-sr-only">Recipients</label>
198
- <%= select_tag :audience, options_for_select([['Write to everyone', 'everyone'], ['Write to all admins', 'admins']], 'everyone'), id: 'b270-broadcast-audience', class: 'b270-select' %>
200
+ <span class="b270-select-wrap b270-select-wrap--full">
201
+ <%= select_tag :audience, options_for_select([['Write to everyone', 'everyone'], ['Write to all admins', 'admins']], 'everyone'), id: 'b270-broadcast-audience', class: 'b270-select' %>
202
+ </span>
199
203
  </div>
200
204
  <%= text_field_tag :subject, params[:subject], placeholder: "Subject", class: "b270-input" %>
201
205
  <%= text_area_tag :body, params[:body], placeholder: "What would you like to say?", rows: 6 %>
@@ -67,11 +67,13 @@
67
67
 
68
68
  <%= form_with url: admin_reader_version_path(@reader), method: :patch, class: "b270-form" do %>
69
69
  <div class="row">
70
- <%= select_tag :bible_version,
71
- options_for_select([["Site default (#{Bible270.config.bible_version})", ""]] +
72
- Bible270::Translations.options,
73
- @reader.bible_version.to_s),
74
- class: "b270-select", style: "width:auto" %>
70
+ <span class="b270-select-wrap b270-select-wrap--full">
71
+ <%= select_tag :bible_version,
72
+ options_for_select([["Site default (#{Bible270.config.bible_version})", ""]] +
73
+ Bible270::Translations.options,
74
+ @reader.bible_version.to_s),
75
+ class: "b270-select", aria: { label: "Bible translation" } %>
76
+ </span>
75
77
  </div>
76
78
  <%= render "bible270/shared/passage_source", reader: @reader %>
77
79
  <%= submit_tag "Save", class: "b270-btn" %>
@@ -82,11 +84,13 @@
82
84
  <h2 class="b270-subhead" id="b270-theme-heading">Theme</h2>
83
85
  <% if Bible270::Reader.display_mode_column? %>
84
86
  <%= form_with url: admin_reader_theme_path(@reader), method: :patch, class: "b270-emailform" do %>
85
- <%= select_tag :display_mode,
86
- options_for_select(Bible270::Reader::DISPLAY_OPTIONS, @reader.effective_display_mode),
87
- class: "b270-select", aria: { labelledby: "b270-theme-heading", describedby: "b270-theme-hint b270-theme-status" },
88
- data: { b270_theme_url: admin_reader_theme_path(@reader), b270_theme_apply: @reader == current_reader,
89
- b270_saved_theme: @reader.effective_display_mode } %>
87
+ <span class="b270-select-wrap b270-select-wrap--full">
88
+ <%= select_tag :display_mode,
89
+ options_for_select(Bible270::Reader::DISPLAY_OPTIONS, @reader.effective_display_mode),
90
+ class: "b270-select", aria: { labelledby: "b270-theme-heading", describedby: "b270-theme-hint b270-theme-status" },
91
+ data: { b270_theme_url: admin_reader_theme_path(@reader), b270_theme_apply: @reader == current_reader,
92
+ b270_saved_theme: @reader.effective_display_mode } %>
93
+ </span>
90
94
  <p id="b270-theme-hint" class="b270-hint" style="margin:0">
91
95
  System follows the reader's device setting: Papyrus for light, Cedar for dark.
92
96
  </p>
@@ -17,10 +17,12 @@
17
17
  label_text: (comment.reply? ? "Reply" : "Reflection") %>
18
18
  <div class="row">
19
19
  <% unless comment.reply? %>
20
- <%= f.select :track,
21
- options_for_select([["The whole day", ""]] + Bible270::Plan::TRACKS.map { |k, v| [v[:label], k] },
22
- comment.track.to_s),
23
- {}, class: "b270-select", style: "width:auto", aria: { label: "Reading this reflection relates to" } %>
20
+ <span class="b270-select-wrap b270-track-select-wrap">
21
+ <%= f.select :track,
22
+ options_for_select([["The whole day", ""]] + Bible270::Plan::TRACKS.map { |k, v| [v[:label], k] },
23
+ comment.track.to_s),
24
+ {}, class: "b270-select", aria: { label: "Reading this reflection relates to" } %>
25
+ </span>
24
26
  <% end %>
25
27
  <%= f.submit "Save", class: "b270-btn" %>
26
28
  <%= link_to "Cancel", day_path(comment.day, anchor: "comment-#{comment.id}"), class: "b270-linkbtn" %>
@@ -23,10 +23,11 @@
23
23
  placeholder: (posting_reply ? "Write your reply…" : "Share a reflection on today's reading…") %>
24
24
  <p class="b270-draft-status" data-b270-draft-status aria-live="polite"></p>
25
25
  <div class="row">
26
- <%= f.select :track,
27
- options_for_select([["The whole day", ""]] + Bible270::Plan::TRACKS.map { |k, v| [v[:label], k] }),
28
- {}, aria: { label: "Reading this reflection relates to" },
29
- style: "font:inherit;padding:8px;border:1px solid var(--line);border-radius:8px;background:#fff" %>
26
+ <span class="b270-select-wrap b270-track-select-wrap">
27
+ <%= f.select :track,
28
+ options_for_select([["The whole day", ""]] + Bible270::Plan::TRACKS.map { |k, v| [v[:label], k] }),
29
+ {}, class: "b270-select", aria: { label: "Reading this reflection relates to" } %>
30
+ </span>
30
31
  <%= f.submit "Post reflection", class: "b270-btn" %>
31
32
  </div>
32
33
  <% end %>
@@ -15,15 +15,19 @@
15
15
  <%= hidden_field_tag :since, @reflections_since_param %>
16
16
  <label>
17
17
  <span>Day</span>
18
- <%= select_tag :day,
19
- options_for_select([["All days", ""]] + @days_with_reflections.map { |day| ["Day #{day}", day] },
20
- @reflection_day) %>
18
+ <span class="b270-select-wrap">
19
+ <%= select_tag :day,
20
+ options_for_select([["All days", ""]] + @days_with_reflections.map { |day| ["Day #{day}", day] },
21
+ @reflection_day) %>
22
+ </span>
21
23
  </label>
22
24
  <label>
23
25
  <span>Reflection by</span>
24
- <%= select_tag :reader_id,
25
- options_for_select([["All readers", ""]] + @reflection_readers.map { |reader| [reader.display_name, reader.id] },
26
- @reflection_reader_id) %>
26
+ <span class="b270-select-wrap">
27
+ <%= select_tag :reader_id,
28
+ options_for_select([["All readers", ""]] + @reflection_readers.map { |reader| [reader.display_name, reader.id] },
29
+ @reflection_reader_id) %>
30
+ </span>
27
31
  </label>
28
32
  <%= submit_tag "Apply", class: "b270-btn" %>
29
33
  <% if @reflection_day || @reflection_reader_id %>
@@ -38,9 +38,11 @@
38
38
  </label>
39
39
  <label class="b270-field">
40
40
  <span>Bible translation</span>
41
- <%= select_tag :bible_version,
42
- options_for_select(Bible270::Translations.options, current_reader.effective_bible_version),
43
- class: "b270-select" %>
41
+ <span class="b270-select-wrap b270-select-wrap--full">
42
+ <%= select_tag :bible_version,
43
+ options_for_select(Bible270::Translations.options, current_reader.effective_bible_version),
44
+ class: "b270-select" %>
45
+ </span>
44
46
  <span class="b270-hint" style="margin:0">Reading links open in this translation.</span>
45
47
  </label>
46
48
  <%= render "bible270/shared/passage_source", reader: current_reader %>
@@ -48,11 +50,13 @@
48
50
  <% if Bible270::Reader.display_mode_column? %>
49
51
  <label class="b270-field">
50
52
  <span>Theme</span>
51
- <%= select_tag :display_mode,
52
- options_for_select(Bible270::Reader::DISPLAY_OPTIONS, @display_mode),
53
- class: "b270-select", aria: { describedby: "b270-display-hint b270-theme-status" },
54
- data: { b270_theme_url: profile_theme_path, b270_theme_apply: true,
55
- b270_saved_theme: current_reader.effective_display_mode } %>
53
+ <span class="b270-select-wrap b270-select-wrap--full">
54
+ <%= select_tag :display_mode,
55
+ options_for_select(Bible270::Reader::DISPLAY_OPTIONS, @display_mode),
56
+ class: "b270-select", aria: { describedby: "b270-display-hint b270-theme-status" },
57
+ data: { b270_theme_url: profile_theme_path, b270_theme_apply: true,
58
+ b270_saved_theme: current_reader.effective_display_mode } %>
59
+ </span>
56
60
  <span id="b270-display-hint" class="b270-hint" style="margin:0">System follows your device's setting: Papyrus for light, Cedar for dark.</span>
57
61
  </label>
58
62
  <p id="b270-theme-status" class="b270-hint" role="status" aria-live="polite" style="margin:0"></p>
@@ -97,13 +101,17 @@
97
101
  <span>at</span>
98
102
  <span class="b270-time-control" role="group" aria-label="Reminder time"
99
103
  aria-describedby="daily-reminder-time-hint">
100
- <%= select_tag :daily_reminder_hour,
101
- options_for_select((0..23).map { |hour| format("%02d", hour) }, reminder_hour),
102
- class: "b270-time-select", required: true, aria: { label: "Hour" } %>
104
+ <span class="b270-select-wrap b270-select-wrap--compact b270-select-wrap--time">
105
+ <%= select_tag :daily_reminder_hour,
106
+ options_for_select((0..23).map { |hour| format("%02d", hour) }, reminder_hour),
107
+ class: "b270-time-select", required: true, aria: { label: "Hour" } %>
108
+ </span>
103
109
  <span class="b270-time-separator" aria-hidden="true">:</span>
104
- <%= select_tag :daily_reminder_minute,
105
- options_for_select(reminder_minutes, reminder_minute),
106
- class: "b270-time-select", required: true, aria: { label: "Minute" } %>
110
+ <span class="b270-select-wrap b270-select-wrap--compact b270-select-wrap--time">
111
+ <%= select_tag :daily_reminder_minute,
112
+ options_for_select(reminder_minutes, reminder_minute),
113
+ class: "b270-time-select", required: true, aria: { label: "Minute" } %>
114
+ </span>
107
115
  <span class="b270-reminder-tooltip" id="daily-reminder-time-hint" role="tooltip">
108
116
  <%= reminder_tooltip %>
109
117
  </span>
@@ -6,13 +6,15 @@
6
6
  <% end %>
7
7
  <% if current_reader && Bible270::Reader.display_mode_column? %>
8
8
  <%= form_with url: profile_theme_path, method: :patch, class: "b270-header-theme" do %>
9
- <%= select_tag :display_mode,
10
- options_for_select(Bible270::Reader::DISPLAY_OPTIONS.map { |label, value| [label.sub(/ \((?:Light|Dark)\)\z/, ""), value] }, current_reader.effective_display_mode),
11
- id: "b270-header-theme", class: "b270-header-theme-select",
12
- aria: { label: "Theme", describedby: "b270-header-theme-status" },
13
- data: { b270_theme_url: profile_theme_path, b270_theme_apply: true,
14
- b270_saved_theme: current_reader.effective_display_mode,
15
- b270_theme_status: "b270-header-theme-status" } %>
9
+ <span class="b270-select-wrap b270-select-wrap--compact">
10
+ <%= select_tag :display_mode,
11
+ options_for_select(Bible270::Reader::DISPLAY_OPTIONS.map { |label, value| [label.sub(/ \((?:Light|Dark)\)\z/, ""), value] }, current_reader.effective_display_mode),
12
+ id: "b270-header-theme", class: "b270-header-theme-select",
13
+ aria: { label: "Theme", describedby: "b270-header-theme-status" },
14
+ data: { b270_theme_url: profile_theme_path, b270_theme_apply: true,
15
+ b270_saved_theme: current_reader.effective_display_mode,
16
+ b270_theme_status: "b270-header-theme-status" } %>
17
+ </span>
16
18
  <%= submit_tag "Save", class: "b270-btn", data: { b270_theme_fallback: true } %>
17
19
  <span id="b270-header-theme-status" class="b270-header-theme-status" role="status" aria-live="polite"></span>
18
20
  <% end %>
@@ -227,12 +227,12 @@
227
227
  .b270-topbar{display:flex;align-items:center;gap:12px;flex-wrap:nowrap;padding-bottom:20px;border-bottom:1px solid var(--line-soft);margin-bottom:26px}
228
228
  .b270-brand{display:flex;align-items:baseline;gap:14px;margin-right:auto;min-width:0}
229
229
  .b270-header-theme{position:relative;display:flex;align-items:baseline;gap:4px;margin:0;flex:none}
230
- .b270-header-theme-select{font:inherit;font-size:12px;width:6.5em;height:28px;padding:2px;margin:0;
230
+ .b270-header-theme-select{font:inherit;font-size:12px;width:8em;height:28px;padding:2px 6px;margin:0;
231
231
  border:1px solid var(--line);border-radius:6px;background:var(--card);color:var(--ink);cursor:pointer}
232
232
  @supports (field-sizing:content){
233
233
  .b270-header-theme-select{field-sizing:content;width:auto}
234
234
  }
235
- .b270-header-theme-select:disabled{cursor:wait;opacity:.7}
235
+ .b270 .b270-select-wrap>.b270-header-theme-select:disabled{cursor:wait}
236
236
  .b270-header-theme-status:not([data-error="true"]){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
237
237
  clip:rect(0,0,0,0);white-space:nowrap;border:0}
238
238
  .b270-header-theme-status[data-error="true"]{position:absolute;z-index:30;right:0;top:calc(100% + 6px);width:220px;max-width:calc(100vw - 28px);
@@ -285,10 +285,10 @@
285
285
  .b270-time-control:active .b270-reminder-tooltip{visibility:visible;opacity:1}
286
286
  .b270-field .b270-reminder-optin input[type=checkbox]{width:auto;margin:0;flex:none}
287
287
  .b270-time-control{grid-template-columns:48px 5px 48px;align-items:center;gap:2px}
288
- .b270-field .b270-time-select{width:48px;height:30px;margin:0;padding:4px 2px;border:1px solid var(--control-line);
288
+ .b270-field .b270-time-select{width:48px;height:30px;margin:0;padding:4px 6px;border:1px solid var(--control-line);
289
289
  border-radius:7px;background:var(--control);color:var(--ink);font:12px/16px system-ui,sans-serif;
290
290
  font-variant-numeric:tabular-nums;text-align:center}
291
- .b270-time-select:focus{outline:none;border-color:var(--gold);box-shadow:0 0 0 3px rgba(165,129,44,.13)}
291
+
292
292
  .b270-time-separator{display:grid;place-items:center;height:30px;font:12px/30px system-ui,sans-serif;color:var(--muted)}
293
293
  .b270-emailform input[type=submit]{justify-self:start}
294
294
  .b270-or{display:flex;align-items:center;gap:12px;margin:22px 0 18px;color:var(--faint);font-size:12px;letter-spacing:.1em;text-transform:uppercase}
@@ -423,6 +423,17 @@
423
423
  .b270-part.done .b270-check svg{opacity:1}
424
424
  .b270-parts-meta{margin-top:10px;font-size:12.5px;color:var(--faint)}
425
425
  .b270-version{font-size:11.5px;color:var(--faint);font-weight:400;letter-spacing:.02em;white-space:nowrap}
426
+ .b270-select-wrap{position:relative;display:inline-block;max-width:100%;min-width:0;color:var(--muted)}
427
+ .b270-select-wrap--full{width:100%}
428
+ .b270-select-wrap--compact{--b270-select-inset:8px;--b270-select-chevron:5px;--b270-select-space:24px}
429
+ .b270-select-wrap--time{--b270-select-inset:7px;--b270-select-space:20px}
430
+ .b270 .b270-select-wrap>select{display:block;-webkit-appearance:none;appearance:none;padding-right:var(--b270-select-space,36px)}
431
+ .b270-select-wrap::after{content:"";position:absolute;right:var(--b270-select-inset,14px);top:50%;
432
+ width:var(--b270-select-chevron,7px);height:var(--b270-select-chevron,7px);
433
+ border-right:2px solid currentColor;border-bottom:2px solid currentColor;
434
+ transform:translateY(-70%) rotate(45deg);pointer-events:none}
435
+ .b270 .b270-select-wrap>select:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
436
+ .b270 .b270-select-wrap>select:disabled{cursor:not-allowed;opacity:.7}
426
437
  .b270-select{font:inherit;font-size:14px;padding:10px 30px 10px 12px;border:1px solid var(--control-line);border-radius:9px;background:var(--control);color:var(--ink);width:100%;max-width:100%;text-overflow:ellipsis}
427
438
  .b270-source-choices{display:flex;align-items:center;justify-content:space-between;gap:4px;flex-wrap:nowrap;width:100%;margin:8px 0 2px;color:var(--muted);font-size:clamp(10.5px,3.4vw,12.5px)}
428
439
  .b270-source-choice{display:inline-flex;align-items:center;gap:4px;cursor:pointer;white-space:nowrap}
@@ -543,8 +554,7 @@
543
554
  .b270-mention-option:hover,.b270-mention-option[aria-selected=true]{background:var(--paper);color:var(--gold)}
544
555
  .b270-draft-status{min-height:16px;margin:4px 0 -4px;font-size:11.5px;color:var(--faint)}
545
556
  .b270-form .row{display:flex;align-items:center;gap:10px;margin-top:10px}
546
- /* Override the reflection track selector's inline background and border color. */
547
- .b270-form .row select{max-width:100%;background:var(--control)!important;border-color:var(--control-line)!important;color:var(--ink)}
557
+
548
558
  .b270 .b270-btn{border:none;border-radius:10px;padding:8px 16px;margin-top:4px;font:inherit;font-weight:600;font-size:14px;cursor:pointer;background:var(--button-surface);color:var(--button-ink);text-decoration:none;display:inline-block}
549
559
  .b270 .b270-btn:hover{background:var(--button-hover)}
550
560
 
@@ -657,7 +667,7 @@
657
667
  .b270-tm{grid-template-columns:104px 1fr auto}
658
668
  .b270-avatarrow{align-items:flex-start;flex-wrap:wrap}
659
669
  .b270-form .row{align-items:stretch;flex-direction:column}
660
- .b270-form .row select{width:100%}
670
+ .b270-track-select-wrap{width:100%}
661
671
  .b270-form .row .b270-btn{align-self:flex-start}
662
672
  .b270-reading{padding:14px 15px;gap:12px}
663
673
  .b270-reading.multi .b270-cat,.b270-reading.multi .b270-parts-meta{margin-left:38px}
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bible270
4
- VERSION = '1.15.0'
4
+ VERSION = '1.15.1'
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: 1.15.0
4
+ version: 1.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew vonderLuft