lesli_view 1.1.3 → 1.1.5
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/app/assets/stylesheets/lesli_view/view.tailwind.css +4362 -0
- data/lib/lesli_view/components/header.html.erb +5 -5
- data/lib/lesli_view/components/tabs.html.erb +59 -26
- data/lib/lesli_view/components/tabs.rb +7 -7
- data/lib/lesli_view/components/timeline.html.erb +28 -25
- data/lib/lesli_view/elements/avatar.html.erb +3 -3
- data/lib/lesli_view/elements/avatar.rb +8 -8
- data/lib/lesli_view/forms/inputs.rb +0 -1
- data/lib/lesli_view/items/activities.html.erb +4 -6
- data/lib/lesli_view/items/discussion.html.erb +6 -5
- data/lib/lesli_view/items/discussions.html.erb +8 -6
- data/lib/lesli_view/items/task.html.erb +16 -11
- data/lib/lesli_view/items/tasks.html.erb +8 -13
- data/lib/lesli_view/partials/engine_spec.html.erb +28 -41
- data/lib/lesli_view/version.rb +2 -2
- data/readme.md +82 -55
- metadata +11 -13
- data/lib/lesli_view/components/tabs.scss +0 -49
- data/lib/lesli_view/components/tabs_spec.rb +0 -0
- data/lib/lesli_view/components/timeline.scss +0 -216
- data/lib/lesli_view/elements/avatar.scss +0 -50
- data/lib/lesli_view/items/activities.scss +0 -39
- data/lib/lesli_view/items/discussions.scss +0 -47
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
|
|
2
2
|
<section
|
|
3
|
-
class="mx-auto
|
|
3
|
+
class="mx-auto mt-14 mb-10 grid w-full grid-cols-1 gap-5 md:grid-cols-[minmax(0,1fr)_auto] md:items-start"
|
|
4
4
|
<% if title.present? %>aria-labelledby="<%= title_id %>"<% end %>>
|
|
5
5
|
|
|
6
6
|
<div class="min-w-0">
|
|
7
|
-
<div class="flex items-
|
|
7
|
+
<div class="flex items-center gap-4">
|
|
8
8
|
|
|
9
9
|
<% if back? %>
|
|
10
10
|
<%= link_to(
|
|
11
11
|
back_path,
|
|
12
|
-
class: "
|
|
12
|
+
class: "inline-flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl border border-sky-600 bg-white text-sky-700 shadow-sm transition hover:bg-sky-50 hover:text-sky-800 focus:outline-none focus:ring-2 focus:ring-sky-500/30",
|
|
13
13
|
aria: { label: I18n.t("actions.back", default: "Go back") },
|
|
14
14
|
data: { turbo_frame: "_top" }
|
|
15
15
|
) do %>
|
|
16
|
-
<span class="material-symbols
|
|
16
|
+
<span class="material-symbols text-[26px] leading-none" aria-hidden="true">arrow_back</span>
|
|
17
17
|
<% end %>
|
|
18
18
|
<% end %>
|
|
19
19
|
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
|
|
37
37
|
<% if actions? %>
|
|
38
38
|
<div
|
|
39
|
-
class="flex
|
|
39
|
+
class="flex flex-wrap items-center gap-3 md:justify-self-end"
|
|
40
40
|
role="group"
|
|
41
41
|
aria-label="<%= I18n.t('actions.label', default: 'Page actions') %>">
|
|
42
42
|
<% if new_path.present? %>
|
|
@@ -1,34 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
<% tabs.each_with_index { |tab, index| tab.set_tab_id(tab.tab_id, index) } %>
|
|
2
|
+
<% initial_tab = active_tab.presence || tabs.first&.tab_id %>
|
|
3
|
+
|
|
4
|
+
<div
|
|
5
|
+
class="lesli-tabs min-w-0<%= " flex items-start gap-6" if vertical %>"
|
|
6
|
+
x-data="{
|
|
7
|
+
activeTab: '<%= j(initial_tab.to_s) %>',
|
|
8
|
+
focusTab(event, offset) {
|
|
9
|
+
const tabs = Array.from(event.currentTarget.closest('[role=tablist]').querySelectorAll('[role=tab]'));
|
|
10
|
+
const currentIndex = tabs.indexOf(event.currentTarget);
|
|
11
|
+
const nextTab = tabs[(currentIndex + offset + tabs.length) % tabs.length];
|
|
12
|
+
|
|
13
|
+
nextTab.focus();
|
|
14
|
+
nextTab.click();
|
|
15
|
+
}
|
|
16
|
+
}">
|
|
17
|
+
|
|
18
|
+
<div class="<%= vertical ? "w-48 shrink-0" : "overflow-x-auto" %>">
|
|
19
|
+
<div
|
|
20
|
+
class="<%= vertical ? "flex w-full flex-col border-r border-slate-200" : "flex min-w-max border-b border-slate-200" %>"
|
|
21
|
+
role="tablist"
|
|
22
|
+
aria-orientation="<%= vertical ? "vertical" : "horizontal" %>">
|
|
23
|
+
|
|
24
|
+
<% tabs.each do |tab| %>
|
|
25
|
+
<button
|
|
26
|
+
id="<%= tab.tab_id %>-tab"
|
|
27
|
+
class="inline-flex min-h-11 cursor-pointer items-center gap-2 whitespace-nowrap px-4 py-2.5 text-sm font-medium transition-colors duration-150 focus:outline-none focus-visible:z-10 focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-inset <%= vertical ? "-mr-px w-full border-r-2 text-left" : "-mb-px justify-center border-b-2" %>"
|
|
28
|
+
type="button"
|
|
29
|
+
role="tab"
|
|
30
|
+
aria-controls="<%= tab.tab_id %>"
|
|
31
|
+
:aria-selected="activeTab === '<%= j(tab.tab_id) %>'"
|
|
32
|
+
:tabindex="activeTab === '<%= j(tab.tab_id) %>' ? 0 : -1"
|
|
33
|
+
:class="{
|
|
34
|
+
'border-blue-600 text-blue-700': activeTab === '<%= j(tab.tab_id) %>',
|
|
35
|
+
'border-transparent text-slate-500 hover:text-slate-700': activeTab !== '<%= j(tab.tab_id) %>'
|
|
36
|
+
}"
|
|
37
|
+
@click="activeTab = '<%= j(tab.tab_id) %>'"
|
|
38
|
+
@keydown.right.prevent="focusTab($event, 1)"
|
|
39
|
+
@keydown.down.prevent="focusTab($event, 1)"
|
|
40
|
+
@keydown.left.prevent="focusTab($event, -1)"
|
|
41
|
+
@keydown.up.prevent="focusTab($event, -1)">
|
|
42
|
+
|
|
43
|
+
<% if tab.icon %>
|
|
44
|
+
<span class="material-symbols-outlined text-xl leading-none" aria-hidden="true">
|
|
45
|
+
<%= tab.icon %>
|
|
19
46
|
</span>
|
|
20
|
-
|
|
21
|
-
|
|
47
|
+
<% end %>
|
|
48
|
+
|
|
49
|
+
<span><%= tab.title %></span>
|
|
50
|
+
</button>
|
|
22
51
|
<% end %>
|
|
23
|
-
</
|
|
52
|
+
</div>
|
|
24
53
|
</div>
|
|
25
|
-
|
|
26
|
-
|
|
54
|
+
|
|
55
|
+
<div class="min-w-0 flex-1<%= " pt-5" unless vertical %>">
|
|
56
|
+
<% tabs.each do |tab| %>
|
|
27
57
|
<div
|
|
28
58
|
id="<%= tab.tab_id %>"
|
|
29
|
-
class="
|
|
30
|
-
|
|
31
|
-
|
|
59
|
+
class="min-w-0"
|
|
60
|
+
role="tabpanel"
|
|
61
|
+
aria-labelledby="<%= tab.tab_id %>-tab"
|
|
62
|
+
tabindex="0"
|
|
63
|
+
x-show="activeTab === '<%= j(tab.tab_id) %>'"
|
|
64
|
+
x-transition.opacity.duration.150ms
|
|
32
65
|
x-cloak>
|
|
33
66
|
<%= tab %>
|
|
34
67
|
</div>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
=begin
|
|
2
|
-
<%= render LesliView::
|
|
3
|
-
<% tabs.with_tab(
|
|
2
|
+
<%= render LesliView::Components::Tabs.new(active_tab: "tab1") do |tabs| %>
|
|
3
|
+
<% tabs.with_tab(id: "tab1", title: "Tab 1") do %>
|
|
4
4
|
hola
|
|
5
5
|
<% end %>
|
|
6
|
-
<% tabs.with_tab(
|
|
7
|
-
<% tabs.with_tab(
|
|
8
|
-
<% tabs.with_tab(
|
|
9
|
-
<% tabs.with_tab(
|
|
10
|
-
<% tabs.with_tab(
|
|
6
|
+
<% tabs.with_tab(id: "tab2", title: "Tab 2") %>
|
|
7
|
+
<% tabs.with_tab(id: "tab3", title: "Tab 3") %>
|
|
8
|
+
<% tabs.with_tab(id: "tab4", title: "Tab 4", icon: "save") %>
|
|
9
|
+
<% tabs.with_tab(id: "tab5", title: "Tab 5", icon: "edit") %>
|
|
10
|
+
<% tabs.with_tab(id: "tab6", title: "Tab 6", icon: "delete") %>
|
|
11
11
|
<% end %>
|
|
12
12
|
=end
|
|
13
13
|
|
|
@@ -1,26 +1,29 @@
|
|
|
1
|
-
<div class="lesli-timelines">
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<
|
|
6
|
-
<
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
</
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
<div class="lesli-timelines py-6">
|
|
2
|
+
<ul class="m-0 w-full list-none p-0">
|
|
3
|
+
<% activities.each do |activity| %>
|
|
4
|
+
<li class="group grid grid-cols-[1.5rem_minmax(0,1fr)] gap-x-4 md:grid-cols-[minmax(8rem,auto)_1.5rem_minmax(0,1fr)] md:gap-x-6">
|
|
5
|
+
<div class="col-start-2 mb-2 min-w-0 text-xs font-bold uppercase tracking-[0.2em] text-slate-500 md:col-start-1 md:row-start-1 md:mb-0 md:pt-1 md:text-right">
|
|
6
|
+
<span><%= activity['date'] %></span>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div class="relative col-start-1 row-span-2 row-start-1 flex justify-center md:col-start-2">
|
|
10
|
+
<span
|
|
11
|
+
class="material-symbols-outlined relative z-10 bg-white text-xl leading-none text-[var(--lesli-color-primary)]"
|
|
12
|
+
aria-hidden="true">
|
|
13
|
+
<%= icons.dig(activity['icon']&.to_sym) || 'radio_button_checked' %>
|
|
14
|
+
</span>
|
|
15
|
+
<span class="absolute top-7 bottom-0 left-1/2 w-px -translate-x-1/2 bg-slate-300 group-last:hidden" aria-hidden="true"></span>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="col-start-2 row-start-2 min-w-0 pb-10 md:col-start-3 md:row-start-1">
|
|
19
|
+
<h6 class="text-base font-semibold text-slate-800">
|
|
20
|
+
<%= activity['operation'] %>
|
|
21
|
+
</h6>
|
|
22
|
+
<p class="mt-1 text-sm leading-6 text-slate-600">
|
|
23
|
+
<%= activity['description'] %>
|
|
24
|
+
</p>
|
|
25
|
+
</div>
|
|
26
|
+
</li>
|
|
27
|
+
<% end %>
|
|
28
|
+
</ul>
|
|
26
29
|
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
<figure class="lesli-element-avatar
|
|
1
|
+
<figure class="lesli-element-avatar <%= avatar_size %> flex shrink-0 items-center justify-center overflow-hidden rounded-full border-[0.1px] border-slate-400 bg-slate-100">
|
|
2
2
|
<% if image %>
|
|
3
|
-
<img src="<%= image %>" alt="Avatar image">
|
|
3
|
+
<img class="h-full w-full object-cover" src="<%= image %>" alt="Avatar image">
|
|
4
4
|
<% else %>
|
|
5
|
-
<span class="
|
|
5
|
+
<span class="font-bold text-slate-700 <%= font_size %>"><%= letter %></span>
|
|
6
6
|
<% end %>
|
|
7
7
|
</figure>
|
|
@@ -32,7 +32,7 @@ Building a better future, one line of code at a time.
|
|
|
32
32
|
module LesliView
|
|
33
33
|
module Elements
|
|
34
34
|
class Avatar < ViewComponent::Base
|
|
35
|
-
attr_reader :image, :name, :size, :letter, :font_size, :
|
|
35
|
+
attr_reader :image, :name, :size, :letter, :font_size, :avatar_size
|
|
36
36
|
|
|
37
37
|
def initialize(image: nil, name: "", size: "medium")
|
|
38
38
|
@image = image
|
|
@@ -40,7 +40,7 @@ module LesliView
|
|
|
40
40
|
@size = size
|
|
41
41
|
@letter = ""
|
|
42
42
|
@font_size = ""
|
|
43
|
-
@
|
|
43
|
+
@avatar_size = ""
|
|
44
44
|
calculate_size
|
|
45
45
|
get_letter unless @image
|
|
46
46
|
end
|
|
@@ -51,14 +51,14 @@ module LesliView
|
|
|
51
51
|
def calculate_size
|
|
52
52
|
case size
|
|
53
53
|
when "small"
|
|
54
|
-
@font_size = "
|
|
55
|
-
@
|
|
54
|
+
@font_size = "text-xl"
|
|
55
|
+
@avatar_size = "size-[60px]"
|
|
56
56
|
when "medium"
|
|
57
|
-
@font_size = "
|
|
58
|
-
@
|
|
57
|
+
@font_size = "text-[2rem]"
|
|
58
|
+
@avatar_size = "size-[120px]"
|
|
59
59
|
when "large"
|
|
60
|
-
@font_size = "
|
|
61
|
-
@
|
|
60
|
+
@font_size = "text-5xl"
|
|
61
|
+
@avatar_size = "size-[180px]"
|
|
62
62
|
else
|
|
63
63
|
raise ArgumentError, "Invalid size: #{size}"
|
|
64
64
|
end
|
|
@@ -38,7 +38,6 @@ module LesliView
|
|
|
38
38
|
def password_field(method, options = {})
|
|
39
39
|
options = options.symbolize_keys
|
|
40
40
|
options[:class] = merge_css_classes("lesli-form-input", options[:class])
|
|
41
|
-
options[:value] = @object.public_send(method) if @object && !options.key?(:value)
|
|
42
41
|
super(method, options)
|
|
43
42
|
end
|
|
44
43
|
|
|
@@ -29,10 +29,8 @@ Building a better future, one line of code at a time.
|
|
|
29
29
|
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
30
|
// ·
|
|
31
31
|
%>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
<%= render(LesliView::Components::Timeline.new(activities:@activities, icons:@icons)) %>
|
|
32
|
+
<article
|
|
33
|
+
class="lesli-items-activities bg-white p-4 sm:p-8"
|
|
34
|
+
id="lesli-items-activities">
|
|
35
|
+
<%= render(LesliView::Components::Timeline.new(activities: @activities, icons: @icons)) %>
|
|
37
36
|
</article>
|
|
38
|
-
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
<
|
|
2
|
-
<div class="
|
|
3
|
-
<strong>Luis Donis</strong>
|
|
1
|
+
<li class="lesli-items-discussions-comments-comment flex flex-col gap-3 border-b border-slate-200 pb-6 last:border-b-0 last:pb-0 sm:flex-row sm:gap-4">
|
|
2
|
+
<div class="shrink-0 text-sm leading-5 text-slate-500 sm:w-40 sm:text-right">
|
|
3
|
+
<strong class="block font-semibold text-slate-800">Luis Donis</strong>
|
|
4
4
|
<%= discussion['created_at_string'] || Date2.new.date_time %>
|
|
5
5
|
</div>
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
<div class="lexxy-content min-w-0 flex-1 break-words text-slate-700">
|
|
7
8
|
<%== discussion.message %>
|
|
8
9
|
</div>
|
|
9
|
-
</
|
|
10
|
+
</li>
|
|
@@ -29,8 +29,8 @@ Building a better future, one line of code at a time.
|
|
|
29
29
|
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
30
|
// ·
|
|
31
31
|
%>
|
|
32
|
-
<article class="lesli-items-discussions" id="lesli-items-discussions">
|
|
33
|
-
<div class="lesli-items-discussions-form">
|
|
32
|
+
<article class="lesli-items-discussions bg-white p-4 sm:p-8" id="lesli-items-discussions">
|
|
33
|
+
<div class="lesli-items-discussions-form p-4">
|
|
34
34
|
<% discussion_class = "#{@resource.class.name.deconstantize}::Items::Discussion".constantize %>
|
|
35
35
|
<% scope_key = ActiveSupport::Inflector.underscore(discussion_class.name).tr("/", "_") %>
|
|
36
36
|
<%= form_with(
|
|
@@ -45,13 +45,15 @@ Building a better future, one line of code at a time.
|
|
|
45
45
|
<%= form.field_control_submit("Add comment") %>
|
|
46
46
|
<% end %>
|
|
47
47
|
</div>
|
|
48
|
-
<hr
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
<hr class="my-6 border-0 border-t border-slate-200">
|
|
49
|
+
|
|
50
|
+
<div class="lesli-items-discussions-container p-4">
|
|
51
|
+
<ul
|
|
52
|
+
id="<%= "#{scope_key}-lesli-items-discussions-list" %>"
|
|
53
|
+
class="m-0 list-none space-y-6 p-0">
|
|
51
54
|
<% @resource.discussions.order(created_at: :desc).each do |comment| %>
|
|
52
55
|
<%= render(LesliView::Items::Discussion.new(comment)) %>
|
|
53
56
|
<% end %>
|
|
54
57
|
</ul>
|
|
55
58
|
</div>
|
|
56
59
|
</article>
|
|
57
|
-
|
|
@@ -30,9 +30,9 @@ Building a better future, one line of code at a time.
|
|
|
30
30
|
// ·
|
|
31
31
|
%>
|
|
32
32
|
|
|
33
|
-
<li
|
|
33
|
+
<li
|
|
34
34
|
id="<%= dom_id(@resource, @scope_key) %>"
|
|
35
|
-
class="lesli-items-tasks-item
|
|
35
|
+
class="lesli-items-tasks-item rounded-xl border transition-colors <%= @resource.done ? "lesli-items-tasks-task-done cursor-not-allowed border-slate-200 bg-slate-50" : "border-slate-200 hover:border-slate-300 hover:bg-slate-50" %>">
|
|
36
36
|
<%= form_with(
|
|
37
37
|
url: helpers.polymorphic_path(@resource),
|
|
38
38
|
method: :patch,
|
|
@@ -40,16 +40,21 @@ Building a better future, one line of code at a time.
|
|
|
40
40
|
local: true
|
|
41
41
|
) do |form| %>
|
|
42
42
|
<%= form.hidden_field :id, value: @resource.id %>
|
|
43
|
-
<%= form.button
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
<%= form.button(
|
|
44
|
+
type: "submit",
|
|
45
|
+
disabled: @resource.done?,
|
|
46
|
+
class: "flex w-full cursor-pointer items-center rounded-xl px-4 py-3 text-left text-sm font-medium text-slate-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--lesli-color-primary)] disabled:cursor-not-allowed"
|
|
47
|
+
) do %>
|
|
48
|
+
<span class="flex min-w-0 items-center gap-3">
|
|
49
|
+
<span
|
|
50
|
+
class="material-symbols-outlined shrink-0 text-xl leading-none <%= @resource.done ? "text-slate-400" : "text-[var(--lesli-color-primary)]" %>"
|
|
51
|
+
aria-hidden="true">
|
|
52
|
+
<%= @resource.done ? "check_box" : "check_box_outline_blank" %>
|
|
49
53
|
</span>
|
|
50
|
-
<span
|
|
51
|
-
|
|
54
|
+
<span class="min-w-0 break-words <%= "text-slate-500 line-through" if @resource.done %>">
|
|
55
|
+
<%= @resource.title %>
|
|
56
|
+
</span>
|
|
57
|
+
</span>
|
|
52
58
|
<% end %>
|
|
53
59
|
<% end %>
|
|
54
60
|
</li>
|
|
55
|
-
|
|
@@ -29,16 +29,9 @@ Building a better future, one line of code at a time.
|
|
|
29
29
|
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
30
|
// ·
|
|
31
31
|
%>
|
|
32
|
-
<
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
text-decoration: line-through;
|
|
36
|
-
opacity: 0.6;
|
|
37
|
-
cursor: not-allowed;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
</style>
|
|
41
|
-
<article class="lesli-items-tasks box p-6" id="<%= dom_id(@resource, :tasks) %>">
|
|
32
|
+
<article
|
|
33
|
+
class="lesli-items-tasks rounded-2xl border border-slate-200 bg-white p-6 shadow-sm"
|
|
34
|
+
id="<%= dom_id(@resource, :tasks) %>">
|
|
42
35
|
<div class="lesli-items-tasks-form">
|
|
43
36
|
<% task_class = "#{@resource.class.name.deconstantize}::Items::Task".constantize %>
|
|
44
37
|
<% scope_key = ActiveSupport::Inflector.underscore(task_class.name).tr("/", "_") %>
|
|
@@ -54,13 +47,15 @@ Building a better future, one line of code at a time.
|
|
|
54
47
|
<%= form.field_control_submit "Add task" %>
|
|
55
48
|
<% end %>
|
|
56
49
|
</div>
|
|
57
|
-
<hr>
|
|
50
|
+
<hr class="my-6 border-0 border-t border-slate-200">
|
|
51
|
+
|
|
58
52
|
<div class="lesli-items-tasks-container">
|
|
59
|
-
<ul
|
|
53
|
+
<ul
|
|
54
|
+
id="<%= "#{scope_key}-lesli-items-tasks-list" %>"
|
|
55
|
+
class="m-0 list-none space-y-3 p-0">
|
|
60
56
|
<% @resource.tasks.each do |task| %>
|
|
61
57
|
<%= render(LesliView::Items::Task.new(task, scope_key)) %>
|
|
62
58
|
<% end %>
|
|
63
59
|
</ul>
|
|
64
60
|
</div>
|
|
65
61
|
</article>
|
|
66
|
-
|
|
@@ -1,51 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
<style>
|
|
3
|
-
.partial-engine-spec div {
|
|
4
|
-
border-bottom: 1px solid silver;
|
|
5
|
-
}
|
|
6
|
-
.partial-engine-spec li {
|
|
7
|
-
font-size: 1.1rem;
|
|
8
|
-
margin-left: .4rem;
|
|
9
|
-
}
|
|
10
|
-
</style>
|
|
11
1
|
<div class="partial-engine-spec">
|
|
12
|
-
<div class="mb-
|
|
13
|
-
<h5 class="
|
|
14
|
-
<p class="
|
|
2
|
+
<div class="mb-4 border-b border-slate-300 pb-3">
|
|
3
|
+
<h5 class="text-xl font-semibold text-slate-800"><%= engine[:name] %></h5>
|
|
4
|
+
<p class="mt-1 text-xl leading-7 text-slate-600"><%= engine[:summary] %></p>
|
|
15
5
|
</div>
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
</span>
|
|
22
|
-
<span></span>
|
|
6
|
+
|
|
7
|
+
<ul class="m-0 list-none space-y-2 p-0">
|
|
8
|
+
<li class="ml-1.5 flex items-center gap-2 text-[1.1rem] text-slate-600">
|
|
9
|
+
<span class="material-symbols shrink-0 text-2xl leading-none text-slate-400" aria-hidden="true">
|
|
10
|
+
pest_control
|
|
23
11
|
</span>
|
|
24
|
-
Version: <%= engine[:version]
|
|
12
|
+
<span>Version: <%= engine[:version] %></span>
|
|
25
13
|
</li>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
</span>
|
|
31
|
-
<span></span>
|
|
14
|
+
|
|
15
|
+
<li class="ml-1.5 flex items-center gap-2 text-[1.1rem] text-slate-600">
|
|
16
|
+
<span class="material-symbols shrink-0 text-2xl leading-none text-slate-400" aria-hidden="true">
|
|
17
|
+
schedule
|
|
32
18
|
</span>
|
|
33
|
-
Build: <%= LesliDate::Formatter.new(Time.at(engine[:build].to_i)).date_time
|
|
19
|
+
<span>Build: <%= LesliDate::Formatter.new(Time.at(engine[:build].to_i)).date_time %></span>
|
|
34
20
|
</li>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
21
|
+
|
|
22
|
+
<li class="ml-1.5 flex min-w-0 items-center gap-2 text-[1.1rem] text-slate-600">
|
|
23
|
+
<span class="material-symbols shrink-0 text-2xl leading-none text-slate-400" aria-hidden="true">
|
|
24
|
+
library_books
|
|
25
|
+
</span>
|
|
26
|
+
<span class="min-w-0 break-all">
|
|
27
|
+
<%= link_to_if(
|
|
28
|
+
engine.dig(:metadata, "documentation_uri"),
|
|
29
|
+
engine.dig(:metadata, "documentation_uri"),
|
|
30
|
+
engine.dig(:metadata, "documentation_uri"),
|
|
31
|
+
target: "_blank",
|
|
32
|
+
rel: "noopener noreferrer",
|
|
33
|
+
class: "font-sans text-[var(--lesli-color-primary)] underline-offset-4 hover:underline focus-visible:rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--lesli-color-primary)]"
|
|
34
|
+
) %>
|
|
41
35
|
</span>
|
|
42
|
-
<%= link_to_if(
|
|
43
|
-
engine.dig(:metadata, "documentation_uri"),
|
|
44
|
-
engine.dig(:metadata, "documentation_uri"),
|
|
45
|
-
engine.dig(:metadata, "documentation_uri"),
|
|
46
|
-
target: "_blank",
|
|
47
|
-
class: "is-family-sans-serif"
|
|
48
|
-
) %>
|
|
49
36
|
</li>
|
|
50
37
|
</ul>
|
|
51
38
|
</div>
|
data/lib/lesli_view/version.rb
CHANGED