@salesforce/ui-bundle-template-base-angular-app 11.17.1 → 11.18.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.
- package/CHANGELOG.md +6 -0
- package/package.json +1 -1
- package/src/force-app/main/default/uiBundles/base-angular-app/angular.json +11 -7
- package/src/force-app/main/default/uiBundles/base-angular-app/eslint.config.js +4 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/package.json +4 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/api/{graphql-client.service.spec.ts → data-client.service.spec.ts} +36 -6
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/api/data-client.service.ts +74 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/app.config.ts +15 -1
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/app.routes.ts +6 -1
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/app.ts +7 -2
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/{layout → components/layout/app-layout}/app-layout.component.html +2 -1
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/{layout → components/layout/app-layout}/app-layout.component.ts +9 -3
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/_field-size.scss +42 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/alert/alert.component.html +31 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/alert/alert.component.ts +53 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/button/button.component.html +18 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/button/button.component.scss +112 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/button/button.component.ts +57 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/card/card.component.scss +34 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/card/card.component.ts +110 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/collapsible/collapsible.component.html +10 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/collapsible/collapsible.component.ts +26 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-picker/date-picker.component.html +25 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-picker/date-picker.component.scss +36 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-picker/date-picker.component.ts +41 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-range-picker/date-range-picker.component.html +34 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-range-picker/date-range-picker.component.scss +33 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/date-range-picker/date-range-picker.component.ts +66 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/dialog/dialog.component.html +37 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/dialog/dialog.component.ts +55 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/field/field.component.html +21 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/field/field.component.ts +36 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/field-size.ts +8 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/input/input.component.html +19 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/input/input.component.scss +35 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/input/input.component.ts +36 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/label/label.component.html +3 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/label/label.component.ts +17 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/paginator/paginator.component.html +10 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/paginator/paginator.component.ts +37 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/popover/popover.component.html +41 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/popover/popover.component.ts +40 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/select/select.component.html +24 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/select/select.component.scss +35 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/select/select.component.ts +72 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/separator/separator.component.html +1 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/separator/separator.component.scss +23 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/separator/separator.component.ts +56 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/skeleton/skeleton.component.html +1 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/skeleton/skeleton.component.scss +28 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/skeleton/skeleton.component.ts +24 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/components/ui/spinner/spinner.component.ts +35 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/pages/home/home.component.ts +7 -1
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/pages/not-found/not-found.component.ts +7 -1
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/utils/async-data.ts +99 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/index.html +1 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/styles.scss +170 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/theme.scss +39 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/api/graphql-client.service.ts +0 -48
- package/src/force-app/main/default/uiBundles/base-angular-app/src/app/app.css +0 -0
- package/src/force-app/main/default/uiBundles/base-angular-app/src/styles.css +0 -12
- /package/src/force-app/main/default/uiBundles/base-angular-app/src/app/{layout → components/layout/app-layout}/app-layout.component.spec.ts +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
@import 'tailwindcss';
|
|
2
|
+
|
|
3
|
+
@layer base {
|
|
4
|
+
html,
|
|
5
|
+
body {
|
|
6
|
+
@apply min-h-screen;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
body {
|
|
10
|
+
@apply antialiased bg-white;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@custom-variant dark (&:is(.dark *));
|
|
15
|
+
|
|
16
|
+
/*
|
|
17
|
+
* shadcn design tokens, ported from the React base app's global.css so the
|
|
18
|
+
* shared object-search feature (bg-card, text-muted-foreground, border-border,
|
|
19
|
+
* rounded-* via --radius, etc.) renders identically in Angular. The React base
|
|
20
|
+
* also imports tw-animate-css and shadcn/tailwind.css (accordion keyframes +
|
|
21
|
+
* data-* variants) — omitted here as they are not installed for the Angular
|
|
22
|
+
* base and are not required for layout/color parity.
|
|
23
|
+
*/
|
|
24
|
+
@theme inline {
|
|
25
|
+
--color-background: var(--background);
|
|
26
|
+
--color-foreground: var(--foreground);
|
|
27
|
+
--color-card: var(--card);
|
|
28
|
+
--color-card-foreground: var(--card-foreground);
|
|
29
|
+
--color-popover: var(--popover);
|
|
30
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
31
|
+
--color-primary: var(--primary);
|
|
32
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
33
|
+
--color-secondary: var(--secondary);
|
|
34
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
35
|
+
--color-muted: var(--muted);
|
|
36
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
37
|
+
--color-accent: var(--accent);
|
|
38
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
39
|
+
--color-destructive: var(--destructive);
|
|
40
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
41
|
+
--color-border: var(--border);
|
|
42
|
+
--color-input: var(--input);
|
|
43
|
+
--color-ring: var(--ring);
|
|
44
|
+
--color-chart-1: var(--chart-1);
|
|
45
|
+
--color-chart-2: var(--chart-2);
|
|
46
|
+
--color-chart-3: var(--chart-3);
|
|
47
|
+
--color-chart-4: var(--chart-4);
|
|
48
|
+
--color-chart-5: var(--chart-5);
|
|
49
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
50
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
51
|
+
--radius-lg: var(--radius);
|
|
52
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
53
|
+
--color-sidebar: var(--sidebar);
|
|
54
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
55
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
56
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
57
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
58
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
59
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
60
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
:root {
|
|
64
|
+
--radius: 0.625rem;
|
|
65
|
+
--background: oklch(1 0 0);
|
|
66
|
+
--foreground: oklch(0.145 0 0);
|
|
67
|
+
--card: oklch(1 0 0);
|
|
68
|
+
--card-foreground: oklch(0.145 0 0);
|
|
69
|
+
--popover: oklch(1 0 0);
|
|
70
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
71
|
+
--primary: oklch(0.205 0 0);
|
|
72
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
73
|
+
--secondary: oklch(0.97 0 0);
|
|
74
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
75
|
+
--muted: oklch(0.97 0 0);
|
|
76
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
77
|
+
--accent: oklch(0.97 0 0);
|
|
78
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
79
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
80
|
+
--border: oklch(0.922 0 0);
|
|
81
|
+
--input: oklch(0.922 0 0);
|
|
82
|
+
--ring: oklch(0.708 0 0);
|
|
83
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
84
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
85
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
86
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
87
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
88
|
+
--sidebar: oklch(0.985 0 0);
|
|
89
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
90
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
91
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
92
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
93
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
94
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
95
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.dark {
|
|
99
|
+
--background: oklch(0.145 0 0);
|
|
100
|
+
--foreground: oklch(0.985 0 0);
|
|
101
|
+
--card: oklch(0.205 0 0);
|
|
102
|
+
--card-foreground: oklch(0.985 0 0);
|
|
103
|
+
--popover: oklch(0.205 0 0);
|
|
104
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
105
|
+
--primary: oklch(0.922 0 0);
|
|
106
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
107
|
+
--secondary: oklch(0.269 0 0);
|
|
108
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
109
|
+
--muted: oklch(0.269 0 0);
|
|
110
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
111
|
+
--accent: oklch(0.269 0 0);
|
|
112
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
113
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
114
|
+
--border: oklch(1 0 0 / 10%);
|
|
115
|
+
--input: oklch(1 0 0 / 15%);
|
|
116
|
+
--ring: oklch(0.556 0 0);
|
|
117
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
118
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
119
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
120
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
121
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
122
|
+
--sidebar: oklch(0.205 0 0);
|
|
123
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
124
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
125
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
126
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
127
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
128
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
129
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@layer base {
|
|
133
|
+
* {
|
|
134
|
+
@apply border-border outline-ring/50;
|
|
135
|
+
}
|
|
136
|
+
body {
|
|
137
|
+
@apply bg-background text-foreground;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/*
|
|
142
|
+
* Angular Material colour re-skin — layered on top of the custom M3 theme
|
|
143
|
+
* defined in theme.scss. The theme owns density (compact control heights) and
|
|
144
|
+
* seeds the base `--mat-sys-*` system variables; here we remap the colour and
|
|
145
|
+
* shape system variables to our shadcn design tokens so every Material
|
|
146
|
+
* component adopts the shadcn look without touching component code. This block
|
|
147
|
+
* loads after theme.scss, so these values win.
|
|
148
|
+
*
|
|
149
|
+
* Control sizing is NOT set here — density handles heights, and any remaining
|
|
150
|
+
* form-field-specific styling lives in the component's own scoped CSS.
|
|
151
|
+
*/
|
|
152
|
+
:root {
|
|
153
|
+
--mat-sys-primary: var(--primary);
|
|
154
|
+
--mat-sys-on-primary: var(--primary-foreground);
|
|
155
|
+
--mat-sys-surface: var(--background);
|
|
156
|
+
--mat-sys-on-surface: var(--foreground);
|
|
157
|
+
--mat-sys-surface-variant: var(--muted);
|
|
158
|
+
--mat-sys-on-surface-variant: var(--muted-foreground);
|
|
159
|
+
--mat-sys-outline: var(--border);
|
|
160
|
+
--mat-sys-outline-variant: var(--border);
|
|
161
|
+
--mat-sys-error: var(--destructive);
|
|
162
|
+
--mat-sys-corner-small: var(--radius-sm);
|
|
163
|
+
--mat-sys-corner-medium: var(--radius-md);
|
|
164
|
+
--mat-sys-corner-large: var(--radius-lg);
|
|
165
|
+
|
|
166
|
+
// Card subtitle — Material defaults this to `--mat-sys-on-surface` (the same
|
|
167
|
+
// dark colour as the title). React renders the card description in muted
|
|
168
|
+
// grey (`text-muted-foreground`), so point the subtitle token there.
|
|
169
|
+
--mat-card-subtitle-text-color: var(--muted-foreground);
|
|
170
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Copyright (c) 2026, Salesforce, Inc.,
|
|
2
|
+
// All rights reserved.
|
|
3
|
+
// For full license text, see the LICENSE.txt file
|
|
4
|
+
|
|
5
|
+
// Angular Material M3 theme.
|
|
6
|
+
// See https://material.angular.dev/guide/theming.
|
|
7
|
+
//
|
|
8
|
+
// This replaces the prebuilt azure-blue theme so we can set a negative
|
|
9
|
+
// `density` — the standard, system-driven way to get the compact control
|
|
10
|
+
// heights the React reference uses (no hardcoded pixel heights anywhere).
|
|
11
|
+
//
|
|
12
|
+
// Colour is intentionally NOT finalised here: the shadcn design tokens are
|
|
13
|
+
// applied on top by remapping `--mat-sys-*` in styles.css, which loads after
|
|
14
|
+
// this file. The palette below only seeds Material's base system variables.
|
|
15
|
+
@use '@angular/material' as mat;
|
|
16
|
+
|
|
17
|
+
html {
|
|
18
|
+
@include mat.theme(
|
|
19
|
+
(
|
|
20
|
+
color: (
|
|
21
|
+
theme-type: light,
|
|
22
|
+
primary: mat.$azure-palette,
|
|
23
|
+
tertiary: mat.$blue-palette,
|
|
24
|
+
),
|
|
25
|
+
// Font family reads Tailwind's system stack (`--font-sans`, the same
|
|
26
|
+
// default the React reference uses) instead of Material's Roboto, so
|
|
27
|
+
// Material components and Tailwind-styled text share one font. Tailwind
|
|
28
|
+
// is the single source of the family; the typescale sizes/weights stay
|
|
29
|
+
// Material's own.
|
|
30
|
+
typography: (
|
|
31
|
+
plain-family: var(--font-sans),
|
|
32
|
+
brand-family: var(--font-sans),
|
|
33
|
+
),
|
|
34
|
+
// Compact density (scale 0 to -5). Drives control heights via
|
|
35
|
+
// Material's own tokens instead of hardcoded px.
|
|
36
|
+
density: -2,
|
|
37
|
+
)
|
|
38
|
+
);
|
|
39
|
+
}
|
package/src/force-app/main/default/uiBundles/base-angular-app/src/app/api/graphql-client.service.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { createDataSDK } from '@salesforce/platform-sdk';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* True when the operation's first definition is a `mutation`. Strips GraphQL
|
|
6
|
-
* comments first so a leading `# ...` line can't mask the keyword. Queries
|
|
7
|
-
* (named or anonymous `{ ... }` shorthand) and subscriptions fall through to
|
|
8
|
-
* query().
|
|
9
|
-
*/
|
|
10
|
-
function isMutation(operation: string): boolean {
|
|
11
|
-
return /^\s*mutation\b/.test(operation.replace(/#[^\n\r]*/g, ''));
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Thin GraphQL client: createDataSDK + sdk.graphql with centralized error
|
|
16
|
-
* handling. Mutations are routed to sdk.graphql.mutate and everything else to
|
|
17
|
-
* sdk.graphql.query (the SDK rejects an operation sent to the wrong method).
|
|
18
|
-
* Use with gql-tagged queries and generated operation types for type-safe calls.
|
|
19
|
-
*/
|
|
20
|
-
@Injectable({ providedIn: 'root' })
|
|
21
|
-
export class GraphqlClient {
|
|
22
|
-
async execute<TData, TVariables = Record<string, unknown>>(
|
|
23
|
-
operation: string,
|
|
24
|
-
variables?: TVariables,
|
|
25
|
-
): Promise<TData> {
|
|
26
|
-
const data = await createDataSDK();
|
|
27
|
-
const result = isMutation(operation)
|
|
28
|
-
? await data.graphql!.mutate<TData, TVariables>({
|
|
29
|
-
mutation: operation,
|
|
30
|
-
variables,
|
|
31
|
-
})
|
|
32
|
-
: await data.graphql!.query<TData, TVariables>({
|
|
33
|
-
query: operation,
|
|
34
|
-
variables,
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
if (result.errors?.length) {
|
|
38
|
-
const msg = result.errors.map((e) => e.message).join('; ');
|
|
39
|
-
throw new Error(`GraphQL Error: ${msg}`);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (result.data == null) {
|
|
43
|
-
throw new Error('GraphQL response data is null');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return result.data;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
File without changes
|