@salesforce/templates 66.17.4 → 66.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/lib/generators/analyticsTemplateGenerator.d.ts +1 -1
- package/lib/generators/analyticsTemplateGenerator.js +1 -1
- package/lib/generators/analyticsTemplateGenerator.js.map +1 -1
- package/lib/generators/apexClassGenerator.d.ts +1 -1
- package/lib/generators/apexClassGenerator.js +1 -0
- package/lib/generators/apexClassGenerator.js.map +1 -1
- package/lib/generators/apexTriggerGenerator.d.ts +1 -1
- package/lib/generators/baseGenerator.d.ts +1 -1
- package/lib/generators/baseGenerator.js +13 -7
- package/lib/generators/baseGenerator.js.map +1 -1
- package/lib/generators/digitalExperienceSiteGenerator.d.ts +1 -2
- package/lib/generators/digitalExperienceSiteGenerator.js +9 -9
- package/lib/generators/digitalExperienceSiteGenerator.js.map +1 -1
- package/lib/generators/flexipageGenerator.d.ts +1 -2
- package/lib/generators/flexipageGenerator.js +5 -7
- package/lib/generators/flexipageGenerator.js.map +1 -1
- package/lib/generators/lightningAppGenerator.d.ts +1 -1
- package/lib/generators/lightningComponentGenerator.d.ts +1 -1
- package/lib/generators/lightningEventGenerator.d.ts +1 -1
- package/lib/generators/lightningInterfaceGenerator.d.ts +1 -1
- package/lib/generators/lightningOutGenerator.d.ts +1 -1
- package/lib/generators/lightningOutGenerator.js +21 -5
- package/lib/generators/lightningOutGenerator.js.map +1 -1
- package/lib/generators/lightningTestGenerator.d.ts +1 -1
- package/lib/generators/lightningTestGenerator.js +1 -1
- package/lib/generators/lightningTestGenerator.js.map +1 -1
- package/lib/generators/projectGenerator.d.ts +1 -1
- package/lib/generators/projectGenerator.js +8 -5
- package/lib/generators/projectGenerator.js.map +1 -1
- package/lib/generators/staticResourceGenerator.d.ts +1 -1
- package/lib/generators/uiBundleGenerator.d.ts +1 -1
- package/lib/generators/uiBundleGenerator.js +4 -2
- package/lib/generators/uiBundleGenerator.js.map +1 -1
- package/lib/generators/uiEmbeddingGenerator.d.ts +1 -1
- package/lib/generators/uiEmbeddingGenerator.js +2 -1
- package/lib/generators/uiEmbeddingGenerator.js.map +1 -1
- package/lib/generators/visualforceComponentGenerator.d.ts +1 -1
- package/lib/generators/visualforcePageGenerator.d.ts +1 -1
- package/lib/i18n/index.js +1 -1
- package/lib/i18n/index.js.map +1 -1
- package/lib/i18n/localization.js +13 -12
- package/lib/i18n/localization.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/service/gitRepoUtils.d.ts +1 -1
- package/lib/service/gitRepoUtils.js +7 -8
- package/lib/service/gitRepoUtils.js.map +1 -1
- package/lib/service/templateService.d.ts +1 -1
- package/lib/service/templateService.js +1 -1
- package/lib/service/templateService.js.map +1 -1
- package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +558 -533
- package/lib/templates/project/angularintapp/CHANGELOG.md +8 -0
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint.config.js +2 -1
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +568 -543
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +4 -4
- package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/icon/icon.ts +44 -0
- package/lib/templates/project/angularintapp/package.json +1 -1
- package/lib/templates/project/reactexternalapp/CHANGELOG.md +40 -0
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/eslint.config.js +8 -12
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +362 -344
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package.json +5 -5
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ui/button.tsx +1 -1
- package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ui/sonner.tsx +7 -1
- package/lib/templates/project/reactexternalapp/package.json +1 -1
- package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +363 -345
- package/lib/templates/project/vueinternalapp/.forceignore +15 -0
- package/lib/templates/project/vueinternalapp/.husky/pre-commit +4 -0
- package/lib/templates/project/vueinternalapp/.prettierignore +11 -0
- package/lib/templates/project/vueinternalapp/.prettierrc +17 -0
- package/lib/templates/project/vueinternalapp/CHANGELOG.md +5375 -0
- package/lib/templates/project/vueinternalapp/PRD.md +35 -0
- package/lib/templates/project/vueinternalapp/README.md +125 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_ps_/vueinternalapp_Access.permissionset-meta.xml +13 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/.graphqlrc.yml +2 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/.prettierignore +9 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/.prettierrc +11 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/README.md +35 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/codegen.yml +95 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/components.json +19 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/eslint.config.js +124 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/index.html +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/package-lock.json +15530 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/package.json +73 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/playwright.config.ts +24 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/scripts/get-graphql-schema.mjs +71 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +23 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/App.vue +5 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/apiUtils.ts +56 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/orgApiVersionService.ts +37 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/searchableContentTypesService.ts +119 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/channelResolver.ts +40 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/cmsQueryFragment.ts +108 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/composables/useSearchableContentTypes.ts +132 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/contentTypeSessionCache.ts +134 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/contentTypeUtils.ts +40 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/index.ts +55 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/parseResponse.ts +65 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/searchChannel.ts +31 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/types.ts +66 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/registry.ts +38 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/index.ts +19 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/parseResponse.ts +55 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/queryFragment.ts +141 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/types.ts +103 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/distinctValuesService.ts +81 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/searchService.ts +136 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/GlobalSearchBox.types.ts +18 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/GlobalSearchBox.vue +73 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/MergedSearchResults.types.ts +24 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/MergedSearchResults.vue +263 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/Search.vue +200 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SearchResults.vue +99 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SourceSection.vue +204 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/PaginationControls.vue +180 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/ScopeSelector.vue +91 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SearchBar.vue +56 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SortControl.vue +55 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/ActiveFilters.vue +59 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/DefaultFilterField.vue +63 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/DefaultFilterPanel.vue +31 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/FilterContext.ts +45 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/FilterProvider.vue +23 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/FilterResetButton.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/PicklistField.vue +35 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/BooleanFilter.vue +47 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/DateRangeFilter.vue +144 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/FilterFieldWrapper.vue +23 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/MultiSelectFilter.vue +95 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/NumericRangeFilter.vue +117 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/SelectFilter.vue +44 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/TextFilter.vue +49 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/CmsResultRow.vue +160 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/DefaultResultRow.vue +102 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/RenderVNode.ts +10 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/resolveResultRenderer.ts +41 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/composables/useAsyncData.ts +66 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/composables/useDistinctValues.ts +67 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/composables/useSearch.ts +906 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/config.json +88 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/constants.ts +8 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/index.ts +115 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/loadConfig.ts +14 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/queryBuilder.ts +100 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/types.ts +375 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/debounce.ts +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/fieldUtils.ts +14 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/filterUtils.ts +304 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/sortUtils.ts +34 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/api/account/query/getAccountDetail.graphql +121 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/api/graphqlClient.ts +44 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/appLayout.vue +153 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/AgentforceConversationClient.vue +76 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/AccountDetailContent.vue +124 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/AccountDetailError.vue +28 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/AccountDetailNotFound.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/AccountDetailSkeleton.vue +57 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/DetailSection.vue +25 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/FieldItem.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/FieldRow.vue +5 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/SkeletonFieldRow.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/TelephoneField.vue +7 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/types.ts +42 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/alerts/status-alert.vue +59 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/layouts/card-layout.vue +30 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/alert/Alert.vue +21 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/alert/AlertAction.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/alert/AlertDescription.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/alert/AlertTitle.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/alert/index.ts +25 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/avatar/Avatar.vue +23 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/avatar/AvatarFallback.vue +31 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/avatar/AvatarImage.vue +16 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/avatar/index.ts +3 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/button/Button.vue +33 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/button/index.ts +43 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/card/Card.vue +29 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/card/CardAction.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/card/CardContent.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/card/CardDescription.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/card/CardFooter.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/card/CardHeader.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/card/CardTitle.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/card/index.ts +7 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/checkbox/Checkbox.vue +43 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/checkbox/index.ts +1 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/collapsible/Collapsible.vue +19 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/collapsible/CollapsibleContent.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/collapsible/CollapsibleTrigger.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/collapsible/index.ts +3 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/Dialog.vue +15 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogClose.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogContent.vue +59 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogDescription.vue +31 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogFooter.vue +33 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogHeader.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogOverlay.vue +31 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogPortal.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogTitle.vue +26 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/DialogTrigger.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dialog/index.ts +10 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +51 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuContent.vue +47 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuItem.vue +44 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +30 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuPortal.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +52 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +26 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +19 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +37 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +38 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/dropdown-menu/index.ts +15 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/Field.vue +27 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldContent.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldDescription.vue +24 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldError.vue +48 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldGroup.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldLabel.vue +24 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldLegend.vue +29 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldSeparator.vue +31 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldSet.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/FieldTitle.vue +22 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/field/index.ts +33 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/index.ts +115 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/input/Input.vue +30 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/input/index.ts +1 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/label/Label.vue +29 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/label/index.ts +1 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/pagination/Pagination.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/pagination/PaginationContent.vue +15 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/pagination/PaginationEllipsis.vue +23 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/pagination/PaginationItem.vue +7 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/pagination/PaginationLink.vue +31 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/pagination/PaginationNext.vue +29 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/pagination/PaginationPrevious.vue +29 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/pagination/index.ts +7 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/popover/Popover.vue +15 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/popover/PopoverAnchor.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/popover/PopoverContent.vue +44 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/popover/PopoverDescription.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/popover/PopoverHeader.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/popover/PopoverTitle.vue +14 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/popover/PopoverTrigger.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/popover/index.ts +7 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/Select.vue +15 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectContent.vue +65 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectGroup.vue +26 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectItem.vue +41 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectLabel.vue +26 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectScrollDownButton.vue +32 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectScrollUpButton.vue +32 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectSeparator.vue +24 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectTrigger.vue +45 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/SelectValue.vue +12 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/select/index.ts +10 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/separator/Separator.vue +33 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/separator/index.ts +1 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/skeleton/Skeleton.vue +15 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/skeleton/index.ts +1 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/sonner/Sonner.vue +29 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/sonner/index.ts +3 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/spinner/Spinner.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/spinner/index.ts +1 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/composables/useAsyncData.ts +69 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/index.ts +10 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/lib/utils.ts +6 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/main.ts +6 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/pages/AccountObjectDetailPage.vue +98 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/pages/Home.vue +20 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/pages/NotFound.vue +28 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/pages/SearchPage.vue +17 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/router-utils.ts +32 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/router.ts +51 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/styles/global.css +134 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/test/setup.ts +1 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/types/conversation.ts +54 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/types/globals.d.ts +13 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/utils/accountFields.ts +25 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/tsconfig.json +45 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/tsconfig.node.json +13 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +1 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/vite-env.d.ts +14 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/vite.config.ts +106 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/vitest-env.d.ts +2 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/vueinternalapp.uibundle-meta.xml +8 -0
- package/lib/templates/project/vueinternalapp/_p_/_m_/applications/vueinternalapp.app-meta.xml +17 -0
- package/lib/templates/project/vueinternalapp/config/project-scratch-def.json +13 -0
- package/lib/templates/project/vueinternalapp/eslint.config.js +7 -0
- package/lib/templates/project/vueinternalapp/jest.config.js +6 -0
- package/lib/templates/project/vueinternalapp/package.json +46 -0
- package/lib/templates/project/vueinternalapp/scripts/apex/hello.apex +10 -0
- package/lib/templates/project/vueinternalapp/scripts/gitignore-templates.json +4 -0
- package/lib/templates/project/vueinternalapp/scripts/graphql-search.sh +191 -0
- package/lib/templates/project/vueinternalapp/scripts/network-senders.mjs +84 -0
- package/lib/templates/project/vueinternalapp/scripts/org-setup-config-schema.mjs +132 -0
- package/lib/templates/project/vueinternalapp/scripts/org-setup-dev.mjs +114 -0
- package/lib/templates/project/vueinternalapp/scripts/org-setup-url.mjs +108 -0
- package/lib/templates/project/vueinternalapp/scripts/org-setup-utils.mjs +569 -0
- package/lib/templates/project/vueinternalapp/scripts/org-setup-xml.mjs +283 -0
- package/lib/templates/project/vueinternalapp/scripts/org-setup.config.json +9 -0
- package/lib/templates/project/vueinternalapp/scripts/org-setup.mjs +2545 -0
- package/lib/templates/project/vueinternalapp/scripts/sf-project-setup.mjs +103 -0
- package/lib/templates/project/vueinternalapp/scripts/soql/account.soql +6 -0
- package/lib/templates/project/vueinternalapp/scripts/validate-org-setup-config.mjs +38 -0
- package/lib/templates/project/vueinternalapp/sfdx-project.json +12 -0
- package/lib/templates/uiBundles/angularbasic/package-lock.json +558 -533
- package/lib/templates/uiBundles/reactbasic/eslint.config.js +8 -12
- package/lib/templates/uiBundles/reactbasic/package-lock.json +362 -344
- package/lib/templates/uiBundles/reactbasic/package.json +5 -5
- package/lib/templates/uiBundles/reactbasic/src/components/ui/button.tsx +1 -1
- package/lib/templates/uiBundles/reactbasic/src/components/ui/sonner.tsx +7 -1
- package/lib/templates/uiBundles/vuebasic/eslint.config.js +6 -1
- package/lib/templates/uiBundles/vuebasic/package-lock.json +339 -321
- package/lib/templates/uiBundles/vuebasic/package.json +5 -5
- package/lib/utils/createUtil.js +1 -1
- package/lib/utils/createUtil.js.map +1 -1
- package/lib/utils/types.d.ts +8 -7
- package/lib/utils/types.js +4 -4
- package/lib/utils/types.js.map +1 -1
- package/lib/utils/uiBundleTemplateUtils.js +13 -9
- package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
- package/package.json +10 -12
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { embedAgentforceClient } from "@salesforce/agentforce-conversation-client";
|
|
3
|
+
import type { AgentforceClientConfig } from "@salesforce/agentforce-conversation-client";
|
|
4
|
+
import { createAccEmbedder } from "@salesforce/agentforce-conversation-client/ui-bundle";
|
|
5
|
+
import { computed, onMounted, ref, watch } from "vue";
|
|
6
|
+
import type { AgentforceConversationClientProps } from "../types/conversation";
|
|
7
|
+
|
|
8
|
+
// The embed orchestration (window singleton, global host, dev frontdoor fetch,
|
|
9
|
+
// SFDC_ENV default, partial-embed cleanup) lives in the shared, framework-agnostic
|
|
10
|
+
// @salesforce/agentforce-conversation-client/ui-bundle glue. We hand it the
|
|
11
|
+
// low-level embed function via dependency injection.
|
|
12
|
+
const embedder = createAccEmbedder<AgentforceClientConfig>(embedAgentforceClient);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Vue wrapper that embeds the Agentforce Conversation Client (copilot/agent UI)
|
|
16
|
+
* using Lightning Out. Requires a valid Salesforce session for the given org.
|
|
17
|
+
* Flat props are normalized into an `AgentforceClientConfig` and passed through
|
|
18
|
+
* to the shared embedder as-is. The faithful port of the React
|
|
19
|
+
* `AgentforceConversationClient`: the `computed` config mirrors the React
|
|
20
|
+
* `useMemo` and the `onMounted`/`watch` embed mirrors the React `useEffect`.
|
|
21
|
+
*/
|
|
22
|
+
const props = defineProps<AgentforceConversationClientProps>();
|
|
23
|
+
|
|
24
|
+
const containerRef = ref<HTMLDivElement | null>(null);
|
|
25
|
+
|
|
26
|
+
const normalizedAgentforceClientConfig = computed<AgentforceClientConfig>(() => {
|
|
27
|
+
const renderingConfig: NonNullable<AgentforceClientConfig["renderingConfig"]> = {
|
|
28
|
+
mode: props.inline ? "inline" : "floating",
|
|
29
|
+
...(props.headerEnabled !== undefined && { headerEnabled: props.headerEnabled }),
|
|
30
|
+
...(props.showHeaderIcon !== undefined && { showHeaderIcon: props.showHeaderIcon }),
|
|
31
|
+
showAvatar: false,
|
|
32
|
+
...(props.width !== undefined && { width: props.width }),
|
|
33
|
+
...(props.height !== undefined && { height: props.height }),
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
agentId: props.agentId,
|
|
38
|
+
...(props.agentLabel !== undefined && { agentLabel: props.agentLabel }),
|
|
39
|
+
...(props.styleTokens !== undefined && { styleTokens: props.styleTokens }),
|
|
40
|
+
...(props.isFileBased !== undefined && { isFileBased: props.isFileBased }),
|
|
41
|
+
renderingConfig,
|
|
42
|
+
channel: "Vibes",
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const inline = computed(
|
|
47
|
+
() => normalizedAgentforceClientConfig.value?.renderingConfig?.mode === "inline",
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
function embed() {
|
|
51
|
+
embedder.embedAcc(
|
|
52
|
+
normalizedAgentforceClientConfig.value,
|
|
53
|
+
{ salesforceOrigin: props.salesforceOrigin, frontdoorUrl: props.frontdoorUrl },
|
|
54
|
+
containerRef.value,
|
|
55
|
+
{ onReady: props.onReady, onError: props.onError },
|
|
56
|
+
// Intentionally no cleanup:
|
|
57
|
+
// This component guarantees a single LO initialization per window.
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
onMounted(embed);
|
|
62
|
+
watch(
|
|
63
|
+
() => [
|
|
64
|
+
normalizedAgentforceClientConfig.value,
|
|
65
|
+
props.salesforceOrigin,
|
|
66
|
+
props.frontdoorUrl,
|
|
67
|
+
props.onReady,
|
|
68
|
+
props.onError,
|
|
69
|
+
],
|
|
70
|
+
embed,
|
|
71
|
+
);
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<template>
|
|
75
|
+
<div v-if="inline" ref="containerRef" />
|
|
76
|
+
</template>
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from "vue";
|
|
3
|
+
import { Card, CardContent } from "../ui/card";
|
|
4
|
+
import { Separator } from "../ui/separator";
|
|
5
|
+
import { fieldValue, getAddressFieldLines } from "../../utils/accountFields";
|
|
6
|
+
import DetailSection from "./DetailSection.vue";
|
|
7
|
+
import FieldItem from "./FieldItem.vue";
|
|
8
|
+
import FieldRow from "./FieldRow.vue";
|
|
9
|
+
import TelephoneField from "./TelephoneField.vue";
|
|
10
|
+
import type { AccountNode } from "./types";
|
|
11
|
+
|
|
12
|
+
const props = defineProps<{ account: AccountNode }>();
|
|
13
|
+
|
|
14
|
+
const name = computed(() => fieldValue(props.account.Name));
|
|
15
|
+
const billingAddress = computed(() =>
|
|
16
|
+
getAddressFieldLines({
|
|
17
|
+
street: fieldValue(props.account.BillingStreet),
|
|
18
|
+
city: fieldValue(props.account.BillingCity),
|
|
19
|
+
state: fieldValue(props.account.BillingState),
|
|
20
|
+
postalCode: fieldValue(props.account.BillingPostalCode),
|
|
21
|
+
country: fieldValue(props.account.BillingCountry),
|
|
22
|
+
}),
|
|
23
|
+
);
|
|
24
|
+
const shippingAddress = computed(() =>
|
|
25
|
+
getAddressFieldLines({
|
|
26
|
+
street: fieldValue(props.account.ShippingStreet),
|
|
27
|
+
city: fieldValue(props.account.ShippingCity),
|
|
28
|
+
state: fieldValue(props.account.ShippingState),
|
|
29
|
+
postalCode: fieldValue(props.account.ShippingPostalCode),
|
|
30
|
+
country: fieldValue(props.account.ShippingCountry),
|
|
31
|
+
}),
|
|
32
|
+
);
|
|
33
|
+
const createdBy = computed(
|
|
34
|
+
() =>
|
|
35
|
+
[fieldValue(props.account.CreatedBy?.Name), fieldValue(props.account.CreatedDate)]
|
|
36
|
+
.filter(Boolean)
|
|
37
|
+
.join(" ") || null,
|
|
38
|
+
);
|
|
39
|
+
const lastModifiedBy = computed(
|
|
40
|
+
() =>
|
|
41
|
+
[fieldValue(props.account.LastModifiedBy?.Name), fieldValue(props.account.LastModifiedDate)]
|
|
42
|
+
.filter(Boolean)
|
|
43
|
+
.join(" ") || null,
|
|
44
|
+
);
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<template>
|
|
48
|
+
<h1 class="text-2xl font-bold mb-4">Account: {{ name }}</h1>
|
|
49
|
+
|
|
50
|
+
<Card>
|
|
51
|
+
<CardContent class="space-y-8 pt-6">
|
|
52
|
+
<!-- Top section -->
|
|
53
|
+
<div>
|
|
54
|
+
<div class="space-y-4">
|
|
55
|
+
<FieldRow>
|
|
56
|
+
<FieldItem label="Account Owner" :value="fieldValue(account.Owner?.Name)" />
|
|
57
|
+
<FieldItem label="Phone">
|
|
58
|
+
<TelephoneField :value="fieldValue(account.Phone)" />
|
|
59
|
+
</FieldItem>
|
|
60
|
+
</FieldRow>
|
|
61
|
+
<FieldRow>
|
|
62
|
+
<FieldItem label="Account Name" :value="name" />
|
|
63
|
+
<FieldItem label="Fax">
|
|
64
|
+
<TelephoneField :value="fieldValue(account.Fax)" />
|
|
65
|
+
</FieldItem>
|
|
66
|
+
</FieldRow>
|
|
67
|
+
<FieldRow>
|
|
68
|
+
<FieldItem label="Parent Account" :value="fieldValue(account.Parent?.Name)" />
|
|
69
|
+
<FieldItem label="Website" :value="fieldValue(account.Website)" />
|
|
70
|
+
</FieldRow>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<Separator />
|
|
75
|
+
|
|
76
|
+
<!-- Additional Information -->
|
|
77
|
+
<DetailSection title="Additional Information">
|
|
78
|
+
<FieldRow>
|
|
79
|
+
<FieldItem label="Type" :value="fieldValue(account.Type)" />
|
|
80
|
+
<FieldItem label="Employees" :value="fieldValue(account.NumberOfEmployees)" />
|
|
81
|
+
</FieldRow>
|
|
82
|
+
<FieldRow>
|
|
83
|
+
<FieldItem label="Industry" :value="fieldValue(account.Industry)" />
|
|
84
|
+
<FieldItem label="Annual Revenue" :value="fieldValue(account.AnnualRevenue)" />
|
|
85
|
+
</FieldRow>
|
|
86
|
+
<dl>
|
|
87
|
+
<FieldItem label="Description" :value="fieldValue(account.Description)" />
|
|
88
|
+
</dl>
|
|
89
|
+
</DetailSection>
|
|
90
|
+
|
|
91
|
+
<Separator />
|
|
92
|
+
|
|
93
|
+
<!-- Address Information -->
|
|
94
|
+
<DetailSection title="Address Information">
|
|
95
|
+
<FieldRow>
|
|
96
|
+
<FieldItem label="Billing Address">
|
|
97
|
+
<template v-if="billingAddress">
|
|
98
|
+
<div v-for="(line, i) in billingAddress" :key="i">
|
|
99
|
+
{{ line }}
|
|
100
|
+
</div>
|
|
101
|
+
</template>
|
|
102
|
+
</FieldItem>
|
|
103
|
+
<FieldItem label="Shipping Address">
|
|
104
|
+
<template v-if="shippingAddress">
|
|
105
|
+
<div v-for="(line, i) in shippingAddress" :key="i">
|
|
106
|
+
{{ line }}
|
|
107
|
+
</div>
|
|
108
|
+
</template>
|
|
109
|
+
</FieldItem>
|
|
110
|
+
</FieldRow>
|
|
111
|
+
</DetailSection>
|
|
112
|
+
|
|
113
|
+
<Separator />
|
|
114
|
+
|
|
115
|
+
<!-- System Information -->
|
|
116
|
+
<DetailSection title="System Information">
|
|
117
|
+
<FieldRow>
|
|
118
|
+
<FieldItem label="Created By" :value="createdBy" />
|
|
119
|
+
<FieldItem label="Last Modified By" :value="lastModifiedBy" />
|
|
120
|
+
</FieldRow>
|
|
121
|
+
</DetailSection>
|
|
122
|
+
</CardContent>
|
|
123
|
+
</Card>
|
|
124
|
+
</template>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { CircleAlert } from "@lucide/vue";
|
|
3
|
+
import { Alert, AlertTitle, AlertDescription } from "../ui/alert";
|
|
4
|
+
import { Button } from "../ui/button";
|
|
5
|
+
|
|
6
|
+
defineEmits<{ back: [] }>();
|
|
7
|
+
|
|
8
|
+
const retry = () => window.location.reload();
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<!-- Alert hardcodes role="alert"; override so the h1-focus logic in the page is the only announcement path (WCAG 4.1.3) -->
|
|
13
|
+
<Alert variant="destructive" :role="undefined">
|
|
14
|
+
<CircleAlert aria-hidden="true" />
|
|
15
|
+
<AlertTitle>
|
|
16
|
+
<h1>Failed to load account</h1>
|
|
17
|
+
</AlertTitle>
|
|
18
|
+
<AlertDescription>
|
|
19
|
+
Something went wrong while loading this account. Please try again later.
|
|
20
|
+
</AlertDescription>
|
|
21
|
+
</Alert>
|
|
22
|
+
<div class="mt-4 flex gap-3">
|
|
23
|
+
<Button variant="outline" @click="$emit('back')">
|
|
24
|
+
<span aria-hidden="true">←</span> Back
|
|
25
|
+
</Button>
|
|
26
|
+
<Button variant="outline" @click="retry"> Retry </Button>
|
|
27
|
+
</div>
|
|
28
|
+
</template>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { FileQuestionMark } from "@lucide/vue";
|
|
3
|
+
import { Button } from "../ui/button";
|
|
4
|
+
import { Card, CardContent } from "../ui/card";
|
|
5
|
+
|
|
6
|
+
defineEmits<{ back: [] }>();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<template>
|
|
10
|
+
<Card>
|
|
11
|
+
<CardContent class="flex flex-col items-center justify-center py-16 text-center">
|
|
12
|
+
<FileQuestionMark aria-hidden="true" class="size-12 text-muted-foreground mb-4" />
|
|
13
|
+
<h1 class="text-lg font-semibold mb-1">Account not found</h1>
|
|
14
|
+
<p class="text-sm text-muted-foreground mb-6">
|
|
15
|
+
The account you're looking for doesn't exist or may have been deleted.
|
|
16
|
+
</p>
|
|
17
|
+
<Button variant="outline" @click="$emit('back')">
|
|
18
|
+
<span aria-hidden="true">←</span> Go back
|
|
19
|
+
</Button>
|
|
20
|
+
</CardContent>
|
|
21
|
+
</Card>
|
|
22
|
+
</template>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { Card, CardContent } from "../ui/card";
|
|
3
|
+
import { Separator } from "../ui/separator";
|
|
4
|
+
import { Skeleton } from "../ui/skeleton";
|
|
5
|
+
import SkeletonFieldRow from "./SkeletonFieldRow.vue";
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<div>
|
|
10
|
+
<Skeleton class="h-8 w-56 mb-4" />
|
|
11
|
+
|
|
12
|
+
<Card>
|
|
13
|
+
<CardContent class="space-y-8 pt-6">
|
|
14
|
+
<!-- Top section: field rows -->
|
|
15
|
+
<div>
|
|
16
|
+
<div class="space-y-4">
|
|
17
|
+
<SkeletonFieldRow />
|
|
18
|
+
<SkeletonFieldRow />
|
|
19
|
+
<SkeletonFieldRow />
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<Separator />
|
|
24
|
+
|
|
25
|
+
<!-- Additional Information -->
|
|
26
|
+
<div class="space-y-4">
|
|
27
|
+
<Skeleton class="h-7 w-48 py-2" />
|
|
28
|
+
<SkeletonFieldRow />
|
|
29
|
+
<SkeletonFieldRow />
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<Separator />
|
|
33
|
+
|
|
34
|
+
<!-- Address Information -->
|
|
35
|
+
<div class="space-y-4">
|
|
36
|
+
<Skeleton class="h-7 w-48 py-2" />
|
|
37
|
+
<div class="grid grid-cols-2 gap-x-8 gap-y-4">
|
|
38
|
+
<div v-for="w in ['w-28', 'w-32']" :key="w">
|
|
39
|
+
<Skeleton :class="`h-4 ${w} mb-1.5`" />
|
|
40
|
+
<Skeleton class="h-5 w-44 mb-1" />
|
|
41
|
+
<Skeleton class="h-5 w-36 mb-1" />
|
|
42
|
+
<Skeleton class="h-5 w-28" />
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<Separator />
|
|
48
|
+
|
|
49
|
+
<!-- System Information -->
|
|
50
|
+
<div class="space-y-4">
|
|
51
|
+
<Skeleton class="h-7 w-48 py-2" />
|
|
52
|
+
<SkeletonFieldRow />
|
|
53
|
+
</div>
|
|
54
|
+
</CardContent>
|
|
55
|
+
</Card>
|
|
56
|
+
</div>
|
|
57
|
+
</template>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from "vue";
|
|
3
|
+
import { ChevronDown, ChevronRight } from "@lucide/vue";
|
|
4
|
+
import { Collapsible, CollapsibleTrigger, CollapsibleContent } from "../ui/collapsible";
|
|
5
|
+
|
|
6
|
+
defineProps<{ title: string }>();
|
|
7
|
+
const open = ref(true);
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<Collapsible v-model:open="open">
|
|
12
|
+
<h2>
|
|
13
|
+
<CollapsibleTrigger class="flex items-center gap-2 cursor-pointer text-lg font-semibold py-2">
|
|
14
|
+
<ChevronDown v-if="open" aria-hidden="true" class="size-5" />
|
|
15
|
+
<ChevronRight v-else aria-hidden="true" class="size-5" />
|
|
16
|
+
{{ title }}
|
|
17
|
+
</CollapsibleTrigger>
|
|
18
|
+
</h2>
|
|
19
|
+
<CollapsibleContent>
|
|
20
|
+
<div class="mt-2 space-y-4">
|
|
21
|
+
<slot />
|
|
22
|
+
</div>
|
|
23
|
+
</CollapsibleContent>
|
|
24
|
+
</Collapsible>
|
|
25
|
+
</template>
|
package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/account/FieldItem.vue
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// Plain-text fields pass `value`; rich content (links, address lines) uses the
|
|
3
|
+
// default slot. An empty `{{ null }}` interpolation still counts as slot
|
|
4
|
+
// content, so the "—" placeholder lives on `value` rather than slot fallback.
|
|
5
|
+
defineProps<{ label: string; value?: string | null }>();
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<div>
|
|
10
|
+
<dt class="text-sm text-muted-foreground">
|
|
11
|
+
{{ label }}
|
|
12
|
+
</dt>
|
|
13
|
+
<dd class="mt-0.5">
|
|
14
|
+
<slot>{{ value ?? "—" }}</slot>
|
|
15
|
+
</dd>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { Skeleton } from "../ui/skeleton";
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<div class="grid grid-cols-2 gap-x-8 gap-y-4">
|
|
7
|
+
<div v-for="i in 2" :key="i">
|
|
8
|
+
<Skeleton class="h-4 w-24 mb-1.5" />
|
|
9
|
+
<Skeleton class="h-5 w-40" />
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
</template>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** A uiapi scalar field as returned with `@optional { value displayValue }`. Typed locally to avoid a generated-types dependency. */
|
|
2
|
+
export type FieldValue = { value?: unknown; displayValue?: string | null } | null;
|
|
3
|
+
export type NameHolder = { Name?: FieldValue } | null;
|
|
4
|
+
|
|
5
|
+
export interface AccountNode {
|
|
6
|
+
Id?: string;
|
|
7
|
+
Name?: FieldValue;
|
|
8
|
+
Owner?: NameHolder;
|
|
9
|
+
Phone?: FieldValue;
|
|
10
|
+
Fax?: FieldValue;
|
|
11
|
+
Parent?: NameHolder;
|
|
12
|
+
Website?: FieldValue;
|
|
13
|
+
Type?: FieldValue;
|
|
14
|
+
NumberOfEmployees?: FieldValue;
|
|
15
|
+
Industry?: FieldValue;
|
|
16
|
+
AnnualRevenue?: FieldValue;
|
|
17
|
+
Description?: FieldValue;
|
|
18
|
+
BillingStreet?: FieldValue;
|
|
19
|
+
BillingCity?: FieldValue;
|
|
20
|
+
BillingState?: FieldValue;
|
|
21
|
+
BillingPostalCode?: FieldValue;
|
|
22
|
+
BillingCountry?: FieldValue;
|
|
23
|
+
ShippingStreet?: FieldValue;
|
|
24
|
+
ShippingCity?: FieldValue;
|
|
25
|
+
ShippingState?: FieldValue;
|
|
26
|
+
ShippingPostalCode?: FieldValue;
|
|
27
|
+
ShippingCountry?: FieldValue;
|
|
28
|
+
CreatedBy?: NameHolder;
|
|
29
|
+
CreatedDate?: FieldValue;
|
|
30
|
+
LastModifiedBy?: NameHolder;
|
|
31
|
+
LastModifiedDate?: FieldValue;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface GetAccountDetailResponse {
|
|
35
|
+
uiapi?: {
|
|
36
|
+
query?: {
|
|
37
|
+
Account?: {
|
|
38
|
+
edges?: Array<{ node?: AccountNode } | null> | null;
|
|
39
|
+
} | null;
|
|
40
|
+
} | null;
|
|
41
|
+
} | null;
|
|
42
|
+
}
|
package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/alerts/status-alert.vue
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, useId } from 'vue';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { AlertCircleIcon, CheckCircle2Icon, InfoIcon } from '@lucide/vue';
|
|
5
|
+
import { Alert, AlertDescription } from '@/components/ui/alert';
|
|
6
|
+
|
|
7
|
+
const statusAlertVariants = cva('', {
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
error: '',
|
|
11
|
+
success: '',
|
|
12
|
+
info: 'text-blue-700 dark:text-blue-400 *:[svg]:text-current *:data-[slot=alert-description]:text-blue-700 dark:*:data-[slot=alert-description]:text-blue-400',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
defaultVariants: {
|
|
16
|
+
variant: 'error',
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Status alert component for displaying error, success, or info messages.
|
|
22
|
+
* Renders nothing when the default slot is empty.
|
|
23
|
+
*/
|
|
24
|
+
const props = withDefaults(
|
|
25
|
+
defineProps<{
|
|
26
|
+
/** Alert variant type. @default "error" */
|
|
27
|
+
variant?: 'error' | 'success' | 'info';
|
|
28
|
+
}>(),
|
|
29
|
+
{
|
|
30
|
+
variant: 'error',
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const descriptionId = useId();
|
|
35
|
+
const isError = computed(() => props.variant === 'error');
|
|
36
|
+
const icon = computed(
|
|
37
|
+
() =>
|
|
38
|
+
({
|
|
39
|
+
error: AlertCircleIcon,
|
|
40
|
+
success: CheckCircle2Icon,
|
|
41
|
+
info: InfoIcon,
|
|
42
|
+
})[props.variant]
|
|
43
|
+
);
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
<template>
|
|
47
|
+
<Alert
|
|
48
|
+
v-if="$slots.default"
|
|
49
|
+
:variant="isError ? 'destructive' : 'default'"
|
|
50
|
+
:class="statusAlertVariants({ variant })"
|
|
51
|
+
:aria-describedby="descriptionId"
|
|
52
|
+
:role="isError ? 'alert' : 'status'"
|
|
53
|
+
>
|
|
54
|
+
<component :is="icon" aria-hidden="true" />
|
|
55
|
+
<AlertDescription :id="descriptionId">
|
|
56
|
+
<slot />
|
|
57
|
+
</AlertDescription>
|
|
58
|
+
</Alert>
|
|
59
|
+
</template>
|
package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/layouts/card-layout.vue
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {
|
|
3
|
+
Card,
|
|
4
|
+
CardContent,
|
|
5
|
+
CardDescription,
|
|
6
|
+
CardHeader,
|
|
7
|
+
CardTitle,
|
|
8
|
+
} from '@/components/ui/card';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Card layout component for authentication pages.
|
|
12
|
+
* Provides a CardHeader with title and optional description, and CardContent.
|
|
13
|
+
*/
|
|
14
|
+
defineProps<{
|
|
15
|
+
title: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
}>();
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<template>
|
|
21
|
+
<Card>
|
|
22
|
+
<CardHeader>
|
|
23
|
+
<CardTitle class="text-2xl">{{ title }}</CardTitle>
|
|
24
|
+
<CardDescription v-if="description">{{ description }}</CardDescription>
|
|
25
|
+
</CardHeader>
|
|
26
|
+
<CardContent>
|
|
27
|
+
<slot />
|
|
28
|
+
</CardContent>
|
|
29
|
+
</Card>
|
|
30
|
+
</template>
|
package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/alert/Alert.vue
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import type { AlertVariants } from '.';
|
|
4
|
+
import { cn } from '@/lib/utils';
|
|
5
|
+
import { alertVariants } from '.';
|
|
6
|
+
|
|
7
|
+
const props = defineProps<{
|
|
8
|
+
class?: HTMLAttributes['class'];
|
|
9
|
+
variant?: AlertVariants['variant'];
|
|
10
|
+
}>();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<div
|
|
15
|
+
data-slot="alert"
|
|
16
|
+
role="alert"
|
|
17
|
+
:class="cn(alertVariants({ variant }), props.class)"
|
|
18
|
+
>
|
|
19
|
+
<slot />
|
|
20
|
+
</div>
|
|
21
|
+
</template>
|
package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/alert/AlertAction.vue
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { cn } from '@/lib/utils';
|
|
4
|
+
|
|
5
|
+
const props = defineProps<{
|
|
6
|
+
class?: HTMLAttributes['class'];
|
|
7
|
+
}>();
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<div
|
|
12
|
+
data-slot="alert-action"
|
|
13
|
+
:class="cn('absolute top-2 right-2', props.class)"
|
|
14
|
+
>
|
|
15
|
+
<slot />
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { cn } from '@/lib/utils';
|
|
4
|
+
|
|
5
|
+
const props = defineProps<{
|
|
6
|
+
class?: HTMLAttributes['class'];
|
|
7
|
+
}>();
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<div
|
|
12
|
+
data-slot="alert-description"
|
|
13
|
+
:class="
|
|
14
|
+
cn(
|
|
15
|
+
'text-muted-foreground text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3',
|
|
16
|
+
props.class
|
|
17
|
+
)
|
|
18
|
+
"
|
|
19
|
+
>
|
|
20
|
+
<slot />
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/alert/AlertTitle.vue
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { cn } from '@/lib/utils';
|
|
4
|
+
|
|
5
|
+
const props = defineProps<{
|
|
6
|
+
class?: HTMLAttributes['class'];
|
|
7
|
+
}>();
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<div
|
|
12
|
+
data-slot="alert-title"
|
|
13
|
+
:class="
|
|
14
|
+
cn(
|
|
15
|
+
'font-medium group-has-[>svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3',
|
|
16
|
+
props.class
|
|
17
|
+
)
|
|
18
|
+
"
|
|
19
|
+
>
|
|
20
|
+
<slot />
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { VariantProps } from 'class-variance-authority';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
|
|
4
|
+
export { default as Alert } from './Alert.vue';
|
|
5
|
+
export { default as AlertTitle } from './AlertTitle.vue';
|
|
6
|
+
export { default as AlertDescription } from './AlertDescription.vue';
|
|
7
|
+
export { default as AlertAction } from './AlertAction.vue';
|
|
8
|
+
|
|
9
|
+
export const alertVariants = cva(
|
|
10
|
+
"grid gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4 w-full relative group/alert",
|
|
11
|
+
{
|
|
12
|
+
variants: {
|
|
13
|
+
variant: {
|
|
14
|
+
default: 'bg-card text-card-foreground',
|
|
15
|
+
destructive:
|
|
16
|
+
'text-red-700 dark:text-red-400 bg-card *:data-[slot=alert-description]:text-red-700 dark:*:data-[slot=alert-description]:text-red-400 *:[svg]:text-current',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
variant: 'default',
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
export type AlertVariants = VariantProps<typeof alertVariants>;
|
package/lib/templates/project/vueinternalapp/_p_/_m_/_w_/_a_/src/components/ui/avatar/Avatar.vue
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { AvatarRoot } from 'reka-ui';
|
|
4
|
+
import { cn } from '@/lib/utils';
|
|
5
|
+
|
|
6
|
+
const props = defineProps<{
|
|
7
|
+
class?: HTMLAttributes['class'];
|
|
8
|
+
}>();
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<AvatarRoot
|
|
13
|
+
data-slot="avatar"
|
|
14
|
+
:class="
|
|
15
|
+
cn(
|
|
16
|
+
'relative flex size-8 shrink-0 overflow-hidden rounded-full',
|
|
17
|
+
props.class
|
|
18
|
+
)
|
|
19
|
+
"
|
|
20
|
+
>
|
|
21
|
+
<slot />
|
|
22
|
+
</AvatarRoot>
|
|
23
|
+
</template>
|