@salesforce/ui-bundle-template-app-react-sample-b2e 11.8.4 → 11.9.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 (16) hide show
  1. package/dist/CHANGELOG.md +8 -0
  2. package/dist/force-app/main/default/uiBundles/propertymanagementapp/package.json +4 -4
  3. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/appLayout.tsx +7 -1
  4. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/IssuesDonutChart.tsx +0 -9
  5. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/StatCard.tsx +0 -9
  6. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/TopBar.tsx +7 -5
  7. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/VerticalNav.tsx +11 -4
  8. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/properties/PropertyDetailsModal.tsx +1 -1
  9. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/FilterFieldWrapper.tsx +6 -1
  10. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/NumericRangeFilter.tsx +5 -1
  11. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/ApplicationSearch.tsx +1 -1
  12. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/Home.tsx +1 -0
  13. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/MaintenanceRequestSearch.tsx +1 -1
  14. package/dist/package-lock.json +2 -2
  15. package/dist/package.json +1 -1
  16. package/package.json +2 -2
package/dist/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
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.9.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.8.4...v11.9.0) (2026-07-07)
7
+
8
+ **Note:** Version bump only for package @salesforce/ui-bundle-template-base-sfdx-project
9
+
10
+
11
+
12
+
13
+
6
14
  ## [11.8.4](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.8.3...v11.8.4) (2026-07-07)
7
15
 
8
16
  **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.8.4",
