@salesforce/templates 66.11.1 → 66.12.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/lib/generators/projectGenerator.js +4 -1
- package/lib/generators/projectGenerator.js.map +1 -1
- package/lib/templates/project/angularextapp/.forceignore +15 -0
- package/lib/templates/project/angularextapp/.husky/pre-commit +4 -0
- package/lib/templates/project/angularextapp/.prettierignore +11 -0
- package/lib/templates/project/angularextapp/.prettierrc +17 -0
- package/lib/templates/project/angularextapp/CHANGELOG.md +4086 -0
- package/lib/templates/project/angularextapp/README.md +77 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/angularextapp1.digitalExperience-meta.xml +11 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/_meta.json +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/content.json +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_dc_/angularextapp1.digitalExperienceConfig-meta.xml +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/README.md +85 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angular.json +101 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angularextapp.uibundle-meta.xml +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +13600 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package.json +56 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/user-profile.service.ts +126 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +77 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +53 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +89 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +81 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.guard.ts +50 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.service.ts +126 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.html +34 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.ts +94 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.html +2 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.ts +30 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.html +16 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.ts +40 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/config/authentication.config.ts +75 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.html +9 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.ts +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.html +26 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.ts +46 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/reactive-form-page.base.ts +50 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.html +55 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.ts +205 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.html +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.ts +52 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.html +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.scss +17 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.ts +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-helpers.ts +68 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-validators.ts +72 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/helpers.ts +85 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-time-servlet.ts +130 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.config.ts +83 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.service.ts +201 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.html +68 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.ts +82 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.html +35 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.ts +87 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.html +47 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.ts +89 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.html +116 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.ts +194 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.html +80 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.ts +93 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.html +60 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.ts +96 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls +68 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls +77 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls +71 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls +105 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls +162 -0
- package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls-meta.xml +5 -0
- package/lib/templates/project/angularextapp/_p_/_m_/networks/angularextapp.network-meta.xml +60 -0
- package/lib/templates/project/angularextapp/_p_/_m_/package.xml +24 -0
- package/lib/templates/project/angularextapp/_p_/_m_/permissionsets/angularextapp_Guest_User_Api_Access.permissionset-meta.xml +9 -0
- package/lib/templates/project/angularextapp/_p_/_m_/sites/angularextapp.site-meta.xml +31 -0
- package/lib/templates/project/angularextapp/config/project-scratch-def.json +13 -0
- package/lib/templates/project/angularextapp/eslint.config.js +7 -0
- package/lib/templates/project/angularextapp/jest.config.js +6 -0
- package/lib/templates/project/angularextapp/package.json +46 -0
- package/lib/templates/project/angularextapp/scripts/apex/hello.apex +10 -0
- package/lib/templates/project/angularextapp/scripts/gitignore-templates.json +4 -0
- package/lib/templates/project/angularextapp/scripts/graphql-search.sh +191 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-config-schema.mjs +103 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-dev.mjs +87 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-utils.mjs +369 -0
- package/lib/templates/project/angularextapp/scripts/org-setup-xml.mjs +182 -0
- package/lib/templates/project/angularextapp/scripts/org-setup.config.json +9 -0
- package/lib/templates/project/angularextapp/scripts/org-setup.mjs +1702 -0
- package/lib/templates/project/angularextapp/scripts/sf-project-setup.mjs +103 -0
- package/lib/templates/project/angularextapp/scripts/soql/account.soql +6 -0
- package/lib/templates/project/angularextapp/scripts/validate-org-setup-config.mjs +38 -0
- package/lib/templates/project/angularextapp/sfdx-project.json +12 -0
- package/lib/templates/project/angularintapp/.forceignore +15 -0
- package/lib/templates/project/angularintapp/.husky/pre-commit +4 -0
- package/lib/templates/project/angularintapp/.prettierignore +11 -0
- package/lib/templates/project/angularintapp/.prettierrc +17 -0
- package/lib/templates/project/angularintapp/CHANGELOG.md +4086 -0
- package/lib/templates/project/angularintapp/README.md +77 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/README.md +85 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angular.json +101 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angularintapp.uibundle-meta.xml +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +13619 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +57 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +31 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +52 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +90 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +67 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/agentforce-embed.service.ts +177 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.html +3 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.ts +119 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/conversation.ts +55 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/globals.d.ts +13 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.ts +15 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
- package/lib/templates/project/angularintapp/_p_/_m_/applications/angularintapp.app-meta.xml +17 -0
- package/lib/templates/project/angularintapp/_p_/_m_/permissionsets/angularintapp_Access.permissionset-meta.xml +13 -0
- package/lib/templates/project/angularintapp/config/project-scratch-def.json +13 -0
- package/lib/templates/project/angularintapp/eslint.config.js +7 -0
- package/lib/templates/project/angularintapp/jest.config.js +6 -0
- package/lib/templates/project/angularintapp/package.json +46 -0
- package/lib/templates/project/angularintapp/scripts/apex/hello.apex +10 -0
- package/lib/templates/project/angularintapp/scripts/gitignore-templates.json +4 -0
- package/lib/templates/project/angularintapp/scripts/graphql-search.sh +191 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-config-schema.mjs +103 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-dev.mjs +87 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-utils.mjs +369 -0
- package/lib/templates/project/angularintapp/scripts/org-setup-xml.mjs +182 -0
- package/lib/templates/project/angularintapp/scripts/org-setup.config.json +9 -0
- package/lib/templates/project/angularintapp/scripts/org-setup.mjs +1702 -0
- package/lib/templates/project/angularintapp/scripts/sf-project-setup.mjs +103 -0
- package/lib/templates/project/angularintapp/scripts/soql/account.soql +6 -0
- package/lib/templates/project/angularintapp/scripts/validate-org-setup-config.mjs +38 -0
- package/lib/templates/project/angularintapp/sfdx-project.json +12 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +589 -561
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +589 -561
- package/lib/templates/uiBundles/angularbasic/package-lock.json +147 -168
- package/lib/templates/uiBundles/reactbasic/package-lock.json +589 -561
- package/lib/utils/types.d.ts +1 -1
- package/lib/utils/uiBundleTemplateUtils.js +10 -0
- package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { ChangeDetectionStrategy, Component, computed, inject, signal } from "@angular/core";
|
|
7
|
+
import { Router, RouterLink, RouterLinkActive, RouterOutlet, type Route } from "@angular/router";
|
|
8
|
+
import { AuthMenuComponent } from "../../../features/authentication/menu/auth-menu/auth-menu";
|
|
9
|
+
|
|
10
|
+
interface NavItem {
|
|
11
|
+
path: string;
|
|
12
|
+
label: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* App-owned layout — overrides the base `app-layout` at compose (the app package
|
|
17
|
+
* ships its own copy, so patches-cli's "app wins" rule selects this one over the
|
|
18
|
+
* base-angular-app version). This is the Angular analogue of the React external
|
|
19
|
+
* app's own `appLayout.tsx`: the layout belongs to the PROJECT, not the base app
|
|
20
|
+
* or a feature. The auth feature's `AuthAppLayout` wrapper renders `<app-layout />`
|
|
21
|
+
* (via its `__inherit__app-layout` stub), which resolves to this component.
|
|
22
|
+
*
|
|
23
|
+
* Adds two things over the base layout:
|
|
24
|
+
* - `<app-auth-menu />` in the header (the auth feature's account dropdown),
|
|
25
|
+
* the parallel of the React app rendering `<AuthMenu />`.
|
|
26
|
+
* - Dynamic navigation derived from the router config at runtime — the Angular
|
|
27
|
+
* analogue of React's `getAllRoutes()` reading route `handle` metadata. Post
|
|
28
|
+
* compose the router config IS the merged base + feature routes, so nav items
|
|
29
|
+
* surface automatically for any route whose `data.showInNavigation` is true.
|
|
30
|
+
*/
|
|
31
|
+
@Component({
|
|
32
|
+
selector: "app-layout",
|
|
33
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
34
|
+
imports: [RouterOutlet, RouterLink, RouterLinkActive, AuthMenuComponent],
|
|
35
|
+
templateUrl: "./app-layout.html",
|
|
36
|
+
})
|
|
37
|
+
export class AppLayoutComponent {
|
|
38
|
+
private readonly router = inject(Router);
|
|
39
|
+
|
|
40
|
+
readonly isOpen = signal(false);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Flatten the router config and keep routes explicitly marked for navigation
|
|
44
|
+
* (`data.showInNavigation === true` with a `data.label`). Mirrors the React
|
|
45
|
+
* `getAllRoutes().filter(r => r.handle?.showInNavigation)` selection.
|
|
46
|
+
*/
|
|
47
|
+
readonly navigationItems = computed<NavItem[]>(() =>
|
|
48
|
+
this.collectNavItems(this.router.config, ""),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
private collectNavItems(routes: Route[], parentPath: string): NavItem[] {
|
|
52
|
+
const items: NavItem[] = [];
|
|
53
|
+
for (const route of routes) {
|
|
54
|
+
const segment = route.path ?? "";
|
|
55
|
+
const fullPath =
|
|
56
|
+
segment === ""
|
|
57
|
+
? parentPath || "/"
|
|
58
|
+
: parentPath === "/" || parentPath === ""
|
|
59
|
+
? `/${segment}`
|
|
60
|
+
: `${parentPath}/${segment}`;
|
|
61
|
+
|
|
62
|
+
const data = route.data as { showInNavigation?: boolean; label?: string } | undefined;
|
|
63
|
+
if (data?.showInNavigation === true && data.label) {
|
|
64
|
+
items.push({ path: fullPath, label: data.label });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (route.children?.length) {
|
|
68
|
+
items.push(...this.collectNavItems(route.children, fullPath));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return items;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
toggleMenu(): void {
|
|
75
|
+
this.isOpen.update((v) => !v);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
closeMenu(): void {
|
|
79
|
+
this.isOpen.set(false);
|
|
80
|
+
}
|
|
81
|
+
}
|
package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Shared height scale for the form-field wrappers (app-input, app-select,
|
|
9
|
+
* app-date-picker): sm = 24px, default = 32px, lg = 40px.
|
|
10
|
+
*
|
|
11
|
+
* Material's density scale only reaches 36px at its -5 floor, so these compact
|
|
12
|
+
* heights can't come from `mat.form-field-density`. Instead we set the two M3
|
|
13
|
+
* tokens that drive the height directly:
|
|
14
|
+
* --mat-form-field-container-height -> `.mat-mdc-form-field-flex` min-height
|
|
15
|
+
* --mat-form-field-container-vertical-padding -> infix padding-top / -bottom
|
|
16
|
+
*
|
|
17
|
+
* These are CSS custom properties, so setting them on the wrapper's own
|
|
18
|
+
* `mat-form-field` (an in-view element that matches under emulated
|
|
19
|
+
* encapsulation) is enough — they INHERIT down to Material's internal flex /
|
|
20
|
+
* infix elements. No `::ng-deep` and no global classes needed. This mirrors how
|
|
21
|
+
* `app-button` sizes work (it sets `--mat-button-*-container-height` tokens).
|
|
22
|
+
*/
|
|
23
|
+
@mixin apply($height, $vertical-padding) {
|
|
24
|
+
--mat-form-field-container-height: #{$height};
|
|
25
|
+
--mat-form-field-container-vertical-padding: #{$vertical-padding};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* Emit the three size classes. Consumers opt in via `size` on the wrapper,
|
|
30
|
+
* which renders `size-sm | size-default | size-lg` on the mat-form-field.
|
|
31
|
+
*/
|
|
32
|
+
@mixin sizes {
|
|
33
|
+
.size-sm {
|
|
34
|
+
@include apply(1.5rem, 0.25rem); // 24px, 4px
|
|
35
|
+
}
|
|
36
|
+
.size-default {
|
|
37
|
+
@include apply(2rem, 0.5rem); // 32px, 8px
|
|
38
|
+
}
|
|
39
|
+
.size-lg {
|
|
40
|
+
@include apply(2.5rem, 0.75rem); // 40px, 12px
|
|
41
|
+
}
|
|
42
|
+
}
|
package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
@if (icon()) {
|
|
2
|
+
<mat-icon class="row-span-2 translate-y-0.5 !size-4 !text-base leading-4" aria-hidden="true">{{
|
|
3
|
+
icon()
|
|
4
|
+
}}</mat-icon>
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
@if (title()) {
|
|
8
|
+
<div data-slot="alert-title" class="col-start-2 font-medium">{{ title() }}</div>
|
|
9
|
+
}
|
|
10
|
+
@if (description()) {
|
|
11
|
+
<div
|
|
12
|
+
data-slot="alert-description"
|
|
13
|
+
class="col-start-2 text-sm"
|
|
14
|
+
[class.text-muted-foreground]="variant() === 'default'"
|
|
15
|
+
[class.text-destructive]="variant() === 'destructive'"
|
|
16
|
+
>
|
|
17
|
+
{{ description() }}
|
|
18
|
+
</div>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
<!--
|
|
22
|
+
Default slot for callers that project body content (e.g. app-status-alert
|
|
23
|
+
composing a message with a link) instead of the `description` input. Sits in
|
|
24
|
+
the second grid column to align with the icon. Inert when only inputs are used.
|
|
25
|
+
-->
|
|
26
|
+
<div class="col-start-2 text-sm">
|
|
27
|
+
<ng-content />
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<!-- Optional caller-owned trailing control, pinned top-right. -->
|
|
31
|
+
<ng-content select="app-alert-action" />
|
package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
+
|
|
9
|
+
/** Visual variant. */
|
|
10
|
+
export type AppAlertVariant = 'default' | 'destructive';
|
|
11
|
+
|
|
12
|
+
const BASE_CLASSES =
|
|
13
|
+
'relative w-full grid grid-cols-[auto_1fr] items-start gap-x-2 gap-y-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-[app-alert-action]:pr-18';
|
|
14
|
+
const VARIANT_CLASSES: Record<AppAlertVariant, string> = {
|
|
15
|
+
default: 'bg-card text-card-foreground',
|
|
16
|
+
destructive: 'bg-card text-destructive',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** Alert banner. Optional trailing control via the `app-alert-action` slot. */
|
|
20
|
+
@Component({
|
|
21
|
+
selector: 'app-alert',
|
|
22
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
23
|
+
imports: [MatIconModule],
|
|
24
|
+
templateUrl: './alert.html',
|
|
25
|
+
host: {
|
|
26
|
+
'data-slot': 'alert',
|
|
27
|
+
role: 'alert',
|
|
28
|
+
'[class]': 'hostClass()',
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
export class AlertComponent {
|
|
32
|
+
readonly variant = input<AppAlertVariant>('default');
|
|
33
|
+
readonly title = input<string>('');
|
|
34
|
+
readonly description = input<string>('');
|
|
35
|
+
/** Material icon ligature name, e.g. `info`, `error`, `warning`. */
|
|
36
|
+
readonly icon = input<string>('');
|
|
37
|
+
|
|
38
|
+
protected readonly hostClass = computed(
|
|
39
|
+
() => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]}`,
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Trailing action slot for `app-alert`, pinned to the top-right. */
|
|
44
|
+
@Component({
|
|
45
|
+
selector: 'app-alert-action',
|
|
46
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
47
|
+
template: '<ng-content />',
|
|
48
|
+
host: {
|
|
49
|
+
'data-slot': 'alert-action',
|
|
50
|
+
class: 'absolute top-2 right-2',
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
export class AlertActionComponent {}
|
package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<button
|
|
2
|
+
[matButton]="matAppearance()"
|
|
3
|
+
[class]="buttonClass()"
|
|
4
|
+
[class.destructive]="isDestructive()"
|
|
5
|
+
[type]="type()"
|
|
6
|
+
[disabled]="disabled()"
|
|
7
|
+
[attr.aria-label]="ariaLabel()"
|
|
8
|
+
[attr.aria-expanded]="ariaExpanded()"
|
|
9
|
+
(click)="clicked.emit($event)"
|
|
10
|
+
>
|
|
11
|
+
@if (icon()) {
|
|
12
|
+
<mat-icon aria-hidden="true">{{ icon() }}</mat-icon>
|
|
13
|
+
}
|
|
14
|
+
<ng-content />
|
|
15
|
+
@if (iconEnd()) {
|
|
16
|
+
<mat-icon aria-hidden="true" iconPositionEnd>{{ iconEnd() }}</mat-icon>
|
|
17
|
+
}
|
|
18
|
+
</button>
|
package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
@use '@angular/material' as mat;
|
|
7
|
+
|
|
8
|
+
// Compact density themes — Material's canonical heights (36 / 32 / 28px).
|
|
9
|
+
$-lg: mat.define-theme(
|
|
10
|
+
(
|
|
11
|
+
density: (
|
|
12
|
+
scale: -1,
|
|
13
|
+
),
|
|
14
|
+
)
|
|
15
|
+
);
|
|
16
|
+
$-md: mat.define-theme(
|
|
17
|
+
(
|
|
18
|
+
density: (
|
|
19
|
+
scale: -2,
|
|
20
|
+
),
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
$-sm: mat.define-theme(
|
|
24
|
+
(
|
|
25
|
+
density: (
|
|
26
|
+
scale: -3,
|
|
27
|
+
),
|
|
28
|
+
)
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
@mixin -height($h) {
|
|
32
|
+
--mat-button-filled-container-height: #{$h};
|
|
33
|
+
--mat-button-outlined-container-height: #{$h};
|
|
34
|
+
--mat-button-text-container-height: #{$h};
|
|
35
|
+
--mat-button-tonal-container-height: #{$h};
|
|
36
|
+
--mat-button-protected-container-height: #{$h};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@mixin -label-size($s) {
|
|
40
|
+
--mat-button-filled-label-text-size: #{$s};
|
|
41
|
+
--mat-button-outlined-label-text-size: #{$s};
|
|
42
|
+
--mat-button-text-label-text-size: #{$s};
|
|
43
|
+
--mat-button-tonal-label-text-size: #{$s};
|
|
44
|
+
--mat-button-protected-label-text-size: #{$s};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:host {
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.mat-mdc-button-base {
|
|
52
|
+
width: 100%;
|
|
53
|
+
font-weight: 500;
|
|
54
|
+
--mat-button-filled-container-shape: var(--radius-md);
|
|
55
|
+
--mat-button-outlined-container-shape: var(--radius-md);
|
|
56
|
+
--mat-button-text-container-shape: var(--radius-md);
|
|
57
|
+
--mat-button-tonal-container-shape: var(--radius-md);
|
|
58
|
+
--mat-button-protected-container-shape: var(--radius-md);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Heights via Material's density scale; 24px (xs) sits below the button
|
|
62
|
+
// density floor (-3 = 28px), so it sets the height token directly.
|
|
63
|
+
.size-default,
|
|
64
|
+
.size-icon {
|
|
65
|
+
@include mat.button-density($-md);
|
|
66
|
+
}
|
|
67
|
+
.size-sm,
|
|
68
|
+
.size-icon-sm {
|
|
69
|
+
@include mat.button-density($-sm);
|
|
70
|
+
}
|
|
71
|
+
.size-lg,
|
|
72
|
+
.size-icon-lg {
|
|
73
|
+
@include mat.button-density($-lg);
|
|
74
|
+
}
|
|
75
|
+
.size-xs,
|
|
76
|
+
.size-icon-xs {
|
|
77
|
+
@include -height(1.5rem);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Font-size isn't a density concern, so it stays a label token.
|
|
81
|
+
.size-default,
|
|
82
|
+
.size-lg {
|
|
83
|
+
@include -label-size(0.875rem);
|
|
84
|
+
}
|
|
85
|
+
.size-sm {
|
|
86
|
+
@include -label-size(0.8rem);
|
|
87
|
+
}
|
|
88
|
+
.size-xs {
|
|
89
|
+
@include -label-size(0.75rem);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Icon-only: square, no min-width or horizontal padding. Material's leading-icon
|
|
93
|
+
// margins assume a text label, so zero them to keep the icon centred.
|
|
94
|
+
.size-icon,
|
|
95
|
+
.size-icon-xs,
|
|
96
|
+
.size-icon-sm,
|
|
97
|
+
.size-icon-lg {
|
|
98
|
+
width: auto;
|
|
99
|
+
min-width: 0;
|
|
100
|
+
padding: 0;
|
|
101
|
+
aspect-ratio: 1;
|
|
102
|
+
|
|
103
|
+
.mat-icon {
|
|
104
|
+
margin: 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Destructive: subtle red tint + red text, matching React's bg-destructive/10.
|
|
109
|
+
.destructive {
|
|
110
|
+
--mat-button-filled-container-color: color-mix(in oklch, var(--destructive) 10%, transparent);
|
|
111
|
+
--mat-button-filled-label-text-color: var(--destructive);
|
|
112
|
+
}
|
package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';
|
|
7
|
+
import { MatButtonModule, type MatButtonAppearance } from '@angular/material/button';
|
|
8
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
9
|
+
|
|
10
|
+
/** Material's appearances plus `destructive`, which Material doesn't provide. */
|
|
11
|
+
export type AppButtonAppearance = MatButtonAppearance | 'destructive';
|
|
12
|
+
|
|
13
|
+
/** Button size variants. */
|
|
14
|
+
export type AppButtonSize =
|
|
15
|
+
| 'default'
|
|
16
|
+
| 'xs'
|
|
17
|
+
| 'sm'
|
|
18
|
+
| 'lg'
|
|
19
|
+
| 'icon'
|
|
20
|
+
| 'icon-xs'
|
|
21
|
+
| 'icon-sm'
|
|
22
|
+
| 'icon-lg';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Thin wrapper over `matButton`. Adds a `destructive` appearance and a `size`
|
|
26
|
+
* scale Material lacks; inputs drive the inner button (a host class/aria attr
|
|
27
|
+
* would land on `<app-button>`, not the real `<button>`).
|
|
28
|
+
*/
|
|
29
|
+
@Component({
|
|
30
|
+
selector: 'app-button',
|
|
31
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
32
|
+
imports: [MatButtonModule, MatIconModule],
|
|
33
|
+
templateUrl: './button.html',
|
|
34
|
+
styleUrl: './button.scss',
|
|
35
|
+
})
|
|
36
|
+
export class ButtonComponent {
|
|
37
|
+
readonly appearance = input<AppButtonAppearance>('filled');
|
|
38
|
+
readonly size = input<AppButtonSize>('default');
|
|
39
|
+
readonly type = input<'button' | 'submit' | 'reset'>('button');
|
|
40
|
+
readonly disabled = input<boolean>(false);
|
|
41
|
+
readonly ariaLabel = input<string>();
|
|
42
|
+
readonly ariaExpanded = input<boolean>();
|
|
43
|
+
/** Extra classes for the inner button — `class` on the host forwards here. */
|
|
44
|
+
readonly classes = input<string>('', { alias: 'class' });
|
|
45
|
+
/** Leading / trailing Material icon ligature names, e.g. `search`. */
|
|
46
|
+
readonly icon = input<string>('');
|
|
47
|
+
readonly iconEnd = input<string>('');
|
|
48
|
+
readonly clicked = output<MouseEvent>();
|
|
49
|
+
|
|
50
|
+
/** `destructive` renders as a filled button carrying the destructive class. */
|
|
51
|
+
protected readonly matAppearance = computed<MatButtonAppearance>(() =>
|
|
52
|
+
this.appearance() === 'destructive' ? 'filled' : (this.appearance() as MatButtonAppearance),
|
|
53
|
+
);
|
|
54
|
+
protected readonly isDestructive = computed(() => this.appearance() === 'destructive');
|
|
55
|
+
/** Size class merged with any caller-supplied classes, applied to the button. */
|
|
56
|
+
protected readonly buttonClass = computed(() => `size-${this.size()} ${this.classes()}`.trim());
|
|
57
|
+
}
|
package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// `size="sm"` — compact padding. Material hardcodes the card's 16px padding
|
|
8
|
+
// (there is no padding design token to override), so the compact size tightens
|
|
9
|
+
// the real Material padding classes. `::ng-deep` is required because the slot
|
|
10
|
+
// content (`mat-card-header/content/actions`) is projected — it lives in the
|
|
11
|
+
// consumer's view, not this wrapper's — so a plain scoped selector can't reach
|
|
12
|
+
// it. The rules are anchored under `.app-card-sm`, a class only this component
|
|
13
|
+
// applies, so the deep selector stays contained to compact cards.
|
|
14
|
+
.app-card-sm {
|
|
15
|
+
::ng-deep .mat-mdc-card-header {
|
|
16
|
+
padding: 0.75rem 0.75rem 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
::ng-deep .mat-mdc-card-content {
|
|
20
|
+
padding: 0 0.75rem;
|
|
21
|
+
|
|
22
|
+
&:first-child {
|
|
23
|
+
padding-top: 0.75rem;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&:last-child {
|
|
27
|
+
padding-bottom: 0.75rem;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
::ng-deep .mat-mdc-card-actions {
|
|
32
|
+
padding: 0.75rem;
|
|
33
|
+
}
|
|
34
|
+
}
|
package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
|
|
7
|
+
import {
|
|
8
|
+
MatCard,
|
|
9
|
+
MatCardActions,
|
|
10
|
+
MatCardContent,
|
|
11
|
+
MatCardHeader,
|
|
12
|
+
MatCardSubtitle,
|
|
13
|
+
MatCardTitle,
|
|
14
|
+
} from '@angular/material/card';
|
|
15
|
+
|
|
16
|
+
/** Card container density. */
|
|
17
|
+
export type AppCardSize = 'default' | 'sm';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Thin wrapper over `mat-card`. Preserves the `app-card` / `app-card-*` slot API
|
|
21
|
+
* while Material drives the visual. `size="sm"` maps to a compact-padding class.
|
|
22
|
+
*/
|
|
23
|
+
@Component({
|
|
24
|
+
selector: 'app-card',
|
|
25
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
26
|
+
imports: [MatCard],
|
|
27
|
+
template:
|
|
28
|
+
'<mat-card appearance="outlined" [class]="classes()" [class.app-card-sm]="size() === \'sm\'"><ng-content /></mat-card>',
|
|
29
|
+
styleUrl: './card.scss',
|
|
30
|
+
})
|
|
31
|
+
export class CardComponent {
|
|
32
|
+
readonly size = input<AppCardSize>('default');
|
|
33
|
+
/** Extra classes forwarded to the inner `mat-card` (host `class` lands here). */
|
|
34
|
+
readonly classes = input<string>('', { alias: 'class' });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Header slot — wraps `mat-card-header` and recreates its title/subtitle stack
|
|
39
|
+
* so the slots project by element selector (Material's static
|
|
40
|
+
* `[mat-card-title]` projection can't see the runtime attribute across this
|
|
41
|
+
* boundary, and would otherwise render title + subtitle side by side).
|
|
42
|
+
*/
|
|
43
|
+
@Component({
|
|
44
|
+
selector: 'app-card-header',
|
|
45
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
46
|
+
imports: [MatCardHeader],
|
|
47
|
+
template: `<mat-card-header [class]="classes()">
|
|
48
|
+
<ng-content select="[mat-card-avatar]" />
|
|
49
|
+
<div class="app-card-header-text">
|
|
50
|
+
<ng-content select="app-card-title" />
|
|
51
|
+
<ng-content select="app-card-description" />
|
|
52
|
+
</div>
|
|
53
|
+
<ng-content />
|
|
54
|
+
</mat-card-header>`,
|
|
55
|
+
styles: '.app-card-header-text { display: flex; flex-direction: column; gap: 0.25rem; }',
|
|
56
|
+
})
|
|
57
|
+
export class CardHeaderComponent {
|
|
58
|
+
/** Extra classes forwarded to the inner `mat-card-header`. */
|
|
59
|
+
readonly classes = input<string>('', { alias: 'class' });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Title slot — Material's `MatCardTitle` styling. */
|
|
63
|
+
@Component({
|
|
64
|
+
selector: 'app-card-title',
|
|
65
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
66
|
+
hostDirectives: [MatCardTitle],
|
|
67
|
+
template: '<ng-content />',
|
|
68
|
+
})
|
|
69
|
+
export class CardTitleComponent {}
|
|
70
|
+
|
|
71
|
+
/** Description slot — Material's `mat-card-subtitle` styling. */
|
|
72
|
+
@Component({
|
|
73
|
+
selector: 'app-card-description',
|
|
74
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
75
|
+
hostDirectives: [MatCardSubtitle],
|
|
76
|
+
template: '<ng-content />',
|
|
77
|
+
})
|
|
78
|
+
export class CardDescriptionComponent {}
|
|
79
|
+
|
|
80
|
+
/** Action slot — pinned to the trailing edge of `app-card-header`. */
|
|
81
|
+
@Component({
|
|
82
|
+
selector: 'app-card-action',
|
|
83
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
84
|
+
host: { style: 'margin-inline-start: auto; align-self: flex-start;' },
|
|
85
|
+
template: '<ng-content />',
|
|
86
|
+
})
|
|
87
|
+
export class CardActionComponent {}
|
|
88
|
+
|
|
89
|
+
/** Body slot — Material's `mat-card-content`. */
|
|
90
|
+
@Component({
|
|
91
|
+
selector: 'app-card-content',
|
|
92
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
93
|
+
hostDirectives: [MatCardContent],
|
|
94
|
+
template: '<ng-content />',
|
|
95
|
+
})
|
|
96
|
+
export class CardContentComponent {}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Footer slot — Material's `mat-card-actions` (a flex-row action bar).
|
|
100
|
+
* Material ships no inter-button spacing, so `:host` (the actions element)
|
|
101
|
+
* sets a `gap`.
|
|
102
|
+
*/
|
|
103
|
+
@Component({
|
|
104
|
+
selector: 'app-card-footer',
|
|
105
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
106
|
+
hostDirectives: [MatCardActions],
|
|
107
|
+
styles: ':host { gap: 0.5rem; }',
|
|
108
|
+
template: '<ng-content />',
|
|
109
|
+
})
|
|
110
|
+
export class CardFooterComponent {}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<mat-expansion-panel [expanded]="open()" (expandedChange)="open.set($event)">
|
|
2
|
+
<mat-expansion-panel-header>
|
|
3
|
+
@if (title()) {
|
|
4
|
+
<mat-panel-title>{{ title() }}</mat-panel-title>
|
|
5
|
+
} @else {
|
|
6
|
+
<ng-content select="[collapsibleHeader]" />
|
|
7
|
+
}
|
|
8
|
+
</mat-expansion-panel-header>
|
|
9
|
+
<ng-content />
|
|
10
|
+
</mat-expansion-panel>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { ChangeDetectionStrategy, Component, input, model } from '@angular/core';
|
|
7
|
+
import { MatExpansionModule } from '@angular/material/expansion';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Thin wrapper over Material's `mat-expansion-panel`. Two-way bindable `open`
|
|
11
|
+
* and a `title`; body via `<ng-content>`. For custom header content, omit
|
|
12
|
+
* `title` and project `[collapsibleHeader]`.
|
|
13
|
+
*/
|
|
14
|
+
@Component({
|
|
15
|
+
selector: 'app-collapsible',
|
|
16
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
17
|
+
imports: [MatExpansionModule],
|
|
18
|
+
templateUrl: './collapsible.html',
|
|
19
|
+
})
|
|
20
|
+
export class CollapsibleComponent {
|
|
21
|
+
/** Two-way bindable expanded state. Supports `[(open)]`. */
|
|
22
|
+
readonly open = model<boolean>(false);
|
|
23
|
+
|
|
24
|
+
/** Header title text. Omit and project `[collapsibleHeader]` for custom content. */
|
|
25
|
+
readonly title = input<string>('');
|
|
26
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<mat-form-field
|
|
2
|
+
class="w-full"
|
|
3
|
+
[class]="'size-' + size()"
|
|
4
|
+
[appearance]="appearance()"
|
|
5
|
+
subscriptSizing="dynamic"
|
|
6
|
+
>
|
|
7
|
+
@if (label()) {
|
|
8
|
+
<mat-label>{{ label() }}</mat-label>
|
|
9
|
+
}
|
|
10
|
+
<input
|
|
11
|
+
matInput
|
|
12
|
+
[matDatepicker]="picker"
|
|
13
|
+
[min]="min()"
|
|
14
|
+
[max]="max()"
|
|
15
|
+
[placeholder]="placeholder()"
|
|
16
|
+
[disabled]="disabled()"
|
|
17
|
+
[readonly]="readonly()"
|
|
18
|
+
[(ngModel)]="value"
|
|
19
|
+
(click)="readonly() && picker.open()"
|
|
20
|
+
(keydown.enter)="readonly() && picker.open()"
|
|
21
|
+
(keydown.space)="readonly() && picker.open()"
|
|
22
|
+
/>
|
|
23
|
+
<mat-datepicker-toggle matIconSuffix [for]="picker" />
|
|
24
|
+
<mat-datepicker #picker />
|
|
25
|
+
</mat-form-field>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
@use '../field-size' as field-size;
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* Form-field-specific structural styling. Height comes from the `size` input
|
|
11
|
+
* (see field-size.scss); colour comes from the --mat-sys-* remap (styles.css).
|
|
12
|
+
* Here we only: give the outline our design-token radius, emit the size
|
|
13
|
+
* classes, and collapse the empty hint/error subscript row.
|
|
14
|
+
*/
|
|
15
|
+
@include field-size.sizes;
|
|
16
|
+
|
|
17
|
+
:host {
|
|
18
|
+
display: block;
|
|
19
|
+
/*
|
|
20
|
+
* Allow the host to shrink below the mat-form-field's intrinsic width when
|
|
21
|
+
* used as a flex item (e.g. two side-by-side pickers in a date-range filter,
|
|
22
|
+
* or a picker beside an operator select). Without this, the default
|
|
23
|
+
* `min-width: auto` on a flex item keeps each field at its content width and
|
|
24
|
+
* the row overflows its container.
|
|
25
|
+
*/
|
|
26
|
+
min-width: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.mat-mdc-form-field {
|
|
30
|
+
--mdc-outlined-text-field-container-shape: var(--radius-md);
|
|
31
|
+
font-size: 0.875rem; /* text-sm, matches the React inputs */
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.mat-mdc-form-field-subscript-wrapper {
|
|
35
|
+
display: none;
|
|
36
|
+
}
|