Skip to content

Commit f13cdbf

Browse files
authored
Refactor top control selectors to prepare shared styling evolution (#24405)
1 parent 34e9ca6 commit f13cdbf

48 files changed

Lines changed: 276 additions & 199 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 2 additions & 2 deletions
Loading

ā€Žplugins/CoreHome/javascripts/corehome.jsā€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
var headerComponentParent = $(COMPONENT_SELECTOR).parent();
1717

1818
// when 'check for updates...' link is clicked, force a check & display the result
19-
headerComponentParent.one('click', '#updateCheckLinkContainer', function (e) {
19+
headerComponentParent.one('click', '#header_message a.title:not([href])', function (e) {
2020
var headerComponent = $(this)
2121
.closest(COMPONENT_SELECTOR);
2222
var headerMessage = headerComponent.find('#header_message');

ā€Žplugins/CoreHome/stylesheets/layout.lessā€Ž

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -556,20 +556,6 @@ nav {
556556
}
557557
}
558558

559-
#root, #standalone, .ui-dialog, .ngdialog {
560-
.borderedControl {
561-
background-color: @theme-color-background-base;
562-
border: 0;
563-
transition: box-shadow 150ms linear;
564-
box-shadow: @default-box-shade;
565-
border-radius: 2px;
566-
&.expanded,
567-
&:hover, &:focus {
568-
background-color: @theme-color-background-contrast;
569-
}
570-
}
571-
}
572-
573559
.widgetize {
574560
width: auto;
575561
}
Lines changed: 180 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,39 @@
1-
.piwikSelector {
2-
display: inline-block;
3-
line-height: 0;
1+
@_selector-button_color-background: @theme-color-background-base;
2+
@_selector-button_color-background-hover: @theme-color-background-contrast;
3+
@_selector-button_border: 0;
4+
@_selector-button_border-radius: 2px;
5+
@_selector-button_box-shadow: @default-box-shade;
6+
7+
@_selector-dropdown_color-background: @theme-color-background-contrast;
8+
@_selector-dropdown_border: 1px solid @theme-color-background-base;
9+
@_selector-dropdown_border-radius: 2px;
10+
@_selector-dropdown_box-shadow: 4px 7px 25px rgba(0,0,0,0.3);
11+
@_selector-dropdown_margin-top: 2px;
12+
13+
14+
.piwikSelector:not(.quick-access) {
15+
display: flex;
16+
border: @_selector-button_border;
17+
border-radius: @_selector-button_border-radius;
18+
box-shadow: @_selector-button_box-shadow;
419

520
span.title,
621
a.title,
722
button.title {
8-
.font-default(11px, 12px);
9-
display: inline-block;
23+
display: flex;
1024
width: 100%;
1125
padding: 10px 15px 11px 13px;
12-
background-color: transparent;
26+
background-color: @_selector-button_color-background;
1327
border: none;
28+
border-radius: @_selector-button_border-radius;
1429

30+
.font-default(11px, 12px);
1531
white-space: nowrap;
1632
cursor: pointer;
1733
text-transform: uppercase;
1834
text-decoration: none;
1935
color: @theme-color-text;
36+
font-variant: tabular-nums;
2037

2138
&.activityIndicator {
2239
background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat 9px 9px;
@@ -28,10 +45,8 @@
2845

2946
.icon {
3047
// remove relative: [class^="icon-"], [class*=" icon-"]{line-height:1em}
31-
.font-default(11px, 12px);
32-
padding-left: 6px;
33-
display: inline-block;
34-
vertical-align: top;
48+
font-size: inherit;
49+
line-height: inherit;
3550

3651
&.iconHidden {
3752
visibility: hidden;
@@ -40,17 +55,50 @@
4055

4156
.icon:not(.icon-fixed) {
4257
float: right;
43-
&:after {
44-
clear:left;
58+
59+
&::after {
60+
clear: left;
4561
content: ' ';
4662
}
4763
}
64+
}
4865

49-
&:hover, &:focus {
66+
&.expanded,
67+
&.editing,
68+
&:hover,
69+
&:focus {
70+
span.title,
71+
a.title,
72+
button.title {
5073
text-decoration: none;
74+
background: @_selector-button_color-background-hover;
5175
}
5276
}
5377

78+
/* Period selector specific: left & right arrows */
79+
80+
.move-period {
81+
background-color: @_selector-button_color-background;
82+
}
83+
84+
.move-period-prev {
85+
border-radius: @_selector-button_border-radius 0 0 @_selector-button_border-radius;
86+
}
87+
88+
.move-period-next {
89+
border-radius: 0 @_selector-button_border-radius @_selector-button_border-radius 0;
90+
}
91+
92+
&.periodSelector-withPrevNext .title {
93+
border-radius: 0;
94+
}
95+
96+
.selectorLegacyCompatibility();
97+
}
98+
99+
/* Dropdown */
100+
101+
.piwikSelector {
54102
.dropdown {
55103
.font-default(11px, 15px);
56104
display: none;
@@ -59,16 +107,129 @@
59107

60108
&.expanded {
61109
.dropdown {
62-
display: block;
63-
margin-top: 2px;
64-
margin-left: -1px;
110+
display: block; /* to revert display: none */
111+
65112
position: absolute;
66113
z-index: 999;
67-
border: 1px solid @theme-color-background-base;
68-
border-radius: 2px;
69-
box-shadow: 4px 7px 25px rgba(0,0,0,0.3);
114+
top: 100%;
115+
margin-top: @_selector-dropdown_margin-top;
116+
left: -1px;
117+
right: -1px;
118+
119+
border: @_selector-dropdown_border;
120+
border-radius: @_selector-dropdown_border-radius;
121+
box-shadow: @_selector-dropdown_box-shadow;
70122
padding: 16px;
123+
}
124+
}
125+
126+
&.expanded .dropdown,
127+
&:hover .dropdown,
128+
&.active .dropdown {
129+
background-color: @_selector-dropdown_color-background;
130+
}
131+
}
132+
133+
/*
134+
* ============================================================================
135+
* TEMPORARY LEGACY OVERRIDES
136+
* ============================================================================
137+
*
138+
* The rules from here and to the end of the files will be removed.
139+
* They were previously defined either in component-specific files
140+
* such as PeriodSelector.less, SiteSelector.less, segmentation.less,
141+
* dashboard.less, _periodSelect.less and _headerMessage.less, or were part of
142+
* the historical rendering behavior of selector.less itself.
143+
*
144+
* They exist only to reduce UI/screenshot side effects during the refactor.
145+
* They should be removed later, once the shared selector system has been
146+
* redesigned component-by-component with explicit visual contracts.
147+
* ============================================================================
148+
*/
149+
150+
/* A mixin to by-pass Stylelint errors */
151+
.selectorLegacyCompatibility() {
152+
// Legacy inline-block layout kept only to preserve historical spacing and screenshots.
153+
// The shared selector layout should eventually rely on flexbox only.
154+
display: inline-block;
155+
line-height: 0;
156+
background-color: @theme-color-background-base;
157+
158+
&.expanded,
159+
&.editing,
160+
&:hover,
161+
&:focus {
162+
background-color: @theme-color-background-contrast;
163+
164+
span.title,
165+
a.title,
166+
button.title {
167+
background: transparent;
168+
}
169+
}
170+
171+
span.title,
172+
a.title,
173+
button.title {
174+
// Legacy buttons were visually transparent and depended on the shell background.
175+
// The new design should keep the button styling self-contained.
176+
display: inline-block;
177+
background-color: transparent;
178+
border-radius: 0;
179+
font-variant: initial;
180+
181+
.icon {
182+
// Legacy icon alignment depends on inline-block metrics and manual spacing.
183+
// This should disappear once all selectors use the flex layout consistently.
184+
display: inline-block;
185+
vertical-align: top;
186+
padding-left: 6px;
187+
}
188+
}
189+
190+
&.periodSelector-withPrevNext button.title {
191+
width: auto;
192+
}
193+
194+
.move-period {
195+
background-color: transparent;
196+
}
197+
198+
.move-period-prev,
199+
.move-period-next {
200+
border-radius: 0;
201+
}
202+
203+
&.expanded {
204+
.dropdown {
205+
// Legacy dropdown positioning relies on margin offsets instead of the newer anchored layout.
206+
// This should be removed once all selectors share the same positioning model.
207+
top: auto;
208+
left: auto;
209+
right: auto;
210+
margin-left: -1px;
71211
background-color: @theme-color-background-contrast;
72212
}
73213
}
74214
}
215+
216+
.sites_autocomplete {
217+
height: 36px;
218+
}
219+
220+
.periodSelector {
221+
display: inline-block;
222+
}
223+
224+
// Keep same flow when a siteSelector is used inside a page
225+
.siteSelector a.title {
226+
overflow: hidden;
227+
}
228+
229+
// Uppercase is kept only for legacy selector rendering.
230+
// We do not want to force uppercase in the shared selector design long-term.
231+
.siteSelector .custom_select_ul_list li a,
232+
.siteSelector .custom_select_all a,
233+
.siteSelector .custom_select_main_link > span {
234+
text-transform: uppercase;
235+
}

ā€Žplugins/CoreHome/templates/_headerMessage.twigā€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{% set updateCheck %}
2+
<span class="icon icon-fixed icon-reload"></span>
23
<span id="updateCheckLinkContainer">
3-
<span class="icon icon-fixed icon-reload"></span>
44
{{ (lastUpdateCheckFailed|default(false) ? 'General_ErrorTryAgain' : 'CoreHome_CheckForUpdates')|translate }}
55
</span>
66
{% endset %}

ā€Žplugins/CoreHome/tests/UI/VersionInfoHeaderMessage_spec.jsā€Ž

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ describe('VersionInfoHeaderMessage', function() {
1616
const selectorMessageTitle = '#header_message .title';
1717
const selectorMessageDropdown = '#header_message .dropdown';
1818
const selectorUpdateLink = '#updateCheckLinkContainer';
19+
const selectorUpdateButtonIcon = '#header_message .title .icon-reload';
1920

2021
const urlAdminHome = '?idSite=1&period=year&date=2012-08-09&module=CoreAdminHome&action=home';
2122
const urlHome = '?idSite=1&period=year&date=2012-08-09&module=CoreHome&action=index';
@@ -116,6 +117,30 @@ describe('VersionInfoHeaderMessage', function() {
116117
expect(await getMessageTitleText()).to.match(/latest version of Matomo/);
117118
});
118119

120+
it('should check for a new version when clicking the full title anchor', async function() {
121+
await page.goto(urlAdminHome);
122+
await page.waitForNetworkIdle();
123+
124+
expect(await getUpdateLinkText()).to.match(/Check for updates/);
125+
126+
await page.click(selectorMessageTitle);
127+
await page.waitForNetworkIdle();
128+
129+
expect(await getMessageTitleText()).to.match(/latest version of Matomo/);
130+
});
131+
132+
it('should check for a new version when clicking the icon inside the title anchor', async function() {
133+
await page.goto(urlAdminHome);
134+
await page.waitForNetworkIdle();
135+
136+
expect(await getUpdateLinkText()).to.match(/Check for updates/);
137+
138+
await page.click(selectorUpdateButtonIcon);
139+
await page.waitForNetworkIdle();
140+
141+
expect(await getMessageTitleText()).to.match(/latest version of Matomo/);
142+
});
143+
119144
it('should check for a new version on request', async function() {
120145
await page.goto(urlAdminHome);
121146
await page.waitForNetworkIdle();

ā€Žplugins/CoreHome/vue/src/PeriodSelector/PeriodSelector.lessā€Ž

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
@color-period-selector-calendar-hover-background: @theme-color-background-lowContrast;
55

66
.periodSelector {
7-
display: inline-block;
87

98
.preset-option-text {
109
padding-left: 30px !important;
@@ -409,7 +408,6 @@
409408
}
410409

411410
.move-period {
412-
background-color: transparent;
413411
border: none;
414412
width: 20px;
415413
height: 33px; // req'd for tap target

ā€Žplugins/CoreHome/vue/src/SiteSelector/SiteSelector.lessā€Ž

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
}
5050
}
5151

52-
.siteSelector a.title,
5352
.siteSelector .custom_select_ul_list li a,
5453
.siteSelector .custom_select_all a,
5554
.siteSelector .custom_select_main_link > span {
@@ -59,13 +58,10 @@
5958
text-overflow: ellipsis;
6059
padding: 0;
6160
color: @theme-color-text;
62-
text-transform: uppercase;
6361
width: 100%;
6462
}
6563

6664
.siteSelector.piwikSelector a.title {
67-
padding: 10px 15px 11px 13px;
68-
6965
> span {
7066
max-width: 161px;
7167
overflow: hidden;
@@ -173,10 +169,4 @@
173169
display: none !important;
174170
}
175171
}
176-
177-
&.borderedControl {
178-
&:hover {
179-
background-color: @theme-color-background-base!important;
180-
}
181-
}
182172
}

ā€Žplugins/Dashboard/stylesheets/dashboard.lessā€Ž

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,6 @@ body#standalone {
201201

202202
.dashboardSettings.expanded .dropdown {
203203
min-width: 800px;
204-
background-color: @theme-color-background-contrast;
205204
display: grid;
206205
grid-template-columns: auto 1fr;
207206
}
Lines changed: 2 additions & 2 deletions
Loading

0 commit comments

Comments
Ā (0)
⚔