@salesforcedevs/docs-components 1.33.2-llms-txt-3 → 1.34.0-alpha

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.
@@ -4,26 +4,59 @@
4
4
  :host {
5
5
  --dx-c-dropdown-option-font-weight: normal;
6
6
  --dx-c-dropdown-option-label-color: var(--dx-g-gray-10);
7
+ --dx-c-dropdown-option-padding: var(--dx-g-spacing-sm)
8
+ var(--dx-g-spacing-lg);
9
+ --dx-c-popover-padding: var(--dx-g-spacing-sm) 0;
7
10
  --popover-container-open-transform: translateY(4px);
8
11
  }
9
12
 
13
+ /* Open menus must stack above later sibling pickers in the sidebar. */
14
+ :host(:has([aria-expanded="true"])) {
15
+ position: relative;
16
+ z-index: 2;
17
+ }
18
+
10
19
  .version-picker-container {
11
- padding: 8px var(--dx-g-spacing-lg) 8px
12
- var(--dx-g-global-header-padding-horizontal);
13
- border-top: 1px solid var(--dx-g-gray-90);
14
- border-bottom: 1px solid var(--dx-g-gray-90);
20
+ /* Override --doc-version-picker-padding to change the inset (e.g. when the
21
+ picker sits inside an already-padded container). */
22
+ padding: var(
23
+ --doc-version-picker-padding,
24
+ var(--dx-g-spacing-sm) var(--dx-g-spacing-lg) var(--dx-g-spacing-sm)
25
+ var(--dx-g-global-header-padding-horizontal)
26
+ );
27
+
28
+ /* Override --doc-version-picker-divider (e.g. `none`) to restyle dividers. */
29
+ border-top: var(
30
+ --doc-version-picker-divider,
31
+ 1px solid var(--dx-g-gray-90)
32
+ );
33
+ border-bottom: var(
34
+ --doc-version-picker-divider,
35
+ 1px solid var(--dx-g-gray-90)
36
+ );
37
+ }
38
+
39
+ /* Inline sidebar variant: drop the header-slot chrome so the picker sits
40
+ beside a tree node without extra padding or divider lines. */
41
+ .version-picker-container-small {
42
+ display: flex;
43
+ align-items: center;
44
+ padding: 0;
45
+ border: none;
15
46
  }
16
47
 
17
48
  .version-picker-button {
18
49
  display: flex;
19
50
  width: var(--doc-version-picker-width, 296px);
51
+
52
+ --dx-c-button-horizontal-spacing: var(--dx-g-spacing-sm);
53
+ --dx-g-button-icon-color: var(--dx-g-gray-50);
20
54
  }
21
55
 
22
56
  .version-picker-button:hover,
