@salesforcedevs/dx-components 1.40.11 → 1.42.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.
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Sample /api/search response for the "apex" query, used by the WithResults
3
+ * story. Shared fields are filled in by `row()`. The two blog rows are
4
+ * invented so the "blog" filter has something to show; the facet counts are
5
+ * from the real response.
6
+ */
7
+ const DEV = "https://developer.salesforce.com/";
8
+ const G = "Apex Developer Guide";
9
+
10
+ interface Row {
11
+ url: string;
12
+ title: string;
13
+ description?: string;
14
+ contentType?: string;
15
+ lastmod?: string | null;
16
+ matchType?: string;
17
+ sectionTitle?: string | null;
18
+ sectionHash?: string | null;
19
+ snippet: string;
20
+ snippetSource?: string;
21
+ }
22
+
23
+ const row = (r: Row, i: number) => ({
24
+ url: r.url,
25
+ title: r.title,
26
+ description: r.description ?? G,
27
+ locale: "en-us",
28
+ site: "developer",
29
+ contentType: r.contentType ?? "docs",
30
+ lastmod: r.lastmod ?? null,
31
+ score: 2 - i * 0.04,
32
+ lexScore: 18,
33
+ semScore: 0.45,
34
+ matchType: r.matchType ?? "hybrid",
35
+ sectionUrl: r.sectionHash ? `${r.url}#${r.sectionHash}` : null,
36
+ sectionTitle: r.sectionTitle ?? null,
37
+ snippet: r.snippet,
38
+ snippetSource: r.snippetSource ?? "headline"
39
+ });
40
+
41
+ const APEX = `${DEV}docs/platform/apex-dev/references/apex-dev/`;
42
+ const REF = `${DEV}docs/platform/apex-ref/references`;
43
+ const CLI = `${DEV}docs/platform/salesforce-cli-reference/guide/`;
44
+
45
+ const ROWS: Row[] = [
46
+ {
47
+ url: `${APEX}apex-intro.html`,
48
+ title: `Introducing Apex | ${G}`,
49
+ snippet:
50
+ "Introducing <b>Apex</b> | <b>Apex</b> Developer Guide\n\nof hosting server code, such as Java or .NET, in a secure and robust environment. What is <b>Apex</b>?"
51
+ },
52
+ {
53
+ url: `${APEX}apex-intro-what-is-apex.html`,
54
+ title: `What is Apex? | ${G}`,
55
+ snippet: "What is <b>Apex</b>?"
56
+ },
57
+ {
58
+ url: `${APEX}connectapi-overview.html`,
59
+ title: `Connect in Apex | ${G}`,
60
+ snippet:
61
+ "Connect in <b>Apex</b> | <b>Apex</b> Developer Guide\n\nConnect in <b>Apex</b> Use Connect in <b>Apex</b> to develop custom experiences in Salesforce."
62
+ },
63
+ {
64
+ url: `${CLI}cli_reference_apex_run.html`,
65
+ title: "apex run | apex Commands",
66
+ description:
67
+ "Execute anonymous Apex code entered on the command line or from a local file.",
68
+ matchType: "lexical",
69
+ snippet:
70
+ "<b>apex</b> run | <b>apex</b> Commands\n\n<b>apex</b> run Execute anonymous <b>Apex</b> code entered on the command line or from a local file."
71
+ },
72
+ {
73
+ url: `${DEV}docs/platform/salesforce-slack-sdk/guide/apex_ref.html`,
74
+ title: "Apex | Apex SDK for Slack (Beta)",
75
+ description: "Use Apex classes in the",
76
+ matchType: "lexical",
77
+ snippet:
78
+ "<b>Apex</b> | <b>Apex</b> SDK for Slack (Beta)\n\nk.ActionDispatcher Commands: Slack.SlashCommandDispatcher Events: Slack.EventDispatcher Shortcuts: Slack.ShortcutDispatcher To determine which classes and methods you"
79
+ },
80
+ {
81
+ url: `${DEV}developer-centers/apex`,
82
+ title: "Apex",
83
+ description:
84
+ "Explore the developer resources for Apex to write server-side logic with classes, triggers, and services.",
85
+ contentType: "page",
86
+ lastmod: "2026-10-09T20:57:17.000Z",
87
+ matchType: "lexical",
88
+ snippet:
89
+ "Read more Developer Guide Debug, Test, and Deploy <b>Apex</b> Develop your <b>Apex</b> code in a sandbox, debug it, unit-test it"
90
+ },
91
+ {
92
+ url: `${APEX}apex-dev-guide.html`,
93
+ title: `Apex Developer Guide | ${G}`,
94
+ snippet:
95
+ "<b>Apex</b> Developer Guide | <b>Apex</b> Developer Guide\n\nthe Salesforce Release Notes to learn about the most recent updates and changes to <b>Apex</b>."
96
+ },
97
+ {
98
+ url: APEX.slice(0, -1),
99
+ title: `Apex Developer Guide | ${G}`,
100
+ snippet:
101
+ "<b>Apex</b> Developer Guide | <b>Apex</b> Developer Guide\n\nthe Salesforce Release Notes to learn about the most recent updates and changes to <b>Apex</b>."
102
+ },
103
+ {
104
+ url: `${DEV}docs/platform/apex-dev`,
105
+ title: `Apex Developer Guide | ${G}`,
106
+ snippet:
107
+ "You can run <b>Apex</b> code using a variety of mechanisms. <b>Apex</b> code runs in atomic transactions."
108
+ },
109
+ {
110
+ url: `${CLI}cli_reference_apex_run_test.html`,
111
+ title: "apex run test | apex Commands",
112
+ description: "Invoke Apex tests in an org.",
113
+ matchType: "lexical",
114
+ sectionHash: "aliases-for-apex-run-test",
115
+ sectionTitle: "Aliases for apex run test",
116
+ snippet:
117
+ "<b>apex</b> run test | <b>apex</b> Commands — Aliases for <b>apex</b> run test\n\nd if the target-org configuration variable is already set."
118
+ },
119
+ {
120
+ url: `${APEX}apex-intro-learning-apex.html`,
121
+ title: `Learning Apex | ${G}`,
122
+ matchType: "lexical",
123
+ sectionHash: "in-this-guide-apex-developer-guide",
124
+ sectionTitle: "In This Guide (Apex Developer Guide)",
125
+ snippet:
126
+ "Learning <b>Apex</b> | <b>Apex</b> Developer Guide — In This Guide (<b>Apex</b> Developer Guide)\n\nIn This Guide (<b>Apex</b> Developer Guide) Beginning programmers can look at the following: Introducing <b>Apex</b> , and in particular:"
127
+ },
128
+ {
129
+ url: `${APEX}apex-running.html`,
130
+ title: `Running Apex | ${G}`,
131
+ matchType: "lexical",
132
+ snippet:
133
+ "Running <b>Apex</b> | <b>Apex</b> Developer Guide\n\nRunning <b>Apex</b> You can access many features of the Salesforce user interface programmatically in <b>Apex</b>, and you can integrate with external SOAP and REST Web services."
134
+ },
135
+ {
136
+ url: `${APEX}apex-testing.html`,
137
+ title: `Testing Apex | ${G}`,
138
+ matchType: "lexical",
139
+ snippet:
140
+ "Testing <b>Apex</b> | <b>Apex</b> Developer Guide\n\ne tests. You can use it to test classes in isolation, which is important for unit testing."
141
+ },
142
+ {
143
+ url: `${APEX}apex-scheduler.html`,
144
+ title: `Apex Scheduler | ${G}`,
145
+ matchType: "lexical",
146
+ sectionHash: "implementing-the-schedulable-interface",
147
+ sectionTitle: "Implementing the Schedulable Interface",
148
+ snippet:
149
+ "<b>Apex</b> Scheduler | <b>Apex</b> Developer Guide — Implementing the Schedulable Interface\n\nImplementing the Schedulable Interface To schedule an <b>Apex</b> class to run at regular intervals, first write an <b>Apex</b> class that"
150
+ },
151
+ {
152
+ url: `${DEV}docs/platform/apex-ref/references/apex-ref`,
153
+ title: "Apex Reference Guide",
154
+ description: "Apex Reference Guide",
155
+ lastmod: "2026-11-03T01:09:58.000Z",
156
+ matchType: "semantic",
157
+ snippet: "Apex Reference Guide",
158
+ snippetSource: "description"
159
+ },
160
+ {
161
+ url: `${REF}/apex-ref/apex-ref-guide.html`,
162
+ title: "Apex Reference Guide",
163
+ description: "Apex Reference Guide",
164
+ lastmod: "2026-11-03T01:10:03.000Z",
165
+ matchType: "semantic",
166
+ snippet: "Apex Reference Guide",
167
+ snippetSource: "description"
168
+ },
169
+ {
170
+ url: `${REF}/apex-ref/v68.0`,
171
+ title: "Apex Reference Guide",
172
+ description: "Apex Reference Guide",
173
+ lastmod: "2026-11-03T01:10:03.000Z",
174
+ matchType: "semantic",
175
+ snippet: "Apex Reference Guide",
176
+ snippetSource: "description"
177
+ },
178
+ {
179
+ url: REF,
180
+ title: "Apex Reference Guide",
181
+ description: "Apex Reference Guide",
182
+ lastmod: "2026-11-03T01:10:03.000Z",
183
+ matchType: "semantic",
184
+ snippet: "Apex Reference Guide",
185
+ snippetSource: "description"
186
+ },
187
+ {
188
+ url: `${DEV}docs/industries/industries-common-dev/guide/omnistudio-apex-reference.html`,
189
+ title: "Omnistudio Apex Reference | Industries Common Resources | Industries Common Resources Developer Guide",
190
+ description:
191
+ "Apex is a strongly typed, object-oriented programming language that allows developers to execute flow and transaction control statements on the Salesf",
192
+ matchType: "semantic",
193
+ snippet:
194
+ "Apex is a strongly typed, object-oriented programming language that allows developers to execute flow and transaction control statements on the Salesf",
195
+ snippetSource: "description"
196
+ },
197
+ // Invented sample rows so the "blog" filter has results to show.
198
+ {
199
+ url: `${DEV}blogs/2026/09/apex-cursors-in-practice`,
200
+ title: "Apex Cursors in Practice",
201
+ description: "How to process large result sets with Apex cursors.",
202
+ contentType: "blog",
203
+ lastmod: "2026-09-18T00:00:00.000Z",
204
+ snippet: "Process large result sets with <b>Apex</b> cursors."
205
+ },
206
+ {
207
+ url: `${DEV}blogs/2026/06/apex-testing-tips`,
208
+ title: "Five Apex Testing Tips",
209
+ description: "Write faster, more reliable Apex tests.",
210
+ contentType: "blog",
211
+ lastmod: "2026-06-02T00:00:00.000Z",
212
+ snippet: "Write faster, more reliable <b>Apex</b> tests."
213
+ }
214
+ ];
215
+
216
+ const ALL = ROWS.map(row);
217
+
218
+ /**
219
+ * Builds the response the stub returns, honouring the `type` filter and `lang`
220
+ * query params so the sidebar filters work in Storybook. Facet counts always
221
+ * reflect the full result set (disjunctive facets), as the real API does.
222
+ */
223
+ export function mockSearchResponse(params: URLSearchParams) {
224
+ const type = params.get("type");
225
+ const results = type ? ALL.filter((r) => r.contentType === type) : ALL;
226
+ return {
227
+ query: params.get("q") ?? "apex",
228
+ locale: params.get("lang") ?? "en-us",
229
+ site: null,
230
+ sort: params.get("sort") ?? "relevance",
231
+ limit: 20,
232
+ offset: 0,
233
+ total: type ? results.length : 59,
234
+ count: results.length,
235
+ facets: {
236
+ contentType: [
237
+ { value: "docs", count: 56 },
238
+ { value: "blog", count: 2 },
239
+ { value: "page", count: 1 }
240
+ ]
241
+ },
242
+ results
243
+ };
244
+ }
@@ -7,11 +7,8 @@ import type { LocaleOption } from "docUtils/searchLocale";
7
7
  import {
8
8
  decodeHtmlEntities,
9
9
  highlightedSnippetHtml,
10
- isSortOption,
11
10
  resultHref,
12
- SORT_OPTIONS,
13
- type SearchResult,
14
- type SortOption
11
+ type SearchResult
15
12
  } from "docUtils/searchClient";
