@salesforcedevs/dx-components 1.40.4-fix-alpha → 1.40.4-fix-redoc-topic-v-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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforcedevs/dx-components",
3
- "version": "1.40.4-fix-alpha",
3
+ "version": "1.40.4-fix-redoc-topic-v-1",
4
4
  "description": "DX Lightning web components",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -43,5 +43,6 @@
43
43
  "eventsourcemock": "2.0.0",
44
44
  "luxon": "3.4.4",
45
45
  "msw": "^2.12.4"
46
- }
46
+ },
47
+ "stableVersion": "1.40.4"
47
48
  }
@@ -20,11 +20,6 @@
20
20
  --dx-c-button-line-height: inherit;
21
21
  --dx-c-button-letter-spacing: inherit;
22
22
  --dx-c-button-display: flex;
23
-
24
- /* Keyboard focus ring (WES): a 2px white band, then a 2px blue outline. */
25
- --dx-c-button-focus-outline: 2px solid var(--dx-g-blue-vibrant-60);
26
- --dx-c-button-focus-offset: 2px;
27
- --dx-c-button-focus-shadow: 0 0 0 2px white;
28
23
  }
29
24
 
30
25
  .button {
@@ -37,8 +32,7 @@
37
32
  user-select: none;
38
33
  white-space: nowrap;
39
34
  font-size: var(--dx-c-button-font-size);
40
- transition: var(--dx-g-transition-hue-1x),
41
- var(--dx-g-transition-box-shadow-1x);
35
+ transition: var(--dx-g-transition-hue-1x);
42
36
  padding: var(--dx-c-button-vertical-spacing, 0)
43
37
  var(--dx-c-button-horizontal-spacing, var(--dx-g-spacing-md));
44
38
  border-radius: var(--dx-g-spacing-xs);
@@ -66,11 +60,7 @@
66
60
  display: inline;
67
61
  vertical-align: var(--dx-c-button-icon-vertical-align, unset);
68
62
 
69
- /* Component hook first; the global stays as the fallback for dark mode. */
70
- --dx-c-icon-color: var(
71
- --dx-c-button-icon-color,
72
- var(--dx-g-button-icon-color, currentcolor)
73
- );
63
+ --dx-c-icon-color: var(--dx-g-button-icon-color, currentcolor);
74
64
  }
75
65
 
76
66
  .button.variant_inline dx-icon,
@@ -201,7 +191,6 @@
201
191
  }
202
192
 
203
193
  .button.variant_primary:hover,