23
- .version-picker-button:active,
24
- .version-picker-button:focus {
25
- --dx-c-button-secondary-color-hover: var(--dx-g-cloud-blue-vibrant-95);
26
- --dx-c-button-primary-color: var(--dx-g-blue-vibrant-40);
57
+ .version-picker-button:focus-within,
58
+ .version-picker-button[aria-expanded="true"] {
59
+ --dx-g-button-icon-color: var(--dx-g-blue-vibrant-20);
27
60
  }
28
61
 
29
62
  /**
@@ -35,6 +68,27 @@ dx-button::part(content) {
35
68
  overflow: hidden;
36
69
  }
37
70
 
71
+ /* The border is an inset box-shadow so thickening it on hover/focus doesn't
72
+ resize the small variant's fit-content box. */
73
+ .version-picker-button::part(container) {
74
+ background: white;
75
+ box-shadow: inset 0 0 0 1px var(--dx-g-gray-50);
76
+ color: var(--dx-g-gray-10);
77
+ }
78
+
79
+ .version-picker-button::part(container):hover {
80
+ background: var(--dx-g-blue-vibrant-95);
81
+ box-shadow: inset 0 0 0 2px var(--dx-g-blue-vibrant-20);
82
+ }
83
+
84
+ /* aria-expanded keeps the focus ring while the menu is open. */
85
+ .version-picker-button:focus-within::part(container),
86
+ .version-picker-button[aria-expanded="true"]::part(container) {
87
+ background: var(--dx-g-blue-vibrant-95);
88
+ box-shadow: inset 0 0 0 2px var(--dx-g-blue-vibrant-20), 0 0 0 2px white,
89
+ 0 0 0 4px var(--dx-g-blue-vibrant-60);
90
+ }
91
+
38
92
  .selected-version {
39
93
  display: flex;
40
94
  flex-direction: row;
@@ -49,16 +103,100 @@ dx-button::part(content) {
49
103
  white-space: nowrap;
50
104
  }
51
105
 
52
- dx-type-badge.latest-badge {
53
- --dx-c-type-badge-color: var(--dx-g-green-vibrant-40);
54
- --dx-c-type-badge-background: var(--dx-g-green-vibrant-95);
55
-
106
+ dx-type-badge.latest-badge,
107
+ dx-type-badge.not-latest-badge {
56
108
  margin-left: var(--dx-g-spacing-sm);
57
109
  }
58
110
 
59
- dx-type-badge.not-latest-badge {
60
- --dx-c-type-badge-color: var(--dx-g-red-vibrant-40);
61
- --dx-c-type-badge-background: var(--dx-g-red-vibrant-95);
111
+ /* ------------------------------------------------------------------ *
112
+ * Small "dot" variant (opt-in via `small`). Additive
113
+ * ------------------------------------------------------------------ */
62
114
 
63
- margin-left: var(--dx-g-spacing-sm);
115
+ /* Option padding is sm both axes: the small menu tracks the ~104px trigger, so
116
+ the default 24px horizontal would crowd the labels. */
117
+ .version-picker-dropdown-small {
118
+ --dx-c-dropdown-option-font-size: var(--dx-g-text-xs);
119
+ --dx-c-dropdown-option-padding: var(--dx-g-spacing-sm)
120
+ var(--dx-g-spacing-sm);
121
+ --dx-c-dropdown-option-border-radius: 0;
122
+ --dx-c-popover-border: none;
123
+ }
124
+
125
+ .version-picker-button-small {
126
+ width: fit-content;
127
+ max-width: 104px;
128
+
129
+ --dx-c-button-font-size: var(--dx-g-text-xs);
130
+ --dx-c-button-font-weight: var(--dx-g-font-normal);
131
+ --dx-c-button-line-height: var(--dx-g-spacing-lg);
132
+ --dx-c-button-icon-gap: var(--dx-g-spacing-2xs);
133
+ }
134
+
135
+ /* min-width: 0 on each flex ancestor lets the label truncate: a flex item's
136
+ default min-width: auto refuses to shrink below its content and overrides the
137
+ host's max-width, so without this the trigger overflows instead. */
138
+ .version-picker-button-small::part(content) {
139
+ display: flex;
140
+ flex: 1;
141
+ min-width: 0;
142
+ width: auto;
143
+ overflow: hidden;
144
+ }
145
+
146
+ /* width:100% re-ties to the 104px-capped host (container is width:inherit,
147
+ which copies width but not max-width). Border/bg/states are shared above. */
148
+ .version-picker-button-small::part(container) {
149
+ width: 100%;
150
+ height: var(--dx-g-spacing-lg);
151
+ padding: 0 var(--dx-g-spacing-xs);
152
+ }
153
+
154
+ .selected-version-small {
155
+ flex: 1;
156
+ min-width: 0;
157
+ }
158
+
159
+ .version-picker-dot {
160
+ flex: 0 0 auto;
161
+ width: var(--dx-g-spacing-sm);
162
+ height: var(--dx-g-spacing-sm);
163
+ margin-right: var(--dx-g-spacing-xs);
164
+ border-radius: 50%;
165
+ }
166
+
167
+ .version-picker-dot-latest {
168
+ background: var(--dx-g-green-vibrant-60);
169
+ }
170
+
171
+ .version-picker-dot-not-latest {
172
+ background: var(--dx-g-yellow-vibrant-80);
173
+ }
174
+
175
+ /* inline-block (not flex) so the label can truncate; line-height centers it. */
176
+ .version-picker-readonly {
177
+ box-sizing: border-box;
178
+ display: inline-block;
179
+ width: var(--doc-version-picker-width, 296px);
180
+ height: var(--dx-g-spacing-xl);
181
+ margin: 0;
182
+ padding: 0 var(--dx-g-spacing-sm);
183
+ border: 1px solid var(--dx-g-gray-80);
184
+ border-radius: var(--dx-g-spacing-xs);
185
+ overflow: hidden;
186
+ color: var(--dx-g-gray-10);
187
+ text-overflow: ellipsis;
188
+ white-space: nowrap;
189
+ font: var(--dx-g-font-normal) var(--dx-g-text-sm) / var(--dx-g-spacing-xl)
190
+ var(--dx-g-font-sans),
191
+ sans-serif;
192
+ }
193
+
194
+ .version-picker-readonly-small {
195
+ width: fit-content;
196
+ max-width: 104px;
197
+ height: var(--dx-g-spacing-lg);
198
+ padding: 0 var(--dx-g-spacing-xs);
199
+ font: var(--dx-g-font-normal) var(--dx-g-text-xs) / var(--dx-g-spacing-lg)
200
+ var(--dx-g-font-sans),
201
+ sans-serif;
64
202
  }
@@ -1,37 +1,70 @@
1
1
  <template>
2
- <div lwc:if={showVersionPicker} class="version-picker-container">
2
+ <div lwc:if={showVersionPicker} class={containerClass}>
3
+ <!-- Small read-only: plain value, no dropdown -->
4
+ <p
5
+ lwc:if={readOnly}
6
+ class={readOnlyClass}
7
+ title={selectedVersion.label}
8
+ >
9
+ {selectedVersion.label}
10
+ </p>
11
+
3
12
  <dx-dropdown
13
+ lwc:else
14
+ class={dropdownClass}
4
15
  options={versions}
5
16
  analytics-event="custEv_docVersionSelect"
6
17
  analytics-payload={analyticsPayload}
7
18
  value={selectedVersion.id}
8
- width="var(--doc-version-picker-width)"
19
+ full-width="true"
9
20
  onchange={onVersionChange}
10
21
  >
11
22
  <dx-button
12
- class="version-picker-button"
23
+ class={triggerClass}
13
24
  variant="tertiary"
14
25
  size="small"
26
+ font="sans"
15
27
  icon-symbol="chevrondown"
16
- icon-size="medium"
28
+ icon-size={triggerIconSize}
29
+ aria-label={triggerAriaLabel}
17
30
  >
18
- <div class="selected-version">
19
- <p class="selected-version-label">
20
- {selectedVersion.label}
21
- </p>
22
- <template lwc:if={showLatestTag}>
23
- <dx-type-badge
24
- class="latest-badge"
25
- lwc:if={latestVersion}
26
- value="Latest"
27
- size="small"
28
- ></dx-type-badge>
29
- <dx-type-badge
30
- class="not-latest-badge"
31
- lwc:else
32
- value="Not Latest"
33
- size="small"
34
- ></dx-type-badge>
31
+ <div class={selectedVersionClass}>
32
+ <!-- Small: leading colored dot -->
33
+ <template lwc:if={small}>
34
+ <template lwc:if={showLatestTag}>
35
+ <span class={dotClass} aria-hidden="true"></span>
36
+ </template>
37
+ <p
38
+ class="selected-version-label"
39
+ title={selectedVersion.label}
40
+ >
41
+ {selectedVersion.label}
42
+ </p>
43
+ </template>
44
+ <!-- Default: trailing Latest/Not-Latest badge -->
45
+ <template lwc:else>
46
+ <p
47
+ class="selected-version-label"
48
+ title={selectedVersion.label}
49
+ >
50
+ {selectedVersion.label}
51
+ </p>
52
+ <template lwc:if={showLatestTag}>
53
+ <dx-type-badge
54
+ class="latest-badge"
55
+ lwc:if={latestVersion}
56
+ variant="status-success"
57
+ value="Latest"
58
+ size="small"
59
+ ></dx-type-badge>
60
+ <dx-type-badge
61
+ class="not-latest-badge"
62
+ lwc:else
63
+ variant="status-warning"
64
+ value="Not Latest"
65
+ size="small"
66
+ ></dx-type-badge>
67
+ </template>
35
68
  </template>
36
69
  </div>
37
70
  </dx-button>
@@ -1,4 +1,5 @@
1
1
  import { LightningElement, api, track } from "lwc";
2
+ import cx from "classnames";
2
3
 
3
4
  import { AnalyticsPayload, OptionWithNested } from "typings/custom";
4
5
 
@@ -12,6 +13,8 @@ export default class VersionPicker extends LightningElement {
12
13
  private _selectedVersion?: OptionWithNested;
13
14
  private _latestVersion: boolean = false;
14
15
  private _hideBadge: boolean = false;
16
+ private _small: boolean = false;
17
+ private _readOnly: boolean = false;
15
18
 
16
19
  @api
17
20
  get versions() {
@@ -51,14 +54,97 @@ export default class VersionPicker extends LightningElement {
51
54
  this._hideBadge = normalizeBoolean(value);
52
55
  }
53
56
 
57
+ // Opt-in compact "dot" variant (24px, abbreviated label). Off by default so
58
+ // existing consumers render the default trigger unchanged.
59
+ @api
60
+ get small() {
61
+ return this._small;
62
+ }
63
+
64
+ set small(value) {
65
+ this._small = normalizeBoolean(value);
66
+ }
67
+
68
+ // Opt-in read-only state: plain value, no dropdown menu.
69
+ @api
70
+ get readOnly() {
71
+ return this._readOnly;
72
+ }
73
+
74
+ set readOnly(value) {
75
+ this._readOnly = normalizeBoolean(value);
76
+ }
77
+
54
78
  private get showVersionPicker() {
55
79
  return this._versions && this._versions.length !== 0;
56
80
  }
57
81
 
82
+ private get containerClass(): string {
83
+ return this.small
84
+ ? "version-picker-container-small"
85
+ : "version-picker-container";
86
+ }
87
+
58
88
  private get showLatestTag(): boolean {
59
89
  return !this.hideBadge;
60
90
  }
61
91
 
92
+ private get readOnlyClass(): string {
93
+ return cx(
94
+ "version-picker-readonly",
95
+ this.small && "version-picker-readonly-small"
96
+ );
97
+ }
98
+
99
+ private get dotClass(): string {
100
+ return `version-picker-dot ${
101
+ this.latestVersion
102
+ ? "version-picker-dot-latest"
103
+ : "version-picker-dot-not-latest"
104
+ }`;
105
+ }
106
+
107
+ // Accessible name for the small trigger: includes the latest state so it
108
+ // isn't conveyed by the dot's color alone (WCAG 1.4.1). Omits the state
109
+ // when the indicator is hidden.
110
+ private get smallTriggerAriaLabel(): string {
111
+ const label = this.selectedVersion?.label ?? "";
112
+ if (!this.showLatestTag) {
113
+ return label;
114
+ }
115
+ return `${label}, ${this.latestVersion ? "Latest" : "Not Latest"}`;
116
+ }
117
+
118
+ // --- Per-variant values for the shared dropdown/button markup below. The
119
+ // small variant opts into extra classes and a compact chevron.
120
+
121
+ // Not cx(): the default must have NO class attribute (cx returns "", which
122
+ // would render class="" and break the frozen consumer snapshots).
123
+ private get dropdownClass(): string | undefined {
124
+ return this.small ? "version-picker-dropdown-small" : undefined;
125
+ }
126
+
127
+ private get triggerClass(): string {
128
+ return cx(
129
+ "version-picker-button",
130
+ this.small && "version-picker-button-small"
131
+ );
132
+ }
133
+
134
+ private get triggerIconSize(): string {
135
+ return this.small ? "xsmall" : "medium";
136
+ }
137
+
138
+ // Default returns "" (dx-button's own default) so the trigger's rendered
139
+ // aria-label is unchanged for the default variant.
140
+ private get triggerAriaLabel(): string {
141
+ return this.small ? this.smallTriggerAriaLabel : "";
142
+ }
143
+
144
+ private get selectedVersionClass(): string {
145
+ return cx("selected-version", this.small && "selected-version-small");
146
+ }
147
+
62
148
  private onVersionChange(e: CustomEvent) {
63
149
  this.dispatchEvent(new CustomEvent("change", { detail: e.detail }));
64
150
  }