16
13
  import { searchLocalePrefs } from "dxUtils/searchLocalePrefs";
17
14
  import { track as trackGTM } from "dxUtils/analytics";
@@ -23,11 +20,19 @@ import { parseSupportedLocales } from "docUtils/searchLocale";
23
20
  // are ingested under this site value).
24
21
  const DX_SITE = "developer";
25
22
 
26
- const SORT_LABELS: Record<SortOption, string> = {
27
- relevance: "Relevance",
28
- date: "Most recent"
23
+ // The search backend labels developer docs "docs"; the badge and label
24
+ // constants know them as "documentation". Filtering still sends the raw value.
25
+ const CONTENT_TYPE_ALIASES: Record<string, string> = {
26
+ docs: "documentation",
27
+ page: "website"
29
28
  };
30
29
 
30
+ function normalizeContentType(contentType: string | null): string | null {
31
+ return contentType != null
32
+ ? CONTENT_TYPE_ALIASES[contentType] ?? contentType
33
+ : null;
34
+ }
35
+
31
36
  interface DisplayResult {
32
37
  key: string;
33
38
  url: string;
@@ -42,6 +47,7 @@ interface DisplayResult {
42
47
  // text path renders exactly as before.
43
48
  snippetHtml: string | null;
44
49
  hasSnippetHtml: boolean;
50
+ contentType: string | null;
45
51
  contentTypeLabel: string | null;
46
52
  hasBadge: boolean;
47
53
  displayDate: string;
@@ -56,7 +62,7 @@ interface FacetChip {
56
62
  cssClass: string;
57
63
  }
58
64
 
59
- interface SortSelectOption {
65
+ interface SelectOption {
60
66
  value: string;
61
67
  label: string;
62
68
  }
@@ -162,7 +168,8 @@ export default class SearchHybrid extends LightningElement {
162
168
  r.description != null && r.description !== ""
163
169
  ? decodeHtmlEntities(r.description)
164
170
  : null;
165
- const label = this.contentTypeLabel(r.contentType);
171
+ const contentType = normalizeContentType(r.contentType);
172
+ const label = this.contentTypeLabel(contentType);
166
173
  const displayDate = this.formatDate(r.lastmod);
167
174
  // Prefer the highlighted snippet (headline source only); otherwise
168
175
  // null → the description text path below renders unchanged.
@@ -176,6 +183,7 @@ export default class SearchHybrid extends LightningElement {
176
183
  hasDescription: description !== null,
177
184
  snippetHtml,
178
185
  hasSnippetHtml: snippetHtml !== null,
186
+ contentType,
179
187
  contentTypeLabel: label,
180
188
  hasBadge: label !== null,
181
189
  displayDate,
@@ -240,8 +248,9 @@ export default class SearchHybrid extends LightningElement {
240
248
  if (contentType == null || contentType === "") {
241
249
  return null;
242
250
  }
251
+ const normalized = normalizeContentType(contentType) as string;
243
252
  const labels = CONTENT_TYPE_LABELS as Record<string, string>;
244
- return labels[contentType] ?? contentType;
253
+ return labels[normalized] ?? contentType;
245
254
  }
246
255
 
247
256
  // ---- content-type facet chips (disjunctive) ---------------------------
@@ -269,24 +278,51 @@ export default class SearchHybrid extends LightningElement {
269
278
  return this.facetChips.length > 0;
270
279
  }
271
280
 
272
- // ---- sort + locale select options -------------------------------------
273
-
274
- get sortOptions(): SortSelectOption[] {
275
- return SORT_OPTIONS.map((value) => ({
276
- value,
277
- label: SORT_LABELS[value]
281
+ /** Options for the sidebar dx-filter-menu (single-select by content type, sent to the API as `type`). */
282
+ get typeFilterOptions(): Array<{
283
+ id: string;
284
+ name: string;
285
+ value: string;
286
+ }> {
287
+ return this.facetChips.map((chip) => ({
288
+ id: chip.value,
289
+ name: `${chip.label} (${chip.count})`,
290
+ value: chip.value
278
291
  }));
279
292
  }
280
293
 
281
- get sortValue(): string {
282
- return this.vm?.sort ?? "relevance";
294
+ get selectedTypeValue(): string {
295
+ return this.vm?.selectedType ?? "";
296
+ }
297
+
298
+ get hasActiveType(): boolean {
299
+ return !!this.vm?.selectedType;
300
+ }
301
+
302
+ get noActiveFilters(): boolean {
303
+ return !this.hasActiveType && this.localeValue === this.defaultLanguage;
304
+ }
305
+
306
+ get showRange(): boolean {
307
+ return this.hasResults && this.total > 0;
308
+ }
309
+
310
+ get rangeStart(): number {
311
+ return ((this.vm?.page ?? 1) - 1) * (this.vm?.limit ?? 10) + 1;
312
+ }
313
+
314
+ get rangeEnd(): number {
315
+ const limit = this.vm?.limit ?? 10;
316
+ return Math.min(this.rangeStart + limit - 1, this.total);
283
317
  }
284
318
 
319
+ // ---- locale select options -------------------------------------
320
+
285
321
  get showLocaleSelector(): boolean {
286
322
  return this.controller?.showLocaleSelector ?? false;
287
323
  }
288
324
 
289
- get localeSelectOptions(): SortSelectOption[] {
325
+ get localeSelectOptions(): SelectOption[] {
290
326
  const options = this.controller?.localeOptions ?? [];
291
327
  return options.map((l: LocaleOption) => ({
292
328
  value: l.id,
@@ -294,6 +330,13 @@ export default class SearchHybrid extends LightningElement {
294
330
  }));
295
331
  }
296
332
 
333
+ get localeFilterOptions(): Array<{ id: string; name: string }> {
334
+ return this.localeSelectOptions.map((o) => ({
335
+ id: o.value,
336
+ name: o.label
337
+ }));
338
+ }
339
+
297
340
  get localeValue(): string {
298
341
  return this.vm?.locale ?? this.defaultLanguage;
299
342
  }
@@ -314,17 +357,29 @@ export default class SearchHybrid extends LightningElement {
314
357
 
315
358
  // ---- event handlers ---------------------------------------------------
316
359
 
317
- handleSortChange(event: CustomEvent<{ value: string }>): void {
318
- const value = event.detail?.value;
319
- if (isSortOption(value)) {
320
- this.controller?.setSort(value);
360
+ handleLocaleChange(event: CustomEvent<{ value?: { id?: string } }>): void {
361
+ const value = event.detail?.value?.id;
362
+ if (value) {
363
+ this.controller?.setLanguage(value);
321
364
  }
322
365
  }
323
366
 
324
- handleLocaleChange(event: CustomEvent<{ value: string }>): void {
325
- const value = event.detail?.value;
367
+ handleTypeFilterChange(
368
+ event: CustomEvent<{ value?: { value?: string } }>
369
+ ): void {
370
+ const value = event.detail?.value?.value;
326
371
  if (value) {
327
- this.controller?.setLanguage(value);
372
+ // Disjunctive toggle: the controller clears it if already active.
373
+ this.controller?.setType(value);
374
+ }
375
+ }
376
+
377
+ handleClearFilters(): void {
378
+ if (this.hasActiveType) {
379
+ this.controller?.setType(null);
380
+ }
381
+ if (this.localeValue !== this.defaultLanguage) {
382
+ this.controller?.setLanguage(this.defaultLanguage);
328
383
  }
329
384
  }
330
385
 
@@ -248,7 +248,7 @@ li.coveo-dynamic-facet-breadcrumb-value-list-item {
248
248
 
249
249
  .coveo-pager-list-item {
250
250
  border: none;
251
- border-radius: 16px;
251
+ border-radius: var(--dx-g-spacing-xs);
252
252
  display: inline-flex;
253
253
  align-items: center;
254
254
  justify-content: center;
@@ -282,13 +282,64 @@ li.coveo-dynamic-facet-breadcrumb-value-list-item {
282
282
  border-right: none;
283
283
  }
284
284
 
285
+ /* List item states: same padding in all states so text never moves. Ring 8px from text on sides, more on top/bottom. */
285
286
  .dx-result {
287
+ --dx-result-inner-gap-x: var(
288
+ --dx-g-spacing-sm
289
+ ); /* 8px between text and ring on sides */
290
+
291
+ --dx-result-inner-gap-y: var(
292
+ --dx-g-spacing-xs
293
+ ); /* ring closer to card edge so more padding inside box top/bottom */
294
+
295
+ position: relative;
286
296
  background: white;
287
- border-radius: 16px;
297
+ border-radius: var(--dx-g-spacing-md);
288
298
  border: 1px solid rgb(24 24 24 / 4%);
289
299
  box-shadow: 0 0 2px 0 rgb(24 24 24 / 8%), 0 2px 4px 1px rgb(24 24 24 / 16%);
290
- padding: 20px;
291
- margin-bottom: var(--dx-g-spacing-lg);
300
+ padding: var(--dx-g-spacing-md);
301
+ margin-bottom: var(--dx-g-spacing-md);
302
+ transition: background-color 0.1s ease;
303
+ }
304
+
305
+ /* Hover: same shape as focus box, more padding top/bottom inside box; space between results unchanged */
306
+ .dx-result:hover::after {
307
+ content: "";
308
+ position: absolute;
309
+ top: var(--dx-result-inner-gap-y);
310
+ bottom: var(--dx-result-inner-gap-y);
311
+ left: var(--dx-result-inner-gap-x);
312
+ right: var(--dx-result-inner-gap-x);
313
+ background: var(--dx-g-cloud-blue-vibrant-95);
314
+ border-radius: var(--dx-g-spacing-xs);
315
+ pointer-events: none;
316
+ z-index: 0;
317
+ }
318
+
319
+ .dx-result > * {
320
+ position: relative;
321
+ z-index: 1;
322
+ }
323
+
324
+ /* Focus: ring 8px from text via pseudo-element; no padding/layout change */
325
+ .dx-result:focus-within {
326
+ outline: none;
327
+ }
328
+
329
+ /* Pseudo: 8px from text; inner ring container/hover (cloud blue 95), outer blue-vibrant-20 */
330
+ .dx-result:focus-within::before {
331
+ content: "";
332
+ position: absolute;
333
+ top: var(--dx-result-inner-gap-y);
334
+ bottom: var(--dx-result-inner-gap-y);
335
+ left: var(--dx-result-inner-gap-x);
336
+ right: var(--dx-result-inner-gap-x);
337
+ border: none;
338
+ border-radius: var(--dx-g-spacing-xs);
339
+ box-shadow: 0 0 0 2px var(--dx-g-cloud-blue-vibrant-95),
340
+ 0 0 0 4px var(--dx-g-blue-vibrant-20);
341
+ pointer-events: none;
342
+ z-index: 2;
292
343
  }
293
344
 
294
345
  .dx-result-title {
@@ -322,10 +373,59 @@ li.coveo-dynamic-facet-breadcrumb-value-list-item {
322
373
  color: white;
323
374
  }
324
375
 
325
- .dx-search-header + .coveo-main-section {
376
+ .dx-search-header + .dx-search-main {
326
377
  margin-top: var(--dx-g-spacing-2xl);
327
378
  }
328
379
 
380
+ .dx-search-results {
381
+ font-family: var(--dx-g-font-sans);
382
+ background-color: #fafaf9;
383
+ }
384
+
385
+ .dx-search-main {
386
+ max-width: 1200px;
387
+ margin: 0 auto;
388
+ padding: 0 var(--dx-g-spacing-xl);
389
+ }
390
+
391
+ .dx-search-box-row {
392
+ margin-bottom: var(--dx-g-spacing-lg);
393
+ }
394
+
395
+ .dx-search-box-row .dx-search-box {
396
+ max-width: 400px;
397
+ }
398
+
399
+ .dx-search-loading {
400
+ padding: var(--dx-g-spacing-2xl);
401
+ text-align: center;
402
+ }
403
+
404
+ .dx-search-loading-image {
405
+ max-width: 200px;
406
+ }
407
+
408
+ .dx-search-no-results {
409
+ display: flex;
410
+ justify-content: center;
411
+ gap: 90px;
412
+ margin: 50px 34px 90px;
413
+ }
414
+
415
+ .dx-search-no-results-info {
416
+ text-align: left;
417
+ }
418
+
419
+ .dx-search-no-results-info > ul {
420
+ list-style-type: disc;
421
+ list-style-position: inside;
422
+ font-size: var(--dx-g-text-xs);
423
+ }
424
+
425
+ .dx-search-result-list {
426
+ padding-bottom: var(--dx-g-spacing-2xl);
427
+ }
428
+
329
429
  .dx-search-header-container {
330
430
  margin: 0 auto;
331
431
  max-width: 1200px;
@@ -498,7 +598,20 @@ li.coveo-dynamic-facet-breadcrumb-value-list-item {
498
598
  }
499
599
 
500
600
  @media screen and (max-width: 768px) {
501
- .no-results > img {
601
+ .no-results > img,
602
+ .dx-search-no-results > img {
502
603
  display: none;
503
604
  }
504
605
  }
606
+
607
+ .dx-search-status {
608
+ border: 0;
609
+ clip: rect(0 0 0 0);
610
+ height: 1px;
611
+ margin: -1px;
612
+ overflow: hidden;
613
+ padding: 0;
614
+ position: absolute;
615
+ white-space: nowrap;
616
+ width: 1px;
617
+ }