@hermes-ui/angular 0.1.7 → 0.2.0

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.
Files changed (108) hide show
  1. package/README.md +6 -6
  2. package/button/_buttons.clarity.scss +80 -2
  3. package/button/_mixins.buttons.scss +44 -2
  4. package/button/_properties.buttons.scss +209 -247
  5. package/button/_variables.buttons.scss +22 -0
  6. package/fesm2022/hermes-ui-angular-accordion.mjs +2 -2
  7. package/fesm2022/hermes-ui-angular-accordion.mjs.map +1 -1
  8. package/fesm2022/hermes-ui-angular-addons-card-container.mjs +3 -3
  9. package/fesm2022/hermes-ui-angular-addons-card-container.mjs.map +1 -1
  10. package/fesm2022/hermes-ui-angular-addons-certificate-viewer.mjs +2 -2
  11. package/fesm2022/hermes-ui-angular-addons-certificate-viewer.mjs.map +1 -1
  12. package/fesm2022/hermes-ui-angular-addons-datagrid-filters.mjs +2 -2
  13. package/fesm2022/hermes-ui-angular-addons-datagrid-filters.mjs.map +1 -1
  14. package/fesm2022/hermes-ui-angular-addons-datagrid.mjs +2 -2
  15. package/fesm2022/hermes-ui-angular-addons-datagrid.mjs.map +1 -1
  16. package/fesm2022/hermes-ui-angular-addons-property-view.mjs +2 -2
  17. package/fesm2022/hermes-ui-angular-addons-property-view.mjs.map +1 -1
  18. package/fesm2022/hermes-ui-angular-addons-theme-builder.mjs +66 -66
  19. package/fesm2022/hermes-ui-angular-addons-theme-builder.mjs.map +1 -1
  20. package/fesm2022/hermes-ui-angular-addons-var.mjs +2 -2
  21. package/fesm2022/hermes-ui-angular-addons-var.mjs.map +1 -1
  22. package/fesm2022/hermes-ui-angular-addons-wizard.mjs +2 -2
  23. package/fesm2022/hermes-ui-angular-addons-wizard.mjs.map +1 -1
  24. package/fesm2022/hermes-ui-angular-button.mjs +2 -2
  25. package/fesm2022/hermes-ui-angular-button.mjs.map +1 -1
  26. package/fesm2022/hermes-ui-angular-data-datagrid.mjs +2 -2
  27. package/fesm2022/hermes-ui-angular-data-datagrid.mjs.map +1 -1
  28. package/fesm2022/hermes-ui-angular-data-stack-view.mjs +2 -2
  29. package/fesm2022/hermes-ui-angular-data-stack-view.mjs.map +1 -1
  30. package/fesm2022/hermes-ui-angular-data-tree-view.mjs +2 -2
  31. package/fesm2022/hermes-ui-angular-data-tree-view.mjs.map +1 -1
  32. package/fesm2022/hermes-ui-angular-emphasis-alert.mjs +2 -2
  33. package/fesm2022/hermes-ui-angular-emphasis-alert.mjs.map +1 -1
  34. package/fesm2022/hermes-ui-angular-forms-checkbox.mjs +2 -2
  35. package/fesm2022/hermes-ui-angular-forms-checkbox.mjs.map +1 -1
  36. package/fesm2022/hermes-ui-angular-forms-combobox.mjs +2 -2
  37. package/fesm2022/hermes-ui-angular-forms-combobox.mjs.map +1 -1
  38. package/fesm2022/hermes-ui-angular-forms-common.mjs +2 -2
  39. package/fesm2022/hermes-ui-angular-forms-common.mjs.map +1 -1
  40. package/fesm2022/hermes-ui-angular-forms-datalist.mjs +2 -2
  41. package/fesm2022/hermes-ui-angular-forms-datalist.mjs.map +1 -1
  42. package/fesm2022/hermes-ui-angular-forms-datepicker.mjs +3 -3
  43. package/fesm2022/hermes-ui-angular-forms-datepicker.mjs.map +1 -1
  44. package/fesm2022/hermes-ui-angular-forms-file-input.mjs +2 -2
  45. package/fesm2022/hermes-ui-angular-forms-file-input.mjs.map +1 -1
  46. package/fesm2022/hermes-ui-angular-forms-input.mjs +2 -2
  47. package/fesm2022/hermes-ui-angular-forms-input.mjs.map +1 -1
  48. package/fesm2022/hermes-ui-angular-forms-native-select.mjs +2 -2
  49. package/fesm2022/hermes-ui-angular-forms-native-select.mjs.map +1 -1
  50. package/fesm2022/hermes-ui-angular-forms-number-input.mjs +2 -2
  51. package/fesm2022/hermes-ui-angular-forms-number-input.mjs.map +1 -1
  52. package/fesm2022/hermes-ui-angular-forms-password.mjs +2 -2
  53. package/fesm2022/hermes-ui-angular-forms-password.mjs.map +1 -1
  54. package/fesm2022/hermes-ui-angular-forms-radio.mjs +2 -2
  55. package/fesm2022/hermes-ui-angular-forms-radio.mjs.map +1 -1
  56. package/fesm2022/hermes-ui-angular-forms-range.mjs +2 -2
  57. package/fesm2022/hermes-ui-angular-forms-range.mjs.map +1 -1
  58. package/fesm2022/hermes-ui-angular-forms-select.mjs +2 -2
  59. package/fesm2022/hermes-ui-angular-forms-select.mjs.map +1 -1
  60. package/fesm2022/hermes-ui-angular-forms-textarea.mjs +2 -2
  61. package/fesm2022/hermes-ui-angular-forms-textarea.mjs.map +1 -1
  62. package/fesm2022/hermes-ui-angular-icon.mjs +29 -29
  63. package/fesm2022/hermes-ui-angular-icon.mjs.map +1 -1
  64. package/fesm2022/hermes-ui-angular-layout-nav.mjs +2 -2
  65. package/fesm2022/hermes-ui-angular-layout-nav.mjs.map +1 -1
  66. package/fesm2022/hermes-ui-angular-layout-tabs.mjs +2 -2
  67. package/fesm2022/hermes-ui-angular-layout-tabs.mjs.map +1 -1
  68. package/fesm2022/hermes-ui-angular-layout-vertical-nav.mjs +382 -28
  69. package/fesm2022/hermes-ui-angular-layout-vertical-nav.mjs.map +1 -1
  70. package/fesm2022/hermes-ui-angular-modal.mjs +2 -2
  71. package/fesm2022/hermes-ui-angular-modal.mjs.map +1 -1
  72. package/fesm2022/hermes-ui-angular-popover-signpost.mjs +2 -2
  73. package/fesm2022/hermes-ui-angular-popover-signpost.mjs.map +1 -1
  74. package/fesm2022/hermes-ui-angular-stepper.mjs +2 -2
  75. package/fesm2022/hermes-ui-angular-stepper.mjs.map +1 -1
  76. package/fesm2022/hermes-ui-angular-timeline.mjs +2 -2
  77. package/fesm2022/hermes-ui-angular-timeline.mjs.map +1 -1
  78. package/fesm2022/hermes-ui-angular-toast.mjs +2 -2
  79. package/fesm2022/hermes-ui-angular-toast.mjs.map +1 -1
  80. package/fesm2022/hermes-ui-angular-utils.mjs +6 -0
  81. package/fesm2022/hermes-ui-angular-utils.mjs.map +1 -1
  82. package/fesm2022/hermes-ui-angular-wizard.mjs +2 -2
  83. package/fesm2022/hermes-ui-angular-wizard.mjs.map +1 -1
  84. package/forms/combobox/_combobox.clarity.scss +18 -4
  85. package/forms/combobox/_properties.combobox.scss +5 -5
  86. package/forms/styles/_input-group.clarity.scss +7 -0
  87. package/forms/styles/_mixins.forms.scss +12 -10
  88. package/forms/styles/_native-select.clarity.scss +17 -5
  89. package/forms/styles/_properties.forms.scss +29 -18
  90. package/forms/styles/_textarea.clarity.scss +4 -4
  91. package/forms/styles/_variables.forms.scss +6 -0
  92. package/layout/main-container/_properties.header.scss +44 -6
  93. package/layout/main-container/_variables.header.scss +11 -0
  94. package/layout/nav/_header.clarity.scss +14 -0
  95. package/layout/nav/_mixins.header.scss +55 -40
  96. package/layout/nav/_responsive-nav.clarity.scss +21 -10
  97. package/layout/vertical-nav/_properties.vertical-nav.scss +77 -27
  98. package/layout/vertical-nav/_variables.vertical-nav.scss +23 -0
  99. package/layout/vertical-nav/_vertical-nav.clarity.scss +418 -277
  100. package/package.json +1 -1
  101. package/types/hermes-ui-angular-addons-theme-builder.d.ts +2 -2
  102. package/types/hermes-ui-angular-addons-theme-builder.d.ts.map +1 -1
  103. package/types/hermes-ui-angular-icon.d.ts +3 -3
  104. package/types/hermes-ui-angular-icon.d.ts.map +1 -1
  105. package/types/hermes-ui-angular-layout-vertical-nav.d.ts +134 -10
  106. package/types/hermes-ui-angular-layout-vertical-nav.d.ts.map +1 -1
  107. package/types/hermes-ui-angular-utils.d.ts +12 -0
  108. package/types/hermes-ui-angular-utils.d.ts.map +1 -1