22
- "@salesforce/ui-bundle": "^11.8.4",
21
+ "@salesforce/platform-sdk": "^11.9.0",
22
+ "@salesforce/ui-bundle": "^11.9.0",
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.8.4",
50
- "@salesforce/vite-plugin-ui-bundle": "^11.8.4",
49
+ "@salesforce/graphiti": "^11.9.0",
50
+ "@salesforce/vite-plugin-ui-bundle": "^11.9.0",
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",
@@ -11,6 +11,12 @@ export default function AppLayout() {
11
11
  return (
12
12
  <div className="flex flex-col">
13
13
  <Toaster />
14
+ <a
15
+ href="#main-content"
16
+ className="sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 focus:z-50 focus:rounded-md focus:bg-white focus:px-4 focus:py-2 focus:text-purple-700 focus:shadow-lg focus:outline focus:outline-2 focus:outline-purple-700"
17
+ >
18
+ Skip to main content
19
+ </a>
14
20
  {/* Top Bar */}
15
21
  <TopBar onMenuClick={() => setIsNavOpen(true)} />
16
22
 
@@ -20,7 +26,7 @@ export default function AppLayout() {
20
26
  <VerticalNav isOpen={isNavOpen} onClose={() => setIsNavOpen(false)} />
21
27
 
22
28
  {/* Page Content */}
23
- <main className="flex-1 overflow-auto">
29
+ <main id="main-content" className="flex-1 overflow-auto">
24
30
  <Outlet />
25
31
  </main>
26
32
  </div>
@@ -2,7 +2,6 @@ import React from "react";
2
2
  import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from "recharts";
3
3
  import { Card } from "../ui/card";
4
4
  import { Skeleton } from "../ui/skeleton";
5
- import { MoreVertical } from "lucide-react";
6
5
 
7
6
  interface ChartData {
8
7
  name: string;
@@ -58,14 +57,6 @@ export const IssuesDonutChart: React.FC<IssuesDonutChartProps> = ({ data, loadin
58
57
 
59
58
  return (
60
59
  <Card className="p-4 border-gray-200 shadow-sm flex flex-col relative">
61
- {/* Three-dot menu */}
62
- <button
63
- className="absolute top-4 right-4 p-1 hover:bg-gray-100 rounded-md transition-colors z-10"
64
- aria-label="More options"
65
- >
66
- <MoreVertical className="w-4 h-4 text-gray-400" />
67
- </button>
68
-
69
60
  <h3 className="text-sm font-medium text-primary-purple mb-2 uppercase tracking-wide">
70
61
  Top Maintenance Issues
71
62
  </h3>
@@ -3,7 +3,6 @@ import { Card } from "../ui/card";
3
3
  import { Skeleton } from "../ui/skeleton";
4
4
  import upgraphIcon from "../../assets/icons/upgraph.svg";
5
5
  import downgraphIcon from "../../assets/icons/downgraph.svg";
6
- import { MoreVertical } from "lucide-react";
7
6
 
8
7
  interface StatCardProps {
9
8
  title: string;
@@ -30,14 +29,6 @@ export const StatCard: React.FC<StatCardProps> = ({
30
29
  className={`p-4 border-gray-200 shadow-sm relative ${onClick ? "cursor-pointer hover:shadow-lg transition-shadow" : ""}`}
31
30
  onClick={onClick}
32
31
  >
33
- {/* Three-dot menu */}
34
- <button
35
- className="absolute top-4 right-4 p-1 hover:bg-gray-100 rounded-md transition-colors"
36
- aria-label="More options"
37
- >
38
- <MoreVertical className="w-4 h-4 text-gray-400" />
39
- </button>
40
-
41
32
  <div className="space-y-1">
42
33
  <p className="text-sm font-medium text-gray-600 uppercase tracking-wide">{title}</p>
43
34
  {loading ? (
@@ -1,5 +1,5 @@
1
1
  import React, { useEffect, useState } from "react";
2
- import { ChevronDown, Menu } from "lucide-react";
2
+ import { Menu } from "lucide-react";
3
3
  import zenLogo from "../../assets/icons/zen-logo.svg";
4
4
  import { getUserInfo } from "../../api/dashboard/dashboard";
5
5
 
@@ -42,13 +42,15 @@ export const TopBar: React.FC<TopBarProps> = ({ onMenuClick }) => {
42
42
  {/* Right section - Profile */}
43
43
  <div className="flex items-center gap-4">
44
44
  {/* User Profile */}
45
- <button className="flex items-center gap-2 px-3 py-2 hover:bg-purple-700 rounded-md transition-colors">
46
- <div className="w-8 h-8 bg-purple-300 rounded-full flex items-center justify-center text-purple-900 font-semibold">
45
+ <div className="flex items-center gap-2 px-3 py-2">
46
+ <div
47
+ className="w-8 h-8 bg-purple-300 rounded-full flex items-center justify-center text-purple-900 font-semibold"
48
+ aria-hidden="true"
49
+ >
47
50
  {userName.charAt(0).toUpperCase()}
48
51
  </div>
49
52
  <span className="hidden md:inline font-medium">{userName.toUpperCase()}</span>
50
- <ChevronDown className="w-4 h-4 hidden md:inline" />
51
- </button>
53
+ </div>
52
54
  </div>
53
55
  </div>
54
56
  );
@@ -42,6 +42,7 @@ export const VerticalNav: React.FC<VerticalNavProps> = ({ isOpen = false, onClos
42
42
  key={item.path}
43
43
  to={item.path}
44
44
  onClick={handleClick}
45
+ aria-current={isActive(item.path) ? "page" : undefined}
45
46
  className={`flex flex-col items-center justify-center gap-2 py-4 px-2 transition-colors ${
46
47
  isActive(item.path)
47
48
  ? "bg-purple-100 text-purple-700 border-l-4 border-purple-700"
@@ -57,17 +58,23 @@ export const VerticalNav: React.FC<VerticalNavProps> = ({ isOpen = false, onClos
57
58
  return (
58
59
  <>
59
60
  {/* Desktop sidebar */}
60
- <div className="hidden md:flex flex-col w-24 bg-white border-r border-gray-200 py-8 space-y-4">
61
+ <nav
62
+ aria-label="Main"
63
+ className="hidden md:flex flex-col w-24 bg-white border-r border-gray-200 py-8 space-y-4"
64
+ >
61
65
  {navContent()}
62
- </div>
66
+ </nav>
63
67
 
64
68
  {/* Mobile overlay */}
65
69
  {isOpen && (
66
70
  <>
67
71
  <div className="fixed inset-0 z-40 bg-black/50" onClick={onClose} aria-hidden />
68
- <div className="fixed left-0 top-0 bottom-0 z-50 flex flex-col w-24 bg-white border-r border-gray-200 py-8 space-y-4">
72
+ <nav
73
+ aria-label="Main menu"
74
+ className="fixed left-0 top-0 bottom-0 z-50 flex flex-col w-24 bg-white border-r border-gray-200 py-8 space-y-4"
75
+ >
69
76
  {navContent(onClose)}
70
- </div>
77
+ </nav>
71
78
  </>
72
79
  )}
73
80
  </>
@@ -56,7 +56,7 @@ export const PropertyDetailsModal: React.FC<PropertyDetailsModalProps> = ({
56
56
  case "rented":
57
57
  return "bg-blue-100 text-blue-700";
58
58
  case "maintenance":
59
- return "bg-yellow-100 text-yellow-700";
59
+ return "bg-yellow-100 text-yellow-800";
60
60
  default:
61
61
  return "bg-gray-100 text-gray-700";
62
62
  }
@@ -6,6 +6,8 @@ interface FilterFieldWrapperProps extends React.ComponentProps<"div"> {
6
6
  htmlFor?: string;
7
7
  /** id applied to the visible label so a non-native control can reference it via aria-labelledby */
8
8
  labelId?: string;
9
+ /** id applied to the error message so a control can reference it via aria-describedby */
10
+ errorId?: string;
9
11
  helpText?: string;
10
12
  error?: string;
11
13
  }
@@ -14,6 +16,7 @@ export function FilterFieldWrapper({
14
16
  label,
15
17
  htmlFor,
16
18
  labelId,
19
+ errorId,
17
20
  helpText,
18
21
  error,
19
22
  className,
@@ -28,7 +31,9 @@ export function FilterFieldWrapper({
28
31
  {children}
29
32
  <div className="min-h-4">
30
33
  {error ? (
31
- <p className="text-xs text-destructive">{error}</p>
34
+ <p id={errorId} role="alert" className="text-xs text-destructive">
35
+ {error}
36
+ </p>
32
37
  ) : (
33
38
  helpText && <p className="text-xs text-muted-foreground">{helpText}</p>
34
39
  )}
@@ -1,4 +1,4 @@
1
- import { useState } from "react";
1
+ import { useId, useState } from "react";
2
2
  import { Input } from "../../../../components/ui/input";
3
3
 
4
4
  import { useFilterField } from "../FilterContext";
@@ -62,6 +62,7 @@ export function NumericRangeFilterInputs({
62
62
  className,
63
63
  ...props
64
64
  }: NumericRangeFilterInputsProps) {
65
+ const errorId = useId();
65
66
  const [localMin, setLocalMin] = useState(value?.min ?? "");
66
67
  const [localMax, setLocalMax] = useState(value?.max ?? "");
67
68
 
@@ -129,6 +130,7 @@ export function NumericRangeFilterInputs({
129
130
  label={label}
130
131
  helpText={helpText}
131
132
  error={errorMessage}
133
+ errorId={errorId}
132
134
  className={className}
133
135
  {...props}
134
136
  >
@@ -146,6 +148,7 @@ export function NumericRangeFilterInputs({
146
148
  }}
147
149
  aria-label={`${label} minimum`}
148
150
  aria-invalid={hasError || undefined}
151
+ aria-describedby={hasError ? errorId : undefined}
149
152
  />
150
153
  <Input
151
154
  type="number"
@@ -160,6 +163,7 @@ export function NumericRangeFilterInputs({
160
163
  }}
161
164
  aria-label={`${label} maximum`}
162
165
  aria-invalid={hasError || undefined}
166
+ aria-describedby={hasError ? errorId : undefined}
163
167
  />
164
168
  </div>
165
169
  </FilterFieldWrapper>
@@ -326,7 +326,7 @@ const getStatusColor = (status: string) => {
326
326
  if (statusLower.includes("approved")) return "bg-green-100 text-green-700";
327
327
  if (statusLower.includes("rejected")) return "bg-red-100 text-red-700";
328
328
  if (statusLower.includes("background")) return "bg-blue-100 text-blue-700";
329
- if (statusLower.includes("review")) return "bg-yellow-100 text-yellow-700";
329
+ if (statusLower.includes("review")) return "bg-yellow-100 text-yellow-800";
330
330
  return "bg-gray-100 text-gray-700";
331
331
  };
332
332
 
@@ -131,6 +131,7 @@ export default function Home() {
131
131
  return (
132
132
  <PageContainer>
133
133
  <div className="max-w-7xl mx-auto space-y-6">
134
+ <h1 className="sr-only">Dashboard</h1>
134
135
  <GlobalSearchBar
135
136
  searchableObjects={SEARCHABLE_OBJECTS}
136
137
  selectedObjectApiName={selectedObjectApiName}
@@ -386,7 +386,7 @@ function StatusBadge({ status }: { status: string }) {
386
386
  statusLower === "new"
387
387
  ? "bg-pink-100 text-pink-700"
388
388
  : statusLower === "in progress"
389
- ? "bg-yellow-100 text-yellow-700"
389
+ ? "bg-yellow-100 text-yellow-800"
390
390
  : statusLower === "resolved"
391
391
  ? "bg-green-100 text-green-700"
392
392
  : "bg-gray-100 text-gray-700";
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@salesforce/webapp-template-base-sfdx-project-experimental",
3
- "version": "11.8.4",
3
+ "version": "11.9.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@salesforce/webapp-template-base-sfdx-project-experimental",
9
- "version": "11.8.4",
9
+ "version": "11.9.0",
10
10
  "license": "SEE LICENSE IN LICENSE.txt",
11
11
  "devDependencies": {
12
12
  "@lwc/eslint-plugin-lwc": "^3.3.0",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/ui-bundle-template-base-sfdx-project",
3
- "version": "11.8.4",
3
+ "version": "11.9.0",
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.8.4",
3
+ "version": "11.9.0",
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.8.4",
19
+ "@salesforce/ui-bundle": "^11.9.0",
20
20
  "sonner": "^1.7.0"
21
21
  },
22
22
  "devDependencies": {