204
- .button.variant_primary:focus-visible,
205
194
  :host([aria-expanded="true"]) .button.variant_primary {
206
195
  background: var(--dx-c-button-primary-color-hover);
207
196
  border-color: var(--dx-c-button-primary-color-hover);
@@ -226,8 +215,6 @@
226
215
 
227
216
  .button.variant_secondary:hover,
228
217
  .button.variant_quaternary:hover,
229
- .button.variant_secondary:focus-visible,
230
- .button.variant_quaternary:focus-visible,
231
218
  :host([aria-expanded="true"]) .button.variant_secondary,
232
219
  :host([aria-expanded="true"]) .button.variant_quaternary {
233
220
  background: var(--dx-c-button-secondary-color-hover);
@@ -247,7 +234,6 @@
247
234
  }
248
235
 
249
236
  .button.variant_tertiary:hover,
250
- .button.variant_tertiary:focus-visible,
251
237
  :host([aria-expanded="true"]) .button.variant_tertiary {
252
238
  background: var(--dx-c-button-secondary-color-hover);
253
239
  border-color: var(--dx-c-button-secondary-color-hover);
@@ -264,8 +250,6 @@
264
250
 
265
251
  .button.variant_inline:hover,
266
252
  .button.variant_inline-inherit:hover,
267
- .button.variant_inline:focus-visible,
268
- .button.variant_inline-inherit:focus-visible,
269
253
  :host([aria-expanded="true"])
270
254
  :is(.button.variant_inline, .button.variant_inline-inherit) {
271
255
  color: var(--dx-c-button-inline-color-hover);
@@ -293,30 +277,10 @@
293
277
  }
294
278
 
295
279
  .button.variant_custom:hover,
296
- .button.variant_custom:focus-visible,
297
280
  .button.variant_icon-only:hover,
298
- .button.variant_icon-only:focus-visible,
299
281
  :host([aria-expanded="true"]) .button.variant_custom,
300
282
  :host([aria-expanded="true"]) .button.variant_icon-only {
301
283
  color: var(--dx-c-button-custom-color-hover);
302
284
  background: var(--dx-c-button-custom-background-hover);
303
285
  border-color: var(--dx-c-button-custom-border-hover);
304
-
305
- /* An inset shadow can thicken the edge without resizing the button. */
306
- box-shadow: var(--dx-c-button-custom-border-shadow-hover, none);
307
- }
308
-
309
- /* Keyboard focus only; an open menu alone shows no ring. Keep last so it wins
310
- over hover and the open state (:host lifts it above the custom and icon-only
311
- hover rules). The outline survives Windows high-contrast mode; the white band
312
- does not. */
313
- :host .button:focus-visible,
314
- :host .button:focus-visible:hover,
315
- :host([aria-expanded="true"]) .button:focus-visible {
316
- outline: var(--dx-c-button-focus-outline);
317
- outline-offset: var(--dx-c-button-focus-offset);
318
- box-shadow: var(--dx-c-button-focus-shadow);
319
-
320
- /* The ring appears at once instead of fading in. */
321
- transition: var(--dx-g-transition-hue-1x);
322
286
  }
@@ -1,14 +1,5 @@
1
1
  @import "dxHelpers/reset";
2
2
 
3
- /* Options run edge to edge; the menu adds space above the first and below
4
- the last. */
5
- dx-popover {
6
- --dx-c-popover-padding: var(
7
- --dx-c-dropdown-padding,
8
- var(--dx-g-spacing-sm) 0
9
- );
10
- }
11
-
12
3
  .menu-nested:not(.menu-fit-content)::part(content) {
13
4
  padding-top: var(--dx-g-spacing-sm);
14
5
  width: 354px;
@@ -23,31 +14,30 @@ dx-popover {
23
14
  display: none;
24
15
  }
25
16
 
26
- /* fit-content and fit-end: the menu is as wide as its longest label. */
27
- .menu-fit-content {
28
- --dx-c-popover-width: max-content;
29
- }
30
-
31
- /* fit-end also stops at --dx-c-dropdown-menu-max-width. Labels wrap only once
32
- the menu reaches that width. */
33
- .menu-fit-end::part(content) {
17
+ /* Opt-in fit-content menu: hugs the labels (so it can be as narrow as the
18
+ shortest one) and stops at --dx-c-dropdown-menu-max-width. Defaults still
19
+ truncate; set --dx-c-dropdown-fit-white-space: normal to wrap instead. */
20
+ .menu-fit-content::part(content) {
34
21
  box-sizing: border-box;
22
+ width: max-content;
35
23
  max-width: var(
36
24
  --dx-c-dropdown-menu-max-width,
37
25
  calc(100vw - var(--dx-g-spacing-lg))
38
26
  );
39
27
  }
40
28
 
41
- .menu-fit-content.menu-nested .menu_list {
42
- width: 100%;
43
- align-items: flex-start;
44
- gap: var(--dx-g-spacing-sm);
45
- }
46
-
47
- .menu-fit-content.menu-nested .menu_option:not(:first-child) {
48
- border-top: var(--border);
49
- margin-top: 0;
50
- padding-top: var(--dx-g-spacing-sm);
29
+ .menu-fit-content {
30
+ --dx-c-dropdown-option-min-width: 0;
31
+ --dx-c-dropdown-option-label-display: block;
32
+ --dx-c-dropdown-option-white-space: var(
33
+ --dx-c-dropdown-fit-white-space,
34
+ nowrap
35
+ );
36
+ --dx-c-dropdown-option-overflow: var(--dx-c-dropdown-fit-overflow, hidden);
37
+ --dx-c-dropdown-option-text-overflow: var(
38
+ --dx-c-dropdown-fit-text-overflow,
39
+ ellipsis
40
+ );
51
41
  }
52
42
 
53
43
  @media screen and (max-width: 1000px) {
@@ -119,8 +119,7 @@ export default class Dropdown extends LightningElement {
119
119
  "menu-nested-2-col",
120
120
  this.offset && `menu-offset-${this.offset}`,
121
121
  this.areOptionsEmpty && "menu-hidden",
122
- fitContent && "menu-fit-content",
123
- this.widthMode === "fit-end" && "menu-fit-end"
122
+ fitContent && "menu-fit-content"
124
123
  );
125
124
  }
126
125
 
@@ -12,16 +12,11 @@
12
12
  width: var(--shape-width);
13
13
  }
14
14
 
15
- /* The vertical stroke of the "L" runs up to the top edge of the option: the
16
- top padding plus the space above the shape inside the line box. */
17
15
  .indented-shape::after {
18
16
  background-color: var(--background);
19
17
  bottom: 0;
20
18
  content: "";
21
- height: calc(
22
- var(--dx-g-spacing-sm) +
23
- (var(--dx-g-spacing-lg) + var(--wide) - var(--dx-g-spacing-xs)) / 2
24
- );
19
+ height: 15px;
25
20
  position: absolute;
26
21
  width: var(--wide);
27
22
  }
@@ -30,12 +25,14 @@
30
25
  display: flex;
31
26
  font-family: var(--dx-g-font-sans);
32
27
  width: 100%;
33
- padding: var(
34
- --dx-c-dropdown-option-padding,
35
- var(--dx-g-spacing-sm) var(--dx-g-spacing-lg)
36
- );
28
+
29
+ /* Opt-in hooks; defaults preserve today's look. */
30
+ padding: var(--dx-c-dropdown-option-padding, var(--dx-g-spacing-sm));
37
31
  font-size: var(--dx-g-text-sm);
38
- border-radius: var(--dx-c-dropdown-option-border-radius, 0);
32
+ border-radius: var(
33
+ --dx-c-dropdown-option-border-radius,
34
+ var(--dx-g-spacing-xs)
35
+ );
39
36
  transition: var(--dx-g-transition-hue-1x);
40
37
  align-items: center;
41
38
  outline: none !important;
@@ -56,6 +53,8 @@
56
53
  }
57
54
 
58
55
  .option-active {
56
+ --dx-c-dropdown-option-label-color: var(--dx-g-blue-vibrant-50);
57
+
59
58
  background: var(--dx-g-cloud-blue-vibrant-95);
60
59
  }
61
60
 
@@ -63,34 +62,27 @@
63
62
  display: flex;
64
63
  flex-direction: column;
65
64
  justify-content: center;
66
- align-items: flex-start;
67
- gap: var(--dx-g-spacing-sm);
68
- flex: 1;
69
- min-width: 0;
70
65
  font-family: var(--dx-g-font-sans);
71
66
  font-size: var(--dx-g-text-sm);
72
67
  text-align: left;
68
+
69
+ /* Opt-in: set to 0 to let a long label truncate instead of overflow. */
70
+ min-width: var(--dx-c-dropdown-option-min-width, auto);
73
71
  }
74
72
 
75
73
  .option-indented .option_details {
76
74
  align-items: center;
77
75
  flex-direction: row;
78
- justify-content: flex-start;
79
- gap: 0;
80
76
  }
81
77
 
82
78
  .option_label {
83
- color: var(--dx-c-dropdown-option-label-color, var(--dx-g-text-body-color));
79
+ color: var(--dx-c-dropdown-option-label-color, var(--dx-g-blue-vibrant-50));
84
80
 
85
81
  /* Opt-in: set to block so text-overflow:ellipsis applies (ignored on flex). */
86
82
  display: var(--dx-c-dropdown-option-label-display, flex);
87
83
  align-items: center;
88
- font-weight: var(
89
- --dx-c-dropdown-option-font-weight,
90
- var(--dx-g-font-normal)
91
- );
84
+ font-weight: var(--dx-c-dropdown-option-font-weight, var(--dx-g-font-bold));
92
85
  font-size: var(--dx-c-dropdown-option-font-size, var(--dx-g-text-base));
93
- line-height: var(--dx-g-spacing-lg);
94
86
 
95
87
  /* Opt-in truncation: consumers set --dx-c-dropdown-option-white-space:
96
88
  nowrap to truncate labels with an ellipsis instead of wrapping.
@@ -115,57 +107,65 @@
115
107
 
116
108
  .option_description {
117
109
  color: var(--dx-g-gray-30);
110
+ margin-top: var(--dx-g-spacing-xs);
118
111
  line-height: 18px;
119
112
  }
120
113
 
121
- /* An option can have a start icon (iconSymbol), an end icon (endIconSymbol),
122
- or both. */
123
114
  .option_icon {
124
- --dx-c-icon-size: var(--dx-g-icon-size-md);
125
- --dx-c-icon-color: var(--dx-g-gray-50);
126
-
115
+ margin-right: var(--dx-g-spacing-md);
127
116
  flex-shrink: 0;
128
117
  }
129
118
 
130
- .option_icon-start {
131
- margin-right: var(--dx-g-spacing-md);
119
+ .option-indented {
120
+ padding-top: var(--dx-g-spacing-xs);
121
+ padding-bottom: var(--dx-g-spacing-xs);
132
122
  }
133
123
 
134
- .option_icon-end {
135
- margin-left: var(--dx-g-spacing-2xl);
124
+ .option-fit-content {
125
+ min-width: 0;
126
+ padding: var(--dx-g-spacing-sm) var(--dx-g-spacing-lg);
136
127
  }
137
128
 
138
- /* Indented (breadcrumb hierarchy) menus keep their own selected label color. */
139
- .option-indented.option-active {
140
- --dx-c-dropdown-option-label-color: var(--dx-g-blue-vibrant-50);
129
+ .option-fit-content .option_details {
130
+ align-items: flex-start;
131
+ gap: var(--dx-g-spacing-sm);
132
+ min-width: 0;
133
+ flex: 1;
141
134
  }
142
135
 
143
- /* fit-content (toolbar): one line per label, truncated with an ellipsis. */
144
- .option-fit-content {
145
- min-width: 0;
136
+ .option-fit-content .option_description {
137
+ margin-top: 0;
146
138
  }
147
139
 
148
140
  .option-fit-content .option_label {
149
141
  display: block;
142
+ color: var(--dx-g-gray-10);
143
+ font-weight: var(--dx-g-font-normal);
144
+ line-height: var(--dx-g-spacing-lg);
150
145
  white-space: nowrap;
151
146
  overflow: hidden;
152
147
  text-overflow: ellipsis;
153
148
  max-width: calc(100vw - var(--dx-g-spacing-lg) * 4);
154
149
  }
155
150
 
156
- /* Each "L" starts xs past the first letter of the label above it. A label
157
- sits one shape plus its sm margin after its own "L", so each level steps in
158
- by that much plus xs. */
151
+ .option-fit-content.option-active .option_label {
152
+ color: var(--dx-g-blue-vibrant-50);
153
+ }
154
+
155
+ .option-fit-content .option_icon {
156
+ --dx-c-icon-size: var(--dx-g-icon-size-md);
157
+ --dx-c-icon-color: var(--dx-g-gray-50);
158
+
159
+ order: 1;
160
+ margin-right: 0;
161
+ margin-left: var(--dx-g-spacing-2xl);
162
+ }
163
+
159
164
  .option-indented:not([data-index="0"]) {
160
- --base-indentation: calc(
161
- var(--shape-width) + var(--dx-g-spacing-sm) + var(--dx-g-spacing-xs)
162
- );
165
+ --base-indentation: calc(var(--dx-g-spacing-md) + var(--shape-width));
163
166
  --shape-width: 8px;
164
167
 
165
- padding-left: calc(
166
- var(--indentation, 0px) + var(--dx-g-spacing-lg) +
167
- var(--dx-g-spacing-xs)
168
- );
168
+ padding-left: calc(var(--indentation, 0px) + var(--dx-g-spacing-md));
169
169
  }
170
170
 
171
171
  [data-index="2"] {
@@ -11,12 +11,11 @@
11
11
  onclick={onClick}
12
12
  >
13
13
  <dx-icon
14
- class="option_icon option_icon-start"
14
+ class="option_icon"
15
15
  symbol={option.iconSymbol}
16
16
  sprite={option.iconSprite}
17
- color={option.iconColor}
18
- lwc:if={option.iconSymbol}
19
- size="override"
17
+ if:true={option.iconSymbol}
18
+ size={optionIconSize}
20
19
  ></dx-icon>
21
20
  <div class="option_details">
22
21
  <div if:true={renderIndentedShape} class="indented-shape"></div>
@@ -31,14 +30,6 @@
31
30
  {option.description}
32
31
  </div>
33
32
  </div>
34
- <dx-icon
35
- class="option_icon option_icon-end"
36
- symbol={option.endIconSymbol}
37
- sprite={option.endIconSprite}
38
- color={option.endIconColor}
39
- lwc:if={option.endIconSymbol}
40
- size="override"
41
- ></dx-icon>
42
33
  </a>
43
34
  <button
44
35
  if:false={option.link}
@@ -49,12 +40,12 @@
49
40
  onclick={onClick}
50
41
  >
51
42
  <dx-icon
52
- class="option_icon option_icon-start"
43
+ class="option_icon"
53
44
  symbol={option.iconSymbol}
54
45
  sprite={option.iconSprite}
55
46
  color={option.iconColor}
56
- lwc:if={option.iconSymbol}
57
- size="override"
47
+ if:true={option.iconSymbol}
48
+ size={optionIconSize}
58
49
  ></dx-icon>
59
50
  <div class="option_details">
60
51
  <div if:true={renderIndentedShape} class="indented-shape"></div>
@@ -63,13 +54,5 @@
63
54
  {option.description}
64
55
  </div>
65
56
  </div>
66
- <dx-icon
67
- class="option_icon option_icon-end"
68
- symbol={option.endIconSymbol}
69
- sprite={option.endIconSprite}
70
- color={option.endIconColor}
71
- lwc:if={option.endIconSymbol}
72
- size="override"
73
- ></dx-icon>
74
57
  </button>
75
58
  </template>
@@ -4,7 +4,8 @@ import {
4
4
  OptionWithNested,
5
5
  AnalyticsPayload,
6
6
  DropdownVariant,
7
- DropdownWidthMode
7
+ DropdownWidthMode,
8
+ IconSize
8
9
  } from "typings/custom";
9
10
  import { track } from "dxUtils/analytics";
10
11
 
@@ -40,6 +41,10 @@ export default class DropdownOption extends LightningElement {
40
41
  return this.variant === "indented" && this.indexPosition >= 1;
41
42
  }
42
43
 
44
+ private get optionIconSize(): IconSize {
45
+ return this.widthMode === "fit-content" ? "override" : "large";
46
+ }
47
+
43
48
  private onClick(e: PointerEvent) {
44
49
  this.dispatchEvent(
45
50
  new CustomEvent("select", { detail: this.keyValue })
@@ -29,6 +29,7 @@
29
29
  padding: var(--popover-padding);
30
30
  overflow-y: auto;
31
31
  transition: var(--popover-transition);
32
+ transition-delay: 0.02s;
32
33
  transform: translateY(var(--dx-g-spacing-xs));
33
34
  opacity: 0;
34
35
  }
@@ -39,9 +40,6 @@
39
40
  }
40
41
 
41
42
  .popover-container_open .popover {
42
- /* Delay only on open. A closing delay keeps the menu visible for a frame
43
- after its container hides, while it moves (a flash above the trigger). */
44
- transition-delay: 0.02s;
45
43
  opacity: 1;
46
44
  transform: var(--popover-container-open-transform);
47
45
  }
@@ -240,16 +240,6 @@ export default class Popover extends LightningElement {
240
240
  this.dispatchEvent(new CustomEvent("controlarrowdown"));
241
241
  break;
242
242
  }
243
- // A mouse-opened menu leaves focus on the control, so Escape lands
244
- // here, not in the popover's own key handler.
245
- case "Esc":
246
- case "Escape": {
247
- if (this.open) {
248
- this.dispatchRequestCloseEvent("keypress-escape");
249
- this.closePopover(true);
250
- }
251
- break;
252
- }
253
243
  default:
254
244
  }
255
245
  };
@@ -5,6 +5,8 @@
5
5
  --button-primary-color-hover: var(--dx-g-cloud-blue-vibrant-95);
6
6
  --popover-container-open-transform: translateX(-4px) translateY(-8px);
7
7
  --popover-transition: none;
8
+ --dx-c-dropdown-option-font-weight: normal;
9
+ --dx-c-dropdown-option-label-color: var(--dx-g-gray-10);
8
10
  }
9
11
 
10
12
  .footer-item {
@@ -2,9 +2,7 @@
2
2
  @import "dxHelpers/text";
3
3
 
4
4
  :host {
5
- /* Width of the sidebar content (search field, version pickers) on tablet
6
- and desktop. The sidebar adds its left padding and a 24px right inset. */
7
- --dx-c-sidebar-content-width: 296px;
5
+ --dx-c-sidebar-width: 337px;
8
6
  --dx-c-sidebar-button-color: var(--dx-g-blue-vibrant-50);
9
7
  --dx-c-sidebar-button-background: white;
10
8
  --dx-c-sidebar-button-border: white;
@@ -13,9 +11,7 @@
13
11
  --dx-c-sidebar-button-border-hover: var(--dx-g-blue-vibrant-50);
14
12
  --dx-c-sidebar-left-padding: var(--dx-g-global-header-padding-horizontal);
15
13
  --dx-c-sidebar-vertical-padding: var(--dx-g-spacing-md);
16
-
17
- /* Widest a small version picker menu can grow. */
18
- --doc-version-picker-width: var(--dx-c-sidebar-content-width);
14
+ --doc-version-picker-width: 296px;
19
15
  }
20
16
 
21
17
  .header {
@@ -51,7 +47,7 @@
51
47
  color: var(--dx-g-blue-vibrant-30);
52
48
  }
53
49
 
54
- .container.collapsed:not(.container-mobile) {
50
+ .container.collapsed {
55
51
  width: var(--dx-g-spacing-xl);
56
52
  }
57
53
 
@@ -86,19 +82,15 @@
86
82
  display: flex;
87
83
  flex-direction: column;
88
84
  height: var(--dx-c-sidebar-height);
89
-
90
- /* Mobile (container-mobile, set at 768px and below) fills the viewport. */
91
- width: 100%;
85
+ width: calc(var(--dx-c-sidebar-width) + var(--left-spacing));
92
86
  }
93
87
 
94
- /* Tablet and desktop: left padding + content + right inset. */
95
88
  .container:not(.container-mobile) {
96
89
  --border-color: transparent;
97
-
98
- width: calc(
99
- var(--dx-c-sidebar-left-padding) + var(--dx-c-sidebar-content-width) +
100
- var(--dx-g-spacing-lg)
90
+ --left-spacing: calc(
91
+ var(--dx-c-sidebar-left-padding) - var(--dx-g-spacing-md)
101
92
  );
93
+
102
94
  box-shadow: 2px 0 0 0 var(--border-color);
103
95
  min-height: var(--dx-c-sidebar-min-height);
104
96
  padding: var(--dx-c-sidebar-vertical-padding) 0 var(--dx-g-spacing-2xs) 0;
@@ -114,9 +106,7 @@
114
106
  }
115
107
 
116
108
  .container.container-mobile {
117
- --doc-version-picker-width: calc(
118
- 100vw - var(--dx-c-sidebar-left-padding) - var(--dx-g-spacing-lg)
119
- );
109
+ width: 100%;
120
110
  }
121
111
 
122
112
  .container.container-mobile .header {
@@ -179,3 +169,11 @@
179
169
  .sidebar-content-hasfooter {
180
170
  margin-bottom: var(--dx-g-spacing-2xl);
181
171
  }
172
+
173
+ @media screen and (max-width: 767px) {
174
+ :host {
175
+ --doc-version-picker-width: calc(
176
+ 100vw - var(--dx-c-sidebar-left-padding) - var(--dx-g-spacing-lg)
177
+ );
178
+ }
179
+ }
@@ -318,7 +318,7 @@ function hrefMatchesVersion(
318
318
  return hrefMatchesCurrentPage(applyVersionToHref(href, version, versions));
319
319
  }
320
320
 
321
- function collectSubtreeCanonicalHrefs(
321
+ export function collectSubtreeCanonicalHrefs(
322
322
  node: VersionedNode,
323
323
  includeSelf = true
324
324
  ): string[] {