@salesforce/ui-bundle-template-app-react-sample-b2e 11.24.5 → 11.24.7

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/dist/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [11.24.7](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.24.6...v11.24.7) (2026-07-14)
7
+
8
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
9
+
10
+
11
+
12
+
13
+
14
+ ## [11.24.6](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.24.5...v11.24.6) (2026-07-14)
15
+
16
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
17
+
18
+
19
+
20
+
21
+
6
22
  ## [11.24.5](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.24.4...v11.24.5) (2026-07-14)
7
23
 
8
24
  **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
@@ -18,8 +18,8 @@
18
18
  "graphql:schema": "node scripts/get-graphql-schema.mjs"
19
19
  },
20
20
  "dependencies": {
21
- "@salesforce/platform-sdk": "^11.24.5",
22
- "@salesforce/ui-bundle": "^11.24.5",
21
+ "@salesforce/platform-sdk": "^11.24.7",
22
+ "@salesforce/ui-bundle": "^11.24.7",
23
23
  "@tailwindcss/vite": "^4.1.17",
24
24
  "class-variance-authority": "^0.7.1",
25
25
  "clsx": "^2.1.1",
@@ -46,8 +46,8 @@
46
46
  "@graphql-eslint/eslint-plugin": "^4.1.0",
47
47
  "@graphql-tools/utils": "^11.0.0",
48
48
  "@playwright/test": "^1.49.0",
49
- "@salesforce/graphiti": "^11.24.5",
50
- "@salesforce/vite-plugin-ui-bundle": "^11.24.5",
49
+ "@salesforce/graphiti": "^11.24.7",
50
+ "@salesforce/vite-plugin-ui-bundle": "^11.24.7",
51
51
  "@testing-library/jest-dom": "^6.6.3",
52
52
  "@testing-library/react": "^16.1.0",
53
53
  "@testing-library/user-event": "^14.5.2",
@@ -50,10 +50,10 @@ export const MaintenanceTable: React.FC<MaintenanceTableProps> = ({ requests, lo
50
50
  See All
51
51
  </Button>
52
52
  </div>
53
- <div className="space-y-4">
53
+ <ul className="space-y-4">
54
54
  {loading ? (
55
55
  Array.from({ length: 5 }, (_, i) => (
56
- <div key={i} className="flex items-center p-4 bg-gray-50 rounded-lg">
56
+ <li key={i} className="flex items-center p-4 bg-gray-50 rounded-lg">
57
57
  <Skeleton className="w-12 h-12 rounded-lg shrink-0" />
58
58
  <div className="ml-4 w-64 shrink-0 space-y-2">
59
59
  <Skeleton className="h-4 w-40" />
@@ -66,10 +66,10 @@ export const MaintenanceTable: React.FC<MaintenanceTableProps> = ({ requests, lo
66
66
  <Skeleton className="w-8 h-8 rounded-full shrink-0" />
67
67
  <Skeleton className="h-4 w-24" />
68
68
  </div>
69
- </div>
69
+ </li>
70
70
  ))
71
71
  ) : requests.length === 0 ? (
72
- <div className="text-center py-8 text-gray-500">No maintenance requests</div>
72
+ <li className="text-center py-8 text-gray-500">No maintenance requests</li>
73
73
  ) : (
74
74
  requests.slice(0, 5).map((request) => {
75
75
  const issueType = request.Type__c?.value || "General";
@@ -78,7 +78,7 @@ export const MaintenanceTable: React.FC<MaintenanceTableProps> = ({ requests, lo
78
78
  const tenantName = request.User__r?.Name?.value || "Unknown";
79
79
 
80
80
  return (
81
- <div
81
+ <li
82
82
  key={request.Id}
83
83
  className="flex items-center p-4 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors"
84
84
  >
@@ -119,11 +119,11 @@ export const MaintenanceTable: React.FC<MaintenanceTableProps> = ({ requests, lo
119
119
  </div>
120
120
  <span className="text-sm text-gray-700 font-medium truncate">{tenantName}</span>
121
121
  </div>
122
- </div>
122
+ </li>
123
123
  );
124
124
  })
125
125
  )}
126
- </div>
126
+ </ul>
127
127
  </Card>
128
128
  );
129
129
  };
@@ -30,7 +30,7 @@ export const StatCard: React.FC<StatCardProps> = ({
30
30
  onClick={onClick}
31
31
  >
32
32
  <div className="space-y-1">
33
- <p className="text-sm font-medium text-gray-600 uppercase tracking-wide">{title}</p>
33
+ <h2 className="text-sm font-medium text-gray-600 uppercase tracking-wide">{title}</h2>
34
34
  {loading ? (
35
35
  <>
36
36
  <div className="flex items-baseline gap-3">
@@ -20,7 +20,7 @@ export const TopBar: React.FC<TopBarProps> = ({ onMenuClick }) => {
20
20
  loadUserInfo();
21
21
  }, []);
22
22
  return (
23
- <div className="bg-[#372949] text-white h-16 flex items-center justify-between px-6">
23
+ <header className="bg-[#372949] text-white h-16 flex items-center justify-between px-6">
24
24
  {/* Left section - Logo and Menu */}
25
25
  <div className="flex items-center gap-4">
26
26
  <button
@@ -52,6 +52,6 @@ export const TopBar: React.FC<TopBarProps> = ({ onMenuClick }) => {
52
52
  <span className="hidden md:inline font-medium">{userName.toUpperCase()}</span>
53
53
  </div>
54
54
  </div>
55
- </div>
55
+ </header>
56
56
  );
57
57
  };
@@ -108,8 +108,22 @@ export function MergedSearchResults({
108
108
 
109
109
  const skeletons = skeletonCount ?? page.pageSize;
110
110
 
111
+ // Persistent, always-mounted live region: screen readers announce result
112
+ // updates (searching → count → empty → error) without an Enter keypress.
113
+ const liveMessage = loading
114
+ ? "Searching…"
115
+ : error
116
+ ? "Search failed."
117
+ : mergedResults.length === 0
118
+ ? (emptyMessage ?? "No results found.")
119
+ : `${page.totalCount} result${page.totalCount === 1 ? "" : "s"}`;
120
+
111
121
  return (
112
122
  <div className={`space-y-6 ${className ?? ""}`}>
123
+ <p className="sr-only" role="status" aria-live="polite">
124
+ {liveMessage}
125
+ </p>
126
+
113
127
  {soleController && <SingleSourceChrome controller={soleController} />}
114
128
 
115
129
  {error && (
@@ -123,7 +137,7 @@ export function MergedSearchResults({
123
137
  {/* Results count — its own row, directly above the grid, in every scope.
124
138
  Hidden when there are none (the empty state covers that case). */}
125
139
  {!loading && !error && page.totalCount > 0 && (
126
- <p className="text-sm text-muted-foreground" role="status">
140
+ <p className="text-sm text-muted-foreground">
127
141
  {page.totalCount} result{page.totalCount === 1 ? "" : "s"}
128
142
  </p>
129
143
  )}
@@ -139,7 +153,7 @@ export function MergedSearchResults({
139
153
  {emptyMessage ?? "No results found."}
140
154
  </p>
141
155
  ) : (
142
- <div className={gridClassName}>
156
+ <ul className={gridClassName}>
143
157
  {mergedResults.map(({ sourceKey, node }, i) => {
144
158
  const override = renderResult?.[sourceKey];
145
159
  if (override === false) return null;
@@ -157,16 +171,16 @@ export function MergedSearchResults({
157
171
  />
158
172
  ) : null;
159
173
  return (
160
- <div
174
+ <li
161
175
  key={getItemKey(sourceKey, node, i)}
162
176
  className="flex flex-col gap-1.5 [&>:last-child]:min-h-0 [&>:last-child]:flex-1"
163
177
  >
164
178
  {badge}
165
179
  {rendered}
166
- </div>
180
+ </li>
167
181
  );
168
182
  })}
169
- </div>
183
+ </ul>
170
184
  )}
171
185
 
172
186
  {page.totalCount > 0 && (
@@ -58,8 +58,24 @@ export function SourceSection({
58
58
  const showActiveChips = !hideFilterChrome && filters.active.length > 0;
59
59
  const showSortControl = !hideFilterChrome && (config.sortBy?.length ?? 0) > 0;
60
60
 
61
+ // Persistent, always-mounted live region: screen readers announce result
62
+ // updates (searching → count → empty → error) without an Enter keypress.
63
+ const liveMessage = loading
64
+ ? "Searching…"
65
+ : error
66
+ ? `Failed to load ${config.label}.`
67
+ : showEmpty
68
+ ? (emptyMessage ?? `No ${config.label.toLowerCase()} found.`)
69
+ : totalCount != null
70
+ ? `${config.label}: ${totalCount} ${totalCount === 1 ? "result" : "results"}`
71
+ : "";
72
+
61
73
  return (
62
74
  <section className={`flex flex-col gap-6 ${className ?? ""}`}>
75
+ <p className="sr-only" role="status" aria-live="polite">
76
+ {liveMessage}
77
+ </p>
78
+
63
79
  {showFilterPanel && (
64
80
  <FilterProvider
65
81
  filters={filters.active}
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@salesforce/ui-bundle-template-base-sfdx-project",
3
- "version": "11.24.5",
3
+ "version": "11.24.7",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@salesforce/ui-bundle-template-base-sfdx-project",
9
- "version": "11.24.5",
9
+ "version": "11.24.7",
10
10
  "license": "SEE LICENSE IN LICENSE.txt",
11
11
  "dependencies": {
12
12
  "fast-xml-parser": "^5.9.3",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/ui-bundle-template-base-sfdx-project",
3
- "version": "11.24.5",
3
+ "version": "11.24.7",
4
4
  "description": "Base SFDX project template",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "publishConfig": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/ui-bundle-template-app-react-sample-b2e",
3
- "version": "11.24.5",
3
+ "version": "11.24.7",
4
4
  "description": "Salesforce sample property rental React app",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "",
@@ -16,7 +16,7 @@
16
16
  "clean": "rm -rf dist"
17
17
  },
18
18
  "dependencies": {
19
- "@salesforce/ui-bundle": "^11.24.5",
19
+ "@salesforce/ui-bundle": "^11.24.7",
20
20
  "sonner": "^1.7.0"
21
21
  },
22
22
  "devDependencies": {