studio-engine 0.106.0 → 0.107.0.rc1
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/CHANGELOG.md +26 -0
- data/README.md +19 -1
- data/app/assets/tailwind/studio_engine/engine.css +55 -0
- data/app/helpers/studio_sidebar_helper.rb +9 -0
- data/app/views/components/_admin_dropdown.html.erb +1 -1
- data/app/views/components/_user_nav.html.erb +40 -41
- data/app/views/layouts/_navbar.html.erb +1 -3
- data/lib/studio/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: dd203cdc5c017f4b75ad4f8a1d1af735e55a0791b33e457db3352bf4c250066c
|
|
4
|
+
data.tar.gz: b6afd7f7ea6cfe36293c5151caa9a4c53ffb31def0c0b3be752551a52e9655e9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8efd7d7240c1498a9bf3ba8486e7dcd46c52e174242aeea6e0560abfcded3a5a40530418316463834d5b02bedb4975dc2d16a3fdea2e1d980c3cf1dafbc2a89e
|
|
7
|
+
data.tar.gz: 11a034ae73a7112c6d2d1a46c639616230794a64ef88ae620552a3cb027c09cc5406812c78821c5658a0287bf9e44c26b5e417212be6b6292e5292fbd419d161
|
data/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,32 @@ The format is [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). This pro
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.107.0 — 2026-10-14
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **The engine navbar's account row is Studio's, for every app.** From 768px
|
|
12
|
+
the theme toggle leads the gear, both a size down (moon 14px, gear 16px in a
|
|
13
|
+
24px box), and the moon, gear, name and avatar sit one 0.75rem gap apart,
|
|
14
|
+
measured ink to ink. A user nav with no second row (`data-nav-rows="1"`) gets
|
|
15
|
+
a 40px avatar that shrinks to 32px on the scroll ramp and the name on the rule
|
|
16
|
+
of 3 against it; a two-row nav keeps its 2rem avatar. The account no longer
|
|
17
|
+
dims on hover. Rules: `engine.css`, *THE ACCOUNT ROW*. Turf Monster forks the
|
|
18
|
+
partial and is untouched.
|
|
19
|
+
- **The name and avatar open the link sidebar wherever it renders.**
|
|
20
|
+
`StudioSidebarHelper#studio_account_opens_sidebar?` now answers
|
|
21
|
+
`studio_sidebar?`, so the account is a `<button>` carrying the sidebar's
|
|
22
|
+
toggle attributes, announced as a button that opens a dialog rather than a
|
|
23
|
+
link to `/profile`. An app with no sidebar keeps the link; a host may define
|
|
24
|
+
the helper to decide otherwise. Selectors and tests that pinned
|
|
25
|
+
`a[data-nav-account]` should match `[data-nav-account]`.
|
|
26
|
+
|
|
27
|
+
### Removed
|
|
28
|
+
|
|
29
|
+
- **`show_logout_link`.** The user nav and `layouts/_navbar` no longer draw a
|
|
30
|
+
Log out link (the link sidebar carries it), and a call that still passes the
|
|
31
|
+
local renders without it and without the second row it held open.
|
|
32
|
+
|
|
7
33
|
### Added
|
|
8
34
|
|
|
9
35
|
- **`config.navbar_wordmark`: a brand lockup image in the engine navbar, off by
|
data/README.md
CHANGED
|
@@ -678,7 +678,7 @@ Apps customize it through partial slots — each an optional local naming a
|
|
|
678
678
|
partial (String path, or `{ partial:, locals: }`):
|
|
679
679
|
|
|
680
680
|
- `balance_slot` — balance display at the start of the top row
|
|
681
|
-
- `extra_icons_slot` — app icon buttons
|
|
681
|
+
- `extra_icons_slot` — app icon buttons between the theme toggle and the gear
|
|
682
682
|
- `div2_slot` — replaces the default second row (wallet address + level bar)
|
|
683
683
|
|
|
684
684
|
```erb
|
|
@@ -691,6 +691,24 @@ The legacy string locals (`balance_html`, `extra_icons_html`, `div2_html` —
|
|
|
691
691
|
pre-rendered HTML injected via `raw`) are deprecated but still honored when the
|
|
692
692
|
matching slot is absent, so existing call sites render unchanged.
|
|
693
693
|
|
|
694
|
+
### The account row
|
|
695
|
+
|
|
696
|
+
From 768px the user nav's right end reads theme toggle, gear, name, avatar,
|
|
697
|
+
one gap apart (0.75rem, measured ink to ink), with the moon at 14px and the
|
|
698
|
+
gear's 16px glyph in a 24px box. A nav with no second row (no level, no
|
|
699
|
+
wallet, no `div2_slot`; `data-nav-rows="1"`) takes a 40px avatar that shrinks
|
|
700
|
+
to 32px on the navbar's scroll ramp, and the name on the rule of 3 against it:
|
|
701
|
+
its capitals a third of the avatar's height. A two-row nav keeps the 2rem
|
|
702
|
+
avatar. The rules are `engine.css`, *THE ACCOUNT ROW*, layered like the
|
|
703
|
+
collapse band table, so an app's own `@layer utilities` can override them.
|
|
704
|
+
|
|
705
|
+
Wherever the link sidebar renders (`studio_sidebar?`, which is every signed-in
|
|
706
|
+
app with `/profile`), the name and avatar are one button that opens it, as the
|
|
707
|
+
gear does: the sidebar heads with the profile. A host can define the view
|
|
708
|
+
helper `studio_account_opens_sidebar?` to decide otherwise; with no sidebar
|
|
709
|
+
the account stays a link to the account page. Log out lives in the sidebar,
|
|
710
|
+
never the bar.
|
|
711
|
+
|
|
694
712
|
## Transactional emails
|
|
695
713
|
|
|
696
714
|
Every consuming app can render the same admin page — **`/admin/emails`** —
|
|
@@ -580,6 +580,61 @@ body.modal-open .studio-app-banner {
|
|
|
580
580
|
--nav-title-lead-size: calc(1.3rem - 0.3rem * var(--nav-p, 0)); /* 20.8px -> 16px */
|
|
581
581
|
}
|
|
582
582
|
}
|
|
583
|
+
|
|
584
|
+
/* THE ACCOUNT ROW (components/_user_nav), from 768px. Every app whose
|
|
585
|
+
navbar renders the engine's user nav gets this; Turf Monster forks the
|
|
586
|
+
partial, carries none of these hooks, and keeps its own two-row nav.
|
|
587
|
+
|
|
588
|
+
ICONS. The theme toggle leads the rail (the partial renders it first) and
|
|
589
|
+
both icons sit a size down: the moon at 14px, the gear's 16px glyph in a
|
|
590
|
+
24px box, whether the gear is the sidebar trigger or the admin dropdown.
|
|
591
|
+
|
|
592
|
+
ONE GAP. Moon to gear, gear to name and name to avatar are the same
|
|
593
|
+
--nav-gap, measured ink to ink. Each box gap gives back what its edges
|
|
594
|
+
already hold: the moon's and gear's blank margins inside their 24-unit
|
|
595
|
+
artwork, the gear's 4px inset in its box, and the name's side bearing
|
|
596
|
+
(8.6px between moon and gear, 6.3px between gear and name, measured in
|
|
597
|
+
Chrome). The partial's inline 6px padding on the icon row is zeroed on a
|
|
598
|
+
one-row nav so the row's edge is the gear's; a two-row nav keeps it, as
|
|
599
|
+
its second row lines up under that padding.
|
|
600
|
+
|
|
601
|
+
ONE-ROW NAVS (data-nav-rows="1"): the avatar is 40px at rest and shrinks
|
|
602
|
+
to 32px on the scroll ramp (--nav-p, as the logo and title do), and the
|
|
603
|
+
name sits on the rule of 3 against it: its capitals are a third of the
|
|
604
|
+
avatar's height and centred on it. Montserrat's cap height is 0.7em, so
|
|
605
|
+
the size is a third of the avatar over 0.7. On the partial's
|
|
606
|
+
leading-none, Montserrat's capitals sit 0.01em below the line box's
|
|
607
|
+
middle, so no trim is needed (text-box would cut the ink, since the name
|
|
608
|
+
truncates with overflow hidden). A two-row nav keeps the 2rem avatar its
|
|
609
|
+
second row is laid out against. Below 768px the avatar stays 2rem. */
|
|
610
|
+
@media (min-width: 768px) {
|
|
611
|
+
.nav-shell {
|
|
612
|
+
--nav-avatar: calc(2.5rem - 0.5rem * var(--nav-p, 0)); /* 40px -> 32px */
|
|
613
|
+
--nav-gap: 0.75rem;
|
|
614
|
+
}
|
|
615
|
+
.nav-shell [data-nav-tools] [data-nav-theme-toggle="desktop"] { transform: scale(0.875); }
|
|
616
|
+
.nav-shell [data-nav-tools] [data-link-sidebar-trigger],
|
|
617
|
+
.nav-shell [data-nav-tools] [data-nav-admin-gear] {
|
|
618
|
+
width: 1.5rem;
|
|
619
|
+
height: 1.5rem;
|
|
620
|
+
align-items: center;
|
|
621
|
+
justify-content: center;
|
|
622
|
+
}
|
|
623
|
+
.nav-shell [data-nav-tools] [data-link-sidebar-trigger] svg,
|
|
624
|
+
.nav-shell [data-nav-tools] [data-nav-admin-gear] svg { width: 1rem; height: 1rem; }
|
|
625
|
+
.nav-shell [data-nav-tools] :has(> [data-nav-theme-toggle="desktop"]) { gap: calc(var(--nav-gap) - 8.6px); }
|
|
626
|
+
.nav-shell :has(> [data-nav-tools]) { gap: calc(var(--nav-gap) - 6.3px); }
|
|
627
|
+
.nav-shell [data-nav-account] { gap: var(--nav-gap); }
|
|
628
|
+
.nav-shell [data-nav-tools][data-nav-rows="1"] > div:first-child { padding-inline: 0 !important; }
|
|
629
|
+
.nav-shell [data-nav-rows="1"] + [data-nav-account] > [aria-hidden] > * {
|
|
630
|
+
width: var(--nav-avatar);
|
|
631
|
+
height: var(--nav-avatar);
|
|
632
|
+
font-size: 0.875rem;
|
|
633
|
+
}
|
|
634
|
+
.nav-shell [data-nav-rows="1"] + [data-nav-account] [data-nav-name] {
|
|
635
|
+
font-size: calc(var(--nav-avatar) / 3 / 0.7);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
583
638
|
}
|
|
584
639
|
|
|
585
640
|
/* A board whose controller failed to load (studio/lazy_controllers marks its
|
|
@@ -11,6 +11,15 @@ module StudioSidebarHelper
|
|
|
11
11
|
studio_sidebar_sections.any?
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
# The navbar's name and avatar open the sidebar wherever it renders. The
|
|
15
|
+
# sidebar heads with the engine's own "You > Profile" section
|
|
16
|
+
# (Studio::SidebarSections prepends it whenever /profile is drawn), so the
|
|
17
|
+
# account page stays one click away (components/_user_nav). A host may
|
|
18
|
+
# define its own to say otherwise.
|
|
19
|
+
def studio_account_opens_sidebar?
|
|
20
|
+
studio_sidebar?
|
|
21
|
+
end
|
|
22
|
+
|
|
14
23
|
# The admin dropdown and the sidebar trigger share the cog glyph — showing
|
|
15
24
|
# both reads as a double gear. When the viewer's resolved sections carry an
|
|
16
25
|
# admin-flagged entry, the sidebar IS the admin menu (its title says so) and
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<% display_class = local_assigns.fetch(:display_class, nil) %>
|
|
8
8
|
<% if respond_to?(:admin?) && admin? %>
|
|
9
9
|
<div x-data="{ open: false }" class="<%= ["relative leading-none", display_class].compact.join(" ") %>">
|
|
10
|
-
<button @click="open = !open" class="flex text-secondary hover:text-heading transition" title="Admin">
|
|
10
|
+
<button @click="open = !open" class="flex text-secondary hover:text-heading transition" title="Admin" data-nav-admin-gear>
|
|
11
11
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4">
|
|
12
12
|
<path stroke-linecap="round" stroke-linejoin="round" d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" />
|
|
13
13
|
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
|
|
@@ -15,10 +15,6 @@
|
|
|
15
15
|
(default display_name) and the signed-out button reads
|
|
16
16
|
Studio.sign_in_label (default "Log in"); lib/studio/navbar_identity.rb.
|
|
17
17
|
|
|
18
|
-
Other locals:
|
|
19
|
-
show_logout_link — boolean, show explicit "Log out" link in the
|
|
20
|
-
second row (Studio uses this)
|
|
21
|
-
|
|
22
18
|
Legacy string locals (deprecated): balance_html, extra_icons_html,
|
|
23
19
|
div2_html — pre-rendered HTML injected via raw. Still honored when
|
|
24
20
|
the matching slot local is absent, so existing call sites render
|
|
@@ -30,7 +26,6 @@
|
|
|
30
26
|
<% div2_slot ||= nil %>
|
|
31
27
|
<% balance_html ||= nil %>
|
|
32
28
|
<% extra_icons_html ||= nil %>
|
|
33
|
-
<% show_logout_link ||= false %>
|
|
34
29
|
<% div2_html ||= nil %>
|
|
35
30
|
<%# Slot resolution: the slot local wins when both a slot and its legacy
|
|
36
31
|
string are passed. Returns nil when neither is present. %>
|
|
@@ -44,7 +39,9 @@
|
|
|
44
39
|
end
|
|
45
40
|
end %>
|
|
46
41
|
|
|
47
|
-
<%# Where the account
|
|
42
|
+
<%# Where the account control (the username and the avatar, one control) points
|
|
43
|
+
when it is a link: an app with no link sidebar. Where the sidebar renders,
|
|
44
|
+
the control opens it instead (Div 3 below).
|
|
48
45
|
|
|
49
46
|
A HOST'S OWN account_path WINS: an app that already has an account page keeps
|
|
50
47
|
it rather than being repointed at a thinner /profile by a routine dependency
|
|
@@ -80,34 +77,39 @@
|
|
|
80
77
|
reserved column is 147px, and a column that will not give pushed the
|
|
81
78
|
avatar 17px past the screen edge (e2e/header_phone_width.spec.js).
|
|
82
79
|
It is a centred flex column, so with no second row the icons sit level
|
|
83
|
-
with the name and avatar rather than at the top of the bar.
|
|
84
|
-
|
|
80
|
+
with the name and avatar rather than at the top of the bar.
|
|
81
|
+
data-nav-rows says which navbar this is: "1" when no second row renders,
|
|
82
|
+
and then engine.css sizes the account on the rule of 3 (THE ACCOUNT
|
|
83
|
+
ROW there). A two-row nav keeps the engine's 2rem avatar under its row. %>
|
|
84
|
+
<% div2_content = studio_nav_slot.call(div2_slot, div2_html) %>
|
|
85
|
+
<% server_level = current_user.respond_to?(:level) && current_user.level.present? ? current_user.level : nil %>
|
|
86
|
+
<% wallet_connected = current_user.respond_to?(:truncated_solana) && current_user.try(:solana_connected?) %>
|
|
87
|
+
<% nav_rows = div2_content.present? || server_level || wallet_connected ? 2 : 1 %>
|
|
88
|
+
<div class="flex-1 min-w-0 flex flex-col justify-center" data-nav-tools data-nav-rows="<%= nav_rows %>">
|
|
85
89
|
<%# Div 1 (Bigger): balance + icons. %>
|
|
86
90
|
<div class="flex items-center gap-2 leading-none" :style="'padding: 0 6px;' + ($store.devMode ? 'background: cornflowerblue;' : '')">
|
|
87
91
|
<%= studio_nav_slot.call(balance_slot, balance_html) %>
|
|
88
92
|
<div class="flex items-center gap-2 ml-auto self-end">
|
|
93
|
+
<%# The theme toggle leads the rail, then the app's icons, then the
|
|
94
|
+
gear. Desktop only: below md the engine navbar's phone row draws
|
|
95
|
+
the theme toggle, so a second one here put two on every phone. The
|
|
96
|
+
signed-out bar has always done it this way (layouts/_navbar). %>
|
|
97
|
+
<span class="hidden md:flex" data-nav-theme-toggle="desktop"><%= render "components/theme_toggle_morph" %></span>
|
|
89
98
|
<%= studio_nav_slot.call(extra_icons_slot, extra_icons_html) %>
|
|
90
99
|
<%# Skipped when the link sidebar carries the admin menu — two cog
|
|
91
100
|
glyphs side by side read as a double gear. Desktop only, like
|
|
92
101
|
the theme toggle: below md the navbar's phone row draws the cog,
|
|
93
102
|
so a second one here put two on an admin's phone. %>
|
|
94
103
|
<%= render "components/admin_dropdown", display_class: "hidden md:block" unless respond_to?(:studio_sidebar_replaces_admin_menu?) && studio_sidebar_replaces_admin_menu? %>
|
|
95
|
-
<%# Desktop only. Below md the engine navbar's phone row draws the
|
|
96
|
-
theme toggle, so a second one here put two on every phone. The
|
|
97
|
-
signed-out bar has always done it this way (layouts/_navbar). %>
|
|
98
|
-
<span class="hidden md:flex" data-nav-theme-toggle="desktop"><%= render "components/theme_toggle_morph" %></span>
|
|
99
104
|
</div>
|
|
100
105
|
</div>
|
|
101
|
-
<% div2_content = studio_nav_slot.call(div2_slot, div2_html) %>
|
|
102
|
-
<% server_level = current_user.respond_to?(:level) && current_user.level.present? ? current_user.level : nil %>
|
|
103
|
-
<% wallet_connected = current_user.respond_to?(:truncated_solana) && current_user.try(:solana_connected?) %>
|
|
104
106
|
<% if div2_content.present? %>
|
|
105
107
|
<%# Div 2 replaced by the consumer's slot (div2_slot or legacy div2_html). %>
|
|
106
108
|
<%= div2_content %>
|
|
107
|
-
<% elsif server_level || wallet_connected
|
|
109
|
+
<% elsif server_level || wallet_connected %>
|
|
108
110
|
<%# Div 2 (Smaller): wallet address (left) + level (right) with progress
|
|
109
111
|
bar. Renders only when it has something to show — an off-chain,
|
|
110
|
-
level-less user
|
|
112
|
+
level-less user gets NO second row, so the
|
|
111
113
|
nav collapses to one line instead of an empty progress strip. %>
|
|
112
114
|
<div x-data="{
|
|
113
115
|
barWidth: 0,
|
|
@@ -167,8 +169,6 @@
|
|
|
167
169
|
</span>
|
|
168
170
|
<% if server_level %>
|
|
169
171
|
<span :class="leveledUp && 'nav-level-pop'" x-text="'Level ' + displayLevel">Level <%= server_level %></span>
|
|
170
|
-
<% elsif show_logout_link %>
|
|
171
|
-
<%= link_to "Log out", logout_path, class: "font-mono text-muted no-underline nav-bar-text" %>
|
|
172
172
|
<% end %>
|
|
173
173
|
</div>
|
|
174
174
|
<%# Text layer 2: white (clip-path reveals where bar covers) %>
|
|
@@ -180,8 +180,6 @@
|
|
|
180
180
|
</span>
|
|
181
181
|
<% if server_level %>
|
|
182
182
|
<span :class="leveledUp && 'nav-level-pop'" x-text="'Level ' + displayLevel">Level <%= server_level %></span>
|
|
183
|
-
<% elsif show_logout_link %>
|
|
184
|
-
<%= link_to "Log out", logout_path, class: "font-mono text-white no-underline nav-bar-text" %>
|
|
185
183
|
<% end %>
|
|
186
184
|
</div>
|
|
187
185
|
</div>
|
|
@@ -199,40 +197,41 @@
|
|
|
199
197
|
</style>
|
|
200
198
|
<% end %>
|
|
201
199
|
</div>
|
|
202
|
-
<%# Div 3 (Account): the name and the avatar are ONE
|
|
203
|
-
|
|
200
|
+
<%# Div 3 (Account): the name and the avatar are ONE control, one tab
|
|
201
|
+
stop — they used to be two links to the same place.
|
|
204
202
|
Below md the name is screen-reader text and the avatar stands alone,
|
|
205
203
|
so a phone never shows the name truncated to "Guest 55…"; from md up
|
|
206
204
|
it shows beside the avatar and truncates when the row is tight.
|
|
207
205
|
|
|
208
|
-
The
|
|
206
|
+
The control never shrinks (the avatar must stay on screen); the icon
|
|
209
207
|
column beside it is what gives way. So the name cannot truncate by
|
|
210
208
|
flex shrinking: from md up its box carries a max width instead, and
|
|
211
209
|
the name ellipsizes inside it. The avatar is aria-hidden: the name is
|
|
212
|
-
the
|
|
210
|
+
the control's accessible name.
|
|
213
211
|
|
|
214
|
-
|
|
215
|
-
the
|
|
216
|
-
(
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
212
|
+
WHERE THE LINK SIDEBAR RENDERS, THE ACCOUNT OPENS IT. The sidebar
|
|
213
|
+
heads with the engine's "You > Profile" section, so the name and avatar open it as the gear does
|
|
214
|
+
(studio_account_opens_sidebar?, which StudioSidebarHelper answers with
|
|
215
|
+
studio_sidebar?; a host may define its own). It is then a BUTTON, not a
|
|
216
|
+
link: it does not navigate, and a screen reader announces "Alex, button,
|
|
217
|
+
dialog" rather than a link that goes nowhere it says. studio/link_sidebar
|
|
218
|
+
claims its click from the document, before Alpine binds, as it does the
|
|
219
|
+
gear's. An app with no sidebar keeps the link to the account page. %>
|
|
220
|
+
<% account_opens_sidebar = respond_to?(:studio_account_opens_sidebar?) && studio_account_opens_sidebar? %>
|
|
220
221
|
<% account_classes = "group flex items-center gap-2 flex-shrink-0" %>
|
|
221
|
-
<% account_toggle =
|
|
222
|
-
if studio_nav_destination && respond_to?(:studio_account_opens_sidebar?) && studio_account_opens_sidebar?
|
|
223
|
-
{ "data-profile-image-toggle": "", "aria-controls": "studio-link-sidebar studio-link-sidebar-mobile",
|
|
224
|
-
"aria-haspopup": "dialog", ":aria-expanded": "$store.sidebars && $store.sidebars.linkTreeOpen ? 'true' : 'false'" }
|
|
225
|
-
else
|
|
226
|
-
{}
|
|
227
|
-
end %>
|
|
228
222
|
<% account_inner = capture do %>
|
|
229
|
-
<span class="sr-only md:not-sr-only md:max-w-40"><span class="block truncate text-right text-heading font-semibold text-base leading-none transition<%= " group-hover:text-primary" if studio_nav_destination %>" data-nav-name><%= Studio.navbar_user_name_for(current_user, self) %></span></span>
|
|
223
|
+
<span class="sr-only md:not-sr-only md:max-w-40"><span class="block truncate text-right text-heading font-semibold text-base leading-none transition<%= " group-hover:text-primary" if account_opens_sidebar || studio_nav_destination %>" data-nav-name><%= Studio.navbar_user_name_for(current_user, self) %></span></span>
|
|
230
224
|
<span class="flex-shrink-0 flex items-center" aria-hidden="true">
|
|
231
225
|
<%= render "components/avatar", user: current_user, size: "nav" %>
|
|
232
226
|
</span>
|
|
233
227
|
<% end %>
|
|
234
|
-
<% if
|
|
235
|
-
<%=
|
|
228
|
+
<% if account_opens_sidebar %>
|
|
229
|
+
<button type="button" class="<%= account_classes %> cursor-pointer rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40" data-nav-account data-profile-image-toggle
|
|
230
|
+
aria-controls="studio-link-sidebar studio-link-sidebar-mobile" aria-haspopup="dialog"
|
|
231
|
+
:aria-expanded="$store.sidebars && $store.sidebars.linkTreeOpen ? 'true' : 'false'"
|
|
232
|
+
x-bind:style="$store.devMode && 'background: lightgreen'"><%= account_inner %></button>
|
|
233
|
+
<% elsif studio_nav_destination %>
|
|
234
|
+
<%= link_to account_inner, studio_nav_destination, class: account_classes, "data-nav-account": "", "x-bind:style": "$store.devMode && 'background: lightgreen'" %>
|
|
236
235
|
<% else %>
|
|
237
236
|
<span class="<%= account_classes %>" data-nav-account x-bind:style="$store.devMode && 'background: lightgreen'"><%= account_inner %></span>
|
|
238
237
|
<% end %>
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
preview — if true, disables scroll handler and sticky positioning
|
|
5
5
|
balance_html — raw HTML for balance display (passed through to _user_nav)
|
|
6
6
|
extra_icons_html — raw HTML for extra icon buttons (passed through to _user_nav)
|
|
7
|
-
show_logout_link — boolean, show "Log out" link in user nav (passed through to _user_nav)
|
|
8
7
|
brand_heading — boolean, draw the brand title as the page's h1 (default: true).
|
|
9
8
|
Pass false on a page that carries its own h1: the brand is
|
|
10
9
|
drawn as a div with the same classes and contents.
|
|
@@ -21,7 +20,6 @@
|
|
|
21
20
|
<% pin_header = Studio.smooth_load && !is_preview %>
|
|
22
21
|
<% balance_html = local_assigns.fetch(:balance_html, nil) %>
|
|
23
22
|
<% extra_icons_html = local_assigns.fetch(:extra_icons_html, nil) %>
|
|
24
|
-
<% show_logout_link = local_assigns.fetch(:show_logout_link, false) %>
|
|
25
23
|
<% brand_tag = local_assigns.fetch(:brand_heading, true) ? "h1" : "div" %>
|
|
26
24
|
<%# Out-of-the-box navigation (engine 0.30): when the host declares
|
|
27
25
|
Studio.sidebar_sections, the navbar mounts the link-sidebar trigger in its
|
|
@@ -186,7 +184,7 @@
|
|
|
186
184
|
to fit. %>
|
|
187
185
|
<div class="<%= balance_html.present? ? 'user-nav-col' : 'user-nav-fit' %> flex-shrink-0 pl-0 pr-4 md:px-4">
|
|
188
186
|
<% if show_user %>
|
|
189
|
-
<%= render "components/user_nav", balance_html: balance_html, extra_icons_html: extra_icons_html
|
|
187
|
+
<%= render "components/user_nav", balance_html: balance_html, extra_icons_html: extra_icons_html %>
|
|
190
188
|
<% else %>
|
|
191
189
|
<div class="flex items-center justify-end gap-3">
|
|
192
190
|
<%= sidebar_trigger_desktop if sidebar_active %>
|
data/lib/studio/version.rb
CHANGED