coveragebook_components 0.7.10 → 0.8.0.beta.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 +4 -4
- data/app/assets/build/coco/app.css +1065 -148
- data/app/assets/build/coco/app.js +255 -47
- data/app/assets/build/coco/book.css +26 -0
- data/app/assets/css/app/tippy.css +4 -0
- data/app/components/coco/app/blocks/header/header.css +43 -0
- data/app/components/coco/app/blocks/header/header.html.erb +30 -0
- data/app/components/coco/app/blocks/header/header.js +11 -0
- data/app/components/coco/app/blocks/header/header.rb +35 -0
- data/app/components/coco/app/blocks/nav_drawer/nav_drawer.css +48 -3
- data/app/components/coco/app/blocks/nav_drawer/nav_drawer.html.erb +14 -6
- data/app/components/coco/app/blocks/nav_drawer/nav_drawer.js +18 -1
- data/app/components/coco/app/blocks/nav_drawer/nav_drawer.rb +26 -1
- data/app/components/coco/app/blocks/sidebar_nav/sidebar_nav.css +104 -0
- data/app/components/coco/app/blocks/sidebar_nav/sidebar_nav.html.erb +42 -0
- data/app/components/coco/app/blocks/sidebar_nav/sidebar_nav.js +28 -0
- data/app/components/coco/app/blocks/sidebar_nav/sidebar_nav.rb +28 -0
- data/app/components/coco/app/blocks/sidebar_nav_item/sidebar_nav_item.css +165 -0
- data/app/components/coco/app/blocks/sidebar_nav_item/sidebar_nav_item.html.erb +43 -0
- data/app/components/coco/app/blocks/sidebar_nav_item/sidebar_nav_item.js +41 -0
- data/app/components/coco/app/blocks/sidebar_nav_item/sidebar_nav_item.rb +98 -0
- data/app/components/coco/app/elements/alert/alert.css +65 -18
- data/app/components/coco/app/elements/alert/alert.html.erb +4 -4
- data/app/components/coco/app/elements/alert/alert.js +4 -3
- data/app/components/coco/app/elements/alert/alert.rb +10 -0
- data/app/components/coco/app/elements/button/button.css +58 -0
- data/app/components/coco/app/elements/button/button.rb +1 -1
- data/app/components/coco/app/elements/button_group/button_group.rb +4 -0
- data/app/components/coco/app/elements/color_picker/color_picker.rb +1 -1
- data/app/components/coco/app/elements/menu/menu.css +1 -0
- data/app/components/coco/app/elements/menu/menu.html.erb +1 -1
- data/app/components/coco/app/elements/menu/menu.rb +2 -1
- data/app/components/coco/app/elements/menu_items/user_profile/user_profile.css +22 -0
- data/app/components/coco/app/elements/menu_items/user_profile/user_profile.html.erb +17 -0
- data/app/components/coco/app/elements/menu_items/user_profile/user_profile.rb +20 -0
- data/app/components/coco/app/elements/notice/notice.css +4 -0
- data/app/components/coco/app/elements/snackbar/snackbar.css +8 -1
- data/app/components/coco/app/elements/snackbar/snackbar.rb +2 -2
- data/app/components/coco/app/elements/system_banner/system_banner.html.erb +2 -1
- data/app/components/coco/app/elements/system_banner/system_banner.js +35 -2
- data/app/components/coco/app/elements/system_banner/system_banner.rb +47 -3
- data/app/components/coco/app/layouts/application/application.css +104 -4
- data/app/components/coco/app/layouts/application/application.html.erb +28 -7
- data/app/components/coco/app/layouts/application/application.js +16 -0
- data/app/components/coco/app/layouts/application/application.rb +11 -3
- data/app/components/coco/base/avatar/avatar.css +25 -0
- data/app/components/coco/base/avatar/avatar.rb +20 -0
- data/app/components/coco/base/modal/modal.html.erb +1 -1
- data/app/components/coco/concerns/accepts_tag_attributes.rb +6 -2
- data/app/components/coco/concerns/acts_as_button_group.rb +5 -0
- data/app/helpers/coco/app_helper.rb +16 -0
- data/app/helpers/coco/base_helper.rb +4 -0
- data/config/tokens.cjs +4 -1
- data/lib/coco.rb +1 -1
- metadata +22 -10
- data/app/components/coco/app/blocks/banner/banner.css +0 -5
- data/app/components/coco/app/blocks/banner/banner.rb +0 -8
- data/app/components/coco/app/blocks/nav_bar/nav_bar.css +0 -51
- data/app/components/coco/app/blocks/nav_bar/nav_bar.html.erb +0 -23
- data/app/components/coco/app/blocks/nav_bar/nav_bar.js +0 -31
- data/app/components/coco/app/blocks/nav_bar/nav_bar.rb +0 -19
@@ -1,9 +1,109 @@
|
|
1
1
|
@layer components {
|
2
|
-
[data-coco][data-component="
|
3
|
-
@apply grid
|
2
|
+
[data-coco][data-component="application-layout"] {
|
3
|
+
@apply grid overflow-hidden absolute inset-0 w-screen;
|
4
|
+
height: var(--app-height);
|
4
5
|
|
5
|
-
|
6
|
-
|
6
|
+
grid-template-areas: "body";
|
7
|
+
grid-template-rows: 1fr;
|
8
|
+
grid-template-columns: 1fr;
|
9
|
+
|
10
|
+
&.with-header {
|
11
|
+
grid-template-areas: "header" "body";
|
12
|
+
grid-template-rows: min-content 1fr;
|
13
|
+
|
14
|
+
&.with-banner {
|
15
|
+
grid-template-areas: "header" "body" "banner";
|
16
|
+
grid-template-rows: min-content 1fr min-content;
|
17
|
+
|
18
|
+
&.with-sidebar-nav {
|
19
|
+
grid-template-areas: "header" "body" "banner" "sidebar";
|
20
|
+
grid-template-rows: min-content 1fr min-content min-content;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
&:not(.with-banner) {
|
25
|
+
&.with-sidebar-nav {
|
26
|
+
grid-template-areas: "header" "body" "sidebar";
|
27
|
+
grid-template-rows: min-content 1fr min-content;
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
&.with-sidebar-nav {
|
33
|
+
--snackbar-bottom-offset: theme(spacing.16);
|
34
|
+
}
|
35
|
+
|
36
|
+
&:not(.with-header).with-banner {
|
37
|
+
grid-template-areas: "body" "banner";
|
38
|
+
grid-template-rows: 1fr min-content;
|
39
|
+
}
|
40
|
+
|
41
|
+
.layout-banner {
|
42
|
+
@apply w-screen z-10;
|
43
|
+
grid-area: banner;
|
44
|
+
height: min-content;
|
45
|
+
}
|
46
|
+
|
47
|
+
.layout-header {
|
48
|
+
@apply w-screen z-10;
|
49
|
+
grid-area: header;
|
50
|
+
height: min-content;
|
51
|
+
}
|
52
|
+
|
53
|
+
.layout-body {
|
54
|
+
@apply relative z-0 h-full overflow-y-auto scroll-smooth;
|
55
|
+
grid-area: body;
|
56
|
+
}
|
57
|
+
|
58
|
+
.layout-sidebar-nav {
|
59
|
+
@apply scroll-smooth;
|
60
|
+
scrollbar-width: none;
|
61
|
+
grid-area: sidebar;
|
62
|
+
height: min-content;
|
63
|
+
|
64
|
+
&::-webkit-scrollbar {
|
65
|
+
display: none;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
@media screen(sm) {
|
70
|
+
.layout-sidebar-nav {
|
71
|
+
@apply h-full overflow-auto;
|
72
|
+
width: min-content;
|
73
|
+
|
74
|
+
> * {
|
75
|
+
@apply h-full;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
grid-template-areas: "body";
|
80
|
+
grid-template-rows: 1fr;
|
81
|
+
|
82
|
+
&.with-sidebar-nav {
|
83
|
+
--snackbar-bottom-offset: theme(spacing.10);
|
84
|
+
}
|
85
|
+
|
86
|
+
&.with-header {
|
87
|
+
&.with-banner {
|
88
|
+
grid-template-areas: "banner" "header" "body";
|
89
|
+
grid-template-rows: min-content min-content 1fr;
|
90
|
+
grid-template-columns: 1fr;
|
91
|
+
|
92
|
+
&.with-sidebar-nav {
|
93
|
+
grid-template-areas: "banner banner" "header header" "sidebar body";
|
94
|
+
grid-template-rows: min-content min-content 1fr;
|
95
|
+
grid-template-columns: min-content 1fr;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
&:not(.with-banner) {
|
100
|
+
&.with-sidebar-nav {
|
101
|
+
grid-template-areas: "header header" "sidebar body";
|
102
|
+
grid-template-rows: min-content 1fr;
|
103
|
+
grid-template-columns: min-content 1fr;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
7
107
|
}
|
8
108
|
}
|
9
109
|
}
|
@@ -1,9 +1,30 @@
|
|
1
|
-
<%= render component_tag
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
<%= render component_tag(
|
2
|
+
x: {
|
3
|
+
data: x_data("appLayout", banner: banner? && banner_content?),
|
4
|
+
":class": "{'with-banner': banner}"
|
5
|
+
},
|
6
|
+
class: {
|
7
|
+
"with-sidebar-nav": sidebar_nav?,
|
8
|
+
"with-banner": banner? && banner_content?,
|
9
|
+
"with-header": header?
|
10
|
+
}) do %>
|
11
|
+
<% if banner? && banner_content? %>
|
12
|
+
<div class="layout-banner" data-role="app-banner" role="banner" @banner:dismiss="hideBanner">
|
13
|
+
<%= banner %>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
<% if header? %>
|
17
|
+
<div class="layout-header" data-role="app-header">
|
18
|
+
<%= header %>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
21
|
+
<% if sidebar_nav? %>
|
22
|
+
<div class="layout-sidebar-nav" data-role="app-sidebar-nav">
|
23
|
+
<%= sidebar_nav %>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
26
|
+
<div class="layout-body" data-role="app-body">
|
7
27
|
<%= content %>
|
8
|
-
</
|
28
|
+
</div>
|
29
|
+
<%= flashes %>
|
9
30
|
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { CocoComponent } from "@js/coco";
|
2
|
+
|
3
|
+
export default CocoComponent("appLayout", (opts) => {
|
4
|
+
return {
|
5
|
+
banner: false,
|
6
|
+
|
7
|
+
init() {
|
8
|
+
this.banner = opts.banner;
|
9
|
+
},
|
10
|
+
|
11
|
+
hideBanner() {
|
12
|
+
this.banner = false;
|
13
|
+
this.$el.remove();
|
14
|
+
},
|
15
|
+
};
|
16
|
+
});
|
@@ -2,10 +2,18 @@ module Coco
|
|
2
2
|
module App
|
3
3
|
module Layouts
|
4
4
|
class Application < Coco::Component
|
5
|
-
|
6
|
-
renders_one :navbar, Blocks::NavBar
|
5
|
+
include Concerns::AcceptsOptions
|
7
6
|
|
8
|
-
|
7
|
+
renders_one :flashes
|
8
|
+
renders_one :banner
|
9
|
+
renders_one :header
|
10
|
+
renders_one :sidebar_nav
|
11
|
+
|
12
|
+
component_name :application_layout
|
13
|
+
|
14
|
+
def banner_content?
|
15
|
+
banner.to_s.strip != ""
|
16
|
+
end
|
9
17
|
end
|
10
18
|
end
|
11
19
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
@layer components {
|
2
|
+
[data-coco][data-component="avatar"] {
|
3
|
+
@apply block rounded-full overflow-hidden flex-none;
|
4
|
+
|
5
|
+
img {
|
6
|
+
@apply w-full rounded-full;
|
7
|
+
}
|
8
|
+
|
9
|
+
&[data-size="sm"] {
|
10
|
+
@apply w-5 h-5;
|
11
|
+
}
|
12
|
+
|
13
|
+
&[data-size="md"] {
|
14
|
+
@apply w-6 h-6;
|
15
|
+
}
|
16
|
+
|
17
|
+
&[data-size="lg"] {
|
18
|
+
@apply w-7 h-7;
|
19
|
+
}
|
20
|
+
|
21
|
+
&[data-size="xl"] {
|
22
|
+
@apply w-8 h-8;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Coco
|
2
|
+
class Avatar < Coco::Component
|
3
|
+
include Concerns::AcceptsOptions
|
4
|
+
|
5
|
+
accepts_option :size, from: %i[sm md lg xl], default: :md
|
6
|
+
|
7
|
+
attr_reader :src, :name
|
8
|
+
|
9
|
+
def initialize(src:, name: nil, **)
|
10
|
+
@src = src
|
11
|
+
@name = name
|
12
|
+
end
|
13
|
+
|
14
|
+
def call
|
15
|
+
render component_tag do
|
16
|
+
tag.img src: src, alt: name
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -12,7 +12,7 @@
|
|
12
12
|
},
|
13
13
|
) do %>
|
14
14
|
<div class="modal-overlay" x-bind="overlay"></div>
|
15
|
-
<div class="modal-container"
|
15
|
+
<div class="modal-container" x-bind="container" x-ref="container">
|
16
16
|
<div class="modal-content" x-trap.noscroll.inert.noreturn="open">
|
17
17
|
<%= modal_content %>
|
18
18
|
</div>
|
@@ -11,8 +11,8 @@ module Coco
|
|
11
11
|
@_tag_name
|
12
12
|
end
|
13
13
|
|
14
|
-
def tag_attr(*
|
15
|
-
tag_attr_names.push(*
|
14
|
+
def tag_attr(*)
|
15
|
+
tag_attr_names.push(*)
|
16
16
|
end
|
17
17
|
|
18
18
|
def tag_attr_names
|
@@ -48,6 +48,10 @@ module Coco
|
|
48
48
|
tag_attrs.key?(attr_name)
|
49
49
|
end
|
50
50
|
|
51
|
+
def tag_attr(attr_name, fallback = nil)
|
52
|
+
tag_attrs.fetch(attr_name, fallback)
|
53
|
+
end
|
54
|
+
|
51
55
|
private
|
52
56
|
|
53
57
|
def process_tag_attrs(args)
|
@@ -14,6 +14,7 @@ module Coco
|
|
14
14
|
|
15
15
|
included do
|
16
16
|
renders_many :items, types: {
|
17
|
+
noop: -> {},
|
17
18
|
divider: ->(**kwargs) { tag.div(class: "divider") },
|
18
19
|
button: ->(*args, **kwargs, &block) { coco_button(*args, **button_kwargs(kwargs, :button), &block) },
|
19
20
|
menu_button: ->(*args, **kwargs, &block) { instantiate_button(:menu, *args, **kwargs, &block) },
|
@@ -35,6 +36,10 @@ module Coco
|
|
35
36
|
component
|
36
37
|
end
|
37
38
|
|
39
|
+
def init_button_group
|
40
|
+
with_item_noop
|
41
|
+
end
|
42
|
+
|
38
43
|
def with_divider(...)
|
39
44
|
with_item_divider(...)
|
40
45
|
end
|
@@ -95,5 +95,21 @@ module Coco
|
|
95
95
|
def coco_fields(**, &block)
|
96
96
|
fields(**, builder: Coco::AppFormBuilder, &block)
|
97
97
|
end
|
98
|
+
|
99
|
+
def coco_layout(name, **, &block)
|
100
|
+
render coco_component("app/layouts/#{name}", **), &block
|
101
|
+
end
|
102
|
+
|
103
|
+
def coco_app_header(*, **, &block)
|
104
|
+
render Coco::App::Blocks::Header.new(*, **), &block
|
105
|
+
end
|
106
|
+
|
107
|
+
def coco_sidebar_nav(*, **, &block)
|
108
|
+
render Coco::App::Blocks::SidebarNav.new(*, **), &block
|
109
|
+
end
|
110
|
+
|
111
|
+
def coco_menu_item(type, **, &block)
|
112
|
+
render coco_component("app/elements/menu_items/#{type}", **), &block
|
113
|
+
end
|
98
114
|
end
|
99
115
|
end
|
@@ -12,6 +12,10 @@ module Coco
|
|
12
12
|
render Coco::Image.new(src: src, **)
|
13
13
|
end
|
14
14
|
|
15
|
+
def coco_avatar(src, name = nil, **)
|
16
|
+
render Coco::Avatar.new(src: src, name: name, **)
|
17
|
+
end
|
18
|
+
|
15
19
|
def coco_icon(icon_name = nil, **, &block)
|
16
20
|
render Coco::Icon.new(name: icon_name, **), &block
|
17
21
|
end
|
data/config/tokens.cjs
CHANGED
@@ -90,6 +90,9 @@ const colorAliases = {
|
|
90
90
|
...colors.blue,
|
91
91
|
},
|
92
92
|
background: {
|
93
|
+
header: {
|
94
|
+
DEFAULT: "#427484",
|
95
|
+
},
|
93
96
|
light: {
|
94
97
|
1: colors.white,
|
95
98
|
2: colors.gray[50],
|
@@ -169,7 +172,7 @@ const screens = {
|
|
169
172
|
xl: "1200px",
|
170
173
|
"2xl": "1400px",
|
171
174
|
max: "1800px",
|
172
|
-
|
175
|
+
letterbox: { raw: "(max-height: 760px) and (min-width: 576px)" },
|
173
176
|
print: { raw: "print" }, // Note: PDFs are rendered at a viewport width of 1280px
|
174
177
|
};
|
175
178
|
|
data/lib/coco.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coveragebook_components
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Perkins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -1348,16 +1348,22 @@ files:
|
|
1348
1348
|
- app/assets/js/libs/alpine/utils/tippy_modifiers.js
|
1349
1349
|
- app/assets/js/libs/tippy/index.js
|
1350
1350
|
- app/assets/js/libs/tippy/plugins/hide_on_esc.js
|
1351
|
-
- app/components/coco/app/blocks/
|
1352
|
-
- app/components/coco/app/blocks/
|
1353
|
-
- app/components/coco/app/blocks/
|
1354
|
-
- app/components/coco/app/blocks/
|
1355
|
-
- app/components/coco/app/blocks/nav_bar/nav_bar.js
|
1356
|
-
- app/components/coco/app/blocks/nav_bar/nav_bar.rb
|
1351
|
+
- app/components/coco/app/blocks/header/header.css
|
1352
|
+
- app/components/coco/app/blocks/header/header.html.erb
|
1353
|
+
- app/components/coco/app/blocks/header/header.js
|
1354
|
+
- app/components/coco/app/blocks/header/header.rb
|
1357
1355
|
- app/components/coco/app/blocks/nav_drawer/nav_drawer.css
|
1358
1356
|
- app/components/coco/app/blocks/nav_drawer/nav_drawer.html.erb
|
1359
1357
|
- app/components/coco/app/blocks/nav_drawer/nav_drawer.js
|
1360
1358
|
- app/components/coco/app/blocks/nav_drawer/nav_drawer.rb
|
1359
|
+
- app/components/coco/app/blocks/sidebar_nav/sidebar_nav.css
|
1360
|
+
- app/components/coco/app/blocks/sidebar_nav/sidebar_nav.html.erb
|
1361
|
+
- app/components/coco/app/blocks/sidebar_nav/sidebar_nav.js
|
1362
|
+
- app/components/coco/app/blocks/sidebar_nav/sidebar_nav.rb
|
1363
|
+
- app/components/coco/app/blocks/sidebar_nav_item/sidebar_nav_item.css
|
1364
|
+
- app/components/coco/app/blocks/sidebar_nav_item/sidebar_nav_item.html.erb
|
1365
|
+
- app/components/coco/app/blocks/sidebar_nav_item/sidebar_nav_item.js
|
1366
|
+
- app/components/coco/app/blocks/sidebar_nav_item/sidebar_nav_item.rb
|
1361
1367
|
- app/components/coco/app/blocks/slat/slat.css
|
1362
1368
|
- app/components/coco/app/blocks/slat/slat.rb
|
1363
1369
|
- app/components/coco/app/blocks/slide_editor/slide_editor.css
|
@@ -1410,6 +1416,9 @@ files:
|
|
1410
1416
|
- app/components/coco/app/elements/menu_button/menu_button.html.erb
|
1411
1417
|
- app/components/coco/app/elements/menu_button/menu_button.js
|
1412
1418
|
- app/components/coco/app/elements/menu_button/menu_button.rb
|
1419
|
+
- app/components/coco/app/elements/menu_items/user_profile/user_profile.css
|
1420
|
+
- app/components/coco/app/elements/menu_items/user_profile/user_profile.html.erb
|
1421
|
+
- app/components/coco/app/elements/menu_items/user_profile/user_profile.rb
|
1413
1422
|
- app/components/coco/app/elements/notice/notice.css
|
1414
1423
|
- app/components/coco/app/elements/notice/notice.html.erb
|
1415
1424
|
- app/components/coco/app/elements/notice/notice.js
|
@@ -1469,7 +1478,10 @@ files:
|
|
1469
1478
|
- app/components/coco/app/fields/weekday_select_component.rb
|
1470
1479
|
- app/components/coco/app/layouts/application/application.css
|
1471
1480
|
- app/components/coco/app/layouts/application/application.html.erb
|
1481
|
+
- app/components/coco/app/layouts/application/application.js
|
1472
1482
|
- app/components/coco/app/layouts/application/application.rb
|
1483
|
+
- app/components/coco/base/avatar/avatar.css
|
1484
|
+
- app/components/coco/base/avatar/avatar.rb
|
1473
1485
|
- app/components/coco/base/button/button.css
|
1474
1486
|
- app/components/coco/base/button/button.html.erb
|
1475
1487
|
- app/components/coco/base/button/button.js
|
@@ -1593,9 +1605,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1593
1605
|
version: 3.2.0
|
1594
1606
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1595
1607
|
requirements:
|
1596
|
-
- - "
|
1608
|
+
- - ">"
|
1597
1609
|
- !ruby/object:Gem::Version
|
1598
|
-
version:
|
1610
|
+
version: 1.3.1
|
1599
1611
|
requirements: []
|
1600
1612
|
rubygems_version: 3.4.19
|
1601
1613
|
signing_key:
|
@@ -1,51 +0,0 @@
|
|
1
|
-
@layer components {
|
2
|
-
[data-coco][data-component="app-navbar"] {
|
3
|
-
@apply @container;
|
4
|
-
|
5
|
-
.nav-content {
|
6
|
-
@apply h-11 @lg:h-14 flex items-center bg-teal-700 px-app;
|
7
|
-
}
|
8
|
-
|
9
|
-
.nav-logo {
|
10
|
-
@apply flex-none mr-8;
|
11
|
-
}
|
12
|
-
|
13
|
-
.nav-logo-small {
|
14
|
-
@apply h-6 @lg:hidden;
|
15
|
-
}
|
16
|
-
|
17
|
-
.nav-logo-full {
|
18
|
-
@apply hidden @lg:block h-7;
|
19
|
-
}
|
20
|
-
|
21
|
-
.nav-links {
|
22
|
-
@apply flex items-center w-full overflow-hidden;
|
23
|
-
}
|
24
|
-
|
25
|
-
.nav-link-group {
|
26
|
-
@apply flex items-center gap-x-6;
|
27
|
-
|
28
|
-
.nav-button {
|
29
|
-
> .button-inner {
|
30
|
-
@apply whitespace-nowrap text-white gap-2 text-label-sm @5xl:text-label-md py-2;
|
31
|
-
}
|
32
|
-
|
33
|
-
[data-component="icon"] {
|
34
|
-
@apply w-4 h-4;
|
35
|
-
}
|
36
|
-
}
|
37
|
-
}
|
38
|
-
|
39
|
-
.nav-secondary {
|
40
|
-
@apply ml-auto;
|
41
|
-
}
|
42
|
-
|
43
|
-
.nav-mobile-controls {
|
44
|
-
@apply flex items-center ml-auto text-white -mr-2;
|
45
|
-
|
46
|
-
[data-component="app-button"] {
|
47
|
-
@apply p-2;
|
48
|
-
}
|
49
|
-
}
|
50
|
-
}
|
51
|
-
}
|
@@ -1,23 +0,0 @@
|
|
1
|
-
<%= render component_tag(x: {data: "appNavBar"}) do %>
|
2
|
-
<div class="nav-content">
|
3
|
-
<div class="nav-logo">
|
4
|
-
<%= image_tag asset_url("coco/img/coveragebook-logomark-white.svg"),
|
5
|
-
alt: "CoverageBook logomark",
|
6
|
-
class: "nav-logo-small" %>
|
7
|
-
<%= image_tag asset_url("coco/img/coveragebook-landscape-white.svg"),
|
8
|
-
alt: "CoverageBook full logo",
|
9
|
-
class: "nav-logo-full" %>
|
10
|
-
</div>
|
11
|
-
<div class="nav-links" x-ref="links">
|
12
|
-
<div class="nav-link-group nav-primary" x-ref="primaryLinks" x-show="!mobile" x-cloak>
|
13
|
-
<%= safe_join(primary_buttons) %>
|
14
|
-
</div>
|
15
|
-
<div class="nav-link-group nav-secondary" x-ref="secondaryLinks" x-show="!mobile" x-cloak>
|
16
|
-
<%= safe_join(secondary_buttons) %>
|
17
|
-
</div>
|
18
|
-
<div class="nav-mobile-controls" x-show="mobile" x-cloak>
|
19
|
-
<%= coco_button(icon: :menu, theme: nil) %>
|
20
|
-
</div>
|
21
|
-
</div>
|
22
|
-
</div>
|
23
|
-
<% end %>
|
@@ -1,31 +0,0 @@
|
|
1
|
-
import { CocoComponent } from "@js/coco";
|
2
|
-
import { getHiddenElementDimensions as getSize } from "@helpers/dom";
|
3
|
-
import tokens from "@config/tokens.cjs";
|
4
|
-
|
5
|
-
export default CocoComponent("appNavBar", () => {
|
6
|
-
const mobileMaxWidth = parseInt(tokens.app.screens.md, 10);
|
7
|
-
return {
|
8
|
-
mobile: true,
|
9
|
-
init() {
|
10
|
-
const sizeObserver = new ResizeObserver(
|
11
|
-
Alpine.throttle((entries) => {
|
12
|
-
this.$nextTick(() => {
|
13
|
-
const navWidth = entries[0].contentRect.width;
|
14
|
-
const linksWidth = this.$refs.links.offsetWidth;
|
15
|
-
const primaryWidth = getSize(this.$refs.primaryLinks, "flex").width;
|
16
|
-
const secondaryWidth = getSize(
|
17
|
-
this.$refs.secondaryLinks,
|
18
|
-
"flex"
|
19
|
-
).width;
|
20
|
-
const difference = linksWidth - primaryWidth - secondaryWidth;
|
21
|
-
|
22
|
-
this.mobile =
|
23
|
-
navWidth < mobileMaxWidth || this.mobudifference <= 50;
|
24
|
-
});
|
25
|
-
}, 20)
|
26
|
-
);
|
27
|
-
|
28
|
-
sizeObserver.observe(this.$root);
|
29
|
-
},
|
30
|
-
};
|
31
|
-
});
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Coco
|
2
|
-
module App
|
3
|
-
module Blocks
|
4
|
-
class NavBar < Coco::Component
|
5
|
-
include Coco::AppHelper
|
6
|
-
|
7
|
-
component_name :app_navbar
|
8
|
-
|
9
|
-
renders_many :primary_buttons, ->(*a, **k, &b) { nav_button(*a, **k, &b) }
|
10
|
-
|
11
|
-
renders_many :secondary_buttons, ->(*a, **k, &b) { nav_button(*a, **k, &b) }
|
12
|
-
|
13
|
-
def nav_button(*args, **kwargs, &block)
|
14
|
-
coco_button(*args, **kwargs, theme: nil, size: nil, class: "nav-button", &block)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|