@@ -5,129 +5,189 @@
5
5
  * The full license information can be found in LICENSE in the root directory of this project.
6
6
  */
7
7
 
8
+ @use 'sass:map';
8
9
  @use 'sass:meta';
9
10
  @use '../../styles/a11y';
10
11
  @use '../../styles/mixins';
12
+ @use '../../styles/variables/variables';
11
13
  @use 'variables.vertical-nav' as vertical-nav-variables;
12
14
  @use 'mixins.vertical-nav' as vertical-nav-mixins;
13
15
  @use '../../styles/core/tokens/variables.tokens' as tokens;
14
16
  @use '../../styles/variables/variables.density' as density;
15
17
 
18
+ // A partir daqui a coluna é "de tela larga": abaixo do breakpoint `lg` ela vira a gaveta deslizante
19
+ // do header responsivo (ver ../nav/_responsive-nav.clarity.scss), aberta pelo hambúrguer.
20
+ $desktop-min-width: map.get(variables.$hermes-grid-breakpoints, lg) + 1;
21
+ $mobile-max-width: map.get(variables.$hermes-grid-breakpoints, lg);
22
+
23
+ // Item de navegação: a mesma caixa para link e cabeçalho de grupo. O respiro lateral é o mesmo da
24
+ // coluna compacta comporta, e é isso que mantém o ícone parado (no mesmo x) enquanto a coluna abre
25
+ // e fecha: com um recuo maior, o item precisaria centrar o conteúdo ao encolher.
26
+ @mixin nav-row() {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: vertical-nav-variables.$hermes-vertical-nav-item-gap;
30
+ box-sizing: border-box;
31
+ min-height: vertical-nav-variables.$hermes-vertical-nav-item-height;
32
+ min-width: 0;
33
+ margin: 0;
34
+ padding: vertical-nav-variables.$hermes-vertical-nav-item-padding;
35
+ border: none;
36
+ background-color: transparent;
37
+ font-family: inherit;
38
+ font-size: vertical-nav-variables.$hermes-vertical-nav-item-font-size;
39
+ font-weight: vertical-nav-variables.$hermes-vertical-nav-item-top-level-font-weight;
40
+ line-height: 1.25;
41
+ text-align: left;
42
+ text-decoration: none;
43
+ outline-offset: calc(-1 * #{mixins.baselinePx(5)});
44
+ transition:
45
+ background-color 0.24s cubic-bezier(0.4, 0, 0.2, 1),
46
+ color 0.24s cubic-bezier(0.4, 0, 0.2, 1);
47
+ }
48
+
16
49
  @include meta.load-css('properties.vertical-nav');
17
50
  @include mixins.exports('vertical-nav.clarity') {
51
+ // O host é só o "lugar" da coluna no fluxo: quem tem fundo, borda, largura e sombra é o
52
+ // `.nav-panel`. Em modo sobreposto o painel sai do fluxo e o host segura a largura da trilha
53
+ // (o espaçador), para a página nunca se mexer quando a coluna abre por cima dela.
18
54
  .hermes-vertical-nav {
19
- //Display
20
55
  display: flex;
21
56
  flex-direction: column;
57
+ position: relative;
22
58
 
23
- //Dims
24
- width: mixins.baselinePx(240);
25
- min-width: density.$hermes-base-layout-space-3xl;
26
-
27
- //Others
28
- background-color: vertical-nav-variables.$hermes-vertical-nav-bg-color;
29
- will-change: width;
30
- transition: width 0.2s ease-in-out;
59
+ .nav-panel {
60
+ display: flex;
61
+ flex: 1 1 auto;
62
+ flex-direction: column;
63
+ position: relative;
64
+ min-height: 0;
65
+
66
+ // `--hermes-vertical-nav-measured-width` é escrita pelo componente, depois que a coluna termina
67
+ // de abrir, e só cresce (nunca fica menor que o piso). Sem ela cai no piso.
68
+ width: var(--hermes-vertical-nav-measured-width, #{vertical-nav-variables.$hermes-vertical-nav-width});
69
+ min-width: vertical-nav-variables.$hermes-vertical-nav-width;
70
+ max-width: vertical-nav-variables.$hermes-vertical-nav-max-width;
71
+ border-right: #{tokens.$hermes-alias-object-border-width-100} solid vertical-nav-variables.$hermes-vertical-nav-divider-color;
72
+ background-color: vertical-nav-variables.$hermes-vertical-nav-bg-color;
73
+ will-change: width;
74
+ // Largura, piso e teto animam juntos: se `min-width`/`max-width` ficassem de fora, saltariam
75
+ // para o valor novo no primeiro quadro e prenderiam a largura ali.
76
+ transition:
77
+ width vertical-nav-variables.$hermes-vertical-nav-transition-duration ease-in-out,
78
+ min-width vertical-nav-variables.$hermes-vertical-nav-transition-duration ease-in-out,
79
+ max-width vertical-nav-variables.$hermes-vertical-nav-transition-duration ease-in-out,
80
+ box-shadow vertical-nav-variables.$hermes-vertical-nav-transition-duration ease-in-out;
81
+ }
31
82
 
32
83
  .nav-divider {
33
84
  @include vertical-nav-mixins.vertical-nav-divider();
34
85
  }
35
86
 
36
87
  .nav-content {
37
- //display
38
88
  display: flex;
39
89
  flex-direction: column;
40
90
  flex: 1 1 auto;
41
-
42
- //Others
91
+ min-height: 0;
92
+ gap: vertical-nav-variables.$hermes-vertical-nav-child-gap;
43
93
  overflow: hidden auto;
44
94
  }
45
95
 
46
- // shadcn sidebar: os itens ficam "flutuando" com um respiro da borda do
47
- // container, não de ponta a ponta -- só quando expandida, pra não mexer
48
- // no cálculo (já bem specific) dos ícones no modo colapsado/rail.
96
+ // Os itens flutuam com um respiro da borda da coluna, e não vão de ponta a ponta.
49
97
  &:not(.is-collapsed) .nav-content {
50
98
  padding: vertical-nav-variables.$hermes-vertical-nav-content-inset;
99
+ // A calha da barra fica reservada mesmo sem barra: sem ela, o primeiro grupo que abre faz a
100
+ // lista passar da altura da tela, a barra nasce, tira 8px do rótulo e a largura medida
101
+ // cresceria para compensar sem que rótulo nenhum tenha pedido.
102
+ scrollbar-gutter: stable;
51
103
  }
52
104
 
53
105
  .nav-group {
54
- //Display
55
106
  display: block;
56
107
  flex: 0 0 auto;
57
-
58
- //Dims
59
108
  height: auto;
60
109
  min-height: vertical-nav-variables.$hermes-vertical-nav-item-height;
61
110
  }
62
111
 
63
112
  .nav-group-content {
64
- //Display
65
113
  display: flex;
66
114
 
67
- //Others
68
-
69
- @include vertical-nav-mixins.vertical-nav-link-colors();
70
-
71
115
  .nav-link {
72
- //Display
73
116
  flex: 1 1 auto;
74
-
75
- //Dims
76
- padding-left: 0;
77
- min-width: 0; //Chrome nested flex box ellipsis fix
117
+ min-width: 0; // Chrome nested flex box ellipsis fix
78
118
  }
79
119
 
80
- .nav-icon {
81
- //Dims
82
- margin-left: density.$hermes-base-horizontal-offset-xl;
83
- }
120
+ // Link que também é o cabeçalho do grupo, com a seta de expansão como botão à parte.
121
+ .nav-link ~ .nav-group-trigger {
122
+ flex: 0 0 auto;
123
+ justify-content: center;
124
+ width: vertical-nav-variables.$hermes-vertical-nav-toggle-button-size;
125
+ padding: 0;
84
126
 
85
- .nav-text {
86
- //Dims
87
- padding-left: density.$hermes-base-horizontal-offset-l;
127
+ .nav-group-text {
128
+ display: none;
129
+ }
88
130
  }
131
+ }
89
132
 
90
- .nav-icon + .nav-text {
91
- //Dims
92
- padding-left: 0;
93
- }
133
+ // ── Itens (link e cabeçalho de grupo) ───────────────────────────────────────────────────
94
134
 
95
- .nav-link + .nav-group-text {
96
- //Display
97
- display: none;
135
+ .nav-link,
136
+ .nav-group-trigger {
137
+ @include nav-row();
138
+
139
+ color: vertical-nav-variables.$hermes-vertical-nav-item-color;
140
+ cursor: pointer;
141
+ }
142
+
143
+ // Sem `flex` aqui: o `.nav-content` é uma coluna, e um link solto com `flex-grow` esticaria até
144
+ // ocupar toda a altura que sobra. Só dentro de `.nav-group-content` (uma linha) ele cresce.
145
+ .nav-link {
146
+ border-radius: vertical-nav-variables.$hermes-vertical-nav-item-border-radius;
147
+
148
+ &:hover:not(.active) {
149
+ background-color: vertical-nav-variables.$hermes-vertical-nav-hover-bg-color;
150
+ color: vertical-nav-variables.$hermes-vertical-nav-item-color;
98
151
  }
99
152
 
100
- > .nav-link {
101
- &.active,
102
- &:active {
103
- font-weight: vertical-nav-variables.$hermes-vertical-nav-item-active-font-weight;
104
- }
153
+ &:active:not(.active) {
154
+ background-color: vertical-nav-variables.$hermes-vertical-nav-active-bg-color;
105
155
  }
106
- }
107
156
 
108
- .nav-group-children {
109
- overflow-y: hidden;
157
+ // O selecionado é só a tinta, sem faixa lateral: preenchido de ponta a ponta ele viraria a
158
+ // coisa mais pesada da tela. O peso do texto e o glifo em tom mais forte completam.
159
+ &.active {
160
+ background-color: vertical-nav-variables.$hermes-vertical-nav-selected-bg-color;
161
+ color: vertical-nav-variables.$hermes-vertical-nav-item-active-color;
162
+ font-weight: vertical-nav-variables.$hermes-vertical-nav-item-active-font-weight;
110
163
 
111
- // shadcn sidebar: linha vertical marcando o subnível — os itens ficam
112
- // indentados depois dela, e o pill de hover/active de cada um fica
113
- // mais estreito (começa depois da linha), não do tamanho do item pai.
114
- margin-left: #{mixins.baselinePx(20)};
115
- padding-left: #{mixins.baselinePx(10)};
116
- border-left: #{tokens.$hermes-alias-object-border-width-100} solid vertical-nav-variables.$hermes-vertical-nav-divider-color;
164
+ .nav-icon {
165
+ color: vertical-nav-variables.$hermes-vertical-nav-icon-active-color;
166
+ fill: vertical-nav-variables.$hermes-vertical-nav-icon-active-color;
167
+ }
168
+
169
+ // O item selecionado também responde ao hover: numa lista em que tudo reage, o item onde
170
+ // se está não pode parecer travado.
171
+ &:hover {
172
+ background-color: vertical-nav-variables.$hermes-vertical-nav-selected-hover-bg-color;
173
+ }
174
+ }
117
175
  }
118
176
 
119
- .nav-trigger,
120
177
  .nav-group-trigger {
121
- //Display
122
- flex: 0 0 vertical-nav-variables.$hermes-vertical-nav-toggle-button-size;
178
+ flex: 1 1 auto;
179
+ width: 100%;
180
+ overflow: hidden;
181
+ border-radius: vertical-nav-variables.$hermes-vertical-nav-item-border-radius;
123
182
 
124
- //Dims
125
- border: none;
126
- height: vertical-nav-variables.$hermes-vertical-nav-toggle-button-size;
127
- padding: 0;
183
+ &:hover {
184
+ background-color: vertical-nav-variables.$hermes-vertical-nav-hover-bg-color;
185
+ }
186
+
187
+ &:active {
188
+ background-color: vertical-nav-variables.$hermes-vertical-nav-active-bg-color;
189
+ }
128
190
 
129
- //Others
130
- hermes-icon[shape='angle-double'],
131
191
  hermes-icon[shape='angle-double'] {
132
192
  color: vertical-nav-variables.$hermes-vertical-nav-toggle-icon-color;
133
193
 
@@ -142,124 +202,177 @@
142
202
 
143
203
  &:disabled,
144
204
  &.disabled {
145
- hermes-icon[shape='angle-double'],
146
205
  hermes-icon[shape='angle-double'] {
147
206
  color: vertical-nav-variables.$hermes-vertical-nav-toggle-icon-disabled-color;
148
207
  }
149
208
  }
209
+ }
150
210
 
151
- background-color: transparent;
152
- cursor: pointer;
153
- outline-offset: calc(-1 * #{mixins.baselinePx(5)});
211
+ .nav-group-text,
212
+ .nav-text {
213
+ flex: 1 1 auto;
214
+ min-width: 0; // sem isto o `nowrap` trava o item no tamanho do texto inteiro
215
+
216
+ @include mixins.overflow-ellipsis();
154
217
  }
155
218
 
156
- .nav-trigger {
157
- //Display
158
- display: flex;
159
- align-items: center;
160
- justify-content: flex-end;
219
+ // Um ícone que não é o glifo do item (ex.: o selo "NEW" de 32px dentro do rótulo) não pode esticar a
220
+ // linha: o item mede pelo texto e pelo glifo, e a altura fechada que antes escondia isso saiu.
221
+ .nav-text hermes-icon:not(.nav-icon),
222
+ .nav-group-text hermes-icon:not(.nav-icon) {
223
+ vertical-align: middle;
224
+ margin-block: calc(-1 * #{mixins.baselinePx(8)});
225
+ }
161
226
 
162
- //Dims
163
- height: vertical-nav-variables.$hermes-vertical-nav-item-height;
164
- padding: density.$hermes-base-vertical-offset-m density.$hermes-base-horizontal-offset-xl;
227
+ // O glifo é da cor da marca em todos os itens, e não só no ativo: é ele que dá à coluna a
228
+ // leitura de navegação, e em cinza a barra inteira ficaria apagada ao lado do conteúdo.
229
+ .nav-icon {
230
+ position: relative;
231
+ flex: 0 0 vertical-nav-variables.$hermes-vertical-nav-icon-size;
232
+ align-self: center;
233
+ margin: 0;
234
+ color: vertical-nav-variables.$hermes-vertical-nav-icon-color;
235
+ fill: vertical-nav-variables.$hermes-vertical-nav-icon-color;
236
+ vertical-align: middle;
165
237
 
166
- hermes-icon,
167
- hermes-icon {
168
- margin-right: 0;
238
+ @include mixins.min-equilateral(vertical-nav-variables.$hermes-vertical-nav-icon-size);
239
+ @include mixins.equilateral(vertical-nav-variables.$hermes-vertical-nav-icon-size);
240
+ }
169
241
 
170
- &:not([size]) {
171
- @include mixins.equilateral(density.$hermes-base-icon-size-s);
172
- }
173
- }
242
+ .nav-group-trigger-icon {
243
+ flex: 0 0 auto;
244
+ align-self: center;
245
+ margin: 0;
246
+ transition: all vertical-nav-variables.$hermes-vertical-nav-transition-duration ease-in-out;
174
247
 
175
- &.on-collapse {
176
- hermes-icon,
177
- hermes-icon {
178
- margin: 0;
179
- }
180
- }
248
+ @include mixins.equilateral(vertical-nav-variables.$hermes-vertical-nav-caret-size);
181
249
  }
182
250
 
183
- //Parent .nav-group-content
184
- .nav-group-trigger {
185
- //Display
186
- //flex: 0 0 $hermes-vertical-nav-item-height;
187
- display: flex;
188
- flex: 1 1 auto;
251
+ // ── Submenu ─────────────────────────────────────────────────────────────────────────────
189
252
 
190
- //Others
191
- color: inherit;
192
- overflow: hidden;
193
- text-align: left;
253
+ // O trilho é o que dá forma ao submenu: o recuo sozinho deixaria os filhos boiando, sem nada
254
+ // dizendo a que pai pertencem. O recuo é o menor que ainda se lê, porque cada pixel dele é
255
+ // cobrado da largura da coluna inteira.
256
+ .nav-group-children {
257
+ overflow-y: hidden;
258
+ margin-left: vertical-nav-variables.$hermes-vertical-nav-child-indent;
259
+ padding-left: vertical-nav-variables.$hermes-vertical-nav-child-padding-start;
260
+ border-left: #{tokens.$hermes-alias-object-border-width-100} solid vertical-nav-variables.$hermes-vertical-nav-divider-color;
261
+ transition: border-left-color vertical-nav-variables.$hermes-vertical-nav-transition-duration ease-in-out;
262
+
263
+ // O filho não é um item de primeiro nível reduzido: tem tipografia e glifo próprios, e o
264
+ // glifo neutro é o que separa folha de cabeçalho de grupo ("é a tela", e não "tem mais coisa").
265
+ .nav-link {
266
+ font-size: vertical-nav-variables.$hermes-vertical-nav-child-font-size;
267
+ padding: vertical-nav-variables.$hermes-vertical-nav-item-child-padding;
194
268
 
195
- .nav-group-trigger-icon {
196
- //Display
197
- flex-shrink: 0;
269
+ .nav-icon {
270
+ flex-basis: vertical-nav-variables.$hermes-vertical-nav-child-icon-size;
271
+ color: vertical-nav-variables.$hermes-vertical-nav-child-icon-color;
272
+ fill: vertical-nav-variables.$hermes-vertical-nav-child-icon-color;
198
273
 
199
- //Dims
200
- width: vertical-nav-variables.$hermes-vertical-nav-icon-size;
201
- margin: density.$hermes-base-vertical-offset-m density.$hermes-base-horizontal-offset-m;
202
- align-self: center;
274
+ @include mixins.min-equilateral(vertical-nav-variables.$hermes-vertical-nav-child-icon-size);
275
+ @include mixins.equilateral(vertical-nav-variables.$hermes-vertical-nav-child-icon-size);
276
+ }
203
277
 
204
- //Others
205
- transition: all 0.2s ease-in-out;
278
+ &.active .nav-icon {
279
+ color: vertical-nav-variables.$hermes-vertical-nav-icon-active-color;
280
+ fill: vertical-nav-variables.$hermes-vertical-nav-icon-active-color;
281
+ }
206
282
  }
207
283
  }
208
284
 
209
- //Parent .nav-trigger
210
- .nav-trigger-icon {
211
- //Others
212
- transition: all 0.2s ease-in-out;
285
+ hermes-vertical-nav-group-children {
286
+ display: grid;
287
+ gap: vertical-nav-variables.$hermes-vertical-nav-child-gap;
288
+ padding-top: vertical-nav-variables.$hermes-vertical-nav-child-gap;
213
289
  }
214
290
 
215
- .nav-trigger + .nav-content {
216
- //Dims
291
+ // O grupo que contém a página atual se marca também, e não só o item dentro dele: peso e glifo
292
+ // em tom forte, e o trilho acende. Não repete a tinta de fundo — ela é o que diz "esta é a
293
+ // página em que você está", e pai e filho dizem coisas diferentes ("é por aqui" e "é aqui").
294
+ .nav-group.active,
295
+ .nav-group:has(.nav-group-children .nav-link.active) {
296
+ > .nav-group-content .nav-group-trigger {
297
+ font-weight: vertical-nav-variables.$hermes-vertical-nav-item-active-font-weight;
217
298
 
218
- @include vertical-nav-mixins.vertical-nav-divider();
219
- }
299
+ .nav-icon {
300
+ color: vertical-nav-variables.$hermes-vertical-nav-icon-active-color;
301
+ fill: vertical-nav-variables.$hermes-vertical-nav-icon-active-color;
302
+ }
303
+ }
220
304
 
221
- .nav-group-text,
222
- .nav-link {
223
- //Dims
224
- height: vertical-nav-variables.$hermes-vertical-nav-item-height;
225
- padding: vertical-nav-variables.$hermes-vertical-nav-item-padding;
305
+ > .nav-group-children {
306
+ border-left-color: vertical-nav-variables.$hermes-vertical-nav-icon-color;
307
+ }
308
+ }
226
309
 
227
- //Others
310
+ // O ponto diz "tem um item seu aqui dentro" quando o grupo está fechado. Aparece sobretudo na
311
+ // coluna compacta, em que grupo nenhum mostra conteúdo e o ícone é tudo o que há. Encosta na
312
+ // quina do glifo, e não do botão, que na compacta é bem maior que o desenho.
313
+ .nav-group:not(.is-expanded):has(.nav-group-children .nav-link.active) .nav-group-trigger .nav-icon::after,
314
+ .nav-group.active:not(.is-expanded) .nav-group-trigger .nav-icon::after {
315
+ content: '';
316
+ position: absolute;
317
+ top: calc(-1 * #{mixins.baselinePx(2)});
318
+ right: calc(-1 * #{mixins.baselinePx(2)});
319
+ width: #{mixins.baselinePx(6)};
320
+ height: #{mixins.baselinePx(6)};
321
+ border-radius: 50%;
322
+ background-color: vertical-nav-variables.$hermes-vertical-nav-icon-color;
323
+ }
228
324
 
229
- @include mixins.generate-typography-token('BODY-14-RG-CPT');
325
+ // ── Gatilho de recolher (o botão clássico do topo) ──────────────────────────────────────
230
326
 
327
+ .nav-trigger {
231
328
  display: flex;
329
+ flex: 0 0 vertical-nav-variables.$hermes-vertical-nav-toggle-button-size;
232
330
  align-items: center;
331
+ justify-content: flex-end;
332
+ height: vertical-nav-variables.$hermes-vertical-nav-item-height;
333
+ padding: density.$hermes-base-vertical-offset-m density.$hermes-base-horizontal-offset-xl;
334
+ border: none;
335
+ background-color: transparent;
336
+ cursor: pointer;
233
337
  outline-offset: calc(-1 * #{mixins.baselinePx(5)});
234
- }
235
338
 
236
- .nav-group-text,
237
- /*Parent .nav-link*/
238
- .nav-text {
239
- //Display
240
- flex: 1 1 auto;
241
- //Mixins
339
+ hermes-icon[shape='angle-double'] {
340
+ color: vertical-nav-variables.$hermes-vertical-nav-toggle-icon-color;
242
341
 
243
- @include mixins.overflow-ellipsis();
244
- }
342
+ &:hover {
343
+ color: vertical-nav-variables.$hermes-vertical-nav-toggle-icon-hover-color;
344
+ }
245
345
 
246
- .nav-link {
247
- //Display
248
- display: flex;
249
- text-decoration: none;
346
+ &:active {
347
+ color: vertical-nav-variables.$hermes-vertical-nav-toggle-icon-active-color;
348
+ }
349
+ }
350
+
351
+ hermes-icon {
352
+ margin-right: 0;
250
353
 
251
- //Others
354
+ &:not([size]) {
355
+ @include mixins.equilateral(density.$hermes-base-icon-size-s);
356
+ }
357
+ }
252
358
 
253
- @include vertical-nav-mixins.vertical-nav-link-colors();
359
+ &.on-collapse hermes-icon {
360
+ margin: 0;
361
+ }
362
+ }
363
+
364
+ .nav-trigger-icon {
365
+ transition: all vertical-nav-variables.$hermes-vertical-nav-transition-duration ease-in-out;
366
+ }
367
+
368
+ .nav-trigger + .nav-content {
369
+ @include vertical-nav-mixins.vertical-nav-divider();
254
370
  }
255
371
 
256
372
  .nav-header {
257
- //Dims
258
373
  padding: vertical-nav-variables.$hermes-vertical-nav-header-padding;
259
374
  min-height: vertical-nav-variables.$hermes-vertical-nav-item-height;
260
375
 
261
- //Others
262
-
263
376
  @include mixins.generate-typography-token(
264
377
  'SECTION-12-SB-CPT',
265
378
  (
@@ -268,188 +381,203 @@
268
381
  );
269
382
  }
270
383
 
271
- //Parent .nav-text
272
- .nav-icon {
273
- //Display
274
- flex: 0 0 vertical-nav-variables.$hermes-vertical-nav-icon-size;
275
- align-self: center;
276
-
277
- //Dims
278
-
279
- @include mixins.min-equilateral(vertical-nav-variables.$hermes-vertical-nav-icon-size);
280
-
281
- margin-right: density.$hermes-base-gap-xs;
282
-
283
- //Others
284
- vertical-align: middle;
285
- }
286
-
287
- hermes-vertical-nav-group-children {
288
- display: block;
289
- }
290
-
291
384
  .nav-btn {
292
- //Display
293
385
  flex: 1 1 auto;
294
-
295
- //Dims
296
386
  padding: 0;
297
387
  margin: 0;
298
-
299
- //Others
300
388
  background: transparent;
301
389
  border: none;
302
390
  cursor: pointer;
303
391
  outline-offset: calc(-1 * #{mixins.baselinePx(5)});
304
392
  }
305
393
 
306
- & > .nav-link,
307
- .nav-content > .nav-link {
308
- //Display
309
- flex: 0 0 vertical-nav-variables.$hermes-vertical-nav-toggle-button-size;
394
+ // ── Rodapé de ajustes ───────────────────────────────────────────────────────────────────
395
+
396
+ // A linha de ajuste: o gatilho de modo, o nome do modo em que se está e os botões em lote.
397
+ // Fica embaixo porque é decisão que se toma uma vez — no topo ela disputaria o primeiro item da
398
+ // lista, que é o que se clica sempre.
399
+ .nav-footer {
400
+ position: relative;
401
+ display: flex;
402
+ flex: none;
403
+ align-items: center;
404
+ gap: vertical-nav-variables.$hermes-vertical-nav-child-gap;
405
+ padding: vertical-nav-variables.$hermes-vertical-nav-content-inset;
406
+ border-top: #{tokens.$hermes-alias-object-border-width-100} solid vertical-nav-variables.$hermes-vertical-nav-divider-color;
407
+ color: vertical-nav-variables.$hermes-vertical-nav-footer-text-color;
310
408
  }
311
409
 
312
- .nav-link + .nav-group-trigger {
313
- //Display
314
- flex: 0 0 vertical-nav-variables.$hermes-vertical-nav-toggle-button-size;
410
+ .nav-footer-btn {
411
+ display: inline-flex;
412
+ flex: none;
413
+ align-items: center;
414
+ justify-content: center;
415
+ width: vertical-nav-variables.$hermes-vertical-nav-item-height;
416
+ height: vertical-nav-variables.$hermes-vertical-nav-item-height;
417
+ padding: 0;
418
+ border: none;
419
+ border-radius: vertical-nav-variables.$hermes-vertical-nav-item-border-radius;
420
+ background-color: transparent;
421
+ color: vertical-nav-variables.$hermes-vertical-nav-icon-color;
422
+ cursor: pointer;
423
+ transition: background-color 0.24s cubic-bezier(0.4, 0, 0.2, 1);
424
+ outline-offset: calc(-1 * #{mixins.baselinePx(5)});
315
425
 
316
- .nav-group-text {
317
- display: none;
426
+ &:hover,
427
+ &[aria-expanded='true'] {
428
+ background-color: vertical-nav-variables.$hermes-vertical-nav-hover-bg-color;
318
429
  }
319
- }
320
-
321
- .nav-icon + .nav-group-text {
322
- padding-left: 0;
323
- }
324
430
 
325
- ///////
326
- //////
327
- ////
328
- // Interactions
329
- ////
330
- //////
331
- ///////
332
- &.has-nav-groups {
333
- .nav-content > .nav-link,
334
- .nav-group .nav-group-text,
335
- .nav-group .nav-group-trigger {
336
- font-weight: vertical-nav-variables.$hermes-vertical-nav-item-top-level-font-weight;
337
- }
338
-
339
- .nav-group-children .nav-link {
340
- padding: vertical-nav-variables.$hermes-vertical-nav-item-child-padding;
431
+ &:active {
432
+ background-color: vertical-nav-variables.$hermes-vertical-nav-active-bg-color;
341
433
  }
342
- }
343
434
 
344
- &.has-icons {
345
- .nav-group-children .nav-link {
346
- padding: vertical-nav-variables.$hermes-vertical-nav-item-child-padding;
435
+ hermes-icon {
436
+ @include mixins.equilateral(density.$hermes-base-icon-size-s);
347
437
  }
348
438
  }
349
439
 
350
- .nav-group.active:not(.is-expanded) {
351
- .nav-group-content {
352
- background-color: vertical-nav-variables.$hermes-vertical-nav-selected-bg-color;
440
+ .nav-footer-mode {
441
+ flex: 1 1 auto;
442
+ min-width: 0;
443
+ font-size: #{mixins.baselinePx(12)};
353
444
 
354
- //Horrible Nesting but nothing I can do.
355
- .nav-icon {
356
- fill: vertical-nav-variables.$hermes-vertical-nav-icon-active-color;
357
- }
358
- }
445
+ @include mixins.overflow-ellipsis();
359
446
  }
360
447
 
361
- .nav-group-content {
362
- .nav-link.active ~ .nav-group-trigger {
363
- background-color: vertical-nav-variables.$hermes-vertical-nav-selected-bg-color;
448
+ // O menu abre para cima, sobre a lista, e pode ser mais largo que a trilha compacta: por isso
449
+ // o painel não corta o que sai dele (só `.nav-content` rola).
450
+ .nav-footer-menu {
451
+ position: absolute;
452
+ bottom: calc(100% + #{mixins.baselinePx(4)});
453
+ left: vertical-nav-variables.$hermes-vertical-nav-content-inset;
454
+ z-index: 1;
455
+ display: grid;
456
+ gap: vertical-nav-variables.$hermes-vertical-nav-child-gap;
457
+ min-width: #{mixins.baselinePx(216)};
458
+ margin: 0;
459
+ padding: vertical-nav-variables.$hermes-vertical-nav-child-gap;
460
+ border: #{tokens.$hermes-alias-object-border-width-100} solid vertical-nav-variables.$hermes-vertical-nav-divider-color;
461
+ border-radius: vertical-nav-variables.$hermes-vertical-nav-item-border-radius;
462
+ background-color: vertical-nav-variables.$hermes-vertical-nav-menu-bg-color;
463
+ box-shadow: vertical-nav-variables.$hermes-vertical-nav-overlay-shadow;
464
+ list-style: none;
465
+ }
466
+
467
+ .nav-footer-menu-item {
468
+ @include nav-row();
469
+
470
+ width: 100%;
471
+ gap: #{mixins.baselinePx(8)};
472
+ color: vertical-nav-variables.$hermes-vertical-nav-item-color;
473
+ cursor: pointer;
474
+ border-radius: vertical-nav-variables.$hermes-vertical-nav-item-border-radius;
475
+ font-size: vertical-nav-variables.$hermes-vertical-nav-child-font-size;
476
+
477
+ hermes-icon {
478
+ flex: none;
479
+ color: vertical-nav-variables.$hermes-vertical-nav-icon-color;
480
+
481
+ @include mixins.equilateral(density.$hermes-base-icon-size-s);
364
482
  }
365
483
 
366
- .nav-link:hover ~ .nav-group-trigger {
484
+ &:hover {
367
485
  background-color: vertical-nav-variables.$hermes-vertical-nav-hover-bg-color;
368
486
  }
369
487
 
370
- .nav-link:active ~ .nav-group-trigger {
371
- background-color: vertical-nav-variables.$hermes-vertical-nav-active-bg-color;
488
+ &[aria-checked='true'] {
489
+ background-color: vertical-nav-variables.$hermes-vertical-nav-selected-bg-color;
490
+ font-weight: vertical-nav-variables.$hermes-vertical-nav-item-active-font-weight;
491
+ }
492
+
493
+ .nav-footer-menu-label {
494
+ flex: 1 1 auto;
495
+ min-width: 0;
496
+
497
+ @include mixins.overflow-ellipsis();
372
498
  }
499
+ }
373
500
 
374
- .nav-link.active:hover ~ .nav-group-trigger {
375
- background-color: vertical-nav-variables.$hermes-vertical-nav-selected-hover-bg-color;
501
+ &.nav-trigger--bottom {
502
+ .nav-trigger {
503
+ order: 2;
504
+ margin-top: 0;
376
505
  }
377
506
 
378
- .nav-link.active:active ~ .nav-group-trigger {
379
- background-color: vertical-nav-variables.$hermes-vertical-nav-selected-active-bg-color;
507
+ .nav-trigger + .nav-content {
508
+ border-top: 0;
509
+
510
+ @include vertical-nav-mixins.vertical-nav-divider('border-bottom');
380
511
  }
381
512
  }
382
513
 
383
- // horizontally center the expand icon
384
- &:not(.is-collapsed) .nav-link + .nav-group-trigger {
385
- justify-content: center;
514
+ // ── Modo sobreposto (largura de desktop) ────────────────────────────────────────────────
515
+
516
+ // Compacta em repouso e aberta POR CIMA do conteúdo: o painel sai do fluxo o tempo todo, aberto
517
+ // ou fechado — se saísse só ao abrir, a página entraria e sairia do fluxo a cada passada de
518
+ // ponteiro, acompanhando a coluna. Quem segura o lugar dela é o próprio host, com a largura da
519
+ // trilha, e a página não se mexe nunca: só a coluna, que cresce por cima.
520
+ @media screen and (min-width: #{$desktop-min-width}) {
521
+ &.is-overlay {
522
+ flex: none;
523
+ width: vertical-nav-variables.$hermes-vertical-nav-rail-width;
524
+ min-width: vertical-nav-variables.$hermes-vertical-nav-rail-width;
525
+
526
+ .nav-panel {
527
+ position: absolute;
528
+ inset: 0 auto 0 0;
529
+ z-index: var(--hermes-vertical-nav-overlay-z-index, 1000);
530
+ }
531
+
532
+ &:not(.is-collapsed) .nav-panel {
533
+ box-shadow: vertical-nav-variables.$hermes-vertical-nav-overlay-shadow;
534
+ }
535
+ }
386
536
  }
387
537
 
388
- .main-container:not([class*='open-overflow-menu'], [class*='open-hamburger-menu']) &.is-collapsed {
389
- //Dims
390
- width: vertical-nav-variables.$hermes-vertical-nav-min-width;
391
- min-width: vertical-nav-variables.$hermes-vertical-nav-min-width;
392
- // ATM - adress scroll when more items are available, otherwise the content gets hidden
393
- max-width: calc(#{vertical-nav-variables.$hermes-vertical-nav-min-width} + #{mixins.baselinePx(14)});
538
+ // ── Coluna recolhida ────────────────────────────────────────────────────────────────────
394
539
 
395
- //Others
540
+ .main-container:not([class*='open-overflow-menu'], [class*='open-hamburger-menu']) &.is-collapsed {
396
541
  cursor: pointer;
397
542
 
398
- .nav-icon {
399
- //Dims
400
- margin: density.$hermes-base-vertical-offset-m 0 density.$hermes-base-vertical-offset-m
401
- density.$hermes-base-horizontal-offset-xl;
543
+ .nav-panel {
544
+ width: vertical-nav-variables.$hermes-vertical-nav-rail-width;
545
+ min-width: vertical-nav-variables.$hermes-vertical-nav-rail-width;
546
+ max-width: vertical-nav-variables.$hermes-vertical-nav-rail-width;
402
547
  }
403
548
 
404
- .nav-group-content {
405
- .nav-link {
406
- //Display
407
- flex: 0 0 vertical-nav-variables.$hermes-vertical-nav-min-width;
408
- }
549
+ .nav-content {
550
+ // Rolagem só no eixo Y: na trilha de ícones nada rola para o lado.
551
+ overflow-x: hidden;
552
+ padding: vertical-nav-variables.$hermes-vertical-nav-content-inset;
553
+ }
409
554
 
410
- .nav-link ~ .nav-group-trigger {
411
- //Display
412
- flex: 0 0
413
- calc(
414
- #{vertical-nav-variables.$hermes-vertical-nav-collapsed-caret-size} +
415
- #{vertical-nav-variables.$hermes-vertical-nav-icon-right-margin}
416
- );
417
-
418
- //Others
419
- transform: translateX(calc(-1 * #{vertical-nav-variables.$hermes-vertical-nav-icon-size}));
420
- pointer-events: none;
421
- }
555
+ .nav-group-content .nav-link ~ .nav-group-trigger {
556
+ display: none;
422
557
  }
423
558
 
424
559
  .nav-link,
425
560
  .nav-group-trigger {
426
- //Dims
427
- padding: 0;
561
+ width: 100%;
428
562
  }
429
563
 
430
- .nav-group-trigger {
431
- //Display
432
- //flex: 0 0 $hermes-vertical-nav-collapsed-caret-size + $hermes-vertical-nav-icon-right-margin;
433
-
434
- //Dims
435
- padding-left: 0;
436
-
437
- hermes-icon,
438
- hermes-icon {
439
- &.nav-group-trigger-icon {
440
- width: density.$hermes-base-icon-size-s;
441
- margin: 0;
442
- }
443
- }
564
+ .nav-group-trigger-icon,
565
+ .nav-footer-mode,
566
+ .nav-footer-batch {
567
+ display: none;
568
+ }
569
+
570
+ .nav-group-children {
571
+ display: none;
444
572
  }
445
573
 
446
- //If no icon present then hide the nav-group and nav-links.
574
+ // Sem ícone não o que mostrar numa trilha de ícones: o item some.
447
575
  .nav-group,
448
576
  .nav-link {
449
577
  display: none;
450
578
  }
451
579
 
452
- //When the nav has icons just hide the nav-text
580
+ // Com ícones, o texto sai de cena. Continua no DOM, legível por leitor de tela.
453
581
  &.has-icons {
454
582
  .nav-group {
455
583
  display: block;
@@ -466,17 +594,30 @@
466
594
  }
467
595
  }
468
596
 
469
- &.nav-trigger--bottom {
470
- .nav-trigger {
471
- order: 2;
472
- margin-top: 0;
473
- }
597
+ // ── Gaveta (abaixo do breakpoint) ───────────────────────────────────────────────────────
598
+
599
+ // Aqui o header responsivo é quem posiciona o host (painel deslizante de largura fixa, com fundo
600
+ // escurecido). O painel só preenche esse espaço: modo, sobreposição e largura medida não valem —
601
+ // numa tela estreita a navegação está aberta ou não está, e quando está ocupa a largura toda.
602
+ @media screen and (max-width: #{$mobile-max-width}) {
603
+ &.hermes-nav-level-1,
604
+ &.hermes-nav-level-2 {
605
+ .nav-panel {
606
+ position: static;
607
+ width: 100%;
608
+ min-width: 0;
609
+ max-width: none;
610
+ box-shadow: none;
611
+ }
474
612
 
475
- .nav-trigger + .nav-content {
476
- //Dims
477
- border-top: 0;
613
+ .nav-footer {
614
+ display: none;
615
+ }
478
616
 
479
- @include vertical-nav-mixins.vertical-nav-divider('border-bottom');
617
+ // Folga no fim da lista para a última entrada não ficar escondida atrás da barra do navegador.
618
+ .nav-content {
619
+ padding-bottom: tokens.$hermes-global-space-10;
620
+ }
480
621
  }
481
622
  }
482
623
  }