Mini Kabibi Habibi

Current Path : C:/Program Files/Adobe/Adobe Photoshop 2025/Required/UXP/com.adobe.ccx.start/js/
Upload File :
Current File : C:/Program Files/Adobe/Adobe Photoshop 2025/Required/UXP/com.adobe.ccx.start/js/4458.js.map

{"version":3,"file":"4458.js","mappings":"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","sources":["webpack://UniversalAssetBrowser/../src/constants.ts","webpack://UniversalAssetBrowser/../src/contexts/ProjectContext.ts","webpack://UniversalAssetBrowser/../src/components/Collaborators/CollaboratorPopoverContent.tsx","webpack://UniversalAssetBrowser/../src/components/Collaborators/UserIconAndCount.tsx","webpack://UniversalAssetBrowser/../src/components/LoadingPlaceholder/index.tsx","webpack://UniversalAssetBrowser/../src/components/FacePile/index.tsx","webpack://UniversalAssetBrowser/../src/models/collaborators.ts","webpack://UniversalAssetBrowser/../src/components/Collaborators/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectInviteDialog/index.tsx","webpack://UniversalAssetBrowser/../src/config/index.ts","webpack://UniversalAssetBrowser/../src/api/floodgate-service/floodgateFetch.ts","webpack://UniversalAssetBrowser/../src/components/withProviders/featureFlags.tsx","webpack://UniversalAssetBrowser/../src/components/withProviders/index.tsx","webpack://UniversalAssetBrowser/../src/hooks/useSpectrumPreloader.ts","webpack://UniversalAssetBrowser/../src/components/ProjectList/EmptyState/EmptyProjectIllustrationSpectrum.tsx","webpack://UniversalAssetBrowser/../src/components/IllustratedMessage/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectList/OfflineState/OfflineIllustration.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectList/OfflineState/index.tsx","webpack://UniversalAssetBrowser/../src/components/Dialog/Header/index.tsx","webpack://UniversalAssetBrowser/../src/components/BadgeLoader/index.tsx","webpack://UniversalAssetBrowser/../src/components/TextOverflowEllipsis/index.tsx","webpack://UniversalAssetBrowser/../../../src/Icons/Workfront.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/CardActionMenu.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/CardBadgeContainer.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/CardCreatedBy.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/CardCreatedDate.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/CardMetadataLoadingPlaceholder.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/CardTitle.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/Compact/index.tsx","webpack://UniversalAssetBrowser/../src/components/WorkfrontBadge/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/CardCollaborators.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/Full/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/Minimal/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/MinimalSmaller/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCard/index.tsx","webpack://UniversalAssetBrowser/../../../src/Icons/ProjectCreate.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/useBranding.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/useMessages.tsx","webpack://UniversalAssetBrowser/../src/hooks/useGradients.ts","webpack://UniversalAssetBrowser/../src/components/GradientPicker/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreate/Header.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreate/PermissionDeniedContextualHelp.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreate/events/ProjectCreateEvent.ts","webpack://UniversalAssetBrowser/../src/components/ProjectCreate/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/events/ProjectCreationWizardEvent.ts","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/Content/CreateProjectContentWrapper.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/ShareProjectWizardDialog/ShareProjectWizardDialog.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/Content/InviteToProjectContent.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/Sidebar/AdminConsole/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/Sidebar/AdminConsole/CreateProjectSidebarAdminConsole.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/Sidebar/AdminConsole/InviteToProjectSidebarAdminConsole.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/Sidebar/Express/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectCreationWizard/index.tsx","webpack://UniversalAssetBrowser/../src/components/CreateProjectButton/index.tsx","webpack://UniversalAssetBrowser/../src/components/CreateProjectButton/ToolbarCreateProjectButton.tsx","webpack://UniversalAssetBrowser/../../../src/Icons/Buildings.tsx","webpack://UniversalAssetBrowser/../src/hooks/useProjects.ts","webpack://UniversalAssetBrowser/../src/components/DisplayTypeToggleButton/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectViewSwitcher/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectsSearch/index.tsx","webpack://UniversalAssetBrowser/../src/components/SortButton/index.tsx","webpack://UniversalAssetBrowser/../src/components/Toolbar/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectList/CollaboratorColumn.tsx","webpack://UniversalAssetBrowser/../../src/components/NavigateToGlobalSearchWithQueryButton/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectList/EmptyState/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectList/ErrorState/index.tsx","webpack://UniversalAssetBrowser/../../src/components/CDO/renditions/ProjectGridItem/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectListCard/index.tsx","webpack://UniversalAssetBrowser/../../src/components/CDO/renditions/ProjectListItem/index.tsx","webpack://UniversalAssetBrowser/../../src/components/CDO/BackedCollectionItem.ts","webpack://UniversalAssetBrowser/../../src/components/CDO/renditions/placeholders.tsx","webpack://UniversalAssetBrowser/../../src/components/CDO/index.tsx","webpack://UniversalAssetBrowser/../../src/components/CDO/utils/utils.ts","webpack://UniversalAssetBrowser/../../src/components/CDO/useCDOProjectActions.ts","webpack://UniversalAssetBrowser/../../src/components/CDO/renditions/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectList/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectList/Header/index.tsx","webpack://UniversalAssetBrowser/../../src/components/Organizer/index.tsx","webpack://UniversalAssetBrowser/../../src/ProjectsOrganizer.ts","webpack://UniversalAssetBrowser/../src/hooks/useAnalytics.ts","webpack://UniversalAssetBrowser/../src/utils/getEventName.ts","webpack://UniversalAssetBrowser/../src/components/withProviders/useFeatureFlagValue.ts","webpack://UniversalAssetBrowser/../src/actions/copyLink.tsx","webpack://UniversalAssetBrowser/../src/components/Dialog/Content/index.tsx","webpack://UniversalAssetBrowser/../src/components/Dialog/Footer/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectDiscardDialog/index.tsx","webpack://UniversalAssetBrowser/../src/actions/discard.tsx","webpack://UniversalAssetBrowser/../src/actions/invite.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectLeaveDialog/index.tsx","webpack://UniversalAssetBrowser/../src/actions/leave.tsx","webpack://UniversalAssetBrowser/../src/actions/rename.tsx","webpack://UniversalAssetBrowser/../src/actions/workfrontOpen.tsx","webpack://UniversalAssetBrowser/../src/hooks/useProjectActions.ts","webpack://UniversalAssetBrowser/../src/hooks/useHostExtendedConfig.ts","webpack://UniversalAssetBrowser/../src/hooks/useRefreshListOnResume.ts","webpack://UniversalAssetBrowser/../src/components/ShareBaseDialog/types.ts","webpack://UniversalAssetBrowser/../src/utils/getPlatform.ts","webpack://UniversalAssetBrowser/../src/components/ShareBaseDialog/index.tsx","webpack://UniversalAssetBrowser/../src/hooks/useShareSheetPropertiesAndCallbacks.ts","webpack://UniversalAssetBrowser/../src/hooks/useShareSheetLoader.ts"],"sourcesContent":["/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nexport const PROJECT_NAME_MAX_LENGTH = 200;\n\nexport const DUMMY_PROJECT_EMAIL_NOTIFICATION = {\n    sharing: {\n        viewer: 'dummy_template',\n        editor: 'dummy_template',\n    },\n    acceptance: {\n        viewer: 'dummy_template',\n        editor: 'dummy_template',\n    },\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { createContext } from 'react';\n\nexport default createContext<SAM.Project | undefined>(undefined);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport { useHostConfig, useTheme } from '@csc/common';\nimport classNames from 'classnames';\nimport { observer } from 'mobx-react';\nimport type { ReactElement } from 'react';\nimport React, { useContext } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport type { RenderedCollaborator } from '../../models/collaborators';\n\nfunction NoCollaborators() {\n    return (\n        <div data-testid=\"no-collaborators-popover-body\" className={styles.emptyStateMessage}>\n            <FormattedMessage\n                id=\"@ace/projects:projects.collaborators.tooltip.emptyState\"\n                defaultMessage=\"You are the only person with access to this project.\"\n            />\n        </div>\n    );\n}\n\nexport const SharedWithSection = observer(\n    ({ collaborators, limit }: { collaborators: RenderedCollaborator[]; limit: number }) => {\n        const { themeIsExpress } = useTheme();\n        const people = collaborators.slice(0, limit);\n        return (\n            <div data-testid=\"shared-with-section\">\n                <span className={styles.headerText}>\n                    {themeIsExpress ? (\n                        <FormattedMessage\n                            id=\"@ace/projects:projects.column.sharedWith.express\"\n                            defaultMessage=\"Members\"\n                        />\n                    ) : (\n                        <FormattedMessage\n                            id=\"@ace/projects:projects.column.sharedWith\"\n                            defaultMessage=\"Shared with\"\n                        />\n                    )}\n                </span>\n                {people.map(({ name, email, collaboratorID }, i) => (\n                    <div key={i} className={styles.sharedWithCollaboratorName}>\n                        <CollaboratorName name={name} email={email} id={collaboratorID} />\n                    </div>\n                ))}\n                {collaborators.length > limit && (\n                    <span>\n                        <FormattedMessage\n                            id=\"@ace/projects:projects.collaborators.tooltip.more\"\n                            defaultMessage=\"+ {count, number} more\"\n                            values={{\n                                count: collaborators.length - limit,\n                            }}\n                        />\n                    </span>\n                )}\n            </div>\n        );\n    },\n);\n\nfunction You() {\n    return (\n        <span data-testid=\"collaborator-popover-is-you\" className={styles.you}>\n            <FormattedMessage\n                id=\"@ace/projects:projects.collaborators.tooltip.owner.you\"\n                defaultMessage=\"(You)\"\n            />\n        </span>\n    );\n}\n\nfunction CollaboratorName({ name, email, id }: { name?: string; email?: string; id?: string }) {\n    const { userId } = useHostConfig();\n    return (\n        <div className={styles.collaboratorName}>\n            <span className={styles.ellipsis}>{name ?? email ?? ''}</span>\n            {id === userId && <You />}\n        </div>\n    );\n}\n\ninterface Props {\n    // Array of direct collaborators, including the owner\n    collaborators: RenderedCollaborator[];\n    // Max collaborators shown in the 'Shared with' section, excluding the owner\n    limit?: number;\n}\n\nexport function CreatorName() {\n    const project = useContext(ProjectContext);\n    return <CollaboratorName name={project?.creator?.displayName} id={project?.creator?.id} />;\n}\n\nfunction getProjectOwnerCollaborator(\n    project: SAM.Project | undefined,\n): SAM.Collaborator | undefined {\n    if (!project) {\n        return undefined;\n    }\n\n    // This is a workaround for project owner tooltip as seen by org commenter, when project owner is the org\n    // When project is shared via ShareSheet permission \"Everyone in [org] can comment\", USS does not supply displayName for storageAssignee\n    // Since only projects owned by id=\"orgEverybody\" are affected, we can use the predefinedPrincipal in collaborators list (if cached) as a workaround for finding project owner name\n    if (!project.hasPermission(SAM.Permission.Write)) {\n        const orgEverybody = project.collaboratorArray.find(\n            ({ id, type }: SAM.Collaborator) =>\n                type === 'predefinedPrincipal' && id === 'orgEverybody',\n        );\n\n        if (orgEverybody) {\n            return orgEverybody;\n        }\n    }\n\n    return project.collaboratorArray.find((c) => c.id === project.storageAssignee.id);\n}\n\nexport default observer(function CollaboratorPopoverContent({ collaborators, limit = 10 }: Props) {\n    const project = useContext(ProjectContext);\n    const { themeIsExpress } = useTheme();\n\n    // NOTE: this logic covers an edge case where none of these fields are available, but the project.repositoryOwner includes the displayName\n    // the specific scenario this handles is when the storageAssignee is missing displayName, and the storageAssignee is in the collaboratorArray\n    // but there's no name, and the repositoryOwner happens to also be the same entity and includes the displayName.\n    const ownerName =\n        // the storageAssignee can be a user or an org, used to assign ownership of a directory to an IMS user or an org\n        project?.storageAssignee.displayName ??\n        // the Collaborator that corresponds to the storageAssignee or the orgEverybody\n        getProjectOwnerCollaborator(project)?.name ??\n        // the repositoryOwner is the definitive owner of the project, which can be used as a fallback (and may be the same as the storageAssignee)\n        project?.repositoryOwner.displayName;\n\n    const ownerID = project?.storageAssignee.id;\n\n    const collaboratorsExcludingOwner = collaborators.filter((c) => c.collaboratorID !== ownerID);\n\n    let contentBelowDivider: ReactElement | null = null;\n    if (collaboratorsExcludingOwner.length > 0) {\n        contentBelowDivider = (\n            <SharedWithSection collaborators={collaboratorsExcludingOwner} limit={limit} />\n        );\n    } else {\n        const projectInSharedStorage = project?.storageAssignee?.type === 'org';\n        // The NoCollaborators component shows the message `you are the only member`. We need\n        // to check if the project is a user storage/USM project or ashared-storage/ESM\n        // project before deciding to show this message. In shared-storage, projects owned by\n        // the organization, if there are no direct collaborators and only the user has access,\n        // we display the message `you are the only member`. User storage projects always have\n        // at least one direct collaborator, the owner. If the logged-in user is the owner and\n        // the only person with access, the popover will not be shown initially. This stage\n        // is reached only if the user is not the owner but has been directly invited. Therefore,\n        // saying 'you are the only member' would be incorrect, and we choose not to display it.\n        if (projectInSharedStorage) {\n            contentBelowDivider = <NoCollaborators />;\n        }\n    }\n\n    return (\n        <div\n            data-testid=\"collaborator-summary\"\n            className={classNames(styles.collaboratorSummary, { [styles.express]: themeIsExpress })}\n        >\n            <span className={styles.headerText}>\n                <FormattedMessage id=\"@ace/projects:projects.column.owner\" defaultMessage=\"Owner\" />\n            </span>\n            <div data-testid=\"collaborator-popover-owner\">\n                <CollaboratorName name={ownerName} id={ownerID} />\n            </div>\n            {contentBelowDivider && (\n                <>\n                    <Rule className={styles.divider} variant=\"small\" />\n                    {contentBelowDivider}\n                </>\n            )}\n        </div>\n    );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport UserGroupIcon from '@ccx-public/spectrum-wrapper/dist/Icon/UserGroup';\nimport { useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { FormattedNumber } from 'react-intl';\n\nimport styles from './styles.module.css';\n\ninterface Props {\n    count: number;\n    iconSize: 'S' | 'XS';\n}\n\n/**\n * A small component that shows a user group icon and number beside it.\n */\nexport function UserIconAndCount({ count, iconSize }: Props) {\n    const { themeIsSpectrum } = useTheme();\n    return (\n        <div\n            className={classnames(styles.userIconAndCount, {\n                [styles.spectrum]: themeIsSpectrum,\n            })}\n        >\n            <UserGroupIcon\n                data-testid=\"user-group-icon\"\n                className={classnames(styles.usersIcon, {\n                    [styles.iconXS]: iconSize === 'XS',\n                })}\n                size={iconSize}\n            />\n            <span data-testid=\"count\" className={styles.userCount}>\n                <FormattedNumber value={count} />\n            </span>\n        </div>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport styles from './styles.module.css';\n\ntype Props = React.PropsWithChildren<{\n    loading?: boolean;\n    className?: string;\n    style?: React.CSSProperties;\n    exampleElement?: React.ComponentType<{ className?: string; style?: React.CSSProperties }>;\n    'data-testid'?: string;\n}>;\n\nexport default function LoadingPlaceholder({\n    loading,\n    className,\n    style,\n    children,\n    exampleElement: ExampleElement,\n    'data-testid': dataTestId,\n}: Props) {\n    if (!loading) {\n        return <>{children}</>;\n    }\n\n    if (ExampleElement) {\n        return (\n            <ExampleElement\n                className={classnames(styles.loadingGradient, className)}\n                style={style}\n                data-testid={dataTestId ?? 'loading-placeholder'}\n            />\n        );\n    }\n\n    return (\n        <div\n            className={classnames(styles.loadingGradient, styles.element, className)}\n            style={style}\n            data-testid={dataTestId ?? 'loading-placeholder'}\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport { useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport type { RenderedCollaborator } from '../../models/collaborators';\nimport { getDisplayName } from '../../models/collaborators';\nimport LoadingPlaceholder from '../LoadingPlaceholder';\n\ninterface Props {\n    limit?: number;\n    items: RenderedCollaborator[];\n    loading?: boolean;\n}\n\nexport const FacePileItem = observer(function FacePileItem({\n    item,\n}: {\n    item: RenderedCollaborator;\n}) {\n    const avatarURL = item.getAvatarURL?.(SAM.AvatarSizes.Size50);\n    const displayName = getDisplayName(item);\n\n    return (\n        <div className={classnames(styles.facePileItem, styles.facePileItemBackground)}>\n            {avatarURL ? (\n                <img src={avatarURL} alt={displayName} className={styles.facePileItemImg} />\n            ) : (\n                displayName\n                    ?.split(' ')\n                    .map((n) => n[0])\n                    .join('')\n                    .slice(0, 2)\n            )}\n        </div>\n    );\n});\n\nexport default function FacePile({\n    limit = 4,\n    items,\n    children,\n    loading,\n}: PropsWithChildren<Props>) {\n    const { themeIsExpress } = useTheme();\n    const hasMore = items && items.length > limit;\n    const moreCount = hasMore ? items.length - limit + 1 : 0;\n\n    const faceCount = Math.min(items.length, hasMore ? limit - 1 : limit);\n    const faces = items.slice(0, faceCount);\n\n    const facePileItems: Array<RenderedCollaborator | undefined> = loading\n        ? Array.from({ length: limit - 1 }, () => undefined)\n        : faces.reverse();\n\n    return (\n        <div\n            className={classnames(styles.facePile, { [styles.express]: themeIsExpress })}\n            data-testid=\"facepile\"\n        >\n            {!loading && moreCount > 0 && (\n                <div\n                    className={classnames(\n                        styles.facePileItem,\n                        styles.facePileItemBackground,\n                        styles.facePileMore,\n                    )}\n                >\n                    <FormattedMessage\n                        id=\"@ace/projects:facePile.moreCount\"\n                        defaultMessage=\"+{moreCount, number}\"\n                        values={{ moreCount }}\n                    />\n                </div>\n            )}\n\n            {facePileItems.map((collaborator, index) => (\n                <LoadingPlaceholder\n                    key={index}\n                    data-testid=\"loading-facepile-item\"\n                    loading={loading}\n                    className={classnames(\n                        styles.facePileItem,\n                        styles.facePileItemBackground,\n                        styles.facePileItemLoading,\n                    )}\n                >\n                    {collaborator && (\n                        <FacePileItem\n                            key={collaborator.collaboratorID ?? index}\n                            item={collaborator}\n                        />\n                    )}\n                </LoadingPlaceholder>\n            ))}\n\n            {children && <div>{children}</div>}\n        </div>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\n\nexport type RenderedCollaborator = Partial<\n    Pick<SAM.Collaborator, 'name' | 'email' | 'getAvatarURL' | 'collaboratorID'>\n>;\n\nexport function getDisplayName(user: RenderedCollaborator): string | undefined {\n    return user.name || user.email;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport OverlayTrigger from '@ccx-public/spectrum-wrapper/dist/OverlayTrigger';\nimport Tooltip from '@ccx-public/spectrum-wrapper/dist/Tooltip';\nimport { useMobile } from '@csc/common';\nimport { useDirectCollaborators, useProject } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useContext, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport CollaboratorPopoverContent, {\n    CreatorName,\n    SharedWithSection,\n} from './CollaboratorPopoverContent';\nimport { UserIconAndCount } from './UserIconAndCount';\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport type { RenderedCollaborator } from '../../models/collaborators';\nimport FacePile from '../FacePile';\n\nexport type FacePileCollaboratorFilter =\n    // Show direct collaborators, which implies a filtered set; see useDirectCollaborators\n    | 'all'\n    // Show all collaborators, unfiltered\n    | 'collaborators'\n    // Show only the creator in a facepile of one\n    | 'creator';\n\nconst DEFAULT_LIMIT = 4;\n\n/**\n * Displays an icon and count of collaborators for a project, using the current\n * Project context. This variant is used in places like mobile and listview,\n * where space is limited. Areas with larger available space use\n * CollaboratorFacepile instead.\n *\n * A popover shows on hover with more details, as with the Facepile.\n */\nexport const CollaboratorCount = observer(function CollaboratorCount({\n    iconSize = 'S',\n    collaborators,\n    className,\n}: {\n    iconSize?: 'S' | 'XS';\n    collaborators: RenderedCollaborator[];\n    className?: string;\n}) {\n    const isMobile = useMobile();\n    // If you are the only collaborator (or there are none), don't show the icon.\n    if (!collaborators.length) {\n        return null;\n    }\n\n    return (\n        <span className={className}>\n            <OverlayTrigger trigger={isMobile ? 'click' : 'hover'} placement=\"bottom\">\n                {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- TODO: Handle keyboard events, add an appropriate role */}\n                <div\n                    data-testid=\"collaborators-count\"\n                    className={styles.trigger}\n                    onClick={(e) => {\n                        e.preventDefault();\n                        e.stopPropagation();\n                    }}\n                    // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- TODO: Add appropriate role for interactive element\n                    tabIndex={0}\n                >\n                    <UserIconAndCount count={collaborators.length} iconSize={iconSize} />\n                </div>\n                <Tooltip open placement=\"bottom\" data-testid=\"collaborator-count-popover\">\n                    <div className={styles.popoverContent}>\n                        <CollaboratorPopoverContent collaborators={collaborators} />\n                    </div>\n                </Tooltip>\n            </OverlayTrigger>\n        </span>\n    );\n});\n\ninterface Props {\n    collaborators: RenderedCollaborator[];\n    filter?: FacePileCollaboratorFilter;\n    limit?: number;\n}\n\n/**\n * Displays a facepile of collaborators for a Project, using the current Project context.\n * The facepile should NOT include your own face.\n */\nexport const CollaboratorFacepile = observer(function CollaboratorFacepile({\n    collaborators,\n    filter = 'all',\n    limit = DEFAULT_LIMIT,\n}: Props) {\n    const intl = useIntl();\n    const isMobile = useMobile();\n\n    if (!collaborators.length) {\n        return null;\n    }\n\n    const ariaLabel = intl.formatMessage({\n        id: '@ace/projects:projectContentsHeader.collaboraors',\n        defaultMessage: 'Collaborators',\n    });\n\n    return (\n        <OverlayTrigger\n            trigger={isMobile ? 'click' : 'hover'}\n            placement=\"bottom\"\n            // OverlayTrigger is interacting somehow with the flex layout by default and adding\n            // extra height to the facepile. display: contents; fixes this.\n            style={{ display: 'contents' }}\n        >\n            {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- TODO: Handle keyboard events, add an appropriate role */}\n            <div\n                data-testid=\"collaborators-count\"\n                className={styles.trigger}\n                aria-label={ariaLabel}\n                // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- TODO: Add appropriate role for interactive element\n                tabIndex={0}\n                onClick={(e) => {\n                    e.preventDefault();\n                    e.stopPropagation();\n                }}\n            >\n                <FacePile items={collaborators} limit={limit} />\n            </div>\n            <Tooltip open placement=\"bottom\" data-testid=\"collaborator-facepile-popover\">\n                <div className={styles.popoverContent}>\n                    {filter === 'all' && (\n                        <CollaboratorPopoverContent collaborators={collaborators} />\n                    )}\n                    {filter === 'collaborators' && (\n                        <SharedWithSection collaborators={collaborators} limit={10} />\n                    )}\n                    {filter === 'creator' && <CreatorName />}\n                </div>\n            </Tooltip>\n        </OverlayTrigger>\n    );\n});\n\nconst CreatorFacePile = observer(function CreatorFacePile() {\n    const project = useContext(ProjectContext);\n    const creator = useMemo(() => {\n        return project?.collaboratorArray\n            .filter((c) => c.collaboratorID === project?.creator?.id)\n            .slice(0, 1);\n    }, [project]);\n    if (!creator) {\n        return null;\n    }\n    return <CollaboratorFacepile collaborators={creator} filter=\"creator\" />;\n});\n\nconst DirectCollaboratorsFacepile = observer(function DirectCollaboratorFacepile({\n    limit = DEFAULT_LIMIT,\n}: {\n    limit?: number;\n}) {\n    const project = useContext(ProjectContext);\n    const collaborators = useDirectCollaborators(project);\n    return <CollaboratorFacepile collaborators={collaborators} filter=\"all\" limit={limit} />;\n});\n\nexport const ProjectCollaboratorsFacePile = observer(function ProjectCollaboratorsFacePile({\n    projectId,\n    filter = 'all',\n    limit = DEFAULT_LIMIT,\n}: {\n    projectId: string;\n    filter?: FacePileCollaboratorFilter;\n    limit?: number;\n}) {\n    const { project, loading } = useProject(projectId);\n\n    if (loading || !project) {\n        return null;\n    }\n\n    return (\n        <ProjectContext.Provider value={project}>\n            {filter === 'all' && <DirectCollaboratorsFacepile limit={limit} />}\n            {filter === 'collaborators' && (\n                <CollaboratorFacepile\n                    collaborators={project.collaboratorArray}\n                    filter={filter}\n                    limit={limit}\n                />\n            )}\n            {filter === 'creator' && <CreatorFacePile />}\n        </ProjectContext.Provider>\n    );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { useTheme } from '@csc/common';\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport { useProjectSharingAnalytics } from '../../hooks/useAnalytics';\nimport useShareSheetLoader from '../../hooks/useShareSheetLoader';\nimport type { ProjectViewLocations } from '../../utils/ingest';\nimport { ShareProjectBaseDialog } from '../ShareBaseDialog';\n\ninterface Props {\n    project: SAM.AdobeAsset;\n    viewLocation: ProjectViewLocations;\n}\n\nexport default function ProjectInviteDialog({ project, viewLocation }: Props) {\n    useShareSheetLoader();\n\n    const sendAnalytics = useProjectSharingAnalytics();\n    const onIngestEvent = (event: CustomEvent) => {\n        sendAnalytics(event, viewLocation);\n    };\n\n    const { themeIsExpress, themeIsSpectrum } = useTheme();\n\n    const expressStyle = {\n        width: '100%',\n        height: '100%',\n        minHeight: '420px',\n        minWidth: '330px',\n        maxHeight: 'unset',\n    };\n\n    const spectrumStyle = {\n        minHeight: '420px',\n        minWidth: '330px',\n        height: '480px',\n    };\n\n    return (\n        <div\n            className={classNames({\n                [styles.spectrum]: themeIsSpectrum,\n                [styles.express]: themeIsExpress,\n            })}\n            data-testid=\"project-invite-dialog\"\n        >\n            <div style={themeIsExpress ? expressStyle : spectrumStyle}>\n                <ShareProjectBaseDialog project={project} onIngestEvent={onIngestEvent} />\n            </div>\n        </div>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { Env } from '@ccx-public/component-types';\n\nexport const CLIENT_ID = 'CCProjectsClient';\n\nexport interface IConfig {\n    CLIENT_ID: string;\n    FLOODGATE_ENDPOINT: string;\n    FLOODGATE_CLIENT_ID: string;\n    FLOODGATE_SANDBOX_NAME: string;\n    FLOODGATE_GW_IMS_ORG_ID: string;\n}\n\ninterface IConfigs {\n    stage: IConfig;\n    prod: IConfig;\n}\n\nexport const environmentConfigs: IConfigs = {\n    stage: {\n        CLIENT_ID,\n        FLOODGATE_ENDPOINT: 'https://p13n-stage.adobe.io',\n        FLOODGATE_CLIENT_ID: 'ACEProjects2Stage',\n        FLOODGATE_SANDBOX_NAME: 'xlg-stage',\n        FLOODGATE_GW_IMS_ORG_ID: '9E1005A551ED61CA0A490D45@AdobeOrg',\n    },\n    prod: {\n        CLIENT_ID,\n        FLOODGATE_ENDPOINT: 'https://p13n.adobe.io',\n        FLOODGATE_CLIENT_ID: 'ACEProjects2Prod',\n        FLOODGATE_SANDBOX_NAME: 'xlg-prod',\n        FLOODGATE_GW_IMS_ORG_ID: '9E1005A551ED61CA0A490D45@AdobeOrg',\n    },\n};\n\nexport function getEnvironmentConfig(environment: Env): IConfig {\n    const configType = environment === 'prod' ? 'prod' : 'stage';\n\n    const config: IConfig = environmentConfigs[configType];\n    return config;\n}\n\nexport const usingUXP = function () {\n    return Boolean(window.navigator.userAgent.indexOf('UXP') > -1);\n};\n\nexport type FeatureType =\n    // Test purposes in FLOODGATE stage\n    'test-FF';\n\n// Given example feature flag from FLOODGATE Feature Flag service, \"testFF\"\n// UI render can be gated by generic feature (e.g. testFF && <Component />),\n// host specific feature flag (e.g. testFF-assetsWeb && <Component />),\n// or host technology specific feature flag (e.g. testFF-UXP && <Component />, testFF-web && <Component />)\nexport const hasFeatureFlag = function (\n    feature: FeatureType,\n    featureFlags: string[],\n    productId = '',\n): boolean {\n    if (!featureFlags.length) {\n        return false;\n    }\n\n    let featureFlag: string;\n    let productSpecificFeatureFlag: string;\n    let techSpecificFeatureFlag: string;\n    let featureFlagPresent: boolean;\n    const hostTech: string = usingUXP() ? 'UXP' : 'web';\n    for (let i = 0; i < featureFlags.length; i++) {\n        featureFlag = featureFlags[i];\n        techSpecificFeatureFlag = `${featureFlag}-${hostTech}`;\n        productSpecificFeatureFlag = `${featureFlag}-${productId}`;\n        featureFlagPresent =\n            feature === featureFlag ||\n            feature === techSpecificFeatureFlag ||\n            feature === productSpecificFeatureFlag;\n        if (featureFlagPresent) {\n            return true;\n        }\n    }\n    return false;\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type HostConfig from '@csc/common/@types/HostConfig';\n\nimport { getEnvironmentConfig } from '../../config/index';\n\nexport interface FloodgateFetchOptions\n    extends Pick<HostConfig, 'accessToken' | 'environment' | 'refreshToken'> {\n    allowRetry?: boolean;\n}\n\ninterface IFloodgateResponse {\n    releases: [{ features: string[] }];\n}\n\nexport const floodgateFetch = async function ({\n    accessToken,\n    environment,\n    refreshToken,\n    allowRetry = true,\n}: FloodgateFetchOptions): Promise<string[]> {\n    const config = getEnvironmentConfig(environment);\n    const url = `${config.FLOODGATE_ENDPOINT}/fg/api/v3/feature?clientId=${config.FLOODGATE_CLIENT_ID}`;\n\n    const fetchOptions = {\n        method: 'GET',\n        headers: {\n            'X-Api-Key': config.CLIENT_ID,\n            Authorization: `Bearer ${accessToken}`,\n            'x-sandbox-name': config.FLOODGATE_SANDBOX_NAME,\n            'x-gw-ims-org-id': config.FLOODGATE_GW_IMS_ORG_ID,\n        },\n    };\n\n    const response = await fetch(url, fetchOptions);\n\n    // Only refetch once\n    if (response.status === 401 && allowRetry) {\n        const newToken = await refreshToken(accessToken);\n        if (newToken === accessToken) {\n            throw new Error('Request was unauthorized');\n        } else {\n            return floodgateFetch({\n                environment,\n                refreshToken,\n                accessToken: newToken,\n                allowRetry: false,\n            });\n        }\n    }\n    const floodgateData = (await response.json()) as IFloodgateResponse;\n\n    return floodgateData.releases[0]?.features || [];\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type HostConfig from '@csc/common/@types/HostConfig';\nimport { useEffect, useMemo, useState, createContext } from 'react';\n\nimport { floodgateFetch } from '../../api/floodgate-service/floodgateFetch';\nimport { useLoadPerformance } from '../../hooks/usePerformance';\n\ntype FeatureFlags = string[];\nconst DEFAULT_FEATURE_FLAGS = [];\nlet floodgateFeatureFlagsCache: FeatureFlags | undefined = undefined;\n\ninterface Props\n    extends Pick<HostConfig, 'accessToken' | 'refreshToken' | 'environment' | 'featureFlags'> {\n    hostFeatureFlags?: HostConfig['featureFlags'];\n}\n\nexport function useFeatureFlagsLoader(props: Props) {\n    const { accessToken, refreshToken, environment, hostFeatureFlags = {} } = props;\n    const [featureFlags, setFeatureFlags] = useState<FeatureFlags>(DEFAULT_FEATURE_FLAGS);\n    const loaded = useLoadPerformance('useFeatureFlagsLoader');\n\n    useEffect(() => {\n        const fetchFeatureFlags = async () => {\n            let cancelled = false;\n\n            let newFeatureFlags = floodgateFeatureFlagsCache;\n            if (!newFeatureFlags) {\n                newFeatureFlags = await floodgateFetch({\n                    accessToken,\n                    refreshToken,\n                    environment,\n                });\n                loaded();\n                floodgateFeatureFlagsCache = newFeatureFlags;\n            }\n\n            if (!cancelled) {\n                setFeatureFlags(newFeatureFlags);\n            }\n\n            return () => {\n                cancelled = true;\n            };\n        };\n        fetchFeatureFlags().catch((e) => {\n            console.error('Failed to fetch feature flags: ', e);\n            setFeatureFlags(DEFAULT_FEATURE_FLAGS);\n        });\n    }, [accessToken, refreshToken, environment, loaded]);\n\n    const enabledHostFeatureFlags = useMemo(\n        () =>\n            Object.keys(hostFeatureFlags).filter((key) => {\n                const value = hostFeatureFlags[key as keyof typeof hostFeatureFlags];\n                return (\n                    value === true ||\n                    // @ts-expect-error - FeatureFlag is typed as Record<FeatureFlag, boolean>\n                    // value, but hosts might provide this as a string. This message disables\n                    // TypeScript complaining about comparing boolean to string.\n                    value === 'true'\n                );\n            }),\n        [hostFeatureFlags],\n    );\n\n    return [...enabledHostFeatureFlags, ...featureFlags];\n}\n\nexport const FeatureFlagsContext = createContext<FeatureFlags>(DEFAULT_FEATURE_FLAGS);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser } from '@ccx-public/component-types';\nimport type { SpectrumConfig, ShowModalFn } from '@csc/common';\nimport {\n    DocumentCallbacksProvider,\n    ProductLocation,\n    useToasts,\n    handleShowModalResult,\n    MobileProvider,\n    SpectrumProvider,\n    RenderedEvent,\n    useHostConfig,\n    HostConfigOverrides,\n    NetworkProvider,\n} from '@csc/common';\nimport type HostConfig from '@csc/common/@types/HostConfig';\nimport { useSAMInitializer, SAMProvider } from '@csc/sam-utils';\nimport React, { useCallback, useEffect, useMemo } from 'react';\n\nimport { useFeatureFlagsLoader, FeatureFlagsContext } from './featureFlags';\nimport { useIntlLoader, IntlProvider } from './intl';\nimport { useLoadPerformance } from '../../hooks/usePerformance';\nimport { useSpectrumPreloader } from '../../hooks/useSpectrumPreloader';\nimport Ingest from '../../utils/ingest';\n\nfunction getSpectrumTheme(\n    spectrumTheme: HostConfig['spectrumTheme'],\n): SpectrumConfig['spectrumTheme'] {\n    return spectrumTheme === 'default' ? 'spectrum' : spectrumTheme;\n}\n\nfunction getBrowserData(ua: string) {\n    let name = 'unknown',\n        version = '';\n    const rx = /(edge|opr|chrome|chromium|chrios|safari|firefox|fxios)\\/([\\d.]+)/i;\n    const matches = ua.match(rx);\n    if (matches?.length) {\n        name = matches[1];\n        version = matches[2];\n    }\n\n    return { name, version };\n}\n\ntype RawProvidersProps = Required<{\n    featureFlags: NonNullable<ReturnType<typeof useFeatureFlagsLoader>>;\n    intl: NonNullable<ReturnType<typeof useIntlLoader>>;\n    sam: NonNullable<ReturnType<typeof useSAMInitializer>>;\n}> & {\n    // TODO: change this to AssetBrowser.DocumentCallbacks once DocumentCallbacks has these fields\n    documentCallbacks?: AssetBrowser.DocumentCallbacks &\n        Pick<AssetBrowser.ICDOCallbacks, 'promptUserForFileImport' | 'importFiles'>;\n    hostConfigOverrides?: Partial<HostConfig>;\n    mobileConfig: { isMobile: boolean };\n    isOnline?: boolean;\n    style?: React.CSSProperties;\n};\n\nfunction RawProviders(props: React.PropsWithChildren<RawProvidersProps>) {\n    const {\n        children,\n        documentCallbacks,\n        featureFlags,\n        hostConfigOverrides,\n        mobileConfig,\n        isOnline,\n        intl,\n        sam,\n        style,\n    } = props;\n\n    const { enablePerformanceMeasurement, scale, spectrumTheme, theme } = useHostConfig();\n\n    // We're using `RawProviders` to measure the time from UAB init in component-loader\n    // to the time that the component has its first non-empty render, because the\n    // first time we render `RawProviders`, it means that our async dependencies like\n    // SAM, Spectrum, and locale messages are done loading and we can actually render\n    // the full component for the first time.\n    //\n    // If a component needs to do data loading, that is not taken into account here.\n    // This is about just pure code loading, meaning that this is the first time we're\n    // capable of rendering _anything_, even if it's just a loading spinner.\n    useEffect(() => {\n        if (enablePerformanceMeasurement) {\n            try {\n                window.performance?.measure(\n                    'AssetBrowser:ProjectComponent:first-non-empty-render',\n                    'component-loader:load:AssetBrowser:begin',\n                );\n            } catch {\n                // ignore if beginning marker is not present\n            }\n        }\n    }, []); // eslint-disable-line react-hooks/exhaustive-deps -- only run on first render\n\n    return (\n        <HostConfigOverrides {...hostConfigOverrides}>\n            <MobileProvider {...mobileConfig}>\n                <NetworkProvider online={isOnline}>\n                    <SpectrumProvider\n                        scale={scale}\n                        spectrumTheme={getSpectrumTheme(spectrumTheme)}\n                        theme={theme}\n                        style={style}\n                    >\n                        <SAMProvider value={sam}>\n                            <IntlProvider {...intl}>\n                                <FeatureFlagsContext.Provider value={featureFlags}>\n                                    <DocumentCallbacksProvider {...documentCallbacks}>\n                                        {children}\n                                    </DocumentCallbacksProvider>\n                                </FeatureFlagsContext.Provider>\n                            </IntlProvider>\n                        </SAMProvider>\n                    </SpectrumProvider>\n                </NetworkProvider>\n            </MobileProvider>\n        </HostConfigOverrides>\n    );\n}\n\nexport interface Props {\n    adminModeOrgId?: string;\n    // TODO: change this to AssetBrowser.DocumentCallbacks once DocumentCallbacks has these fields\n    documentCallbacks?: AssetBrowser.DocumentCallbacks &\n        Pick<AssetBrowser.ICDOCallbacks, 'promptUserForFileImport' | 'importFiles'>;\n    isMobile: boolean;\n    /**\n     * Storybook-only prop for testing offline views without having to be offline.\n     */\n    isOnline?: boolean;\n    /**\n     * Storybook-only prop for styling components inside of storybook.\n     */\n    style?: React.CSSProperties;\n}\n\nexport function Providers(props: React.PropsWithChildren<Props>) {\n    const { adminModeOrgId, children, isMobile, isOnline, style, documentCallbacks } = props;\n\n    const {\n        accessToken,\n        appName,\n        appVersion,\n        clientId,\n        disableAnalytics,\n        dispatchEvent,\n        enablePerformanceMeasurement,\n        environment,\n        featureFlags: hostFeatureFlags,\n        imsData,\n        locale,\n        productId,\n        refreshToken,\n        scale,\n        showModal: hostShowModal,\n        showToast: hostShowToast,\n        spectrumTheme,\n        theme,\n    } = useHostConfig();\n\n    const userId = imsData?.userId;\n\n    const intl = useIntlLoader({ locale });\n    const samLoaded = useLoadPerformance('useSAMInitializer');\n    const sam = useSAMInitializer({\n        accessToken,\n        adminModeOrgId,\n        clientId,\n        environment,\n        loaded: samLoaded,\n        locale,\n        productId,\n        productLocation: ProductLocation.Projects,\n        refreshToken,\n        userId,\n    });\n    const spectrum = useSpectrumPreloader({\n        scale,\n        spectrumTheme: getSpectrumTheme(spectrumTheme),\n        theme,\n    });\n    const featureFlags = useFeatureFlagsLoader({\n        accessToken,\n        refreshToken,\n        environment,\n        hostFeatureFlags,\n    });\n\n    const mobileConfig = useMemo(() => ({ isMobile }), [isMobile]);\n\n    const [toastContainer, showToastFallback] = useToasts(spectrum);\n\n    const showToast = useCallback(\n        (config: AssetBrowser.ToastConfig) =>\n            hostShowToast ? hostShowToast(config) : showToastFallback(config),\n        [hostShowToast, showToastFallback],\n    );\n\n    const showModal: ShowModalFn = useCallback(\n        async (element, options) => {\n            const showModalResult = await (intl && sam && spectrum\n                ? hostShowModal(\n                      <>\n                          <RawProviders\n                              featureFlags={featureFlags}\n                              hostConfigOverrides={{ showModal, showToast }}\n                              mobileConfig={mobileConfig}\n                              documentCallbacks={documentCallbacks}\n                              intl={intl}\n                              sam={sam}\n                          >\n                              {element}\n                          </RawProviders>\n                      </>,\n                      {\n                          ...options,\n                          // Enable overlay API dialog for all modals in Projects (for Express)\n                          // TODO: Remove once this becomes the default behavior in Express UAB modals: https://jira.corp.adobe.com/browse/CCPROJ-11446\n                          useOverlayAPIDialog: isMobile ? true : false,\n                      },\n                  )\n                : // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- TODO: Wrap in Error object\n                  Promise.reject({ type: AssetBrowser.ShowModalResultType.NotImplemented }));\n\n            handleShowModalResult(showModalResult.type, options);\n\n            return showModalResult;\n        },\n        [\n            hostShowModal,\n            intl,\n            sam,\n            spectrum,\n            featureFlags,\n            showToast,\n            mobileConfig,\n            isMobile,\n            documentCallbacks,\n        ],\n    );\n\n    const canRender = intl && sam && spectrum;\n\n    const ingestConfig = useMemo(() => {\n        const ingestBase = {\n            env: { com: getBrowserData(navigator.userAgent) },\n            event: {\n                category: 'WEB',\n                user_agent: navigator.userAgent,\n                user_guid: userId,\n            },\n            source: {\n                client_id: clientId,\n                name: appName ?? productId,\n                // eslint-disable-next-line @typescript-eslint/no-deprecated -- TODO: Use other browser data\n                platform: navigator.platform,\n                version: appVersion,\n            },\n        };\n        return {\n            allowNoToken: true,\n            apiKey: 'ace-projects-service',\n            data: ingestBase,\n            env: environment,\n            product: productId,\n            project: 'ace-projects',\n        };\n    }, [clientId, environment, productId, appName, appVersion, userId]);\n\n    // Measure very first render\n    useEffect(() => {\n        if (enablePerformanceMeasurement) {\n            try {\n                window.performance?.measure(\n                    'AssetBrowser:ProjectComponent:first-render',\n                    'component-loader:load:AssetBrowser:begin',\n                );\n            } catch {\n                // ignore if beginning marker is not present\n            }\n        }\n        // eslint-disable-next-line react-hooks/exhaustive-deps -- We only want this to trigger on first render\n    }, []);\n\n    useEffect(() => {\n        Ingest.disabled = !!disableAnalytics;\n        if (!disableAnalytics) {\n            Ingest.init(ingestConfig);\n        }\n    }, [ingestConfig, disableAnalytics]);\n\n    const loaded = useLoadPerformance('Providers');\n    useEffect(() => {\n        if (canRender) {\n            loaded();\n            dispatchEvent(new RenderedEvent());\n        }\n    }, [canRender, loaded, dispatchEvent]);\n\n    if (!canRender) {\n        return null;\n    }\n\n    return (\n        <>\n            <RawProviders\n                documentCallbacks={documentCallbacks}\n                featureFlags={featureFlags}\n                hostConfigOverrides={{ showModal, showToast }}\n                mobileConfig={mobileConfig}\n                isOnline={isOnline}\n                intl={intl}\n                sam={sam}\n                style={style}\n            >\n                {children}\n            </RawProviders>\n            {!hostShowToast && toastContainer}\n        </>\n    );\n}\n\nexport default function withProviders<T extends object>(\n    WrappedComponent: React.ComponentType<T>,\n): React.ComponentType<T & Props> {\n    return function WithProviders(props: T & Props) {\n        const { adminModeOrgId, isMobile, documentCallbacks, ...rest } = props;\n\n        return (\n            <Providers\n                adminModeOrgId={adminModeOrgId}\n                isMobile={isMobile}\n                documentCallbacks={documentCallbacks}\n            >\n                <WrappedComponent {...(rest as T)} />\n            </Providers>\n        );\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport preload from '@ccx-public/spectrum-wrapper/dist/preload';\nimport type { SpectrumConfig } from '@csc/common';\nimport { useState, useEffect } from 'react';\n\nimport { useLoadPerformance } from './usePerformance';\n\nexport function useSpectrumPreloader(props: Partial<SpectrumConfig>): SpectrumConfig | null {\n    const { scale = 'medium', spectrumTheme = 'spectrum', theme = 'light' } = props;\n    const [loadedProps, setLoadedProps] = useState<SpectrumConfig | null>(null);\n    const loaded = useLoadPerformance('useSpectrumPreloader');\n\n    useEffect(() => {\n        let cancelled = false;\n        preload({ scale, spectrumTheme, theme })\n            .then(() => {\n                loaded();\n                if (!cancelled) {\n                    setLoadedProps({ scale, spectrumTheme, theme });\n                }\n                return undefined;\n            })\n            .catch(console.error);\n\n        return () => {\n            cancelled = true;\n        };\n    }, [loaded, scale, spectrumTheme, theme]);\n\n    return loadedProps;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport classnames from 'classnames';\nimport React from 'react';\n\nconst style = '.stroke{ stroke: currentColor; } .fill{ fill: currentColor; }';\n\nconst EmptyProjectIllustrationSpectrum = (props: { className?: string }) => (\n    <svg\n        role=\"img\"\n        height=\"96px\"\n        width=\"96px\"\n        viewBox=\"0 0 96 96\"\n        fill=\"none\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        data-testid=\"icon-empty-project\"\n        className={classnames(props.className, 'projectContents-EmptyFilterView')}\n    >\n        <style>{style}</style>\n        <defs />\n        <path\n            className=\"stroke\"\n            d=\"M74.7969 62.75L69.8338 50.7129C68.9075 48.4661 66.7172 47 64.2868 47H55.2969M21.5469 62.75L25.1031 54.125M40.2969 72.5L56.7969 72.5M20.7969 65.75V86.75C20.7969 90.0638 23.4832 92.75 26.7969 92.75H69.5469C72.8606 92.75 75.5469 90.0638 75.5469 86.75V65.75C75.5469 62.4363 72.8606 59.75 69.5469 59.75H26.7969C23.4832 59.75 20.7969 62.4363 20.7969 65.75Z\"\n            strokeWidth=\"4\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n        />\n        <path\n            className=\"stroke\"\n            d=\"M28.7768 23.4554L33.357 31.3886C33.8034 32.1617 34.8289 32.4054 35.6476 31.9327L44.0473 27.0831M27.9978 23.9053L20.6416 28.1524C19.0704 29.0595 18.5336 31.0711 19.4426 32.6454L30.4145 51.6494C31.3235 53.2238 33.334 53.7647 34.9052 52.8576L50.0776 44.0977C51.6488 43.1906 52.1856 41.179 51.2767 39.6047L44.8266 28.4328C44.3901 27.6768 43.6718 27.1248 42.8296 26.8982L30.4914 23.5788C29.6492 23.3522 28.7523 23.4697 27.9978 23.9053Z\"\n            strokeWidth=\"4\"\n            strokeLinejoin=\"round\"\n        />\n        <path\n            className=\"fill\"\n            d=\"M41.4704 18.2765L44.4819 18.9551C45.6657 19.2225 46.4879 17.801 45.6632 16.907L43.5705 14.6384C43.2956 14.3388 43.1842 13.9252 43.2733 13.5264L43.9519 10.5149C44.2194 9.33114 42.7978 8.50891 41.9038 9.33361L39.6352 11.4263C39.3356 11.7012 38.922 11.8127 38.5233 11.7235L35.5118 11.0449C34.328 10.7775 33.5057 12.199 34.3304 13.093L36.4231 15.3616C36.698 15.6612 36.8095 16.0748 36.7203 16.4736L36.0417 19.4851C35.7743 20.6689 37.1958 21.4911 38.0899 20.6664L40.3584 18.5737C40.6581 18.2988 41.0717 18.1873 41.4704 18.2765Z\"\n            fill=\"#DBDBDB\"\n        />\n        <circle className=\"fill\" cx=\"59.9468\" cy=\"40.1\" r=\"3\" fill=\"#DBDBDB\" />\n        <path\n            className=\"stroke\"\n            d=\"M77.0846 12.1761C78.5426 13.0236 79.0342 14.9212 78.1813 16.4087L71.7867 27.5603C68.4985 33.2945 61.2643 35.2998 55.6418 32.0314C50.0215 28.7643 48.1258 21.4548 51.4152 15.7183L57.8098 4.56677C58.6628 3.0793 60.5408 2.55919 61.9988 3.40669L77.0846 12.1761Z\"\n            strokeWidth=\"4\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n        />\n        <path\n            className=\"stroke fill\"\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M63.2967 20.1428C62.8581 20.4015 62.8521 21.0364 63.2861 21.287L66.8281 23.3319C67.262 23.5825 67.8089 23.2598 67.8136 22.7507L67.8498 18.5981C67.8545 18.0889 67.312 17.7758 66.8734 18.0344L63.2967 20.1428Z\"\n            fill=\"#DBDBDB\"\n            strokeWidth=\"4\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n        />\n        <path\n            className=\"stroke\"\n            d=\"M57 16.9607L61.8082 14.4047\"\n            strokeWidth=\"4\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n        />\n    </svg>\n);\n\nexport default EmptyProjectIllustrationSpectrum;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport _IllustratedMessage from '@ccx-public/spectrum-wrapper/dist/IllustratedMessage';\nimport { useMobile, useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport type { ComponentProps } from 'react';\nimport React from 'react';\n\nimport styles from './style.module.css';\n\ninterface Props extends ComponentProps<typeof _IllustratedMessage> {\n    imageSrc?: string | React.ReactNode;\n    imageAlt?: string;\n}\n\n// Wrapper of spectrum-wrapper IllustratedMessage component\n// uses an <img /> tag for the illustration.\nexport default function IllustratedMessage({\n    className,\n    heading,\n    imageSrc,\n    imageAlt,\n    ...rest\n}: Props) {\n    const isMobile = useMobile();\n    const { themeIsExpress, themeIsSpectrum } = useTheme();\n\n    const img =\n        typeof imageSrc === 'string' ? (\n            <img src={imageSrc} className={styles.illustration} alt={imageAlt ?? heading} />\n        ) : (\n            imageSrc\n        );\n\n    return (\n        <_IllustratedMessage\n            {...rest}\n            className={classnames(\n                styles.illustratedMessage,\n                {\n                    [styles.mobile]: isMobile,\n                    [styles.spectrum]: themeIsSpectrum,\n                    [styles.express]: themeIsExpress,\n                },\n                className,\n            )}\n            heading={heading}\n            illustration={img}\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\n\nexport default function OfflineIllustration() {\n    return (\n        <svg\n            width=\"96\"\n            height=\"96\"\n            viewBox=\"0 0 96 96\"\n            fill=\"none\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n        >\n            <path\n                fillRule=\"evenodd\"\n                clipRule=\"evenodd\"\n                d=\"M64.75 34C64.75 25.8534 71.3534 19.25 79.5 19.25C87.6466 19.25 94.25 25.8534 94.25 34C94.25 42.1466 87.6466 48.75 79.5 48.75C71.3534 48.75 64.75 42.1466 64.75 34ZM79.5 25.0217C78.3978 25.0217 77.4959 25.9236 77.4959 27.0258V34.7215C77.4959 35.8237 78.3978 36.7255 79.5 36.7255C80.6022 36.7255 81.5041 35.8237 81.5041 34.7215V27.0258C81.5041 25.9236 80.6022 25.0217 79.5 25.0217ZM81.484 41.7959C81.5442 41.6656 81.5842 41.5353 81.6143 41.395L81.6143 41.3949C81.6344 41.2546 81.6544 41.1144 81.6544 40.9742C81.6544 40.834 81.6344 40.6937 81.6143 40.5535L81.6143 40.5533C81.5842 40.413 81.5442 40.2828 81.484 40.1525C81.4339 40.0222 81.3638 39.892 81.2936 39.7717C81.2135 39.6615 81.1233 39.5513 81.0231 39.4511C80.9229 39.3509 80.8127 39.2607 80.6924 39.1805C80.5822 39.1004 80.452 39.0403 80.3217 38.9802L80.3217 38.9801C80.1914 38.93 80.0611 38.8899 79.9209 38.8599C79.6403 38.8098 79.3597 38.8098 79.0791 38.8599C78.9389 38.8899 78.8086 38.93 78.6783 38.9801C78.5481 39.0403 78.4178 39.1004 78.3076 39.1805C78.1873 39.2607 78.0771 39.3509 77.9769 39.4511C77.8767 39.5513 77.7865 39.6615 77.7064 39.7717C77.6262 39.892 77.5661 40.0222 77.506 40.1525C77.4558 40.2828 77.4158 40.413 77.3857 40.5533C77.3456 40.6936 77.3456 40.8339 77.3456 40.9742C77.3456 41.1145 77.3556 41.2548 77.3857 41.395C77.4158 41.5353 77.4558 41.6656 77.506 41.7959C77.5661 41.9261 77.6262 42.0564 77.7064 42.1666C77.7865 42.2869 77.8767 42.3971 77.9769 42.4973C78.0771 42.5975 78.1873 42.6877 78.3076 42.7678C78.4178 42.838 78.5481 42.9081 78.6783 42.9582C78.8086 43.0183 78.9389 43.0584 79.0791 43.0885C79.2194 43.1286 79.3597 43.1286 79.5 43.1286C79.6403 43.1286 79.7806 43.1185 79.9209 43.0885C80.0611 43.0584 80.1914 43.0183 80.3217 42.9582C80.4519 42.9081 80.5822 42.838 80.6924 42.7678C80.8127 42.6877 80.9229 42.5975 81.0231 42.4973C81.1233 42.3971 81.2135 42.2869 81.2936 42.1666C81.3638 42.0564 81.4339 41.9261 81.484 41.7959ZM39.585 64.7681C41.7273 62.5872 44.7041 61.2383 47.9996 61.2383C51.2926 61.2383 54.2674 62.5851 56.4094 64.763C57.1839 65.5505 58.4502 65.5611 59.2377 64.7865C60.0252 64.012 60.0358 62.7457 59.2612 61.9582C56.3982 59.0472 52.4083 57.2383 47.9996 57.2383C43.5875 57.2383 39.595 59.05 36.7315 61.9649C35.9574 62.7529 35.9687 64.0192 36.7566 64.7932C37.5446 65.5673 38.8109 65.556 39.585 64.7681ZM47.9984 49.3086C41.4054 49.3086 35.4436 51.9952 31.1416 56.3382C30.3643 57.123 29.098 57.129 28.3132 56.3517C27.5285 55.5743 27.5225 54.308 28.2998 53.5233C33.3221 48.4529 40.2949 45.3086 47.9984 45.3086C55.7003 45.3086 62.6717 48.4516 67.6938 53.52C68.4713 54.3046 68.4655 55.5709 67.6809 56.3484C66.8962 57.1259 65.6299 57.12 64.8525 56.3354C60.5507 51.994 54.59 49.3086 47.9984 49.3086ZM22.7151 47.8924C29.1755 41.3954 38.1165 37.377 47.9999 37.377C51.721 37.377 55.3054 37.9463 58.6728 39.0012C59.7268 39.3314 60.849 38.7446 61.1792 37.6905C61.5094 36.6365 60.9226 35.5143 59.8685 35.1841C56.1187 34.0094 52.1312 33.377 47.9999 33.377C37.0089 33.377 27.0591 37.8509 19.8787 45.072C19.0998 45.8553 19.1034 47.1216 19.8867 47.9004C20.6699 48.6793 21.9362 48.6757 22.7151 47.8924ZM47.9991 25.4453C34.8148 25.4453 22.8859 30.8042 14.2654 39.4676C13.4863 40.2505 12.2199 40.2537 11.4369 39.4746C10.654 38.6954 10.6508 37.4291 11.4299 36.6461C20.7704 27.2593 33.7077 21.4453 47.9991 21.4453C52.7886 21.4453 57.4289 22.0986 61.834 23.322C62.8983 23.6176 63.5214 24.72 63.2259 25.7843C62.9303 26.8485 61.8279 27.4717 60.7636 27.1761C56.7037 26.0486 52.4235 25.4453 47.9991 25.4453ZM48.0039 74.5596C49.6608 74.5596 51.0039 73.2164 51.0039 71.5596C51.0039 69.9027 49.6608 68.5596 48.0039 68.5596C46.3471 68.5596 45.0039 69.9027 45.0039 71.5596C45.0039 73.2164 46.3471 74.5596 48.0039 74.5596Z\"\n                fill=\"var(--spectrum-global-color-gray-800, #292929)\"\n                stroke=\"var(--spectrum-global-color-gray-800, #292929)\"\n            />\n        </svg>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\nimport { useIntl } from 'react-intl';\n\nimport OfflineIllustration from './OfflineIllustration';\nimport styles from './styles.module.css';\nimport IllustratedMessage from '../../IllustratedMessage';\n\nexport default function ProjectListOfflineState() {\n    const intl = useIntl();\n    return (\n        <div data-testid=\"projects-list-offline-state\" className={styles.offlineState}>\n            <IllustratedMessage\n                data-testid=\"projects-list-offline-state-illustrated-message\"\n                heading={intl.formatMessage({\n                    id: '@ace/projects:projects.offline.heading',\n                    defaultMessage: 'You’re Disconnected',\n                })}\n                description={intl.formatMessage({\n                    id: '@ace/projects:projects.offline.description',\n                    defaultMessage:\n                        'You can view and edit shared files when your connection is restored.',\n                })}\n                imageSrc={<OfflineIllustration />}\n                className={styles.noIllustratedMessageTitleToHeading}\n            />\n        </div>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useMobile, useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport styles from './style.module.css';\n\ntype Props = React.HTMLAttributes<HTMLHeadingElement>;\n\nexport default function Header({ className, children, ...props }: Props) {\n    const { themeIsExpress, themeIsSpectrum } = useTheme();\n    const isMobile = useMobile();\n\n    return (\n        <h2\n            {...props}\n            className={classnames(className, styles.header, {\n                [styles.express]: themeIsExpress,\n                [styles.spectrum]: themeIsSpectrum,\n                [styles.mobile]: isMobile,\n            })}\n        >\n            {children}\n        </h2>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { ProjectBadgeProps } from '@csc/adobe-assets-view/dist/src/components/ProjectBadge/ProjectBadge';\nimport classnames from 'classnames';\nimport type { PropsWithChildren } from 'react';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport LoadingPlaceholder from '../LoadingPlaceholder';\n\nfunction BadgeLoader({\n    className,\n    size = 'M',\n    loading,\n    children,\n}: PropsWithChildren<Omit<ProjectBadgeProps, 'name' | 'gradient'> & { loading?: boolean }>) {\n    return (\n        <LoadingPlaceholder\n            loading={loading}\n            data-testid=\"loading-badge\"\n            className={classnames(className, styles.badge, {\n                [styles.sizeS]: size === 'S',\n                [styles.sizeM]: size === 'M',\n                [styles.sizeL]: size === 'L',\n                [styles.sizeL50]: size === 'L50',\n                [styles.sizeXL]: size === 'XL',\n                [styles.sizeXXL]: size === 'XXL',\n            })}\n        >\n            {children}\n        </LoadingPlaceholder>\n    );\n}\n\nexport default BadgeLoader;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport OverlayTrigger from '@ccx-public/spectrum-wrapper/dist/OverlayTrigger';\nimport Tooltip from '@ccx-public/spectrum-wrapper/dist/Tooltip';\nimport classnames from 'classnames';\nimport debounce from 'lodash-es/debounce';\nimport type { RefObject } from 'react';\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { ResizeHandler } from 'use-resize-observer';\nimport useResizeObserver from 'use-resize-observer';\n\nimport style from './style.module.css';\n\nfunction useWidth<Target extends RefObject<HTMLElement>>(target: Target) {\n    const [width, setWidth] = useState<number>();\n    const onResize = useMemo(() => debounce<ResizeHandler>((box) => setWidth(box.width), 50), []);\n\n    useLayoutEffect(() => {\n        if (target.current) {\n            setWidth(Math.ceil(target.current.getBoundingClientRect().width));\n        }\n    }, [target]);\n\n    useResizeObserver({ onResize, ref: target, round: Math.ceil });\n    return width;\n}\n\n/**\n * TextOverflowEllipsis will render the given string in a container with\n * `text-overflow: ellipsis` and wrapped in a Tooltip. The tooltip will only be\n * enabled when the text is overflowing.\n */\nexport default function TextOverflowEllipsis(props: {\n    children: React.ReactNode;\n    isTabbable?: boolean;\n}) {\n    const target = useRef<HTMLDivElement>(null);\n    const width = useWidth(target);\n    const needsTooltip = useMemo(() => {\n        return target.current && width ? width < target.current.scrollWidth : true;\n    }, [width]);\n\n    return (\n        // Ellipsis needed in two places:\n        // In OverlayTrigger to work with CDO List column items\n        // In content div to work with ProjectContentsHeader\n        <OverlayTrigger\n            className={style.ellipsis}\n            trigger={['hover']}\n            disabled={!needsTooltip || undefined}\n            placement=\"bottom\"\n            offset={0}\n        >\n            <div className={style.wrapper}>\n                <div\n                    className={classnames(style.content, style.ellipsis)}\n                    // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- TODO: Add appropriate role for interactive element\n                    tabIndex={props.isTabbable && needsTooltip ? 0 : -1}\n                    ref={target}\n                >\n                    <span>{props.children}</span>\n                </div>\n            </div>\n            <Tooltip>{props.children}</Tooltip>\n        </OverlayTrigger>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Icon from '@ccx-public/spectrum-wrapper/dist/Icon';\nimport React from 'react';\n\nexport default function IconWorkfront(props: React.ComponentProps<typeof Icon>) {\n    return (\n        <Icon {...props}>\n            <svg\n                xmlns=\"http://www.w3.org/2000/svg\"\n                width=\"56\"\n                height=\"55\"\n                style={{ fill: 'none' }}\n                viewBox=\"0 0 56 55\"\n            >\n                <path\n                    style={{ fill: '#fff' }}\n                    d=\"M46.0831.5H9.91642C4.4396.5-.00024 4.89105-.00024 10.3077v34.3846c0 5.4166 4.43984 9.8077 9.91666 9.8077H46.0831c5.4768 0 9.9167-4.3911 9.9167-9.8077V10.3077C55.9998 4.89105 51.5599.5 46.0831.5Z\"\n                />\n                <path\n                    style={{ fill: '#EB1000' }}\n                    d=\"M43.9465 26.9818c-1.6378-5.7081-7.4863-13.8398-7.4863-13.8398s-3.627-.4272-8.4461-.4272c-4.8192 0-8.4748.4272-8.4748.4272s-5.8485 8.1317-7.4862 13.8398c6.5795 11.3071 15.6537 17.4026 15.9467 17.4815.2861-.0782 8.8644-6.0727 15.9467-17.4815Z\"\n                />\n                <path\n                    style={{ fill: '#fff' }}\n                    d=\"m27.4984 30.6499-2.1773-1.6446c-.0534-.0433-.0225-.1289.0465-.1289h5.2726c.069 0 .0999.0856.0465.1289l-2.1772 1.6446.5766 1.6677 4.2107.7305c.0369.0065.0729-.0157.0832-.0514l3.3867-11.6548-4.9972 3.3624.2022 3.7138c.0047.0836-.1137.1075-.1424.0287l-2.0589-5.7894 7.0282-2.3826-3.6107-1.9766-5.184 1.749-5.2269-1.749-3.5761 1.9757 7.0365 2.3835-2.0588 5.7894c-.0288.0788-.1472.0549-.1425-.0287l.2022-3.7138-4.9971-3.3624 3.3916 11.654c.0104.0357.0464.0579.0833.0515l4.2058-.7304.5765-1.6671Zm-2.8621 3.053.8956 2.3262h4.9357l.8956-2.3262-3.3638-.5186-3.3631.5186Z\"\n                />\n                <path\n                    style={{ fill: '#EB1000' }}\n                    d=\"M30.2099 44.6932c-.2386 0-.4325-.1916-.4325-.4277 0-.2381.1939-.4277.4325-.4277.2407 0 .4325.1896.4325.4277 0 .2361-.1918.4277-.4325.4277Zm0-.7969c-.2081 0-.3753.1634-.3753.3692 0 .2038.1672.3712.3753.3712.2061 0 .3733-.1674.3733-.3712 0-.2058-.1672-.3692-.3733-.3692Zm.1183.6154-.1285-.1937H30.11v.1937h-.0653v-.4903h.202c.0836 0 .157.0585.157.1493 0 .1089-.0979.1453-.1265.1453l.1327.1957h-.0817Zm-.0815-.4338H30.11v.1816h.1367c.0428 0 .0897-.0384.0897-.0888 0-.0545-.0469-.0928-.0897-.0928Z\"\n                />\n            </svg>\n        </Icon>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport DropdownButton from '@ccx-public/spectrum-wrapper/dist/DropdownButton';\nimport MoreIcon from '@ccx-public/spectrum-wrapper/dist/Icon/More';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\n\nexport const CardActionMenu = ({\n    actionMenu,\n    loading,\n}: {\n    actionMenu?: React.JSX.Element;\n    loading?: boolean;\n}) => {\n    const { hideProjectActions } = useOrganizerConfig();\n\n    if (hideProjectActions || !actionMenu) {\n        return null;\n    }\n\n    return (\n        <div className={styles.actionMenu} data-testid=\"action-menu\">\n            {loading ? (\n                <DropdownButton\n                    data-testid=\"loading-action-menu\"\n                    quiet\n                    icon={<MoreIcon />}\n                    disabled\n                />\n            ) : (\n                actionMenu\n            )}\n        </div>\n    );\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport ProjectBadge from '@csc/adobe-assets-view/dist/src/components/ProjectBadge/ProjectBadge';\nimport { observer } from 'mobx-react';\nimport type { ComponentProps } from 'react';\nimport React, { useContext } from 'react';\n\nimport ProjectContext from '../../contexts/ProjectContext';\nimport BadgeLoader from '../BadgeLoader';\n\nconst CardBadgeContainer = observer(\n    ({\n        loading,\n        size,\n    }: {\n        loading?: boolean;\n        size: ComponentProps<typeof ProjectBadge>['size'];\n    }) => {\n        const project = useContext(ProjectContext);\n\n        return (\n            <BadgeLoader loading={loading}>\n                {project && (\n                    <ProjectBadge name={project.name} gradient={project.gradient} size={size} />\n                )}\n            </BadgeLoader>\n        );\n    },\n);\n\nexport default CardBadgeContainer;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React, { useContext } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport TextOverflowEllipsis from '../TextOverflowEllipsis';\n\nconst CardCreatedBy = () => {\n    const project = useContext(ProjectContext);\n    const name = project?.creator?.displayName;\n\n    if (!name) {\n        return null;\n    }\n\n    return (\n        <div className={styles.creator} data-testid=\"creator\">\n            <TextOverflowEllipsis>\n                <FormattedMessage\n                    id=\"@ace/projects:projects.createdByName\"\n                    defaultMessage=\"Created by {name}\"\n                    values={{ name }}\n                />\n            </TextOverflowEllipsis>\n        </div>\n    );\n};\n\nexport default CardCreatedBy;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { selectUnit } from '@csc/collection-view';\nimport React, { useContext } from 'react';\nimport { FormattedRelativeTime } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\n\nconst CardCreatedDate = () => {\n    const project = useContext(ProjectContext);\n    const date = project?.created;\n\n    if (!date) {\n        return null;\n    }\n    const { unit, value } = selectUnit(date) ?? {};\n\n    return (\n        <span className={styles.createdDate} data-testid=\"date\">\n            <FormattedRelativeTime unit={unit} value={value} />\n        </span>\n    );\n};\n\nexport default CardCreatedDate;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { PropsWithChildren } from 'react';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport LoadingPlaceholder from '../LoadingPlaceholder';\n\nconst CardMetadataLoadingPlaceholder = ({\n    loading,\n    children,\n}: PropsWithChildren<{ loading?: boolean }>) => {\n    return (\n        <LoadingPlaceholder\n            data-testid=\"loading-project-created\"\n            loading={loading}\n            className={styles.loadingCreated}\n        >\n            {children}\n        </LoadingPlaceholder>\n    );\n};\n\nexport default CardMetadataLoadingPlaceholder;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React, { useContext } from 'react';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport LoadingPlaceholder from '../LoadingPlaceholder';\nimport TextOverflowEllipsis from '../TextOverflowEllipsis';\n\nconst CardTitle = ({ loading }: { loading?: boolean }) => {\n    const project = useContext(ProjectContext);\n\n    return (\n        <LoadingPlaceholder\n            data-testid=\"loading-project-name\"\n            loading={loading}\n            className={styles.loadingName}\n        >\n            {project?.name && <TextOverflowEllipsis>{project.name}</TextOverflowEllipsis>}\n        </LoadingPlaceholder>\n    );\n};\n\nexport default CardTitle;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useDirectCollaborators } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useContext } from 'react';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../../contexts/ProjectContext';\nimport { CollaboratorCount } from '../../Collaborators';\nimport { CardActionMenu } from '../CardActionMenu';\nimport CardBadgeContainer from '../CardBadgeContainer';\nimport CardCreatedBy from '../CardCreatedBy';\nimport CardCreatedDate from '../CardCreatedDate';\nimport CardMetadataLoadingPlaceholder from '../CardMetadataLoadingPlaceholder';\nimport CardTitle from '../CardTitle';\nimport type { ProjectCardProps } from '../types';\n\nconst ProjectCardCompact = ({ actionMenu, loading, id }: ProjectCardProps) => {\n    const project = useContext(ProjectContext);\n    const collaborators = useDirectCollaborators(project);\n\n    return (\n        <div key={id} className={styles.compact}>\n            <div className={styles.badgeAndUsers}>\n                <CardBadgeContainer loading={loading} size=\"M\" />\n                <CardActionMenu actionMenu={actionMenu} loading={loading} />\n            </div>\n            <div className={styles.title} data-testid=\"name\">\n                <CardTitle loading={loading} />\n            </div>\n            <div className={styles.metadata}>\n                <CardMetadataLoadingPlaceholder loading={loading}>\n                    <CardCreatedBy />\n                    <div className={styles.metadataLineTwo}>\n                        <CardCreatedDate />\n                        {Boolean(collaborators.length) && (\n                            // eslint-disable-next-line formatjs/no-literal-string-in-jsx -- No localization needed\n                            <span className={styles.dotSeparator}>{' · '}</span>\n                        )}\n                        <span className={styles.collaborators}>\n                            <CollaboratorCount iconSize=\"XS\" collaborators={collaborators} />\n                        </span>\n                    </div>\n                </CardMetadataLoadingPlaceholder>\n            </div>\n        </div>\n    );\n};\n\nexport default observer(ProjectCardCompact);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport IconWorkfront from '@csc/ui/dist/src/Icons/Workfront';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\n\nconst WorkfrontBadge = ({\n    className,\n    size,\n}: {\n    className?: string;\n    size?: 'S' | 'M' | 'L' | 'XL';\n}) => {\n    const intl = useIntl();\n    const label = intl.formatMessage({\n        id: '@ace/projects:workfront.badge.label',\n        defaultMessage: 'Workfront project',\n    });\n\n    return (\n        <span className={className}>\n            <IconWorkfront aria-label={label} data-testid=\"workfront-badge\" size={size} />\n        </span>\n    );\n};\n\nexport default WorkfrontBadge;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport { useDirectCollaborators } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useContext } from 'react';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport { CollaboratorFacepile } from '../Collaborators';\nimport WorkfrontBadge from '../WorkfrontBadge';\n\nconst CardCollaborators = () => {\n    const project = useContext(ProjectContext);\n    const collaborators = useDirectCollaborators(project);\n    const isWFProject = project?.directorySubtype === SAM.ProjectDirectorySubtype.WF_PROJECT;\n\n    return isWFProject ? (\n        <WorkfrontBadge size=\"M\" className={styles.workfrontBadge} />\n    ) : (\n        <CollaboratorFacepile collaborators={collaborators} />\n    );\n};\n\nexport default observer(CardCollaborators);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport FacePile from '../../FacePile';\nimport { CardActionMenu } from '../CardActionMenu';\nimport CardBadgeContainer from '../CardBadgeContainer';\nimport CardCollaborators from '../CardCollaborators';\nimport CardCreatedBy from '../CardCreatedBy';\nimport CardCreatedDate from '../CardCreatedDate';\nimport CardMetadataLoadingPlaceholder from '../CardMetadataLoadingPlaceholder';\nimport CardTitle from '../CardTitle';\nimport type { ProjectCardProps } from '../types';\n\nconst ProjectCardFull = ({ actionMenu, loading, id }: ProjectCardProps) => {\n    return (\n        <div key={id} className={styles.full}>\n            <div className={styles.badgeAndUsers}>\n                <CardBadgeContainer loading={loading} size=\"M\" />\n                <div className={styles.usersAndMenu}>\n                    {loading && <FacePile items={[]} loading={loading} />}\n                    <CardCollaborators />\n                    <CardActionMenu actionMenu={actionMenu} loading={loading} />\n                </div>\n            </div>\n            <div className={styles.title} data-testid=\"name\">\n                <CardTitle loading={loading} />\n            </div>\n            <div className={styles.metadata}>\n                <CardMetadataLoadingPlaceholder loading={loading}>\n                    <>\n                        <CardCreatedBy />\n                        <CardCreatedDate />\n                    </>\n                </CardMetadataLoadingPlaceholder>\n            </div>\n        </div>\n    );\n};\n\nexport default observer(ProjectCardFull);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type ProjectBadge from '@csc/adobe-assets-view/dist/src/components/ProjectBadge/ProjectBadge';\nimport { useDirectCollaborators } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport type { ComponentProps } from 'react';\nimport React, { useContext } from 'react';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../../contexts/ProjectContext';\nimport { CollaboratorCount } from '../../Collaborators';\nimport { CardActionMenu } from '../CardActionMenu';\nimport CardBadgeContainer from '../CardBadgeContainer';\nimport CardMetadataLoadingPlaceholder from '../CardMetadataLoadingPlaceholder';\nimport CardTitle from '../CardTitle';\nimport type { ProjectCardProps } from '../types';\n\nconst ProjectCardMinimal = ({\n    actionMenu,\n    badgeSize = 'L',\n    loading,\n    id,\n}: ProjectCardProps & {\n    badgeSize?: ComponentProps<typeof ProjectBadge>['size'];\n}) => {\n    const project = useContext(ProjectContext);\n    const collaborators = useDirectCollaborators(project);\n\n    return (\n        <div key={id} className={styles.minimal}>\n            <div className={styles.badgeAndUsers}>\n                <CardBadgeContainer loading={loading} size={badgeSize} />\n                <CardActionMenu actionMenu={actionMenu} loading={loading} />\n            </div>\n            <div className={styles.title} data-testid=\"name\">\n                <CardTitle loading={loading} />\n            </div>\n            <div className={styles.metadata}>\n                <CardMetadataLoadingPlaceholder loading={loading}>\n                    <CollaboratorCount iconSize=\"XS\" collaborators={collaborators} />\n                </CardMetadataLoadingPlaceholder>\n            </div>\n        </div>\n    );\n};\n\nexport default observer(ProjectCardMinimal);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport ProjectCardMinimal from '../Minimal';\nimport type { ProjectCardProps } from '../types';\n\nconst ProjectCardMinimalSmaller = (props: ProjectCardProps) => {\n    return <ProjectCardMinimal {...props} badgeSize=\"M\" />;\n};\n\nexport default observer(ProjectCardMinimalSmaller);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useProject } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useContext } from 'react';\n\nimport ProjectCardCompact from './Compact';\nimport ProjectCardFull from './Full';\nimport ProjectCardMinimal from './Minimal';\nimport ProjectCardMinimalSmaller from './MinimalSmaller';\nimport type { ProjectCardVariant } from './types';\nimport ProjectContext from '../../contexts/ProjectContext';\n\nexport interface Props {\n    actionMenu?: React.JSX.Element;\n    loading?: boolean;\n    variant?: ProjectCardVariant;\n}\n\nexport const ProjectCardById = observer(function ProjectCardById({\n    projectId,\n    variant = 'full',\n}: {\n    projectId: string;\n    variant: ProjectCardVariant;\n}) {\n    const { project, loading } = useProject(projectId);\n\n    if (loading || !project) {\n        return <ProjectCard loading variant={variant} />;\n    }\n\n    return (\n        <ProjectContext.Provider value={project}>\n            <ProjectCard variant={variant} />\n        </ProjectContext.Provider>\n    );\n});\n\nconst ProjectCard = observer(function ProjectCard({\n    actionMenu,\n    loading,\n    variant = 'full',\n}: Props) {\n    const project = useContext(ProjectContext);\n\n    if (!loading && (!project || !project.isProject)) {\n        throw new Error(`ProjectCard does not have a valid Project context`);\n    }\n\n    const props = { actionMenu, loading, id: project?.id };\n\n    switch (variant) {\n        case 'compact':\n            return <ProjectCardCompact {...props} />;\n        case 'minimal':\n            return <ProjectCardMinimal {...props} />;\n        case 'minimal-smaller':\n            return <ProjectCardMinimalSmaller {...props} />;\n        case 'full':\n        default:\n            return <ProjectCardFull {...props} />;\n    }\n});\n\nexport default ProjectCard;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Icon from '@ccx-public/spectrum-wrapper/dist/Icon';\nimport React from 'react';\n\ntype Props = React.ComponentProps<typeof Icon> & { theme?: 'spectrum' | 'express' };\n\nexport default function IconProjectCreate({ theme, ...props }: Props) {\n    const spectrumSvg = (\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n            <circle cx=\"16\" cy=\"8\" r=\".75\" strokeWidth=\"0\" />\n            <path d=\"M11.5,9.875c-.7583,0-1.375-.6167-1.375-1.375s.6167-1.375,1.375-1.375,1.375.6167,1.375,1.375-.6167,1.375-1.375,1.375ZM11.5,8.125c-.20654,0-.375.16846-.375.375s.16846.375.375.375.375-.16846.375-.375-.16846-.375-.375-.375Z\" />\n            <path d=\"M10.59473,1.396l-.32227-.27734c-.42139-.36377-.9707-.52295-1.54102-.45068-.54248.06885-1.04443.34277-1.41309.771L1.43945,8.25977c-.78223.90723-.729,2.23877.11768,2.96875l.32275.27832c.18323.15802.39087.27588.61328.35468-.30396.38367-.49316.86206-.49316,1.38849v3c0,1.5166,1.23389,2.75,2.75,2.75h4.7251c.41406,0,.75-.33594.75-.75s-.33594-.75-.75-.75h-4.7251c-.68945,0-1.25-.56055-1.25-1.25v-3c0-.41357.33643-.75.75-.75h5.12988c.41406,0,.75-.33594.75-.75s-.33594-.75-.75-.75h-4.38513l5.71863-6.63428c.78174-.90723.729-2.23926-.11865-2.96973ZM9.57764,3.38623l-5.87939,6.8208c-.12695.14697-.29297.24072-.46729.2627-.08057.01074-.24268.01221-.37158-.09863l-.32275-.27832c-.2168-.18701-.19873-.57764.03857-.85352l5.87891-6.8208c.12695-.14697.29297-.24072.46729-.2627.02002-.00244.04492-.00488.07275-.00488.08643,0,.20166.02002.29932.104l.32227.27734c.2168.18701.19971.57812-.03809.854Z\" />\n            <path d=\"M8.52539,15.5c-.41406,0-.7627-.33594-.7627-.75s.32324-.75.7373-.75h.02539c.41406,0,.75.33594.75.75s-.33594.75-.75.75Z\" />\n            <path d=\"M14.62744,5.94678c-.104,0-.20752-.02588-.30029-.07715-.14551-.07959-.25342-.21387-.2998-.37256l-.75635-2.59229c-.09668-.33154.09375-.67871.4248-.77539l2.5918-.75635c.3335-.09717.67871.09375.77539.4248l.75635,2.5918c.09668.33154-.09375.67871-.4248.77539l-2.5918.75684c-.05762.0166-.1167.0249-.17529.0249ZM14.646,3.1543l.40625,1.39209,1.39209-.40625-.40625-1.39209-1.39209.40625Z\" />\n            <path d=\"M15,10.52112c-2.48529,0-4.5,2.01471-4.5,4.5s2.01471,4.5,4.5,4.5,4.5-2.01471,4.5-4.5-2.01471-4.5-4.5-4.5ZM17.5,15.646h-1.875v1.875c0,.34521-.27979.625-.625.625s-.625-.27979-.625-.625v-1.875h-1.875c-.34521,0-.625-.27979-.625-.625s.27979-.625.625-.625h1.875v-1.875c0-.34521.27979-.625.625-.625s.625.27979.625.625v1.875h1.875c.34521,0,.625.27979.625.625s-.27979.625-.625.625Z\" />\n        </svg>\n    );\n    const expressSvg = (\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\">\n            <circle className=\"fill\" cx=\"15\" cy=\"7\" r=\".75\" />\n            <path\n                className=\"fill\"\n                d=\"m10,7.875c-.7583,0-1.375-.6167-1.375-1.375s.6167-1.375,1.375-1.375,1.375.6167,1.375,1.375-.6167,1.375-1.375,1.375Zm0-1.75c-.20654,0-.375.16846-.375.375s.16846.375.375.375.375-.16846.375-.375-.16846-.375-.375-.375Z\"\n            />\n            <path\n                className=\"fill\"\n                d=\"m13.19434,5.3457c-.25244,0-.49023-.1543-.58496-.4043l-.95312-2.52637c-.12158-.32324.0415-.68359.36426-.80566l2.52637-.95312c.32324-.12305.68359.04102.80566.36426l.95312,2.52637c.12158.32324-.0415.68359-.36426.80566l-2.52637.95312c-.07275.02734-.14746.04004-.2207.04004Zm-.14795-2.78711l.51221,1.35693,1.35693-.51221-.51221-1.35693-1.35693.51221Z\"\n            />\n            <path\n                className=\"fill\"\n                d=\"m17,13h-2v-2c0-.55225-.44775-1-1-1s-1,.44775-1,1v2h-2c-.55225,0-1,.44775-1,1s.44775,1,1,1h2v2c0,.55225.44775,1,1,1s1-.44775,1-1v-2h2c.55225,0,1-.44775,1-1s-.44775-1-1-1Z\"\n            />\n            <path\n                className=\"fill\"\n                d=\"m10.50977,16h-5.50977c-.55127,0-1-.44873-1-1v-3.75c0-.13806.11194-.25.25-.25h6.25977c.55225,0,1-.44775,1-1s-.44775-1-1-1h-4.24188l2.54559-5.37988c.23291-.49316.27979-1.04492.13184-1.55322-.1582-.54395-.53418-.99072-1.03027-1.22461l-.90381-.42773c-.74561-.35303-1.59082-.36084-2.38086-.02393-.74902.31934-1.36084.91699-1.72314,1.68262L.49609,7.16943c-.3623.76611-.43652,1.61816-.20898,2.39941.24072.82568.7832,1.47412,1.52832,1.82617l.18457.08734v3.51764c0,1.6543,1.3457,3,3,3h5.50977c.55225,0,1-.44775,1-1s-.44775-1-1-1ZM2.30371,8.0249l2.41113-5.09619c.15283-.32324.40186-.57129.7002-.69873.08936-.03809.23145-.08398.39551-.08398.1084,0,.22656.02002.34521.07617l.67896.31049c.12671.05792.18158.20831.12201.33423l-3.27466,6.9223c-.05902.12482-.20801.1781-.33282.11914l-.67883-.32092c-.29736-.14111-.41797-.42236-.46289-.57764-.09082-.31201-.05664-.66162.09619-.98486Z\"\n            />\n        </svg>\n    );\n\n    return <Icon {...props}>{theme === 'express' ? expressSvg : spectrumSvg}</Icon>;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { createContext, useContext } from 'react';\n\nexport type CreationWorkflowType = 'express' | 'admin-console' | 'spectrum';\n\nexport const BrandingContext = createContext<CreationWorkflowType>('express');\nexport const BrandingProvider = BrandingContext.Provider;\n\nexport default function useBranding(): CreationWorkflowType {\n    return useContext(BrandingContext);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useMemo } from 'react';\nimport type { IntlShape } from 'react-intl';\nimport { useIntl } from 'react-intl';\n\nimport type { CreationWorkflowType } from './useBranding';\nimport useBranding from './useBranding';\nimport { PROJECT_NAME_MAX_LENGTH } from '../../constants';\n\nconst getSpectrumMessages = (intl: IntlShape) => ({\n    heading: intl.formatMessage({\n        id: '@ace/projects:createSequence.heading',\n        defaultMessage: 'New project',\n    }),\n    headingInviteStep: intl.formatMessage({\n        id: '@ace/projects:inviteSequence.express.heading',\n        defaultMessage: 'Invite people to the project',\n    }),\n    creating: (values: { name: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.createStep.executing',\n                defaultMessage: 'Creating the “{name}” project',\n            },\n            values,\n        ),\n    created: (values: { projectName: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.toast.created',\n                defaultMessage: '{projectName} successfully created.',\n            },\n            values,\n        ),\n    error: (values: { projectName: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.toast.error',\n                defaultMessage: 'Creating the project, {projectName}, has failed.',\n            },\n            values,\n        ),\n    inputPlaceholder: intl.formatMessage({\n        id: '@ace/projects:createSequence.input.placeholder',\n        defaultMessage: 'Type your project name',\n    }),\n    nameHeading: intl.formatMessage({\n        id: '@ace/projects:project.name.heading',\n        defaultMessage: 'Project name',\n    }),\n    characters: intl.formatMessage({\n        id: '@ace/projects:project.name.error.characters',\n        defaultMessage: 'Names can’t contain the following characters: \\\\ / * ? \" | : < >',\n    }),\n    lengthExceeded: intl.formatMessage(\n        {\n            id: '@ace/projects:project.name.error.lengthExceeded',\n            defaultMessage: 'Names can’t be longer than {maximum, number} characters',\n        },\n        { maximum: PROJECT_NAME_MAX_LENGTH },\n    ),\n    endWithDot: intl.formatMessage({\n        id: '@ace/projects:project.name.error.endWithDot',\n        defaultMessage: 'Names can’t end with a period',\n    }),\n    startWithDot: intl.formatMessage({\n        id: '@ace/projects:project.name.error.startWithDot',\n        defaultMessage: 'Names can’t begin with a period',\n    }),\n    reservedName: intl.formatMessage({\n        id: '@ace/projects:name.error.reservedName',\n        defaultMessage: 'The name is not available. Please choose a different name.',\n    }),\n    duplicate: ({ assetType }: { assetType?: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:name.error.duplicate',\n                defaultMessage:\n                    '{assetType, select, project {There’s already a project with this name in this organization} other {There’s already a file with this name in this organization}}',\n            },\n            { assetType },\n        ),\n    inviteFulfilledAll: ({ count, name }: { count: number; name: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:inviteSequence.toast.success',\n                defaultMessage:\n                    'You have invited {count, plural, =1 {# person} other {# people}} to {name} project.',\n            },\n            { count, name },\n        ),\n    inviteFailed: intl.formatMessage({\n        id: '@ace/projects:inviteSequence.toast.error',\n        defaultMessage: 'An error occurred when trying to invite people to your project.',\n    }),\n});\n\nconst getExpressMessages = (intl: IntlShape) => ({\n    heading: intl.formatMessage({\n        id: '@ace/projects:createSequence.heading',\n        defaultMessage: 'New project',\n    }),\n    headingInviteStep: intl.formatMessage({\n        id: '@ace/projects:inviteSequence.express.heading',\n        defaultMessage: 'Invite people to the project',\n    }),\n    creating: (values: { name: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.createStep.executing',\n                defaultMessage: 'Creating the “{name}” project',\n            },\n            values,\n        ),\n    created: (values: { projectName: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.toast.created',\n                defaultMessage: '{projectName} successfully created.',\n            },\n            values,\n        ),\n    error: (values: { projectName: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.toast.error',\n                defaultMessage: 'Creating the project, {projectName}, has failed.',\n            },\n            values,\n        ),\n    inputPlaceholder: intl.formatMessage({\n        id: '@ace/projects:createSequence.input.placeholder',\n        defaultMessage: 'Type your project name',\n    }),\n    nameHeading: intl.formatMessage({\n        id: '@ace/projects:project.name.heading',\n        defaultMessage: 'Project name',\n    }),\n    characters: intl.formatMessage({\n        id: '@ace/projects:project.name.error.characters',\n        defaultMessage: 'Names can’t contain the following characters: \\\\ / * ? \" | : < >',\n    }),\n    lengthExceeded: intl.formatMessage(\n        {\n            id: '@ace/projects:project.name.error.lengthExceeded',\n            defaultMessage: 'Names can’t be longer than {maximum, number} characters',\n        },\n        { maximum: PROJECT_NAME_MAX_LENGTH },\n    ),\n    endWithDot: intl.formatMessage({\n        id: '@ace/projects:project.name.error.endWithDot',\n        defaultMessage: 'Names can’t end with a period',\n    }),\n    startWithDot: intl.formatMessage({\n        id: '@ace/projects:project.name.error.startWithDot',\n        defaultMessage: 'Names can’t begin with a period',\n    }),\n    reservedName: intl.formatMessage({\n        id: '@ace/projects:name.error.reservedName',\n        defaultMessage: 'The name is not available. Please choose a different name.',\n    }),\n    duplicate: ({ assetType }: { assetType?: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:name.error.duplicate',\n                defaultMessage:\n                    '{assetType, select, project {There’s already a project with this name in this organization} other {There’s already a file with this name in this organization}}',\n            },\n            { assetType },\n        ),\n    inviteFulfilledAll: ({ count, name }: { count: number; name: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:inviteSequence.toast.success',\n                defaultMessage:\n                    'You have invited {count, plural, =1 {# person} other {# people}} to {name} project.',\n            },\n            { count, name },\n        ),\n    inviteFailed: intl.formatMessage({\n        id: '@ace/projects:inviteSequence.toast.error',\n        defaultMessage: 'An error occurred when trying to invite people to your project.',\n    }),\n});\n\nconst getAdminConsoleMessages = (intl: IntlShape) => ({\n    heading: intl.formatMessage({\n        id: '@ace/projects:createSequence.adminConsole.heading',\n        defaultMessage: 'New project',\n    }),\n    creating: (values: { name: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.adminConsole.createStep.executing',\n                defaultMessage: 'Creating {name}',\n            },\n            values,\n        ),\n    created: (values: { projectName: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.adminConsole.toast.created',\n                defaultMessage: 'Your project was created',\n            },\n            values,\n        ),\n    error: (values: { projectName: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:createSequence.toast.error',\n                defaultMessage: 'Creating the project, {projectName}, has failed.',\n            },\n            values,\n        ),\n    inputPlaceholder: intl.formatMessage({\n        id: '@ace/projects:createSequence.input.placeholder',\n        defaultMessage: 'Type your project name',\n    }),\n    nameHeading: intl.formatMessage({\n        id: '@ace/projects:project.name.heading',\n        defaultMessage: 'Project name',\n    }),\n    characters: intl.formatMessage({\n        id: '@ace/projects:project.name.error.characters',\n        defaultMessage: 'Names can’t contain the following characters: \\\\ / * ? \" | : < >',\n    }),\n    lengthExceeded: intl.formatMessage(\n        {\n            id: '@ace/projects:project.name.error.lengthExceeded',\n            defaultMessage: 'Names can’t be longer than {maximum, number} characters',\n        },\n        { maximum: PROJECT_NAME_MAX_LENGTH },\n    ),\n    endWithDot: intl.formatMessage({\n        id: '@ace/projects:project.name.error.endWithDot',\n        defaultMessage: 'Names can’t end with a period',\n    }),\n    startWithDot: intl.formatMessage({\n        id: '@ace/projects:project.name.error.startWithDot',\n        defaultMessage: 'Names can’t begin with a period',\n    }),\n    reservedName: intl.formatMessage({\n        id: '@ace/projects:name.error.reservedName',\n        defaultMessage: 'The name is not available. Please choose a different name.',\n    }),\n    duplicate: ({ assetType }: { assetType?: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:name.error.duplicate',\n                defaultMessage:\n                    '{assetType, select, project {There’s already a project with this name in this organization} other {There’s already a file with this name in this organization}}',\n            },\n            { assetType },\n        ),\n    inviteFulfilledAll: ({ name }: { count: number; name: string }) =>\n        intl.formatMessage(\n            {\n                id: '@ace/projects:inviteSequence.adminConsole.toast.success',\n                defaultMessage: 'You have added users to {name}',\n            },\n            { name },\n        ),\n    inviteFailed: intl.formatMessage({\n        id: '@ace/projects:inviteSequence.toast.error',\n        defaultMessage: 'An error occurred when trying to invite people to your project.',\n    }),\n});\n\nexport default function useMessages(specifiedBranding?: CreationWorkflowType) {\n    const intl = useIntl();\n    const branding = useBranding();\n    const selectedBranding = specifiedBranding ?? branding;\n\n    return useMemo(() => {\n        switch (selectedBranding) {\n            case 'admin-console':\n                return getAdminConsoleMessages(intl);\n            case 'spectrum':\n                return getSpectrumMessages(intl);\n            case 'express':\n            default:\n                return getExpressMessages(intl);\n        }\n    }, [selectedBranding, intl]);\n}\n\nexport function useExpressMessages() {\n    const intl = useIntl();\n    return useMemo(() => getExpressMessages(intl), [intl]);\n}\n\nexport function useSpectrumMessages() {\n    const intl = useIntl();\n    return useMemo(() => getSpectrumMessages(intl), [intl]);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { useLoading } from '@csc/common';\nimport { useSAM } from '@csc/sam-utils';\nimport { useMemo } from 'react';\n\ntype GradientsWithDefault = {\n    gradients?: SAM.Gradient[];\n    defaultGradient?: SAM.Gradient;\n};\n\nexport default function useGradients(): {\n    error?: Error;\n    loading: boolean;\n    gradients?: SAM.Gradient[];\n    defaultGradient?: SAM.Gradient;\n} {\n    const { projectContext } = useSAM();\n\n    const getGradients = useMemo(async () => {\n        const gradients = await projectContext.getGradients();\n        const result: GradientsWithDefault = {\n            gradients,\n            defaultGradient: gradients?.find((g) => g.isDefault) ?? gradients?.[0],\n        };\n        return result;\n    }, [projectContext]);\n\n    const { value, error, loading } = useLoading({}, getGradients);\n    return {\n        error,\n        loading,\n        ...value,\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport Icon from '@ccx-public/spectrum-wrapper/dist/Icon';\nimport Select from '@ccx-public/spectrum-wrapper/dist/Select';\nimport { useFormattedGradient } from '@csc/common';\nimport classNames from 'classnames';\nimport type { ComponentProps } from 'react';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport useGradients from '../../hooks/useGradients';\n\ninterface Props {\n    disabled?: boolean;\n    value?: SAM.Gradient;\n    iconsOnly?: boolean;\n    alignRight?: boolean;\n    fitContent?: boolean;\n    onChange: (gradient: SAM.Gradient) => void;\n}\n\ninterface SwatchProps extends ComponentProps<typeof Icon> {\n    gradient: SAM.Gradient;\n}\n\nfunction Swatch({ gradient, ...props }: SwatchProps) {\n    const gradientStyle = useFormattedGradient(gradient);\n    return (\n        <Icon {...props}>\n            {/* \n                Setting border-radius via inline-style because a CSS class works\n                for the menu list when the menu is open, but not for the \n                selected item that is shown in the select itself.\n            */}\n            <div style={{ ...gradientStyle, borderRadius: '15%' }} />\n        </Icon>\n    );\n}\n\nexport default function GradientPicker({\n    value,\n    onChange,\n    iconsOnly,\n    alignRight,\n    fitContent,\n    disabled,\n}: Props) {\n    const { loading, gradients } = useGradients();\n\n    if (loading) {\n        return null;\n    }\n    return (\n        <Select\n            data-testid=\"gradient-picker\"\n            icons={iconsOnly === true ? 'only' : undefined}\n            className={classNames(styles.gradientPicker, {\n                [styles.fitContent]: !!fitContent,\n            })}\n            disabled={disabled}\n            value={value?.name}\n            alignRight={alignRight}\n            renderItem={(option) => {\n                const gradient = option.gradient as SAM.Gradient;\n                return (\n                    <>\n                        <Swatch slot=\"icon\" gradient={gradient} />\n                        {gradient.name}\n                    </>\n                );\n            }}\n            options={\n                gradients?.map((g) => ({\n                    value: g.name,\n                    label: g.name,\n                    // this is passed for use in renderItem\n                    gradient: g,\n                })) ?? []\n            }\n            onChange={(e) => {\n                if (gradients) {\n                    const gradient = gradients.find((g) => g.name === e);\n                    if (gradient) {\n                        onChange(gradient);\n                    } else {\n                        console.log(`Gradient ${e} not found`);\n                    }\n                }\n            }}\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport { useBreakpoint } from '@csc/common';\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport styles from './Header.module.css';\nimport Header from '../Dialog/Header';\nimport useMessages, {\n    useExpressMessages,\n    useSpectrumMessages,\n} from '../ProjectCreationWizard/useMessages';\n\nexport function ContentHeaderAdminConsole() {\n    const messages = useMessages('admin-console');\n    return (\n        <Header className={styles.adminConsole} data-testid=\"create-project-header\">\n            {messages.heading}\n        </Header>\n    );\n}\n\nexport function ContentHeaderSpectrum({ step }: { step: 'createStep' | 'inviteStep' }) {\n    const messages = useSpectrumMessages();\n    const isMobile = useBreakpoint().isSmallBreakpoint;\n    return (\n        <div\n            className={classNames(styles.spectrum, {\n                [styles.inviteStep]: step === 'inviteStep',\n                [styles.mobile]: isMobile,\n            })}\n        >\n            <Header\n                className={styles.header}\n                data-testid={\n                    step === 'createStep' ? 'create-project-header' : 'invite-project-header'\n                }\n            >\n                {step === 'createStep' ? messages.heading : messages.headingInviteStep}\n            </Header>\n            <Rule data-testid=\"create-project-rule\" variant=\"medium\" className={styles.divider} />\n        </div>\n    );\n}\n\nexport function ContentHeaderExpress({ step }: { step: 'createStep' | 'inviteStep' }) {\n    const isMobile = useBreakpoint().isSmallBreakpoint;\n    const messages = useExpressMessages();\n    const isCreateStep = step === 'createStep';\n    const heading = isCreateStep ? messages.heading : messages.headingInviteStep;\n\n    return (\n        <div\n            className={classNames(styles.contentHeader, styles.express, {\n                [styles.createStep]: step === 'createStep',\n                [styles.inviteStep]: step === 'inviteStep',\n                [styles.mobile]: isMobile,\n            })}\n        >\n            <Header className={styles.header} data-testid=\"create-project-header\">\n                {heading}\n            </Header>\n            {!isMobile && (\n                <Rule\n                    data-testid=\"create-project-rule\"\n                    variant=\"small\"\n                    className={styles.divider}\n                />\n            )}\n        </div>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport IconInfo from '@ccx-public/spectrum-wrapper/dist/Icon/Info';\nimport OverlayTrigger from '@ccx-public/spectrum-wrapper/dist/OverlayTrigger';\nimport Popover from '@ccx-public/spectrum-wrapper/dist/Popover';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport style from './permission-denied-contextual-help.module.css';\n\ntype Props = React.PropsWithChildren<{ showContextualHelper: boolean }>;\n\nexport default function PermissionDeniedContextualHelp(props: Props) {\n    if (!props.showContextualHelper) {\n        return <>{props.children}</>;\n    }\n\n    return (\n        <div className={style.component}>\n            {props.children}\n            <OverlayTrigger trigger=\"hover\" placement=\"top right\">\n                <Button\n                    variant=\"action\"\n                    size=\"xs\"\n                    icon={<IconInfo />}\n                    className={style.contextualHelpTrigger}\n                    data-testid=\"create-project-content-permission-denied-help-button\"\n                />\n                <Popover\n                    excludeDialog\n                    slot=\"hover-content\"\n                    className={classnames(style.popover, style.positionFix)}\n                >\n                    <div className={style.contextualHelpContent}>\n                        <FormattedMessage\n                            id=\"@ace/projects:button.create.disabled\"\n                            defaultMessage=\"You are unable to create projects, please contact your administrator in order to create a project.\"\n                        />\n                    </div>\n                </Popover>\n            </OverlayTrigger>\n        </div>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\ntype CreateSuccessEventDetail = {\n    project: {\n        id: string;\n        name: string;\n    };\n};\n\nexport class CreateSuccessEvent extends CustomEvent<CreateSuccessEventDetail> {\n    static readonly EVENT_NAME = 'create-success';\n\n    constructor(detail: CreateSuccessEventDetail) {\n        super(CreateSuccessEvent.EVENT_NAME, { bubbles: true, composed: true, detail });\n    }\n}\n\ntype CreateFailureEventDetail = {\n    project: {\n        name: string;\n    };\n};\n\nexport class CreateFailureEvent extends CustomEvent<CreateFailureEventDetail> {\n    static readonly EVENT_NAME = 'create-failure';\n\n    constructor(detail: CreateFailureEventDetail) {\n        super(CreateFailureEvent.EVENT_NAME, { bubbles: true, composed: true, detail });\n    }\n}\n\nexport class CreateCancelEvent extends CustomEvent<object> {\n    static readonly EVENT_NAME = 'create-cancel';\n\n    constructor() {\n        super(CreateCancelEvent.EVENT_NAME, { bubbles: true, composed: true });\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport ButtonGroup from '@ccx-public/spectrum-wrapper/dist/ButtonGroup';\nimport IllustratedMessage from '@ccx-public/spectrum-wrapper/dist/IllustratedMessage';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport Textfield from '@ccx-public/spectrum-wrapper/dist/Textfield';\nimport Wait from '@ccx-public/spectrum-wrapper/dist/Wait';\nimport ProjectBadge from '@csc/adobe-assets-view/dist/src/components/ProjectBadge/ProjectBadge';\nimport { useBreakpoint, useHostConfig } from '@csc/common';\nimport { isSAMError, useNameValidation, useSAM } from '@csc/sam-utils';\nimport HelpText from '@csc/ui/dist/src/HelpText/HelpText';\nimport useEnterKeySubmit from '@csc/ui/dist/src/hooks/useEnterKeySubmit';\nimport classnames from 'classnames';\nimport type { ComponentProps, CSSProperties, ReactNode, SyntheticEvent } from 'react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { ContentHeaderAdminConsole, ContentHeaderExpress, ContentHeaderSpectrum } from './Header';\nimport PermissionDeniedContextualHelp from './PermissionDeniedContextualHelp';\nimport {\n    CreateSuccessEvent,\n    CreateCancelEvent,\n    CreateFailureEvent,\n} from './events/ProjectCreateEvent';\nimport styles from './style.module.css';\nimport { useProjectActionAnalytics, useAupAnalytics } from '../../hooks/useAnalytics';\nimport useGradients from '../../hooks/useGradients';\nimport { usePerformance } from '../../hooks/usePerformance';\nimport { ProjectViewLocations } from '../../utils/ingest';\nimport GradientPicker from '../GradientPicker';\nimport type { CreationWorkflowType } from '../ProjectCreationWizard/useBranding';\nimport useMessages from '../ProjectCreationWizard/useMessages';\n\nexport interface ProjectCreateProps {\n    branding: CreationWorkflowType;\n    children?: ReactNode;\n    hideGradientPicker?: boolean;\n    showStepCounter?: boolean;\n    onEvent?: (event: CustomEvent) => void;\n    setProject?: (project: SAM.Project) => void;\n    viewLocation?: ProjectViewLocations;\n}\n\nexport default function ProjectCreate({\n    branding,\n    setProject,\n    onEvent,\n    viewLocation = ProjectViewLocations.ProjectCreate,\n    hideGradientPicker,\n    showStepCounter,\n}: ProjectCreateProps) {\n    const { showToast, dispatchEvent, scale } = useHostConfig();\n    const [isExecuting, setIsExecuting] = useState(false);\n    const [name, setName] = useState('');\n    const { projectContext } = useSAM();\n    const isMobile = useBreakpoint().isSmallBreakpoint;\n    const messages = useMessages(branding);\n    const isExpressBranding = branding === 'express';\n    const sendAnalytics = useProjectActionAnalytics();\n    const sendAupAnalytics = useAupAnalytics(viewLocation);\n\n    const buttonSize = 'm';\n    const { addDuplicate, error, onNameChange, helpText } = useNameValidation('project', {\n        messages,\n    });\n    const noInput = name === '';\n    const [gradient, setGradient] = useState<SAM.Gradient | undefined>(undefined);\n    const { gradients } = useGradients();\n    const perf = usePerformance();\n\n    // isPermissionReady is used to prevent disabling the form field while the permission check is in progress\n    // disabling the form field before permission check is ready will defocus the textfield's autofocus\n    const [isPermissionReady, setIsPermissionReady] = useState<boolean>(false);\n    const [canCreateProjects, setCanCreateProjects] = useState<boolean>(false);\n\n    useEffect(() => {\n        sendAnalytics({\n            subcategory: viewLocation,\n            type: 'render',\n            subtype: 'create-new',\n            pagename: 'create-new',\n        });\n    }, [sendAnalytics, viewLocation]);\n\n    useEffect(() => {\n        projectContext\n            .canCreateProjects()\n            .then((result) => {\n                setCanCreateProjects(result);\n                setIsPermissionReady(true);\n                return undefined;\n            })\n            .catch(() => {\n                console.warn('Failed to check if user can create projects');\n            });\n    }, [projectContext]);\n\n    const hasError = Boolean(error);\n    const submitDisabled = !canCreateProjects || noInput || isExecuting || hasError;\n\n    const randomColorId = useMemo(() => Math.floor(Math.random() * 100), []);\n    const randomGradient = useMemo(\n        () => gradients?.[randomColorId % gradients.length],\n        [gradients, randomColorId],\n    );\n    const currentGradient = gradient ?? randomGradient;\n    const requireGradient = !hideGradientPicker && randomGradient;\n\n    const onChange = useCallback(\n        (val: string) => {\n            const newName = val\n                .trim()\n                // [CCPROJ-10227] Remove zero-width joiners from beginning\n                .replace(/^[\\u200C\\u200D]+/g, '');\n            setName(newName);\n            onNameChange(newName);\n        },\n        [onNameChange],\n    );\n\n    const handleEvent = useCallback(\n        (event: CustomEvent) => {\n            if (event instanceof CreateSuccessEvent && !isExpressBranding) {\n                showToast({\n                    content: messages.created({\n                        projectName: event.detail.project.name,\n                    }),\n                    variant: 'positive',\n                });\n            } else if (event instanceof CreateFailureEvent) {\n                showToast({\n                    content: messages.error({\n                        projectName: event.detail.project.name,\n                    }),\n                    variant: 'negative',\n                });\n            }\n\n            // onEvent is used to report to internal component using ProjectCreate directly, eg creation wizard\n            // dispatchEvent is utilized in the standalone web component scenario\n            (onEvent ?? dispatchEvent)(event);\n        },\n        [dispatchEvent, isExpressBranding, messages, onEvent, showToast],\n    );\n\n    useEffect(() => {\n        if (error === 'duplicate') {\n            sendAnalytics({\n                subcategory: viewLocation,\n                type: 'render',\n                subtype: 'name-conflict',\n                pagename: 'create-new',\n            });\n        }\n    }, [error, sendAnalytics, viewLocation]);\n\n    const handleSubmit = useCallback(\n        async (event: SyntheticEvent) => {\n            event.preventDefault();\n            event.stopPropagation();\n            sendAnalytics({\n                subcategory: viewLocation,\n                type: 'click',\n                subtype: 'create',\n                pagename: 'create-new',\n            });\n            const finishMeasure = perf.startMeasure('CreateProject');\n            setIsExecuting(true);\n            try {\n                const gradientID = (gradient ?? randomGradient)?.id;\n\n                if (!gradientID) {\n                    throw new Error('Missing gradient id');\n                }\n                const project = await projectContext.createProject({ name, gradientID });\n\n                handleEvent(\n                    new CreateSuccessEvent({\n                        project: {\n                            name: project.name,\n                            id: project.id,\n                        },\n                    }),\n                );\n\n                finishMeasure();\n                setProject?.(project);\n                sendAnalytics({\n                    subcategory: viewLocation,\n                    type: 'success',\n                    sequence: 'toast',\n                    subtype: 'create-new',\n                });\n\n                void sendAupAnalytics('create.success', {\n                    ui: { sequence: 'toast' },\n                });\n            } catch (e) {\n                if (isSAMError(e) && e.code === SAM.SAMErrorCode.CONFLICT) {\n                    setIsExecuting(false);\n                    addDuplicate(name);\n                } else {\n                    handleEvent(new CreateFailureEvent({ project: { name } }));\n                    sendAnalytics({\n                        subcategory: viewLocation,\n                        type: 'error',\n                        sequence: 'toast',\n                        subtype: 'create-new',\n                        error: e as Error,\n                    });\n\n                    void sendAupAnalytics('create.error', {\n                        error: {\n                            code: (e as Error).name,\n                            description: (e as Error).message,\n                        },\n                        ui: { sequence: 'toast' },\n                    });\n                }\n            }\n        },\n        [\n            sendAnalytics,\n            sendAupAnalytics,\n            viewLocation,\n            perf,\n            handleEvent,\n            setProject,\n            name,\n            gradient,\n            randomGradient,\n            projectContext,\n            addDuplicate,\n        ],\n    );\n\n    const { onKeyDown } = useEnterKeySubmit({ handleSubmit, submitDisabled });\n\n    if (isExecuting) {\n        return (\n            <IllustratedMessage\n                style={{ flex: 1 }}\n                heading={messages.creating({ name })}\n                illustration={<Wait size=\"L\" />}\n                data-testid=\"loading-state\"\n            />\n        );\n    }\n\n    const handleCancel = () => {\n        handleEvent(new CreateCancelEvent());\n        sendAnalytics({\n            subcategory: viewLocation,\n            type: 'click',\n            subtype: 'cancel',\n            pagename: 'create-new',\n        });\n    };\n\n    const FooterButtons = (\n        <>\n            {!!showStepCounter && (\n                <div data-testid=\"create-project-step-counter\" className={styles.stepCounter}>\n                    <FormattedMessage\n                        id=\"@ace/projects:createSequence.stepCounter\"\n                        values={{ current: 1, total: 2 }}\n                        defaultMessage=\"Step {current, number} of {total, number}\"\n                    />\n                </div>\n            )}\n            <ButtonGroup\n                orientation=\"horizontal\"\n                className={styles.footerButtons}\n                size={buttonSize}\n                data-testid=\"create-project-button-group\"\n            >\n                <Button\n                    type=\"button\"\n                    variant=\"secondary\"\n                    onClick={handleCancel}\n                    className={styles.wizardButton}\n                    data-testid=\"create-project-cancel-button\"\n                >\n                    <FormattedMessage id=\"@ace/projects:button.cancel\" defaultMessage=\"Cancel\" />\n                </Button>\n\n                <PermissionDeniedContextualHelp\n                    showContextualHelper={isPermissionReady && !canCreateProjects}\n                >\n                    <Button\n                        type=\"submit\"\n                        variant=\"cta\"\n                        size={buttonSize}\n                        disabled={submitDisabled}\n                        className={styles.wizardButton}\n                        data-testid=\"create-project-create-button\"\n                    >\n                        <FormattedMessage\n                            id=\"@ace/projects:button.create\"\n                            defaultMessage=\"Create\"\n                        />\n                    </Button>\n                </PermissionDeniedContextualHelp>\n            </ButtonGroup>\n        </>\n    );\n\n    const footer = <div className={styles.footer}>{FooterButtons}</div>;\n\n    const gradientPickerProps: ComponentProps<typeof GradientPicker> & {\n        'data-testid': string;\n    } = {\n        iconsOnly: true,\n        alignRight: true,\n        'data-testid': 'create-project-gradient-picker',\n        disabled: !canCreateProjects || isExecuting,\n        value: currentGradient,\n        fitContent: true,\n        onChange: (g) => {\n            setGradient(() => g);\n        },\n    };\n\n    const gradientPicker = <GradientPicker {...gradientPickerProps} />;\n\n    const mobileGradientPicker = (\n        <GradientPicker {...gradientPickerProps} iconsOnly={false} fitContent={false} />\n    );\n\n    const textfieldProps: ComponentProps<typeof Textfield> & {\n        'data-testid': string;\n        'aria-label': string;\n    } = {\n        autoFocus: true,\n        'data-testid': 'create-project-content-textfield',\n        type: 'text',\n        disabled: (isPermissionReady && !canCreateProjects) || isExecuting,\n        'aria-label': messages.nameHeading,\n        placeholder: messages.inputPlaceholder,\n        value: name,\n        onChange,\n        onKeyDown,\n        style: { width: '100%' } as CSSProperties,\n    };\n\n    const textfield = <Textfield {...textfieldProps} />;\n\n    const mobileTextfield = (\n        <Textfield\n            {...textfieldProps}\n            // eslint-disable-next-line jsx-a11y/no-autofocus -- TODO: Consider not using autoFocus\n            autoFocus={false}\n            style={\n                {\n                    width: '100%',\n                    boxSizing: 'border-box',\n                    padding: '0rem 1.25rem 0rem 1.25rem',\n                } as CSSProperties\n            }\n        />\n    );\n\n    const textfieldWithGradient = (\n        <div\n            className={styles.textFieldWithGradient}\n            data-testid=\"create-project-textfield-wrapper\"\n        >\n            {textfield}\n            {gradientPicker}\n        </div>\n    );\n\n    const textfieldWithoutGradient = (\n        <div\n            className={styles.textFieldWithoutGradient}\n            data-testid=\"create-project-textfield-wrapper\"\n        >\n            {textfield}\n        </div>\n    );\n\n    const textFieldWithOptionalGradient = requireGradient\n        ? textfieldWithGradient\n        : textfieldWithoutGradient;\n\n    const formProps = {\n        onSubmit: handleSubmit,\n        'data-testid': 'create-project-content',\n    };\n\n    const helpTextNode = (\n        <HelpText data-testid=\"helper-text\" variant={error ? 'negative' : 'neutral'}>\n            {helpText}\n        </HelpText>\n    );\n\n    switch (branding) {\n        case 'express':\n            return (\n                <form\n                    className={classnames(styles.express, {\n                        [styles.mobile]: isMobile,\n                    })}\n                    {...formProps}\n                >\n                    <div className={styles.body}>\n                        <ContentHeaderExpress step=\"createStep\" />\n                        {requireGradient && (\n                            <div className={styles.badgePreview}>\n                                <ProjectBadge name={name} gradient={currentGradient} size=\"XXL\" />\n                                {isMobile ? (\n                                    <div\n                                        id=\"container\"\n                                        style={{ alignSelf: 'end', padding: '1rem 1rem 0rem 1rem' }}\n                                    >\n                                        {mobileGradientPicker}\n                                    </div>\n                                ) : null}\n                            </div>\n                        )}\n                        {isMobile ? mobileTextfield : textFieldWithOptionalGradient}\n                        {helpTextNode}\n                    </div>\n                    {isMobile ? (\n                        <div className={styles.mobileFooter}>\n                            <Rule data-testid=\"create-project-rule-mobile\" variant=\"small\" />\n                            <div className={styles.buttonGroup}>{FooterButtons}</div>\n                        </div>\n                    ) : (\n                        footer\n                    )}\n                </form>\n            );\n        case 'spectrum':\n            return (\n                <form\n                    className={classnames(styles.spectrum, { [styles.mobile]: isMobile })}\n                    {...formProps}\n                >\n                    <div className={styles.body}>\n                        <ContentHeaderSpectrum step=\"createStep\" />\n                        {currentGradient ? (\n                            <div className={styles.badgePreview}>\n                                <ProjectBadge name={name} gradient={currentGradient} size=\"L\" />\n                            </div>\n                        ) : null}\n                        {textfieldWithoutGradient}\n                        {helpTextNode}\n                    </div>\n                    {isMobile ? (\n                        <div className={styles.mobileFooter}>\n                            {scale === 'large' && (\n                                // In large scale, the ShareSheet at the invite step uses a\n                                // compact layout with a divider above the buttons, which we\n                                // need to match here.\n                                <Rule data-testid=\"create-project-rule-mobile\" variant=\"small\" />\n                            )}\n                            <div\n                                className={classnames(styles.buttonGroup, {\n                                    [styles.withDivider]: scale === 'large',\n                                })}\n                            >\n                                {FooterButtons}\n                            </div>\n                        </div>\n                    ) : (\n                        footer\n                    )}\n                </form>\n            );\n        case 'admin-console':\n            return (\n                <form className={styles.adminConsole} {...formProps}>\n                    <div className={styles.body}>\n                        <ContentHeaderAdminConsole />\n                        {requireGradient && (\n                            <div className={styles.badgePreview}>\n                                <ProjectBadge name={name} gradient={currentGradient} size=\"L50\" />\n                            </div>\n                        )}\n                        {textFieldWithOptionalGradient}\n                        {helpTextNode}\n                    </div>\n                    {footer}\n                </form>\n            );\n        default:\n            return null;\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\ntype WizardCreateDoneEventDetail =\n    | {\n          type: 'create-cancel';\n      }\n    | {\n          type: 'create-failure';\n          project: {\n              name: string;\n          };\n      };\n\ntype WizardInviteDoneEventDetail =\n    | {\n          type: 'invite-success';\n          successCount: number;\n          project: {\n              id: string;\n              name: string;\n          };\n      }\n    | {\n          type: 'invite-success-partial';\n          successCount: number;\n          failureCount: number;\n          project: {\n              id: string;\n              name: string;\n          };\n      }\n    | {\n          type: 'invite-failure';\n          project: {\n              id: string;\n              name: string;\n          };\n      }\n    | {\n          type: 'invite-skip';\n          project: {\n              id: string;\n              name: string;\n          };\n      };\n\ntype WizardDoneEventDetail = WizardCreateDoneEventDetail | WizardInviteDoneEventDetail;\n\nexport class WizardDoneEvent extends CustomEvent<WizardDoneEventDetail> {\n    static readonly EVENT_NAME = 'done';\n\n    constructor(detail: WizardDoneEventDetail) {\n        super(WizardDoneEvent.EVENT_NAME, { bubbles: true, composed: true, detail });\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport React, { useCallback } from 'react';\n\nimport type { ProjectViewLocations } from '../../../utils/ingest';\nimport ProjectCreate from '../../ProjectCreate';\nimport {\n    CreateFailureEvent,\n    CreateCancelEvent,\n} from '../../ProjectCreate/events/ProjectCreateEvent';\nimport { WizardDoneEvent } from '../events/ProjectCreationWizardEvent';\nimport useBranding from '../useBranding';\n\nexport interface CreateStepContentProps {\n    hideGradientPicker?: boolean;\n    onEvent: (event: CustomEvent) => void;\n    setProject: (project: SAM.Project) => void;\n    viewLocation: ProjectViewLocations;\n}\n\nexport default function CreateStepContent({\n    onEvent,\n    setProject,\n    viewLocation,\n    hideGradientPicker,\n}: CreateStepContentProps) {\n    /**\n     * Translate the ProjectCreate events into WizardDoneEvent events\n     */\n    const handleEvent = useCallback(\n        (event: CustomEvent) => {\n            if (event instanceof CreateCancelEvent) {\n                onEvent(new WizardDoneEvent({ type: 'create-cancel' }));\n            } else if (event instanceof CreateFailureEvent) {\n                onEvent(new WizardDoneEvent({ type: 'create-failure', ...event.detail }));\n            } else {\n                onEvent(event);\n            }\n        },\n        [onEvent],\n    );\n\n    return (\n        <ProjectCreate\n            data-testid=\"project-creation-wizard-create-step\"\n            branding={useBranding()}\n            onEvent={handleEvent}\n            setProject={setProject}\n            viewLocation={viewLocation}\n            hideGradientPicker={hideGradientPicker}\n            showStepCounter\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\n\nimport type { BaseProps } from '../../ShareBaseDialog';\nimport { ShareProjectBaseDialog } from '../../ShareBaseDialog';\n\ninterface IWizardData {\n    enabled: boolean;\n    // Optional number to display in the wizard for \"Step x of y\"\n    currentStep?: number;\n    // Optional number to display in the wizard for \"Step x of y\"\n    totalSteps?: number;\n    // Optional boolean to display Admin Console's Folder info box\n    showFolderInfoBox?: boolean;\n}\n\nconst WIZARD_DATA = JSON.stringify({\n    enabled: true,\n    currentStep: 2,\n    totalSteps: 2,\n    showFolderInfoBox: false,\n} as IWizardData);\n\n/**\n * For sharesheet content that serves the invite step of ProjectCreationWizard\n */\nconst ShareProjectWizardDialog = ({\n    minHeight = '420px',\n    minWidth = '330px',\n    ...rest\n}: BaseProps) => {\n    return (\n        <div\n            // Parent container must have defined dimensions and in inline styling (CCX-16106)\n            style={{\n                width: '100%',\n                height: '100%',\n                minHeight,\n                minWidth,\n                maxHeight: 'unset',\n            }}\n        >\n            <ShareProjectBaseDialog\n                wizarddata={WIZARD_DATA}\n                sendmessagerequestevent\n                // Sharesheet does not expose a way to set autofocus on the invite input to\n                // clients but we can get around that by disabling the link access footer which\n                // take autofocus from input since the wizard doesn't show the link access footer.\n                disablelinkaccess\n                {...rest}\n            />\n        </div>\n    );\n};\n\nexport default ShareProjectWizardDialog;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { useHostConfig, useBreakpoint } from '@csc/common';\nimport classNames from 'classnames';\nimport React, { useCallback } from 'react';\n\nimport styles from './InviteToProjectContent.module.css';\nimport { useProjectSharingAnalytics } from '../../../hooks/useAnalytics';\nimport type { IInviteResponse } from '../../../interfaces/ShareSheetInterface';\nimport type { ProjectViewLocations } from '../../../utils/ingest';\nimport { ContentHeaderExpress, ContentHeaderSpectrum } from '../../ProjectCreate/Header';\nimport ShareProjectWizardDialog from '../ShareProjectWizardDialog/ShareProjectWizardDialog';\nimport { WizardDoneEvent } from '../events/ProjectCreationWizardEvent';\nimport useBranding from '../useBranding';\n\ninterface Props {\n    project: SAM.Project;\n    onEvent: (event: CustomEvent) => void;\n    viewLocation: ProjectViewLocations;\n}\n\nexport default function Content({ project, onEvent, viewLocation }: Props) {\n    const isMobile = useBreakpoint().isSmallBreakpoint;\n    const { scale } = useHostConfig();\n    const sendAnalytics = useProjectSharingAnalytics();\n    const branding = useBranding();\n    const { id, name } = project;\n\n    // Only used to intercept sharesheet analytics events for Projects UI analytics\n    const onIngestEvent = useCallback(\n        (event: CustomEvent) => {\n            sendAnalytics(event, viewLocation);\n        },\n        [sendAnalytics, viewLocation],\n    );\n\n    const onInviteFulfilled = useCallback(\n        (event: Event) => {\n            const { recipients = [] } = (event as CustomEvent).detail as IInviteResponse;\n            const successCount = recipients.filter(({ statusCode }) => statusCode === 201).length;\n            if (successCount === recipients.length) {\n                onEvent(\n                    new WizardDoneEvent({\n                        type: 'invite-success',\n                        successCount,\n                        project: { id, name },\n                    }),\n                );\n            } else {\n                const failureCount = recipients.length - successCount;\n                onEvent(\n                    new WizardDoneEvent({\n                        type: 'invite-success-partial',\n                        successCount,\n                        failureCount,\n                        project: { id, name },\n                    }),\n                );\n            }\n        },\n        [id, name, onEvent],\n    );\n\n    const onInviteRejected = useCallback(() => {\n        onEvent(new WizardDoneEvent({ type: 'invite-failure', project: { id, name } }));\n    }, [id, name, onEvent]);\n\n    const onSkip = useCallback(() => {\n        onEvent(new WizardDoneEvent({ type: 'invite-skip', project: { id, name } }));\n    }, [id, name, onEvent]);\n\n    const shareSheetProps = {\n        project,\n        onInviteFulfilled,\n        onInviteRejected,\n        onSkip,\n        onIngestEvent,\n    };\n\n    switch (branding) {\n        case 'express':\n            return (\n                <div\n                    className={classNames(styles.express, {\n                        [styles.mobile]: isMobile,\n                    })}\n                >\n                    <ContentHeaderExpress step=\"inviteStep\" />\n                    <div className={styles.sharesheet}>\n                        <ShareProjectWizardDialog\n                            {...shareSheetProps}\n                            hideheader\n                            minHeight={isMobile ? '100%' : '420px'}\n                            minWidth={isMobile ? '100%' : '330px'}\n                            messageConfigLineHeight={isMobile ? 3 : 6}\n                        />\n                    </div>\n                </div>\n            );\n        case 'spectrum': {\n            const content = (\n                <>\n                    <ContentHeaderSpectrum step=\"inviteStep\" />\n                    <div\n                        className={classNames(styles.sharesheetSpectrum, {\n                            [styles.mobile]: isMobile,\n                            [styles.large]: scale === 'large',\n                        })}\n                    >\n                        <ShareProjectWizardDialog\n                            {...shareSheetProps}\n                            hideheader\n                            messageConfigLineHeight={3}\n                            minHeight=\"100%\"\n                            minWidth=\"100%\"\n                        />\n                    </div>\n                </>\n            );\n\n            return isMobile ? (\n                <div className={classNames(styles.spectrum, styles.mobile)}>{content}</div>\n            ) : (\n                content\n            );\n        }\n        case 'admin-console':\n            return <ShareProjectWizardDialog {...shareSheetProps} />;\n        default:\n            return null;\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport classNames from 'classnames';\nimport type { ReactElement } from 'react';\nimport React from 'react';\n\nimport styles from '../style.module.css';\n\nexport default function Sidebar({\n    step,\n    heading,\n    description,\n    illustrationElement,\n    'data-testid': dataTestId,\n}: {\n    step: 'createStep' | 'inviteStep';\n    heading: ReactElement;\n    description: ReactElement;\n    illustrationElement: ReactElement;\n    'data-testid'?: string;\n}) {\n    return (\n        <div\n            data-testid={dataTestId}\n            className={classNames(styles.sidebar, styles.adminConsole, styles[step])}\n        >\n            <div className={styles.illustration}>{illustrationElement}</div>\n            <div className={styles.info}>\n                <h1 className={styles.heading}>{heading}</h1>\n                <p className={styles.description}>{description}</p>\n            </div>\n        </div>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Sidebar from '.';\nimport illustration1x from '../../assets/SidebarCreateSpectrum@1x.png';\nimport illustration2x from '../../assets/SidebarCreateSpectrum@2x.png';\nimport illustration3x from '../../assets/SidebarCreateSpectrum@3x.png';\n\nexport default function CreateProjectSidebarAdminConsole() {\n    return (\n        <Sidebar\n            data-testid=\"create-sidebar-admin-console\"\n            step=\"createStep\"\n            heading={\n                <FormattedMessage\n                    id=\"@ace/projects:createSequence.sidebar.heading.spectrum\"\n                    defaultMessage=\"Create a new project\"\n                />\n            }\n            description={\n                <FormattedMessage\n                    id=\"@ace/projects:createSequence.sidebar.description.spectrum\"\n                    defaultMessage=\"Set up a place where you and your collaborators can work and share files, brands, libraries and more.\"\n                />\n            }\n            illustrationElement={\n                // eslint-disable-next-line jsx-a11y/alt-text -- TODO: Add alt text\n                <img srcSet={`${illustration1x} 1x, ${illustration2x} 2x, ${illustration3x} 3x`} />\n            }\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Sidebar from '.';\nimport illustration1x from '../../assets/SidebarInviteSpectrum@1x.png';\nimport illustration2x from '../../assets/SidebarInviteSpectrum@2x.png';\nimport illustration3x from '../../assets/SidebarInviteSpectrum@3x.png';\n\nexport default function InviteToProjectSidebarAdminConsole({ name }: { name: string }) {\n    return (\n        <Sidebar\n            data-testid=\"invite-sidebar-admin-console\"\n            step=\"inviteStep\"\n            heading={\n                <FormattedMessage\n                    id=\"@ace/projects:inviteSequence.sidebar.heading.spectrum\"\n                    values={{ name }}\n                    defaultMessage=\"You have successfully created {name}\"\n                />\n            }\n            description={\n                <FormattedMessage\n                    id=\"@ace/projects:inviteSequence.sidebar.description.spectrum\"\n                    defaultMessage=\"Choose to invite people now or skip this step and invite them later.\"\n                />\n            }\n            illustrationElement={\n                // eslint-disable-next-line jsx-a11y/alt-text -- TODO: Add alt text\n                <img srcSet={`${illustration1x} 1x, ${illustration2x} 2x, ${illustration3x} 3x`} />\n            }\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useMobile } from '@csc/common';\nimport classnames from 'classnames';\nimport type { ReactElement } from 'react';\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { useFeatureFlagValue } from '../../../withProviders/useFeatureFlagValue';\nimport createProject1x from '../../assets/SidebarCreateExpress@1x.png';\nimport createProject2x from '../../assets/SidebarCreateExpress@2x.png';\nimport createProject3x from '../../assets/SidebarCreateExpress@3x.png';\nimport inviteToProject1x from '../../assets/SidebarInviteExpress@1x.png';\nimport inviteToProject2x from '../../assets/SidebarInviteExpress@2x.png';\nimport inviteToProject3x from '../../assets/SidebarInviteExpress@3x.png';\nimport styles from '../style.module.css';\n\ninterface Props {\n    heading?: ReactElement;\n    description: ReactElement;\n    illustrationElement: ReactElement;\n    'data-testid'?: string;\n}\n\nexport function Sidebar({\n    heading,\n    description,\n    illustrationElement,\n    'data-testid': dataTestId,\n}: Props) {\n    const isMobile = useMobile();\n\n    return (\n        <div\n            data-testid={dataTestId}\n            className={classnames(styles.sidebar, styles.express, {\n                [styles.mobile]: isMobile,\n            })}\n        >\n            <div className={styles.illustration}>{illustrationElement}</div>\n            <div className={styles.description}>\n                <div>{heading}</div>\n                <div>{description}</div>\n            </div>\n        </div>\n    );\n}\n\nexport function CreateProjectSidebarExpress() {\n    const schedulerInProjects = useFeatureFlagValue('schedulerInProjects');\n    return (\n        <Sidebar\n            data-testid=\"create-sidebar-express\"\n            description={\n                schedulerInProjects ? (\n                    <FormattedMessage\n                        id=\"@ace/projects:createSequence.sidebar.withCalendars.description.express\"\n                        defaultMessage=\"Set up a place where you and your team can share files, brands, libraries, shared calendars, and more.\"\n                    />\n                ) : (\n                    <FormattedMessage\n                        id=\"@ace/projects:createSequence.sidebar.description.express\"\n                        defaultMessage=\"Set up a place where you and your team can share files, brands, libraries, and more.\"\n                    />\n                )\n            }\n            illustrationElement={\n                // eslint-disable-next-line jsx-a11y/alt-text -- TODO: Add alt text\n                <img\n                    srcSet={`${createProject1x} 1x, ${createProject2x} 2x, ${createProject3x} 3x`}\n                />\n            }\n        />\n    );\n}\n\nexport function InviteToProjectSidebarExpress({ name }: { name: string }) {\n    return (\n        <Sidebar\n            data-testid=\"invite-sidebar-express\"\n            heading={\n                <FormattedMessage\n                    id=\"@ace/projects:inviteSequence.sidebar.heading.express\"\n                    defaultMessage=\"<strong>{name}</strong> has been created.\"\n                    values={{\n                        name,\n                        strong: (chunks) => <strong>{chunks}</strong>,\n                    }}\n                />\n            }\n            description={\n                <FormattedMessage\n                    id=\"@ace/projects:inviteSequence.sidebar.description.express\"\n                    defaultMessage=\"Enter the names or email addresses of people you want to invite to the project.\"\n                />\n            }\n            illustrationElement={\n                // eslint-disable-next-line jsx-a11y/alt-text -- TODO: Add alt text\n                <img\n                    srcSet={`${inviteToProject1x} 1x, ${inviteToProject2x} 2x, ${inviteToProject3x} 3x`}\n                />\n            }\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { AssetBrowser } from '@ccx-public/component-types';\nimport { useBreakpoint, useHostConfig, useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport React, { useState, useRef, useCallback } from 'react';\n\nimport CreateStepContent from './Content/CreateProjectContentWrapper';\nimport InviteStepContent from './Content/InviteToProjectContent';\nimport CreateProjectSidebarAdminConsole from './Sidebar/AdminConsole/CreateProjectSidebarAdminConsole';\nimport InviteToProjectSidebarAdminConsole from './Sidebar/AdminConsole/InviteToProjectSidebarAdminConsole';\nimport { CreateProjectSidebarExpress, InviteToProjectSidebarExpress } from './Sidebar/Express';\nimport { WizardDoneEvent } from './events/ProjectCreationWizardEvent';\nimport styles from './style.module.css';\nimport type { CreationWorkflowType } from './useBranding';\nimport { BrandingContext } from './useBranding';\nimport useMessages from './useMessages';\nimport useShareSheetLoader from '../../hooks/useShareSheetLoader';\nimport { ProjectViewLocations } from '../../utils/ingest';\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\nexport interface Props {\n    branding?: CreationWorkflowType;\n    viewLocation?: ProjectViewLocations;\n    hideGradientPicker?: boolean;\n}\n\nexport default function ProjectCreationWizard({\n    branding: specifiedBranding,\n    viewLocation = ProjectViewLocations.ProjectCreationWizard,\n    hideGradientPicker,\n}: Props) {\n    const { closeModal, showToast, dispatchEvent } = useHostConfig();\n    // Using breakpoint-based mobile detection for this modal because Express overloads the `mobile` attribute to render the editor sidebar\n    // which would make this modal display incorrectly\n    const isMobile = useBreakpoint().isSmallBreakpoint;\n    const [project, setProject] = useState<SAM.Project | null>(null);\n    const { themeIsExpress } = useTheme();\n    const branding = specifiedBranding\n        ? specifiedBranding\n        : themeIsExpress\n          ? 'express'\n          : 'spectrum';\n    const messages = useMessages(branding);\n\n    const containerRef = useRef<HTMLDivElement>(null);\n\n    const proceedToInviteStep = !!project;\n\n    useShareSheetLoader();\n\n    const onEvent = useCallback(\n        (event: CustomEvent) => {\n            if (event instanceof WizardDoneEvent) {\n                const type = event.detail.type;\n                switch (type) {\n                    case 'invite-success':\n                        showToast({\n                            content: messages.inviteFulfilledAll({\n                                count: event.detail.successCount,\n                                name: event.detail.project.name,\n                            }),\n                            variant: 'positive',\n                        });\n                        break;\n                    case 'invite-success-partial':\n                    case 'invite-failure':\n                        showToast({\n                            content: messages.inviteFailed,\n                            variant: 'negative',\n                        });\n                        break;\n                    case 'create-cancel':\n                    case 'create-failure':\n                    case 'invite-skip':\n                        break;\n                    default:\n                        if (type) {\n                            // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- Needed to handle unknown event types\n                            console.warn(`Invalid wizard event type value: ${type}`);\n                        }\n                        break;\n                }\n            }\n\n            // After everything is done, emit a 'navigate' event to the newly created project and 'close' event to close the modal (`closeModal` is for host (e.g. Express) who provides `showModal` only)\n            if (event instanceof WizardDoneEvent) {\n                if (project?.id) {\n                    dispatchEvent(\n                        new NavigationEvent({\n                            name: AssetBrowser.ContentViewType.Project,\n                            params: {\n                                projectId: project.id,\n                                isNewProject: true,\n                                assetId: undefined,\n                            },\n                        }),\n                    );\n                    closeModal({ type: AssetBrowser.ShowModalResultType.Success });\n                } else {\n                    closeModal({ type: AssetBrowser.ShowModalResultType.Cancel });\n                }\n            }\n\n            dispatchEvent(event);\n        },\n        [dispatchEvent, showToast, messages, project, closeModal],\n    );\n\n    const content = proceedToInviteStep ? (\n        <InviteStepContent\n            data-testid=\"project-creation-wizard-invite-step\"\n            onEvent={onEvent}\n            project={project}\n            viewLocation={viewLocation}\n        />\n    ) : (\n        <CreateStepContent\n            onEvent={onEvent}\n            setProject={setProject}\n            viewLocation={viewLocation}\n            hideGradientPicker={hideGradientPicker}\n        />\n    );\n\n    const sharedProps = {\n        ref: containerRef,\n        'data-testid': 'project-creation-wizard',\n    };\n\n    switch (branding) {\n        case 'express':\n            return (\n                <BrandingContext.Provider value={branding}>\n                    <div\n                        {...sharedProps}\n                        className={classnames(styles.express, {\n                            [styles.mobile]: isMobile,\n                        })}\n                    >\n                        {isMobile ? null : (\n                            <div className={styles.sidebar}>\n                                {proceedToInviteStep ? (\n                                    <InviteToProjectSidebarExpress name={project.name} />\n                                ) : (\n                                    <CreateProjectSidebarExpress />\n                                )}\n                            </div>\n                        )}\n                        <div className={styles.content}>{content}</div>\n                    </div>\n                </BrandingContext.Provider>\n            );\n        case 'spectrum':\n            return (\n                <BrandingContext.Provider value={branding}>\n                    <div\n                        {...sharedProps}\n                        className={classnames(styles.spectrum, { [styles.mobile]: isMobile })}\n                    >\n                        {content}\n                    </div>\n                </BrandingContext.Provider>\n            );\n        case 'admin-console':\n            return (\n                <BrandingContext.Provider value={branding}>\n                    <div {...sharedProps} className={styles.adminConsole}>\n                        <div className={styles.sidebar}>\n                            {proceedToInviteStep ? (\n                                <InviteToProjectSidebarAdminConsole name={project.name} />\n                            ) : (\n                                <CreateProjectSidebarAdminConsole />\n                            )}\n                        </div>\n                        <div className={styles.content}>{content}</div>\n                    </div>\n                </BrandingContext.Provider>\n            );\n        default:\n            return null;\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport { useHostConfig } from '@csc/common';\nimport type { ReactElement } from 'react';\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { useProjectActionAnalytics } from '../../hooks/useAnalytics';\nimport { ProjectViewLocations } from '../../utils/ingest';\nimport ProjectCreationWizard from '../ProjectCreationWizard';\n\nexport type CreateProjectButtonProps = React.PropsWithChildren<{ className?: string }> & {\n    icon?: ReactElement;\n    quiet?: boolean;\n    selected?: boolean;\n    size?: 's' | 'm' | 'l' | 'xl';\n    treatment?: 'outline' | 'fill';\n    variant?: React.ComponentProps<typeof Button>['variant'];\n};\n\nfunction CreateProjectButton({ children, ...buttonProps }: CreateProjectButtonProps) {\n    const { showModal } = useHostConfig();\n    const sendAnalytics = useProjectActionAnalytics();\n    const ref = useRef<HTMLSlotElement>(null);\n\n    const handleClick = useCallback(() => {\n        sendAnalytics({\n            subcategory: ProjectViewLocations.Projects,\n            type: 'click',\n            subtype: 'create-new',\n            pagename: 'create-new',\n        });\n        const viewLocation = ProjectViewLocations.ProjectCreationWizard;\n        void showModal(\n            <ProjectCreationWizard\n                viewLocation={viewLocation}\n                data-testid=\"project-creation-wizard\"\n            />,\n            {\n                _expressUseCustomDesktopWidth: true,\n                onClose: () => {\n                    sendAnalytics({\n                        subcategory: viewLocation,\n                        type: 'click',\n                        subtype: 'close',\n                        pagename: 'create-new',\n                    });\n                },\n            },\n        );\n    }, [sendAnalytics, showModal]);\n\n    // NOTE: React synthetic events don't work with web components, so we manage the event listener manually.\n    useEffect(() => {\n        const { current } = ref;\n        if (current) {\n            current.addEventListener('click', handleClick);\n        }\n        return () => {\n            if (current) {\n                current.removeEventListener('click', handleClick);\n            }\n        };\n    }, [handleClick]);\n\n    return (\n        <slot data-testid=\"slot-create-project-button\" ref={ref}>\n            <Button data-testid=\"create-project-button\" {...buttonProps}>\n                {children}\n            </Button>\n        </slot>\n    );\n}\n\nexport default CreateProjectButton;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useTheme } from '@csc/common';\nimport IconProjectCreate from '@csc/ui/dist/src/Icons/ProjectCreate';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CreateProjectButton from '.';\nimport styles from './styles.module.css';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\n\nexport default observer(function ToolbarCreateProjectButton({ iconOnly = false }) {\n    const { themeIsExpress } = useTheme();\n    const { hideProjectActions } = useOrganizerConfig();\n\n    if (hideProjectActions) {\n        return null;\n    }\n\n    const message = themeIsExpress ? (\n        <FormattedMessage id=\"@ace/projects:button.newproject\" defaultMessage=\"New project\" />\n    ) : (\n        <FormattedMessage\n            id=\"@ace/projects:button.newproject.spectrum\"\n            defaultMessage=\"Create project\"\n        />\n    );\n\n    if (themeIsExpress) {\n        return (\n            <CreateProjectButton\n                treatment=\"outline\"\n                data-testid=\"create-project-button\"\n                variant=\"secondary\"\n                quiet\n                icon={<IconProjectCreate theme=\"express\" />}\n            >\n                {!iconOnly && message}\n            </CreateProjectButton>\n        );\n    }\n\n    return (\n        <div className={styles.spectrumToolbarCreateProjectButtonDivider}>\n            <CreateProjectButton\n                data-testid=\"create-project-button\"\n                icon={<IconProjectCreate theme=\"spectrum\" size=\"XS\" />}\n                variant=\"secondary\"\n            >\n                {!iconOnly && message}\n            </CreateProjectButton>\n        </div>\n    );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Icon from '@ccx-public/spectrum-wrapper/dist/Icon';\nimport React from 'react';\n\nexport default function IconBuildings(props: React.ComponentProps<typeof Icon>) {\n    return (\n        <Icon {...props}>\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n                <path d=\"m16.75,17h-1.75c-.41406,0-.75-.33594-.75-.75s.33594-.75.75-.75h1.75c.41406,0,.75049-.33691.75049-.75v-6.5c0-.41309-.33643-.75-.75049-.75h-1.75c-.41406,0-.75-.33594-.75-.75s.33594-.75.75-.75h1.75c1.24072,0,2.25049,1.00977,2.25049,2.25v6.5c0,1.24023-1.00977,2.25-2.25049,2.25Z\" />\n                <circle cx=\"9\" cy=\"7\" r=\"1\" />\n                <circle cx=\"5\" cy=\"10.00019\" r=\"1\" />\n                <circle cx=\"5\" cy=\"7\" r=\"1\" />\n                <path d=\"m10.75,3H3.25c-1.24072,0-2.25,1.00977-2.25,2.25v9.5c0,1.24023,1.00928,2.25,2.25,2.25h7.5c1.24072,0,2.25-1.00977,2.25-2.25V5.25c0-1.24023-1.00928-2.25-2.25-2.25Zm-2.50146,12.5h-2.49854v-1c0-.41309.33643-.75.75-.75h.99854c.41357,0,.75.33691.75.75v1Zm3.25146-.75c0,.41309-.33643.75-.75.75h-1.00146v-1c0-1.24023-1.00928-2.25-2.25-2.25h-.99854c-1.24072,0-2.25,1.00977-2.25,2.25v1h-1c-.41357,0-.75-.33691-.75-.75V5.25c0-.41309.33643-.75.75-.75h7.5c.41357,0,.75.33691.75.75v9.5Z\" />\n                <circle cx=\"9\" cy=\"10.00019\" r=\"1\" />\n                <circle cx=\"15\" cy=\"10.00019\" r=\"1\" />\n                <circle cx=\"15\" cy=\"13\" r=\"1\" />\n            </svg>\n        </Icon>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { AssetBrowser } from '@ccx-public/component-types';\nimport { SAM } from '@ccx-public/component-types';\nimport { useMobile } from '@csc/common';\nimport { useSAM } from '@csc/sam-utils';\nimport { useMemo } from 'react';\n\nimport useHostExtendedConfig from './useHostExtendedConfig';\nimport useOrganizerConfig from './useOrganizerConfig';\nimport useRefreshListOnResume from './useRefreshListOnResume';\n\nconst PROJECTS_PAGE_SIZE = 50;\nconst PROJECTS_MOBILE_PAGE_SIZE = 25;\n\nexport function getProjectView(view: AssetBrowser.ProjectsOrganizerViewFilter): SAM.ProjectViews {\n    switch (view) {\n        case 'all':\n            return SAM.ProjectViews.All;\n        case 'yours':\n            return SAM.ProjectViews.Yours;\n        case 'shared':\n            return SAM.ProjectViews.SWY;\n        case 'recent':\n            return SAM.ProjectViews.Recent;\n        default:\n            return SAM.ProjectViews.All;\n    }\n}\n\ninterface HookOptions {\n    sortBy?: AssetBrowser.ProjectsOrganizerSortBy | AssetBrowser.ProjectContentsSortBy;\n    sortDirection?: AssetBrowser.SortDir;\n    loadAll?: boolean;\n    projectView?: AssetBrowser.ProjectsOrganizerViewFilter;\n    searchQuery?: string;\n    limit?: number;\n    refreshTimeout?: number;\n    supportWorkfrontProjects?: boolean;\n}\n\nconst sortDirToIOrderDirection = (sortDir: AssetBrowser.SortDir): 'ascending' | 'descending' => {\n    return sortDir === 'asc' ? 'ascending' : 'descending';\n};\n\nconst sortByToProjectOrderField = (\n    sortBy: AssetBrowser.ProjectsOrganizerSortBy | AssetBrowser.ProjectContentsSortBy,\n): 'created' | 'name' => {\n    switch (sortBy) {\n        case 'createDate':\n            return 'created';\n        default:\n            return 'name';\n    }\n};\n\nexport default function useProjects({\n    sortBy = 'title',\n    sortDirection = 'asc',\n    loadAll = false,\n    projectView = 'recent',\n    searchQuery,\n    limit = PROJECTS_PAGE_SIZE,\n    refreshTimeout = -1, // default of -1 means never force a refresh\n    supportWorkfrontProjects = false,\n}: HookOptions = {}): SAM.IItemList<SAM.ProjectConfig> {\n    const { hostAssetContext, projectContext } = useSAM();\n\n    const list = useMemo(() => {\n        let list: SAM.IItemList<SAM.ProjectConfig>;\n\n        if (searchQuery) {\n            // Search API with `AdobeAssetGlobalSearchConfig` returns items as AdobeAssets,\n            // but since we are using it with the project context, `list.items` is actually\n            // an array of Projects and to avoid type casting everywhere, we can safely cast\n            // it as ProjectConfig here.\n            list = projectContext\n                .getProjectsSearchSource(searchQuery)\n                .getList(\n                    hostAssetContext.getUSSAdobeAssetOrder(\n                        sortDirToIOrderDirection(sortDirection),\n                        sortByToProjectOrderField(sortBy),\n                    ),\n                    undefined,\n                    {\n                        loadAllPages: loadAll,\n                        limit,\n                        refreshTimeout,\n                    },\n                ) as unknown as SAM.IItemList<SAM.ProjectConfig>;\n        } else if (projectView === 'recent') {\n            list = projectContext.projects().getList(\n                projectContext.getProjectOrder('descending', 'lastAccessed'),\n                projectContext.getProjectFilter({\n                    view: SAM.ProjectViews.Recent,\n                }),\n                {\n                    loadAllPages: loadAll,\n                    limit,\n                    refreshTimeout,\n                },\n            );\n        } else {\n            list = projectContext.projects().getList(\n                projectContext.getProjectOrder(\n                    sortDirToIOrderDirection(sortDirection),\n                    sortByToProjectOrderField(sortBy),\n                ),\n                projectContext.getProjectFilter({\n                    view: getProjectView(projectView),\n                    // @ts-expect-error - directorySubtypes is typed as only being accessible for\n                    // the admin view\n                    // https://github.com/aup-sdk-collab/component-core/blob/e21acbeffda27563f6283f23fe58cfd9685daf2e/packages/component-types/src/SAM/projects/ProjectFilter.ts#L35-L46\n                    directorySubtypes: supportWorkfrontProjects\n                        ? [\n                              SAM.ProjectDirectorySubtype.WF_PROJECT,\n                              SAM.ProjectDirectorySubtype.CC_PROJECTS,\n                          ]\n                        : [SAM.ProjectDirectorySubtype.CC_PROJECTS],\n                }),\n                {\n                    loadAllPages: loadAll,\n                    limit,\n                    refreshTimeout,\n                },\n            );\n        }\n\n        return list;\n    }, [\n        searchQuery,\n        projectView,\n        projectContext,\n        hostAssetContext,\n        sortDirection,\n        sortBy,\n        loadAll,\n        limit,\n        refreshTimeout,\n        supportWorkfrontProjects,\n    ]);\n\n    useRefreshListOnResume(list);\n\n    return list;\n}\n\nexport function useProjectsDefault() {\n    const isMobile = useMobile();\n    const { sortBy, sortDirection, projectView, searchQuery } = useOrganizerConfig();\n    const { supportWorkfrontProjects } = useHostExtendedConfig();\n\n    // TODO: [CCPROJ-12292][SAM-4548] Remove refreshTimeout once Project Listing has notifications for new projects\n    const refreshTimeout = 60000; // 1 minute\n\n    const projectsList = useProjects({\n        projectView,\n        sortBy,\n        sortDirection,\n        searchQuery,\n        limit: isMobile ? PROJECTS_MOBILE_PAGE_SIZE : PROJECTS_PAGE_SIZE,\n        refreshTimeout,\n        supportWorkfrontProjects,\n    });\n\n    return projectsList;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { AssetBrowser } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport GridView from '@ccx-public/spectrum-wrapper/dist/Icon/ClassicGridView';\nimport ListView from '@ccx-public/spectrum-wrapper/dist/Icon/ViewList';\nimport OverlayTrigger from '@ccx-public/spectrum-wrapper/dist/OverlayTrigger';\nimport Tooltip from '@ccx-public/spectrum-wrapper/dist/Tooltip';\nimport React from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\ntype Props = {\n    view?: AssetBrowser.ViewMode;\n    onViewChange?: (view: AssetBrowser.ViewMode) => void;\n    disabled?: boolean;\n};\n\nexport default function DisplayTypeToggleButton({ view, onViewChange, disabled }: Props) {\n    const intl = useIntl();\n    const ListGridIcon = view === 'grid' ? GridView : ListView;\n    return (\n        <OverlayTrigger trigger={['hover']} placement=\"top\">\n            <Button\n                data-testid=\"projects-list-or-grid-button\"\n                aria-label={intl.formatMessage({\n                    id: '@ace/projects:projects.listOrGridButton.label',\n                    defaultMessage: 'View projects as Grid View or List View',\n                })}\n                variant=\"secondary\"\n                icon={<ListGridIcon size=\"XS\" />}\n                onClick={() => {\n                    onViewChange?.(view === 'grid' ? 'list' : 'grid');\n                }}\n                quiet\n                disabled={disabled}\n            />\n            <Tooltip>\n                <FormattedMessage\n                    id=\"@ace/projects:projects.listOrGridButton.tooltip\"\n                    defaultMessage=\"Grid or List view\"\n                />\n            </Tooltip>\n        </OverlayTrigger>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { AssetBrowser } from '@ccx-public/component-types';\nimport Select from '@ccx-public/spectrum-wrapper/dist/Select';\nimport { Tab, TabList } from '@ccx-public/spectrum-wrapper/dist/TabList';\nimport { useHostConfig, useTheme } from '@csc/common';\nimport IconAllFiles from '@csc/ui/dist/src/Icons/All';\nimport IconBusinessStorage from '@csc/ui/dist/src/Icons/Buildings';\nimport IconYourProjects from '@csc/ui/dist/src/Icons/User';\nimport IconSharedWithYou from '@csc/ui/dist/src/Icons/UserGroup';\nimport classNames from 'classnames';\nimport React, { useCallback, useState } from 'react';\nimport type { MessageDescriptor } from 'react-intl';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport { useProjectFilterAnalytics } from '../../hooks/useAnalytics';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\n\nexport type ProjectViewSwitcherVariant = 'tab' | 'picker';\nconst commonProjectViews: Array<AssetBrowser.ProjectsOrganizerViewFilter> = [\n    'all',\n    'yours',\n    'shared',\n];\nconst expressProjectViews: Array<AssetBrowser.ProjectsOrganizerViewFilter> = [\n    'all',\n    'yours',\n    'shared',\n    'recent',\n];\n\nconst Labels: Record<AssetBrowser.ProjectsOrganizerViewFilter, MessageDescriptor> = {\n    all: {\n        id: '@ace/projects:viewswitcher.all',\n        defaultMessage: 'All',\n    },\n    yours: {\n        id: '@ace/projects:viewswitcher.yourprojects',\n        defaultMessage: 'Your projects',\n    },\n    shared: {\n        id: '@ace/projects:viewswitcher.sharedwithyou',\n        defaultMessage: 'Shared with you',\n    },\n    recent: {\n        id: '@ace/projects:viewswitcher.recent',\n        defaultMessage: 'Recent',\n    },\n};\n\nconst iconMap: Record<AssetBrowser.ProjectsOrganizerViewFilter, React.JSX.Element | undefined> = {\n    all: <IconAllFiles />,\n    yours: <IconYourProjects />,\n    shared: <IconSharedWithYou />,\n    recent: undefined,\n};\n\nconst BusinessStorageLabel: MessageDescriptor = {\n    id: '@ace/projects:viewswitcher.businessstorage',\n    defaultMessage: 'Business storage',\n};\n\nexport function ProjectSwitcherTabList({\n    className,\n    current,\n    disabled,\n    onChange,\n}: {\n    className?: string;\n    current: AssetBrowser.ProjectsOrganizerViewFilter;\n    disabled?: boolean;\n    onChange: (view: AssetBrowser.ProjectsOrganizerViewFilter) => void;\n}) {\n    const intl = useIntl();\n    const selectedIndex = commonProjectViews.indexOf(current);\n    const { themeIsExpress } = useTheme();\n    const { imsData } = useHostConfig();\n\n    const tabChanged = useCallback(\n        (index: number) => {\n            const location = themeIsExpress\n                ? expressProjectViews[index]\n                : commonProjectViews[index];\n            onChange(location);\n        },\n        [onChange, themeIsExpress],\n    );\n\n    return (\n        <TabList\n            data-testid=\"project-list-view-switcher\"\n            disabled={disabled}\n            className={className}\n            orientation=\"horizontal\"\n            selectedIndex={selectedIndex}\n            // eslint-disable-next-line jsx-a11y/no-autofocus -- TODO: Consider not using autoFocus\n            autoFocus\n            onChange={tabChanged}\n        >\n            <Tab label={intl.formatMessage(Labels.all)}>\n                <FormattedMessage id=\"@ace/projects:viewswitcher.all\" defaultMessage=\"All\" />\n            </Tab>\n            {imsData?.account_type === 'type1' ? (\n                <Tab label={intl.formatMessage(Labels.yours)}>\n                    <FormattedMessage\n                        id=\"@ace/projects:viewswitcher.yourprojects\"\n                        defaultMessage=\"Your projects\"\n                    />\n                </Tab>\n            ) : (\n                <Tab label={intl.formatMessage(BusinessStorageLabel)}>\n                    <FormattedMessage\n                        id=\"@ace/projects:viewswitcher.businessstorage\"\n                        defaultMessage=\"Business storage\"\n                    />\n                </Tab>\n            )}\n            <Tab label={intl.formatMessage(Labels.shared)}>\n                <FormattedMessage\n                    id=\"@ace/projects:viewswitcher.sharedwithyou\"\n                    defaultMessage=\"Shared with you\"\n                />\n            </Tab>\n            {themeIsExpress && (\n                <Tab label={intl.formatMessage(Labels.recent)}>\n                    <FormattedMessage\n                        id=\"@ace/projects:viewswitcher.recent\"\n                        defaultMessage=\"Recent\"\n                    />\n                </Tab>\n            )}\n        </TabList>\n    );\n}\n\nexport function ProjectViewSwitcherButton({\n    className,\n    current,\n    disabled,\n    onChange,\n}: {\n    className?: string;\n    current: AssetBrowser.ProjectsOrganizerViewFilter;\n    disabled?: boolean;\n    onChange: (value: AssetBrowser.ProjectsOrganizerViewFilter) => void;\n}) {\n    const intl = useIntl();\n    const sendAnalytics = useProjectFilterAnalytics();\n    const { themeIsExpress } = useTheme();\n    const [open, setOpen] = useState(false);\n    const projectViews: AssetBrowser.ProjectsOrganizerViewFilter[] = themeIsExpress\n        ? expressProjectViews\n        : commonProjectViews;\n\n    const handleClick = (value: AssetBrowser.ProjectsOrganizerViewFilter) => {\n        onChange(value);\n        setOpen(false);\n    };\n\n    const { imsData } = useHostConfig();\n\n    return (\n        <Select\n            data-testid=\"project-list-view-switcher\"\n            disabled={disabled}\n            className={className}\n            open={open ? true : undefined}\n            onChange={(e) => {\n                handleClick(e as AssetBrowser.ProjectsOrganizerViewFilter);\n            }}\n            onOpen={() => {\n                sendAnalytics(\n                    {\n                        subcategory: 'Projects',\n                        subtype: 'filter',\n                        type: 'click',\n                    },\n                    current,\n                );\n            }}\n            placeholder={intl.formatMessage({\n                id: '@ace/projects:viewswitcher.selectview.placeholder',\n                defaultMessage: 'Select a Project View',\n            })}\n            defaultValue={current}\n            value={current}\n            renderItem={({ label }) => {\n                return (\n                    <span\n                        // NOTE: using an inline style here is a workaround for Express\n                        style={{\n                            whiteSpace: 'nowrap',\n                        }}\n                    >\n                        {label}\n                    </span>\n                );\n            }}\n            options={projectViews.map((value) => {\n                let icon = iconMap[value];\n                let label = intl.formatMessage(Labels[value]);\n\n                if (value === 'yours' && imsData?.account_type !== 'type1') {\n                    icon = <IconBusinessStorage />;\n                    label = intl.formatMessage(BusinessStorageLabel);\n                }\n\n                // Icons are not required in Express.\n                if (themeIsExpress) {\n                    icon = undefined;\n                }\n\n                return {\n                    icon,\n                    value,\n                    label,\n                };\n            })}\n        />\n    );\n}\n\nexport default function ProjectViewSwitcher({\n    className,\n    current,\n    disabled,\n    onChange,\n    variant,\n}: {\n    className?: string;\n    current: AssetBrowser.ProjectsOrganizerViewFilter;\n    disabled?: boolean;\n    onChange: (value: AssetBrowser.ProjectsOrganizerViewFilter) => void;\n    variant?: ProjectViewSwitcherVariant;\n}) {\n    const { themeIsExpress } = useTheme();\n    const sendAnalytics = useProjectFilterAnalytics();\n    const { searchQuery } = useOrganizerConfig();\n\n    // Hide this component until search api supports view filtering\n    if (searchQuery) {\n        return null;\n    }\n\n    const change = (value: AssetBrowser.ProjectsOrganizerViewFilter) => {\n        if (value === current) {\n            return;\n        }\n\n        onChange(value);\n        sendAnalytics(\n            {\n                subcategory: 'Projects',\n                subtype: 'filter',\n                type: 'change',\n            },\n            value,\n        );\n    };\n\n    if (variant === 'tab') {\n        return (\n            <ProjectSwitcherTabList\n                disabled={disabled}\n                className={className}\n                current={current}\n                onChange={change}\n            />\n        );\n    }\n\n    return (\n        <ProjectViewSwitcherButton\n            className={classNames(className, styles.projectViewSwitcher, {\n                [styles.expressPicker]: themeIsExpress,\n            })}\n            disabled={disabled}\n            current={current}\n            onChange={change}\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Search from '@ccx-public/spectrum-wrapper/dist/Search';\nimport { useHostConfig } from '@csc/common';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { useProjectOrganizerSearchTriggerAnalytics } from '../../hooks/useAnalytics';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\nexport default function ProjectsSearch({ className }: { className?: string }) {\n    const { enableSearch, searchQuery } = useOrganizerConfig();\n    const sendAnalytics = useProjectOrganizerSearchTriggerAnalytics();\n    const { dispatchEvent } = useHostConfig();\n    const intl = useIntl();\n\n    if (!enableSearch) {\n        return null;\n    }\n\n    return (\n        <Search\n            data-testid=\"project-list-search-field\"\n            value={searchQuery ?? ''}\n            placeholder={intl.formatMessage({\n                id: '@ace/projects:searchProjects.placeholder',\n                defaultMessage: 'Search projects',\n            })}\n            className={className}\n            onChange={(value) => {\n                if (value === '') {\n                    dispatchEvent(\n                        new NavigationEvent({\n                            name: 'projectsSearch',\n                            params: {\n                                searchQuery: value,\n                            },\n                        }),\n                    );\n                }\n            }}\n            onSubmit={(value, event) => {\n                event?.preventDefault();\n                sendAnalytics(value);\n                dispatchEvent(\n                    new NavigationEvent({\n                        name: 'projectsSearch',\n                        params: {\n                            searchQuery: value,\n                        },\n                    }),\n                );\n            }}\n        />\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser } from '@ccx-public/component-types';\nimport DropdownButton from '@ccx-public/spectrum-wrapper/dist/DropdownButton';\nimport SortOrderDown from '@ccx-public/spectrum-wrapper/dist/Icon/SortOrderDown';\nimport SortOrderUp from '@ccx-public/spectrum-wrapper/dist/Icon/SortOrderUp';\nimport { MenuDivider, MenuGroup, MenuItem } from '@ccx-public/spectrum-wrapper/dist/Menu';\nimport OverlayTrigger from '@ccx-public/spectrum-wrapper/dist/OverlayTrigger';\nimport Tooltip from '@ccx-public/spectrum-wrapper/dist/Tooltip';\nimport { useHostConfig, useMobile, useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport React, { useCallback, useMemo } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport styles from './style.module.css';\nimport { useProjectSortAnalytics } from '../../hooks/useAnalytics';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\n// Dates should be \"reversed\" in this scenario\n// because descending sorts most recent on top to oldest at the bottom\nfunction isReverseSelected(\n    sortBy: AssetBrowser.ProjectsOrganizerSortBy | AssetBrowser.ProjectContentsSortBy | undefined,\n    sortDirection: AssetBrowser.SortDir | undefined,\n) {\n    if (sortBy === 'createDate') {\n        return sortDirection === 'asc';\n    }\n\n    return sortDirection === 'desc';\n}\n\nexport default function SortButton({ disabled }: { disabled?: boolean }) {\n    const { themeIsSpectrum, themeIsExpress } = useTheme();\n    const intl = useIntl();\n    const sendAnalytics = useProjectSortAnalytics();\n    const { dispatchEvent } = useHostConfig();\n    const isMobile = useMobile();\n    const { sortBy, sortDirection } = useOrganizerConfig();\n\n    const sortOptions = useMemo(\n        () => ({\n            name: {\n                label: intl.formatMessage({\n                    id: '@ace/projects:projects.sortby.name',\n                    defaultMessage: 'Name',\n                }),\n                value: 'title',\n            },\n            created: {\n                label: themeIsSpectrum\n                    ? intl.formatMessage({\n                          id: '@ace/projects:spectrum.projects.sortby.created',\n                          defaultMessage: 'Date created',\n                      })\n                    : intl.formatMessage({\n                          id: '@ace/projects:express.projects.sortby.created',\n                          defaultMessage: 'Created',\n                      }),\n                value: 'createDate',\n            },\n            reverse: {\n                label: intl.formatMessage({\n                    id: '@ace/projects:projects.sortdirection.reverse',\n                    defaultMessage: 'Reverse order',\n                }),\n                value: 'reverse',\n            },\n        }),\n        [intl, themeIsSpectrum],\n    );\n\n    const reverseSelected = useMemo(\n        () => isReverseSelected(sortBy, sortDirection),\n        [sortBy, sortDirection],\n    );\n\n    function sendClickEventAnalytics() {\n        let sortType: string = sortBy;\n        if (sortType === 'title') {\n            sortType = 'name';\n        }\n\n        sendAnalytics(\n            {\n                subcategory: 'Projects',\n                subtype: 'sort',\n                type: 'click',\n            },\n            sortType,\n        );\n    }\n\n    const SortIcon = sortDirection === 'asc' ? SortOrderUp : SortOrderDown;\n    const ReverseSortIcon = sortDirection === 'asc' ? SortOrderDown : SortOrderUp;\n\n    const onSelect = useCallback(\n        (e: string) => {\n            if (e === sortBy) {\n                // avoid dispatching an event or sending analytics when selecting the existing sort\n                return;\n            }\n\n            let updatedSortBy = sortBy;\n            let updatedSortDirection = sortDirection;\n\n            switch (e) {\n                case sortOptions.name.value:\n                    updatedSortBy = 'title';\n                    updatedSortDirection = 'asc';\n                    break;\n                case sortOptions.created.value:\n                    updatedSortBy = 'createDate';\n                    updatedSortDirection = 'desc';\n                    break;\n                case sortOptions.reverse.value:\n                    updatedSortDirection = sortDirection === 'asc' ? 'desc' : 'asc';\n                    break;\n                default:\n                    break;\n            }\n\n            let sortType: string = updatedSortBy;\n            if (sortType === 'title') {\n                sortType = 'name';\n            }\n            sendAnalytics(\n                {\n                    subcategory: 'Projects',\n                    subtype: 'sort',\n                    type: 'change',\n                },\n                sortType,\n            );\n            dispatchEvent(\n                new NavigationEvent({\n                    name: AssetBrowser.ContentViewType.Projects,\n                    params: {\n                        sortBy: updatedSortBy,\n                        sortDir: updatedSortDirection,\n                        // @deprecated -- use sortDir instead\n                        // @ts-expect-error -- kept for backward compatibility\n                        sortDirection: updatedSortDirection,\n                    },\n                }),\n            );\n        },\n        [sortBy, sortDirection, dispatchEvent, sendAnalytics, sortOptions],\n    );\n\n    const dropDownMenu = (\n        <DropdownButton\n            onClick={sendClickEventAnalytics}\n            data-testid=\"projects-sort-button\"\n            icon={\n                <SortIcon\n                    aria-label={intl.formatMessage({\n                        id: '@ace/projects:projects.sortLabel',\n                        defaultMessage: 'Sort',\n                    })}\n                />\n            }\n            disabled={disabled}\n            quiet\n            alignRight\n            onSelect={onSelect}\n            className={classnames(styles.dropdownButton, {\n                [styles.spectrum]: themeIsSpectrum,\n            })}\n        >\n            <MenuGroup\n                selects=\"single\"\n                header={\n                    themeIsExpress\n                        ? intl.formatMessage({\n                              id: '@ace/projects:projects.sortby',\n                              defaultMessage: 'Sort by',\n                          })\n                        : undefined\n                }\n            >\n                <MenuItem\n                    className={styles.sortMenuItem}\n                    selected={sortBy === 'createDate'}\n                    data-testid=\"projects-sort-by-created\"\n                    value={sortOptions.created.value}\n                >\n                    {sortOptions.created.label}\n                </MenuItem>\n                <MenuItem\n                    className={styles.sortMenuItem}\n                    selected={sortBy === 'title'}\n                    value={sortOptions.name.value}\n                    data-testid=\"projects-sort-by-name\"\n                >\n                    {sortOptions.name.label}\n                </MenuItem>\n            </MenuGroup>\n            <MenuDivider />\n            <MenuGroup selects=\"single\">\n                <MenuItem\n                    className={styles.sortMenuItem}\n                    icon={\n                        themeIsExpress ? (\n                            <ReverseSortIcon size=\"S\" data-testid=\"reverse-sort-icon\" />\n                        ) : undefined\n                    }\n                    selected={reverseSelected}\n                    data-testid=\"projects-sort-reverse-order\"\n                    value={sortOptions.reverse.value}\n                >\n                    {sortOptions.reverse.label}\n                </MenuItem>\n            </MenuGroup>\n        </DropdownButton>\n    );\n\n    const dropDownMenuWithTooltip = (\n        <OverlayTrigger trigger=\"hover\" placement=\"top\">\n            {dropDownMenu}\n            <Tooltip slot=\"hover-content\" data-testid=\"projects-sort-button-tooltip\">\n                <FormattedMessage id=\"@ace/projects:projects.sortLabel\" defaultMessage=\"Sort\" />\n            </Tooltip>\n        </OverlayTrigger>\n    );\n\n    return isMobile ? dropDownMenu : dropDownMenuWithTooltip;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM, AssetBrowser } from '@ccx-public/component-types';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport { useHostConfig, useMobile, useTheme } from '@csc/common';\nimport { observer } from 'mobx-react';\nimport React, { useMemo } from 'react';\n\nimport styles from './style.module.css';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\nimport { useProjectsDefault } from '../../hooks/useProjects';\nimport ToolbarCreateProjectButton from '../CreateProjectButton/ToolbarCreateProjectButton';\nimport DisplayTypeToggleButton from '../DisplayTypeToggleButton';\nimport ProjectViewSwitcher from '../ProjectViewSwitcher';\nimport ProjectsSearch from '../ProjectsSearch';\nimport SortButton from '../SortButton';\nimport withOrganizerConfig from '../withOrganizerConfig';\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\ntype Props = {\n    style?: React.CSSProperties;\n    variant?: 'inline' | 'compact' | 'search-only';\n};\n\nconst ProjectsToolbar = observer(function ProjectsToolbar({ variant = 'inline' }: Props) {\n    const { view, hideProjectActions, enableSearch, projectView } = useOrganizerConfig();\n    const { dispatchEvent } = useHostConfig();\n    const { themeIsExpress } = useTheme();\n    const isMobile = useMobile();\n\n    // The toolbar, which disables some actions on an empty list, and the organizer, responsible for\n    // displaying the list, share a common hook. Given SAM's proficiency in managing request queues\n    // and caching, and since the two components render together, it's a safe assumption that a\n    // single fetch operation retrieves the projects list for shared use across both components.\n    const projectsList = useProjectsDefault();\n    const isProjectsListEmpty = projectsList.items.length === 0;\n\n    const showListGridToggle = !(isMobile && themeIsExpress);\n\n    const disableViewSwitcher = useMemo(() => {\n        return (\n            projectView === 'all' &&\n            isProjectsListEmpty &&\n            projectsList.status === SAM.AssetListStatus.ReadyFullyLoaded\n        );\n    }, [projectView, isProjectsListEmpty, projectsList.status]);\n\n    const sortAndDisplayTypeToggleButtonGroup = (\n        <div className={styles.sortAndToggleButtons}>\n            <SortButton disabled={isProjectsListEmpty || projectView === 'recent'} />\n            {showListGridToggle && (\n                <DisplayTypeToggleButton\n                    data-testid=\"project-list-display-type-toggle-button\"\n                    view={view === 'grid' ? 'list' : 'grid'}\n                    onViewChange={() => {\n                        dispatchEvent(\n                            new NavigationEvent({\n                                name: AssetBrowser.ContentViewType.Projects,\n                                params: {\n                                    viewMode: view === 'grid' ? 'list' : 'grid',\n                                    // @ts-expect-error -- kept for backward compatibility\n                                    // @deprecated -- use viewMode instead\n                                    view: view === 'grid' ? 'list' : 'grid',\n                                },\n                            }),\n                        );\n                    }}\n                    disabled={isProjectsListEmpty}\n                />\n            )}\n        </div>\n    );\n\n    switch (variant) {\n        case 'compact':\n            return (\n                <div data-testid=\"project-list-header-toolbar\" className={styles.compact}>\n                    <ProjectsSearch className={styles.fullWidth} />\n                    <ProjectViewSwitcher\n                        data-testid=\"project-list-view-switcher\"\n                        disabled={disableViewSwitcher}\n                        current={projectView}\n                        onChange={(v) => {\n                            dispatchEvent(\n                                new NavigationEvent({\n                                    name: AssetBrowser.ContentViewType.Projects,\n                                    params: {\n                                        projectView: v,\n                                    },\n                                }),\n                            );\n                        }}\n                        variant=\"picker\"\n                        className={styles.projectViewPicker}\n                    />\n                    {sortAndDisplayTypeToggleButtonGroup}\n                    {themeIsExpress && <ToolbarCreateProjectButton iconOnly />}\n                </div>\n            );\n        case 'search-only':\n            return (\n                <div data-testid=\"project-list-header-toolbar\">\n                    <ProjectsSearch className={styles.fullWidth} />\n                </div>\n            );\n        case 'inline':\n        default: {\n            const viewSwitcher = (\n                <ProjectViewSwitcher\n                    data-testid=\"project-list-view-switcher\"\n                    disabled={disableViewSwitcher}\n                    current={projectView}\n                    onChange={(v) => {\n                        dispatchEvent(\n                            new NavigationEvent({\n                                name: AssetBrowser.ContentViewType.Projects,\n                                params: {\n                                    projectView: v,\n                                },\n                            }),\n                        );\n                    }}\n                    variant=\"picker\"\n                    className={styles.projectViewPicker}\n                />\n            );\n            if (themeIsExpress) {\n                const expressRule = (\n                    <Rule vertical variant=\"small\" className={styles.expressDivider} />\n                );\n                return (\n                    <div data-testid=\"project-list-header-toolbar\" className={styles.inlineExpress}>\n                        <ProjectsSearch />\n                        {enableSearch && expressRule}\n                        <ToolbarCreateProjectButton />\n                        {!hideProjectActions && expressRule}\n                        {viewSwitcher}\n                        {sortAndDisplayTypeToggleButtonGroup}\n                    </div>\n                );\n            } else {\n                return (\n                    <div data-testid=\"project-list-header-toolbar\" className={styles.inline}>\n                        {viewSwitcher}\n                        {sortAndDisplayTypeToggleButtonGroup}\n                    </div>\n                );\n            }\n        }\n    }\n});\n\nexport default withOrganizerConfig(ProjectsToolbar);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport { useTheme } from '@csc/common';\nimport { useDirectCollaborators } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport ProjectContext from '../../contexts/ProjectContext';\nimport { CollaboratorCount } from '../Collaborators';\nimport WorkfrontBadge from '../WorkfrontBadge';\n\n/**\n * Displays the collaborators for a project in the project list. Designed to be used to populate the 'Sharing' column.\n * For WorkFront projects, it only displays a Workfront badge.\n */\nconst CollaboratorColumn = observer(function CollaboratorColumn({\n    project,\n}: {\n    project: SAM.Project;\n}) {\n    const collaborators = useDirectCollaborators(project);\n    const { themeIsSpectrum } = useTheme();\n    const isWFProject = project.directorySubtype === SAM.ProjectDirectorySubtype.WF_PROJECT;\n\n    return isWFProject ? (\n        <WorkfrontBadge />\n    ) : (\n        <ProjectContext.Provider value={project}>\n            <CollaboratorCount\n                collaborators={collaborators}\n                iconSize={themeIsSpectrum ? 'XS' : 'S'}\n            />\n        </ProjectContext.Provider>\n    );\n});\n\nexport default CollaboratorColumn;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport { useHostConfig } from '@csc/common';\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\nexport default function NavigateToGlobalSearchWithQueryButton({\n    searchQuery,\n}: {\n    searchQuery: string;\n}) {\n    const { dispatchEvent } = useHostConfig();\n    return (\n        <Button\n            data-testid=\"navigate-to-global-search-with-query-button\"\n            size=\"m\"\n            variant=\"cta\"\n            onClick={() =>\n                dispatchEvent(\n                    new NavigationEvent({ name: 'globalSearch', params: { searchQuery } }),\n                )\n            }\n        >\n            <FormattedMessage\n                id=\"@ace/projects:button.searchAllAssets\"\n                defaultMessage=\"Search all assets\"\n            />\n        </Button>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useMobile, useTheme } from '@csc/common';\nimport IconProjectCreate from '@csc/ui/dist/src/Icons/ProjectCreate';\nimport classnames from 'classnames';\nimport type { ReactElement } from 'react';\nimport React, { forwardRef } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport EmptyProjectIllustrationSpectrum from './EmptyProjectIllustrationSpectrum';\nimport emptyStateIllustrationExpress from './assets/ExpressEmptyStateProjects.png';\nimport emptyStateISearchViewllustrationExpress from './assets/NoSearchResultsIcon.svg';\nimport styles from './styles.module.css';\nimport useOrganizerConfig from '../../../hooks/useOrganizerConfig';\nimport type { OrganizerConfig } from '../../../organizerConfig';\nimport CreateProjectButton from '../../CreateProjectButton';\nimport IllustratedMessage from '../../IllustratedMessage';\nimport NavigateToGlobalSearchWithQueryButton from '../../NavigateToGlobalSearchWithQueryButton';\nimport { useFeatureFlagValue } from '../../withProviders/useFeatureFlagValue';\n\nexport default forwardRef(function ProjectListEmptyState(\n    {\n        searchQuery,\n    }: {\n        searchQuery?: string;\n    },\n    ref: React.ForwardedRef<HTMLDivElement>,\n) {\n    const organizer = useOrganizerConfig();\n    const isMobile = useMobile();\n    const intl = useIntl();\n    const { themeIsSpectrum, themeIsExpress } = useTheme();\n    const schedulerInProjects = useFeatureFlagValue('schedulerInProjects');\n    let slotName = 'projects-list-empty-state';\n\n    let imageSrc: React.ReactNode,\n        heading: string,\n        description: string,\n        secondaryDescription: ReactElement | null = null,\n        button: ReactElement | null = null;\n\n    if (searchQuery) {\n        slotName = 'projects-list-empty-state-search';\n        imageSrc = emptyStateISearchViewllustrationExpress;\n        heading = intl.formatMessage({\n            id: '@ace/projects:projects.emptyState.search.heading',\n            defaultMessage: 'Sorry, we didn’t find anything!',\n        });\n        description = intl.formatMessage({\n            id: '@ace/projects:projects.emptyState.search.description',\n            defaultMessage: 'No results found',\n        });\n        secondaryDescription = (\n            <div className={styles.tip}>\n                <FormattedMessage\n                    id=\"@ace/projects:projects.emptyState.search.tip\"\n                    defaultMessage=\"Tip: Please check your spelling or refine your keywords\"\n                />\n            </div>\n        );\n        button = <NavigateToGlobalSearchWithQueryButton searchQuery={searchQuery} />;\n    } else {\n        imageSrc = themeIsSpectrum ? (\n            <EmptyProjectIllustrationSpectrum className={styles.emptyProjectIllustration} />\n        ) : (\n            emptyStateIllustrationExpress\n        );\n        heading = getHeaderCopy(intl, organizer);\n        description = getDescriptionCopy(schedulerInProjects, intl, organizer);\n\n        if (!organizer.hideProjectActions && !isMobile) {\n            const buttonLabel = getButtonLabelCopy(themeIsExpress, intl, organizer);\n            button = (\n                <CreateProjectButton\n                    size=\"l\"\n                    variant={themeIsSpectrum ? 'primary' : 'cta'}\n                    treatment={themeIsSpectrum ? 'fill' : undefined}\n                    quiet={themeIsSpectrum}\n                    icon={<IconProjectCreate size=\"S\" />}\n                >\n                    {buttonLabel}\n                </CreateProjectButton>\n            );\n        }\n    }\n\n    return (\n        <slot name={slotName}>\n            <div\n                ref={ref}\n                className={classnames(styles.container, {\n                    [styles.mobile]: isMobile,\n                    [styles.express]: themeIsExpress,\n                    [styles.spectrum]: themeIsSpectrum,\n                    [styles.searchView]: !!searchQuery,\n                })}\n                data-testid=\"projects-list-empty-state\"\n            >\n                <IllustratedMessage\n                    heading={heading}\n                    description={description}\n                    imageSrc={imageSrc}\n                    data-testid=\"projects-list-empty-state-illustrated-message\"\n                >\n                    {imageSrc}\n                </IllustratedMessage>\n                {secondaryDescription}\n                {button && <div className={styles.button}>{button}</div>}\n            </div>\n        </slot>\n    );\n});\n\nfunction getButtonLabelCopy(\n    themeIsExpress: boolean,\n    intl: ReturnType<typeof useIntl>,\n    organizer: OrganizerConfig,\n): string {\n    switch (organizer.projectView) {\n        case 'yours':\n            return intl.formatMessage({\n                id: '@ace/projects:button.startAProject',\n                defaultMessage: 'Start a project',\n            });\n        case 'shared':\n            return intl.formatMessage({\n                id: '@ace/projects:button.startAProject',\n                defaultMessage: 'Start a project',\n            });\n        case 'all':\n        case 'recent':\n        default:\n            return themeIsExpress\n                ? intl.formatMessage({\n                      id: '@ace/projects:button.createNewProject',\n                      defaultMessage: 'Create new project',\n                  })\n                : intl.formatMessage({\n                      id: '@ace/projects:button.createNewProject.spectrum',\n                      defaultMessage: 'Create project',\n                  });\n    }\n}\n\nfunction getDescriptionCopy(\n    schedulerInProjects: boolean,\n    intl: ReturnType<typeof useIntl>,\n    organizer: OrganizerConfig,\n): string {\n    switch (organizer.projectView) {\n        case 'yours':\n            return intl.formatMessage({\n                id: '@ace/projects:projects.emptystate.description.yours',\n                defaultMessage:\n                    'Add files, brands, libraries, and more to a project, then effortlessly share it with your team.',\n            });\n        case 'shared':\n            return intl.formatMessage({\n                id: '@ace/projects:projects.emptystate.description.shared',\n                defaultMessage: 'Invite others to join your projects.',\n            });\n        case 'all':\n        case 'recent':\n        default:\n            return schedulerInProjects\n                ? intl.formatMessage({\n                      id: '@ace/projects:projects.emptystate.withCalendars.description.all',\n                      defaultMessage:\n                          'Keep files, brands, libraries, and shared calendars together in a project and share them with others for easy all-in-one access.',\n                  })\n                : intl.formatMessage({\n                      id: '@ace/projects:projects.emptystate.description.all',\n                      defaultMessage:\n                          'Keep files, brands, and libraries together in a project, and share them with others for easy, all-in-one access.',\n                  });\n    }\n}\n\nfunction getHeaderCopy(intl: ReturnType<typeof useIntl>, organizer: OrganizerConfig): string {\n    switch (organizer.projectView) {\n        case 'yours':\n            return intl.formatMessage({\n                id: '@ace/projects:projects.emptystate.heading.yours',\n                defaultMessage: 'Let’s start your first project',\n            });\n        case 'shared':\n            return intl.formatMessage({\n                id: '@ace/projects:projects.emptystate.heading.shared',\n                defaultMessage: 'You’re not a member of any projects yet',\n            });\n        case 'all':\n        case 'recent':\n        default:\n            return intl.formatMessage({\n                id: '@ace/projects:projects.emptystate.heading.all',\n                defaultMessage: 'Organize and share content in projects',\n            });\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\nimport { useIntl } from 'react-intl';\n\nimport errorStateIllustration from './error_state.svg';\nimport IllustratedMessage from '../../IllustratedMessage';\n\nexport default function ProjectListErrorState() {\n    const intl = useIntl();\n    return (\n        <div data-testid=\"projects-list-error-state\">\n            <IllustratedMessage\n                heading={intl.formatMessage({\n                    id: '@ace/projects:projects.errorstate.heading',\n                    defaultMessage: 'Couldn’t load Projects',\n                })}\n                description={intl.formatMessage({\n                    id: '@ace/projects:projects.errorstate.description',\n                    defaultMessage: 'Please try again.',\n                })}\n                imageSrc={errorStateIllustration}\n            />\n        </div>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport type { ICardSize, SelectionStore } from '@csc/collection-view';\nimport { GridItem } from '@csc/collection-view';\nimport { hasAny } from '@csc/common';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport { OrganizerConfigProvider } from '../../../../contexts/OrganizerConfigContext';\nimport ProjectContext from '../../../../contexts/ProjectContext';\nimport type { OrganizerConfig } from '../../../../organizerConfig';\nimport ProjectCard from '../../../ProjectCard/index';\nimport type BackedCollectionItem from '../../BackedCollectionItem';\n\nexport const PROJECT_CARD_SIZE: ICardSize = {\n    minTileWidth: 265,\n    maxTileWidth: 330,\n    tileHeight: 133,\n    infoHeight: 0,\n    rowMargin: 24,\n    columnMargin: 16,\n};\n\nexport const PROJECT_CARD_SIZE_MOBILE: ICardSize = {\n    ...PROJECT_CARD_SIZE,\n    minTileWidth: 120,\n    maxTileWidth: 164,\n    tileHeight: 164,\n};\n\nexport function getCardSize(mobile: boolean) {\n    return mobile ? PROJECT_CARD_SIZE_MOBILE : PROJECT_CARD_SIZE;\n}\n\ninterface Props {\n    element: BackedCollectionItem<SAM.AdobeAsset>;\n    project: SAM.Project;\n    organizerConfig: OrganizerConfig;\n    selectionStore: SelectionStore;\n    onIngestEvent: (item: SAM.AdobeAsset, type: string) => void;\n    loading?: boolean;\n}\n\nexport default class ProjectGridItem extends GridItem<Props> {\n    additionalClassNames() {\n        const { selectionStore, isSelected } = this.props;\n\n        return classnames(styles.projectGridItem, {\n            [styles.allBoxes]: hasAny(selectionStore.selectedElements),\n            [styles.projectGridItemLoading]: this.props.loading,\n            [styles.projectGridItemSelected]: isSelected,\n        });\n    }\n\n    fireIngestEvent(type: string) {\n        const { element, onIngestEvent } = this.props;\n        onIngestEvent(element.backingItem, type);\n    }\n\n    protected renderRendition(): React.JSX.Element {\n        const { project, tileWidth = 0 } = this.props;\n        return (\n            <OrganizerConfigProvider {...this.props.organizerConfig}>\n                <ProjectContext.Provider value={project}>\n                    <ProjectCard\n                        loading={this.props.loading}\n                        actionMenu={this.renderActionMenu()}\n                        variant={tileWidth < PROJECT_CARD_SIZE.minTileWidth ? 'compact' : 'full'}\n                    />\n                </ProjectContext.Provider>\n            </OrganizerConfigProvider>\n        );\n    }\n\n    protected renderTitle(): React.JSX.Element {\n        return <></>;\n    }\n\n    protected renderTitleAndMetadata(): React.JSX.Element {\n        return <></>; // Don't show anything outside of the card.\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useDirectCollaborators } from '@csc/sam-utils';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport React, { useContext } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport { CollaboratorCount } from '../Collaborators';\nimport LoadingPlaceholder from '../LoadingPlaceholder';\nimport TextOverflowEllipsis from '../TextOverflowEllipsis';\n\nexport interface Props {\n    loading?: boolean;\n    hideProjectMetadata?: boolean;\n}\n\nexport default observer(function ProjectListCard({ loading, hideProjectMetadata }: Props) {\n    const project = useContext(ProjectContext);\n\n    if (!project) {\n        throw new Error(`ProjectCard does not have a valid Project context`);\n    }\n\n    const collaborators = useDirectCollaborators(project);\n\n    return (\n        <div className={styles.listCard}>\n            <div\n                className={classnames(styles.title, {\n                    [styles.largerTitle]: !hideProjectMetadata,\n                })}\n                data-testid=\"name\"\n            >\n                <LoadingPlaceholder\n                    data-testid=\"loading-project-name\"\n                    loading={loading}\n                    className={styles.loadingTitle}\n                >\n                    <TextOverflowEllipsis>{project.name}</TextOverflowEllipsis>\n                </LoadingPlaceholder>\n            </div>\n            {!hideProjectMetadata && (\n                <div className={styles.metadata}>\n                    <LoadingPlaceholder\n                        data-testid=\"loading-project-created\"\n                        loading={loading}\n                        className={styles.loadingCreated}\n                    >\n                        {project.creator && (\n                            <span data-testid=\"creator\">\n                                <FormattedMessage\n                                    id=\"@ace/projects:projects.createdByName\"\n                                    defaultMessage=\"Created by {name}\"\n                                    values={{ name: project.creator.displayName }}\n                                />\n                            </span>\n                        )}\n                        {project.creator && !!collaborators.length && (\n                            <span className={styles.bullet} />\n                        )}\n                        <CollaboratorCount iconSize=\"XS\" collaborators={collaborators} />\n                    </LoadingPlaceholder>\n                </div>\n            )}\n        </div>\n    );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport ProjectBadge from '@csc/adobe-assets-view/dist/src/components/ProjectBadge/ProjectBadge';\nimport { ListItem } from '@csc/collection-view';\nimport { MobileContext } from '@csc/common';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport { OrganizerConfigProvider } from '../../../../contexts/OrganizerConfigContext';\nimport ProjectContext from '../../../../contexts/ProjectContext';\nimport type { OrganizerConfig } from '../../../../organizerConfig';\nimport BadgeLoader from '../../../BadgeLoader';\nimport LoadingPlaceholder from '../../../LoadingPlaceholder';\nimport ProjectListCard from '../../../ProjectListCard';\nimport TextOverflowEllipsis from '../../../TextOverflowEllipsis';\nimport type BackedCollectionItem from '../../BackedCollectionItem';\n\ninterface Props {\n    element: BackedCollectionItem<SAM.AdobeAsset>;\n    project: SAM.Project;\n    organizerConfig: OrganizerConfig;\n    onIngestEvent: (item: SAM.AdobeAsset, type: string) => void;\n    loading?: boolean;\n    hideProjectMetadata?: boolean;\n}\n\nconst ObservableBadge = observer(function BadgeContext(props: { project: SAM.Project }) {\n    return <ProjectBadge name={props.project.name} gradient={props.project.gradient} size=\"L\" />;\n});\n\nexport default class ProjectListItem extends ListItem<Props> {\n    static contextType = MobileContext;\n\n    get isMobile(): boolean {\n        return Boolean(this.context);\n    }\n\n    additionalClassNames() {\n        return classnames(styles.listItem, {\n            [styles.listCardItem]: this.isMobile,\n        });\n    }\n\n    fireIngestEvent(type: string) {\n        const { element, onIngestEvent } = this.props;\n        onIngestEvent(element.backingItem, type);\n    }\n\n    renderRendition(): React.JSX.Element {\n        return (\n            <BadgeLoader loading={this.props.loading}>\n                <ObservableBadge project={this.props.project} />\n            </BadgeLoader>\n        );\n    }\n\n    renderTitle(): React.JSX.Element {\n        const { project, hideProjectMetadata, loading } = this.props;\n\n        if (this.isMobile) {\n            return (\n                <OrganizerConfigProvider {...this.props.organizerConfig}>\n                    <ProjectContext.Provider value={project}>\n                        <ProjectListCard\n                            hideProjectMetadata={hideProjectMetadata}\n                            loading={loading}\n                        />\n                    </ProjectContext.Provider>\n                </OrganizerConfigProvider>\n            );\n        }\n\n        return (\n            <LoadingPlaceholder loading={this.props.loading} className={styles.loadingName}>\n                <TextOverflowEllipsis>{project.name}</TextOverflowEllipsis>\n            </LoadingPlaceholder>\n        );\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { ICollectionItem, ActionArgs, OperationStore } from '@csc/collection-view';\nimport { computed } from 'mobx';\n\nfunction splitBackedItems<T>(\n    items: Array<BackedCollectionItem<T>>,\n): [Array<T>, Array<ICollectionItem>] {\n    const backedItems = items.filter((i) => i.backingItem);\n    const unbackedItems = items.filter((i) => !i.backingItem);\n    return [backedItems.map((i) => i.backingItem), unbackedItems];\n}\n\n// Generates execute and isVisible functions that apply only when a single element is selected. Further usage-specific validation can be applied by passing appropriate valid() and exec() arguments.\nexport function singleAssetHandler<T>(\n    valid: (item: T) => boolean,\n    exec: (asset: T) => Promise<void>,\n): Pick<ActionArgs, 'isVisible' | 'execute'> {\n    const isVisible = (elements: ICollectionItem[] | undefined) => {\n        if (!elements) {\n            return false;\n        }\n        if (elements.length !== 1) {\n            return false;\n        }\n        const [backedItems, unbackedItems] = splitBackedItems<T>(\n            elements as Array<BackedCollectionItem<T>>,\n        );\n        if (backedItems.length !== 1 || unbackedItems.length !== 0) {\n            return false;\n        }\n        const item = backedItems[0];\n        if (!valid(item)) {\n            return false;\n        }\n        return true;\n    };\n\n    const execute = async (_store: OperationStore, items: Array<ICollectionItem>) => {\n        if (items.length !== 1) {\n            return;\n        }\n\n        const [backedItems, unbackedItems] = splitBackedItems<T>(\n            items as Array<BackedCollectionItem<T>>,\n        );\n        if (backedItems.length !== 1 || unbackedItems.length !== 0) {\n            return;\n        }\n        const item = backedItems[0];\n\n        if (!valid(item)) {\n            return;\n        }\n\n        await exec(item);\n    };\n\n    return {\n        isVisible,\n        execute,\n    };\n}\n\n// This is a duplicate of @csc/adobe-assets-view's BackedCollectionItem. We are maintaining a separate version while waiting for AAV to stabilize to avoid regressions in Express.\nexport default class BackedCollectionItem<T> implements ICollectionItem {\n    backingItem: T;\n    private mapper: (t: T) => ICollectionItem;\n\n    constructor(backingItem: T, mapper: (t: T) => ICollectionItem) {\n        this.backingItem = backingItem;\n        this.mapper = mapper;\n    }\n\n    @computed\n    get mappedItem(): ICollectionItem {\n        return this.mapper(this.backingItem);\n    }\n\n    get id() {\n        return this.mappedItem.id;\n    }\n\n    get title() {\n        return this.mappedItem.title;\n    }\n\n    get path() {\n        return this.mappedItem.path;\n    }\n\n    get fileExtension() {\n        return this.mappedItem.fileExtension;\n    }\n\n    get rendition() {\n        return this.mappedItem.rendition;\n    }\n\n    get type() {\n        return this.mappedItem.type;\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport type {\n    SelectionStore,\n    IGridItemPlaceholderProps,\n    IListItemPlaceholderProps,\n} from '@csc/collection-view';\nimport { Column as CDOColumn } from '@csc/collection-view';\nimport React from 'react';\n\nimport 'react-dom';\nimport ProjectGridItem from './ProjectGridItem';\nimport ProjectListItem from './ProjectListItem';\nimport type { OrganizerConfig } from '../../../organizerConfig';\nimport type BackedCollectionItem from '../BackedCollectionItem';\n\n// common props for project placeholder items\n// needed to satisfy the props required by the ProjectGridItem and ProjectListItem components\nconst commonProjectPlaceholderProps = {\n    project: {\n        name: '',\n        storageAssignee: {\n            displayName: '',\n            id: '',\n            type: 'user',\n        },\n        collaboratorArray: [],\n        hasPermission: () => false,\n    } as Partial<SAM.Project> as SAM.Project,\n    onIngestEvent: () => {},\n    selectionStore: {} as SelectionStore,\n    disabled: false,\n    isSelected: false,\n    ingestSubcategory: '',\n    onItemClickedHandler: () => {},\n    onActionButtonClick: () => {},\n    organizerConfig: {} as unknown as OrganizerConfig,\n    dragDisabled: true,\n};\n\nconst commonProjectElementPlaceholder = {\n    fileExtension: 'PROJECT',\n    title: '',\n    type: 'application/vnd.adobecloud.directory+json',\n};\n\nexport const projectGridItemPlaceholder = function ({\n    cardSize,\n    tileHeight,\n    tileWidth,\n    index,\n}: IGridItemPlaceholderProps) {\n    return (\n        <ProjectGridItem\n            cardSize={cardSize}\n            loading\n            element={\n                {\n                    ...commonProjectElementPlaceholder,\n                    id: `item-${index}-loading`,\n                } as unknown as BackedCollectionItem<SAM.AdobeAsset>\n            }\n            tileHeight={tileHeight}\n            tileWidth={tileWidth}\n            {...commonProjectPlaceholderProps}\n        />\n    );\n};\n\nexport const projectListItemPlaceholder = function ({ index }: IListItemPlaceholderProps) {\n    return (\n        <ProjectListItem\n            loading\n            element={\n                {\n                    ...commonProjectElementPlaceholder,\n                    id: `item-${index}-loading`,\n                } as unknown as BackedCollectionItem<SAM.AdobeAsset>\n            }\n            columns={[CDOColumn.Title]}\n            {...commonProjectPlaceholderProps}\n        />\n    );\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM, AssetBrowser } from '@ccx-public/component-types';\nimport { useSAMListPagination } from '@csc/adobe-assets-view';\nimport type BackedCollectionItem from '@csc/adobe-assets-view/dist/src/types/BackedCollectionItem';\nimport type {\n    ICollectionItem,\n    IListViewCustomColumn,\n    ListViewColumn,\n    IPaginationProps,\n    ISelectionStore,\n    ISelectionManager,\n} from '@csc/collection-view';\nimport {\n    CDOView,\n    ColumnType,\n    GridView,\n    ListView,\n    OperationStore,\n    ProcessingState,\n    SelectionStore,\n    UXSortBy,\n    UXSortDir,\n    Column as CDOColumn,\n    ViewMode as CDOViewMode,\n} from '@csc/collection-view';\nimport { useHostConfig, useMobile, SelectionChangeEvent } from '@csc/common';\nimport classNames from 'classnames';\nimport { observer } from 'mobx-react';\nimport React, { forwardRef, useCallback, useEffect, useMemo } from 'react';\nimport 'react-dom';\nimport { useIntl } from 'react-intl';\n\nimport { getCardSize } from './renditions/ProjectGridItem';\nimport type { ItemRenderer } from './renditions/index';\nimport { useItemRenderer } from './renditions/index';\nimport { projectGridItemPlaceholder, projectListItemPlaceholder } from './renditions/placeholders';\nimport themeVariables from './renditions/themeVariables.module.css';\nimport styles from './styles.module.css';\nimport useCDOProjectActions from './useCDOProjectActions';\nimport { themeToCDOTheme } from './utils/utils';\nimport {\n    useProjectOrganizerSearchResultItemClickAnalytics,\n    useProjectOrganizerClickAnalytics,\n} from '../../hooks/useAnalytics';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\nimport { ProjectViewLocations } from '../../utils/ingest';\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\ntype ItemConfig<T extends SAM.AdobeAsset> = SAM.IItemSourceConfig<T>;\n\nexport interface Column<T extends SAM.AdobeAsset = SAM.AdobeAsset> {\n    id: string;\n    label: string;\n    isSortDisabled: boolean;\n    render: (renderer: ItemRenderer<T>) => React.ReactChild;\n}\n\ninterface Props<TAsset extends SAM.AdobeAsset, TItemConfig extends ItemConfig<TAsset>> {\n    onItemClick(item: TItemConfig['type']): void;\n    onBeforeItemClicked?: (item: TItemConfig['type']) => boolean;\n    samList: SAM.IItemList<TItemConfig>;\n    className?: string;\n    viewMode: AssetBrowser.ViewMode;\n    columns: Column<TItemConfig['type']>[];\n    selectionDisabled?: boolean;\n    selectionManager?: ISelectionManager;\n    hideProjectMetadata?: boolean;\n    shouldRenderItemAsDisabled?: (item: BackedCollectionItem<SAM.AdobeAsset>) => Promise<boolean>;\n}\n\nconst CDO_FEATURE_FLAGS = {\n    focusManagementEnabled: true,\n    enableOnboarding: false,\n    enableCDOActionBar: false,\n    enableIconsWithActions: true,\n};\n\nfunction cdoSortBy(sortBy: AssetBrowser.SortBy): UXSortBy {\n    switch (sortBy) {\n        case 'createDate':\n            return UXSortBy.createDate;\n        case 'title':\n        default:\n            return UXSortBy.title;\n    }\n}\n\nfunction cdoSortDir(sortDir: AssetBrowser.SortDir): UXSortDir {\n    return UXSortDir[sortDir];\n}\n\nexport default observer(\n    forwardRef(function CDO<TAsset extends SAM.AdobeAsset, TItemConfig extends ItemConfig<TAsset>>(\n        {\n            selectionDisabled,\n            selectionManager,\n            samList,\n            shouldRenderItemAsDisabled,\n            onBeforeItemClicked,\n            hideProjectMetadata,\n            viewMode,\n            className,\n            columns,\n            // eslint-disable-next-line @typescript-eslint/unbound-method -- Required for passing method reference as prop\n            onItemClick,\n        }: Props<TAsset, TItemConfig>,\n        ref: React.ForwardedRef<HTMLDivElement>,\n    ) {\n        const intl = useIntl();\n        const { productId, spectrumTheme, theme, dispatchEvent, imsData } = useHostConfig();\n        const isMobile = useMobile();\n        const organizer = useOrganizerConfig();\n        const cdoTheme = themeToCDOTheme(theme);\n        const projectActions = useCDOProjectActions({\n            viewLocation: ProjectViewLocations.Projects,\n        });\n        const operationStore = useMemo(() => new OperationStore(), []);\n        const selectionStore = useMemo(() => new SelectionStore(), []);\n\n        const onSelectionChange = useCallback(\n            (e: ISelectionStore) => {\n                dispatchEvent(\n                    new SelectionChangeEvent({\n                        selection: e.selectedElements.map(\n                            (e: ICollectionItem) =>\n                                (e as BackedCollectionItem<SAM.AdobeAsset>).backingItem,\n                        ),\n                    }),\n                );\n            },\n            [dispatchEvent],\n        );\n        const sendAnalytics = useProjectOrganizerClickAnalytics();\n        const sendSearchAnalytics = useProjectOrganizerSearchResultItemClickAnalytics();\n\n        const onIngestEvent = useCallback(\n            (item: SAM.AdobeAsset, type: string) => {\n                switch (type) {\n                    case 'click': {\n                        // Skip analytics in selection mode to avoid interpreting selection clicks as navigational actions\n                        if (selectionManager) {\n                            break;\n                        }\n\n                        if (organizer.searchQuery) {\n                            const itemIndex = samList.items.findIndex((i) => i.id === item.id);\n                            sendSearchAnalytics({\n                                element: item,\n                                ui: organizer,\n                                userId: imsData.userId,\n                                rank: itemIndex + 1,\n                            });\n                        } else {\n                            sendAnalytics({ element: item, ui: organizer, userId: imsData.userId });\n                        }\n                        break;\n                    }\n                    default:\n                        break;\n                }\n            },\n            [\n                organizer,\n                samList.items,\n                sendSearchAnalytics,\n                sendAnalytics,\n                imsData.userId,\n                selectionManager,\n            ],\n        );\n\n        const { elements, getRenderer } = useItemRenderer<TAsset, TItemConfig>(\n            organizer,\n            samList,\n            selectionStore,\n            onIngestEvent,\n            hideProjectMetadata,\n        );\n\n        // We can't use built-in CDO column renderers (like ColumnType.Date) because\n        // they expect the old \"react-intl\" context, which is only provided by CDOProvider.\n        const listViewColumns: IListViewCustomColumn[] = columns.map((col) => ({\n            ...col,\n            uxSortColumn: col.id,\n            columnType: ColumnType.Default,\n            activeSortDirection: cdoSortDir(organizer.sortDirection),\n            isActiveSort: organizer.sortBy === col.id,\n            cellContentRender: (item: ICollectionItem) => col.render(getRenderer(item)),\n        }));\n\n        // Override label for Title column\n        // allows us to use our own intl context to translate the column heading\n        const overrideListColumns = useCallback(\n            (columns: ListViewColumn[]) => {\n                const nameIndex = columns.findIndex((col) => col === CDOColumn.Title);\n                if (nameIndex !== -1) {\n                    columns[nameIndex] = {\n                        label: intl.formatMessage({\n                            id: '@ace/projects:projects.column.name',\n                            defaultMessage: 'Name',\n                        }),\n                        predefinedColumn: CDOColumn.Title,\n                    } as ListViewColumn;\n                }\n                return columns;\n            },\n            [intl],\n        );\n\n        const { disableViewOnlyProjects } = organizer;\n\n        const extendedShouldRenderItemAsDisabled = useCallback(\n            async (element: BackedCollectionItem<SAM.AdobeAsset>) => {\n                return (\n                    (await shouldRenderItemAsDisabled?.(element)) ||\n                    (disableViewOnlyProjects &&\n                        !element.backingItem.hasPermission(SAM.Permission.Write))\n                );\n            },\n            [disableViewOnlyProjects, shouldRenderItemAsDisabled],\n        );\n\n        const isItemDisabled = useCallback((element: ICollectionItem) => {\n            const asset = (element as BackedCollectionItem<SAM.AdobeAsset>).backingItem;\n            return !asset.hasPermission(SAM.Permission.Write);\n        }, []);\n\n        useEffect(() => {\n            if (selectionDisabled) {\n                selectionStore.setSelectionBehavior({\n                    single: false,\n                    hideFileCheckbox: false,\n                    hideFolderCheckbox: false,\n                    shouldHideCheckbox: isItemDisabled,\n                });\n            } else {\n                selectionStore.setSelectionBehavior({\n                    single: true,\n                    hideFileCheckbox: false,\n                    hideFolderCheckbox: false,\n                    shouldHideCheckbox: isItemDisabled,\n                });\n            }\n        }, [selectionDisabled, selectionStore, isItemDisabled]);\n        const onSortSelected = useCallback(\n            (cdoSortBy: string) => {\n                let sortBy = organizer.sortBy;\n                let sortDirection =\n                    organizer.sortDirection === 'asc' ? UXSortDir.desc : UXSortDir.asc;\n                if (sortBy !== cdoSortBy) {\n                    sortBy = cdoSortBy === 'createDate' ? UXSortBy.createDate : UXSortBy.title;\n                    sortDirection = UXSortDir.asc;\n                }\n\n                dispatchEvent(\n                    new NavigationEvent({\n                        name: AssetBrowser.ContentViewType.Projects,\n                        params: {\n                            sortBy: sortBy === 'createDate' ? 'createDate' : 'title',\n                            sortDir: sortDirection,\n                            // @ts-expect-error -- kept for backward compatibility\n                            // @deprecated -- use sortDir instead\n                            sortDirection: sortDirection,\n                        },\n                    }),\n                );\n            },\n            [organizer.sortBy, organizer.sortDirection, dispatchEvent],\n        );\n\n        const samPaginationProps = useSAMListPagination({ samList: samList });\n        const pagination: IPaginationProps = {\n            ...samPaginationProps,\n            initialPlaceholderElements: 6,\n            renderGridItemPlaceholder: projectGridItemPlaceholder,\n            renderListItemPlaceholder: projectListItemPlaceholder,\n        };\n\n        return (\n            <div ref={ref} data-testid=\"cdo-projects-list\" className={styles.CDOContainer}>\n                <CDOView\n                    launchItems={(items: ICollectionItem[]) => {\n                        for (const item of items) {\n                            onItemClick(getRenderer(item).asset);\n                        }\n                    }}\n                    onBeforeItemClicked={onBeforeItemClicked}\n                    startOperation={() => operationStore}\n                    operationState={operationStore.assetOpState ?? ProcessingState.Idle}\n                    setOperationState={(state: unknown) => {\n                        // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- TODO: Improve state type\n                        // @ts-ignore\n                        operationStore.setAssetOpState(state);\n                    }}\n                    productId={productId}\n                    theme={cdoTheme}\n                    isFeatureFlagEnabled={(flag: string) => {\n                        if (flag === 'enableUnifiedSelectionUX') {\n                            // we only want to enable selection ux when we have a selection manager\n                            return selectionManager !== undefined;\n                        }\n                        return !!CDO_FEATURE_FLAGS[flag];\n                    }}\n                    className={classNames(\n                        `theme-${cdoTheme}`,\n                        themeVariables[spectrumTheme],\n                        styles.CDO,\n                        className,\n                        {\n                            [styles.express]: spectrumTheme === 'express',\n                            [styles.mobile]: isMobile,\n                            [styles.mobileListView]: isMobile && viewMode === 'list',\n                        },\n                    )}\n                    elements={elements}\n                    ingestSubcategory=\"Projects\" // TODO\n                    view={viewMode === 'list' ? CDOViewMode.List : CDOViewMode.Grid}\n                    activeSort={cdoSortBy(organizer.sortBy)}\n                    activeSortDirection={cdoSortDir(organizer.sortDirection)}\n                    selectionStore={selectionStore}\n                    selectionDisabled={selectionManager === undefined}\n                    selectionManager={selectionManager}\n                    onSortSelected={onSortSelected}\n                    actionMenuItems={projectActions}\n                    hideActionMenu={organizer.hideProjectActions}\n                    shouldRenderItemAsDisabled={extendedShouldRenderItemAsDisabled}\n                    onSelectionChange={selectionManager ? onSelectionChange : undefined}\n                    toastConfig={{\n                        message: '',\n                        variant: 'info',\n                    }}\n                    overrideListColumns={overrideListColumns}\n                    pagination={pagination}\n                >\n                    <GridView\n                        additionalChangeProps={[isMobile ? 'compact' : 'full']}\n                        isHeaderVisible={false}\n                        cardSize={getCardSize(isMobile)}\n                        sortOptions={[UXSortBy.title, UXSortBy.modifiedDate]}\n                        // TODO: CCXCD-14722 could make this unnecessary\n                        getPropsForItem={(item: ICollectionItem) => {\n                            return {\n                                disabled: isItemDisabled(item),\n                                shouldHideCheckbox: isItemDisabled,\n                            };\n                        }}\n                    >\n                        {(item: ICollectionItem) => getRenderer(item).getGridViewItem?.()}\n                    </GridView>\n                    <ListView\n                        columns={listViewColumns}\n                        isHeaderVisible={!isMobile}\n                        hideSelectAllCheckbox={false}\n                        // TODO: CCXCD-14722 could make this unnecessary\n                        getPropsForItem={(item: ICollectionItem) => {\n                            return {\n                                disabled: isItemDisabled(item),\n                                shouldHideCheckbox: isItemDisabled,\n                            };\n                        }}\n                    >\n                        {(item: ICollectionItem) => getRenderer(item).getListViewItem?.()}\n                    </ListView>\n                </CDOView>\n            </div>\n        );\n    }),\n);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { Themes } from '@csc/common';\nimport type HostConfig from '@csc/common/@types/HostConfig';\n\nexport function themeToCDOTheme(theme: HostConfig['theme']): Themes {\n    switch (theme) {\n        case 'darkest':\n            return Themes.darkest;\n        case 'dark':\n            return Themes.dark;\n        case 'lightest':\n            return Themes.lightest;\n        case 'light':\n        default:\n            return Themes.light;\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { Action } from '@csc/collection-view';\nimport { useTheme } from '@csc/common';\nimport { useMemo } from 'react';\n\nimport { singleAssetHandler } from './BackedCollectionItem';\nimport type { Options } from '../../hooks/useProjectActions';\nimport useProjectActions from '../../hooks/useProjectActions';\n\nexport default function useCDOProjectActions(options: Options) {\n    const actions = useProjectActions(options);\n    const { themeIsExpress } = useTheme();\n\n    return useMemo(() => {\n        return actions.map((action) => {\n            const { execute, icon, isVisible, label, value, groupName } = action;\n            return new Action({\n                icon,\n                label,\n                value,\n                groupName: themeIsExpress ? undefined : groupName,\n                ...singleAssetHandler(isVisible, execute),\n            });\n        });\n    }, [actions, themeIsExpress]);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport type { ICollectionItem, SelectionStore } from '@csc/collection-view';\nimport React from 'react';\n\nimport ProjectGridItem from './ProjectGridItem';\nimport ProjectListItem from './ProjectListItem';\nimport type { OrganizerConfig } from '../../../organizerConfig';\nimport BackedCollectionItem from '../BackedCollectionItem';\n\n/**\n * A data structure used to map a SAM asset to a CDO item,\n * along with the corresponding item renderers.\n */\nexport interface ItemRenderer<T extends SAM.AdobeAsset> {\n    asset: T;\n    item: ICollectionItem;\n    getGridViewItem?: () => React.JSX.Element;\n    getListViewItem?: () => React.JSX.Element;\n    hideProjectMetadata?: boolean;\n}\n\nexport function useItemRenderer<\n    TAsset extends SAM.AdobeAsset,\n    TItemConfig extends SAM.IItemSourceConfig<TAsset>,\n>(\n    organizerConfig: OrganizerConfig,\n    list: SAM.IItemList<TItemConfig>,\n    selectionStore: SelectionStore<ICollectionItem>,\n    onIngestEvent: (item: SAM.AdobeAsset, type: string) => void,\n    hideProjectMetadata?: boolean,\n) {\n    const renderers = list.items.map(<T extends SAM.AdobeAsset>(asset: T) =>\n        getItemRenderer(asset, selectionStore, onIngestEvent, organizerConfig, hideProjectMetadata),\n    );\n    const rendererMap = new Map<string, ItemRenderer<TAsset>>(renderers.map((r) => [r.item.id, r]));\n\n    return {\n        elements: renderers.map((r) => r.item),\n        getRenderer: (item: ICollectionItem) => {\n            const renderer = rendererMap.get(item.id);\n            if (!renderer) {\n                throw new Error('No renderer available for item id ' + item.id);\n            }\n            return renderer;\n        },\n    };\n}\n\nexport function getItemRenderer<T extends SAM.AdobeAsset>(\n    asset: T,\n    selectionStore: SelectionStore,\n    onIngestEvent: (item: SAM.AdobeAsset, type: string) => void,\n    organizerConfig?: OrganizerConfig,\n    hideProjectMetadata?: boolean,\n): ItemRenderer<T> {\n    let result: ItemRenderer<T>;\n\n    const item = new BackedCollectionItem(asset, (data) => ({\n        id: data.id,\n        title: data.name,\n        fileExtension: 'PROJECT',\n        type: 'application/vnd.adobecloud.directory+json',\n    }));\n\n    if (asset.isProject) {\n        const project = asset as unknown as SAM.Project;\n        result = {\n            asset,\n            item,\n            getGridViewItem: () => (\n                // @ts-expect-error - TODO: Add missing props or adjust types\n                <ProjectGridItem\n                    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- TODO: Handle undefined organizerConfig or adjust types\n                    organizerConfig={organizerConfig!}\n                    project={project}\n                    selectionStore={selectionStore}\n                    onIngestEvent={onIngestEvent}\n                    actionMenuTabIndex={0}\n                />\n            ),\n            getListViewItem: () => (\n                // @ts-expect-error - TODO: Add missing props or adjust types\n                <ProjectListItem\n                    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- TODO: Handle undefined organizerConfig or adjust types\n                    organizerConfig={organizerConfig!}\n                    project={project}\n                    onIngestEvent={onIngestEvent}\n                    actionMenuTabIndex={0}\n                    hideProjectMetadata={hideProjectMetadata}\n                />\n            ),\n        };\n    } else {\n        result = {\n            asset,\n            item,\n        };\n    }\n\n    return result;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport type BackedCollectionItem from '@csc/adobe-assets-view/dist/src/types/BackedCollectionItem';\nimport { selectUnit, SingleSelectionManager } from '@csc/collection-view';\nimport { useHostConfig, useMobile, useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport React, { useCallback, useRef, useEffect, useMemo } from 'react';\nimport type { IntlShape } from 'react-intl';\nimport { FormattedMessage, FormattedRelativeTime, useIntl } from 'react-intl';\n\n// NOTE: testing-library/render-result-naming-convention trips on \"Render\" in this name\nimport CollaboratorColumn from './CollaboratorColumn';\nimport ProjectListEmptyState from './EmptyState/index';\nimport ProjectListErrorState from './ErrorState/index';\nimport styles from './styles.module.css';\nimport {\n    useProjectListRenderAnalytics as useProjectListRAnalytics,\n    useProjectOrganizerSearchResultRenderAnalytics,\n} from '../../hooks/useAnalytics';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\nimport { useLoadPerformance } from '../../hooks/usePerformance';\nimport { useProjectsDefault } from '../../hooks/useProjects';\nimport type { OrganizerConfig } from '../../organizerConfig';\nimport type { Column } from '../CDO';\nimport CDO from '../CDO';\nimport TextOverflowEllipsis from '../TextOverflowEllipsis';\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\nexport interface ProjectListProps {\n    hideProjectMetadata?: boolean;\n    shouldRenderItemAsDisabled?: (item: BackedCollectionItem<SAM.AdobeAsset>) => Promise<boolean>;\n    singleSelectionMode?: boolean;\n}\n\nexport default observer(function ProjectList(props: ProjectListProps) {\n    const intl = useIntl();\n    const { dispatchEvent } = useHostConfig();\n    const { themeIsSpectrum } = useTheme();\n    const isMobile = useMobile();\n    const organizer = useOrganizerConfig();\n    const { sortBy, sortDirection, view, searchQuery, projectView } = organizer;\n    const projectsList = useProjectsDefault();\n    const sendAnalytics = useProjectListRAnalytics();\n    const sendSearchAnalytics = useProjectOrganizerSearchResultRenderAnalytics();\n    const listCount = projectsList.items.length;\n    const totalCount = projectsList.total;\n    const listDataLoaded =\n        projectsList.status === SAM.AssetListStatus.ReadyHasMorePages ||\n        projectsList.status === SAM.AssetListStatus.ReadyFullyLoaded;\n    const loaded = useLoadPerformance('ProjectList', projectView);\n    const cdoMounted = useRef(false);\n    const onCDOMount = useCallback(() => {\n        if (cdoMounted.current) {\n            return;\n        }\n\n        // don't mark as mounted until we have data\n        if (listDataLoaded) {\n            cdoMounted.current = true;\n        }\n    }, [listDataLoaded]);\n\n    const { singleSelectionMode } = props;\n\n    useEffect(() => {\n        if (cdoMounted.current && listDataLoaded) {\n            loaded();\n        }\n        // Need `projectView` because once the lists are fully fetched, their statuses\n        // are same when switching project views but we still need to send performance\n        // measurements on switching project views.\n    }, [loaded, listDataLoaded, organizer.projectView, cdoMounted]);\n\n    useEffect(() => {\n        // NOTE: remember to ensure this is mounted by a component!\n        if (cdoMounted.current && listDataLoaded && !searchQuery) {\n            sendAnalytics(listCount, totalCount ?? 0, { sortBy, sortDirection, view });\n        }\n    }, [\n        listCount,\n        searchQuery,\n        sendAnalytics,\n        sortBy,\n        sortDirection,\n        listDataLoaded,\n        totalCount,\n        view,\n    ]);\n\n    useEffect(() => {\n        if (cdoMounted.current && searchQuery && listDataLoaded && totalCount !== undefined) {\n            sendSearchAnalytics(searchQuery, totalCount);\n        }\n    }, [listDataLoaded, searchQuery, sendSearchAnalytics, totalCount]);\n\n    const selectionManager = useMemo(() => {\n        if (singleSelectionMode) {\n            return new SingleSelectionManager({\n                selectionUXConfig: {\n                    clickSelectionMode: AssetBrowser.CDO.ClickSelectType.Single,\n                    showCheckbox: true,\n                    showEllipsisOnHover: false,\n                    alwaysShowEllipsis: false,\n                },\n            });\n        }\n\n        return undefined;\n    }, [singleSelectionMode]);\n\n    const onBeforeItemClicked = useCallback(() => {\n        if (singleSelectionMode) {\n            return false;\n        }\n\n        return true;\n    }, [singleSelectionMode]);\n\n    if (projectsList.status === SAM.AssetListStatus.HadLoaderErrors) {\n        return <ProjectListErrorState />;\n    }\n\n    if (listCount === 0 && projectsList.status === SAM.AssetListStatus.ReadyFullyLoaded) {\n        return <ProjectListEmptyState ref={onCDOMount} searchQuery={searchQuery} />;\n    }\n\n    return (\n        <>\n            {searchQuery && totalCount !== undefined && (\n                <div\n                    className={styles.searchResultsCount}\n                    data-testid=\"project-list-search-result-count\"\n                >\n                    <FormattedMessage\n                        id=\"@ace/projects:projects.search.heading\"\n                        values={{ count: totalCount, name: searchQuery }}\n                        defaultMessage='{count,plural,=1{1 result for \"{name}\"} other{# results for \"{name}\"}}'\n                    />\n                </div>\n            )}\n            <CDO\n                hideProjectMetadata={props.hideProjectMetadata}\n                shouldRenderItemAsDisabled={props.shouldRenderItemAsDisabled}\n                ref={onCDOMount}\n                className={classnames(styles.ProjectList, { [styles.spectrum]: themeIsSpectrum })}\n                viewMode={organizer.view}\n                samList={projectsList}\n                columns={isMobile ? [] : getColumns(intl, organizer)}\n                onItemClick={(project: SAM.Project) => {\n                    dispatchEvent(\n                        new NavigationEvent({\n                            name: AssetBrowser.ContentViewType.Project,\n                            params: { projectId: project.id, assetId: undefined },\n                        }),\n                    );\n                }}\n                onBeforeItemClicked={onBeforeItemClicked}\n                selectionManager={selectionManager}\n            />\n        </>\n    );\n});\n\nfunction getColumns(intl: IntlShape, { projectView }: OrganizerConfig): Column[] {\n    return [\n        {\n            id: 'owner',\n            label: intl.formatMessage({\n                id: '@ace/projects:projects.column.createdBy',\n                defaultMessage: 'Created By',\n            }),\n            render: ({ asset }) => {\n                if (!asset.isProject) {\n                    return '';\n                }\n\n                const creator = (asset as SAM.Project).creator;\n                if (!creator) {\n                    return '';\n                }\n\n                return <TextOverflowEllipsis>{creator.displayName}</TextOverflowEllipsis>;\n            },\n            isSortDisabled: true, // TODO - reenable once supported by SAM\n        },\n        {\n            id: 'createDate',\n            label: intl.formatMessage({\n                id: '@ace/projects:projects.column.dateCreated',\n                defaultMessage: 'Date Created',\n            }),\n            render: ({ asset }) => {\n                const { unit, value } = selectUnit(asset.created) ?? {};\n                return (\n                    <TextOverflowEllipsis>\n                        <FormattedRelativeTime unit={unit} value={value} />\n                    </TextOverflowEllipsis>\n                );\n            },\n            isSortDisabled: projectView === 'recent',\n        },\n        {\n            id: 'members',\n            label: intl.formatMessage({\n                id: '@ace/projects:projects.column.sharing',\n                defaultMessage: 'Sharing',\n            }),\n            render: ({ asset }) => <CollaboratorColumn project={asset as SAM.Project} />,\n            isSortDisabled: true,\n        },\n    ];\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SingleBreadcrumb } from '@csc/adobe-assets-view/dist/src/components/HeaderNavigation/HeaderNavigation';\nimport { useHostConfig, useMobile } from '@csc/common';\nimport IconProjectCreate from '@csc/ui/dist/src/Icons/ProjectCreate';\nimport { observer } from 'mobx-react';\nimport React, { useMemo } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport styles from './style.module.css';\nimport useOrganizerConfig from '../../../hooks/useOrganizerConfig';\nimport CreateProjectButton from '../../CreateProjectButton';\nimport Toolbar from '../../Toolbar';\n\nexport default observer(function Header() {\n    const { spectrumTheme } = useHostConfig();\n    const intl = useIntl();\n\n    const {\n        enableSearch,\n        searchQuery,\n        hideProjectActions,\n        projectView,\n        sortBy,\n        sortDirection,\n        view,\n    } = useOrganizerConfig();\n\n    const isMobile = useMobile();\n\n    const headerTitle = useMemo(\n        () =>\n            intl.formatMessage({\n                id: '@ace/projects:heading.name',\n                defaultMessage: 'Projects',\n            }),\n        [intl],\n    );\n\n    const toolbar = (\n        <Toolbar\n            hideProjectActions={hideProjectActions}\n            projectView={projectView}\n            sortBy={sortBy}\n            sortDirection={sortDirection}\n            enableSearch={enableSearch}\n            searchQuery={searchQuery}\n            view={view}\n            variant={isMobile ? 'compact' : undefined}\n        />\n    );\n\n    switch (spectrumTheme) {\n        case 'express':\n            return <div data-testid=\"project-list-header\">{toolbar}</div>;\n        case 'spectrum':\n        default:\n            return (\n                <div data-testid=\"project-list-header\" className={styles.spectrum}>\n                    <div data-testid=\"project-list-header-upper\" className={styles.upper}>\n                        <SingleBreadcrumb rootTitle={headerTitle} />\n\n                        {!hideProjectActions && (\n                            <CreateProjectButton\n                                icon={<IconProjectCreate size=\"S\" />}\n                                variant=\"secondary\"\n                                quiet={isMobile}\n                            >\n                                {!isMobile && (\n                                    <FormattedMessage\n                                        id=\"@ace/projects:button.newproject.spectrum\"\n                                        defaultMessage=\"Create project\"\n                                    />\n                                )}\n                            </CreateProjectButton>\n                        )}\n                    </div>\n                    {toolbar}\n                </div>\n            );\n    }\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser } from '@ccx-public/component-types';\nimport { useHostConfig, useMobile, useTheme, useOnline } from '@csc/common';\nimport classNames from 'classnames';\nimport { observer } from 'mobx-react';\nimport React, { useEffect } from 'react';\n\nimport styles from './styles.module.css';\nimport useOrganizerConfig from '../../hooks/useOrganizerConfig';\nimport ProjectList from '../ProjectList';\nimport Header from '../ProjectList/Header';\nimport ProjectListOfflineState from '../ProjectList/OfflineState';\nimport withOrganizerConfig from '../withOrganizerConfig';\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\ntype Props = {\n    hideHeader?: boolean;\n    hideProjectMetadata?: boolean;\n    shouldRenderItemAsDisabled?: (item) => Promise<boolean>;\n    singleSelectionMode?: boolean;\n};\n\nconst ProjectsOrganizer = observer(function ProjectsOrganizer({\n    hideHeader,\n    hideProjectMetadata,\n    shouldRenderItemAsDisabled,\n    singleSelectionMode,\n}: Props) {\n    const { themeIsExpress } = useTheme();\n    const { spectrumTheme, dispatchEvent } = useHostConfig();\n    const isMobile = useMobile();\n    const { view } = useOrganizerConfig();\n    const isOnline = useOnline();\n\n    useEffect(() => {\n        // Force organizer view to list for Express mobile\n        if (isMobile && themeIsExpress && view === 'grid') {\n            dispatchEvent(\n                new NavigationEvent({\n                    name: AssetBrowser.ContentViewType.Projects,\n                    params: {\n                        viewMode: 'list',\n                        // @ts-expect-error -- kept for backward compatibility\n                        // @deprecated -- use viewMode instead\n                        view: 'list',\n                    },\n                }),\n            );\n        }\n    }, [isMobile, dispatchEvent, view, themeIsExpress]);\n\n    return (\n        <>\n            {spectrumTheme && !isOnline && <ProjectListOfflineState />}\n            <div\n                className={classNames(styles.root, styles[spectrumTheme])}\n                data-testid={`projects-organizer-${view}`}\n                // Hide the projects list when the user is offline but do not unmount the component,\n                // allows the list to automatically refresh when the user returns online\n                style={isOnline ? undefined : { display: 'none' }}\n            >\n                {hideHeader ? null : <Header />}\n                <ProjectList\n                    hideProjectMetadata={hideProjectMetadata}\n                    shouldRenderItemAsDisabled={shouldRenderItemAsDisabled}\n                    singleSelectionMode={singleSelectionMode}\n                />\n            </div>\n        </>\n    );\n});\n\nexport default withOrganizerConfig(ProjectsOrganizer);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport Organizer from './components/Organizer';\nimport withProviders from './components/withProviders';\nimport './styles.css';\n\nexport default withProviders(Organizer);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { IAUPSDK, Analytics } from '@ccx-public/component-types';\nimport { useHostConfig } from '@csc/common';\nimport SharedConfig from '@csc/common/dist/src/config/SharedConfig';\nimport { useCallback } from 'react';\n\nimport getEventName from '../utils/getEventName';\nimport type { ProjectViewLocations } from '../utils/ingest';\nimport Ingest, {\n    linkedBrandClickEvent,\n    projectActionEvent,\n    projectContentsRenderEvent,\n    projectFilterEvent,\n    projectListRenderEvent,\n    projectOrganizerSearchResultItemClickEvent,\n    projectOrganizerSearchResultRenderEvent,\n    projectOrganizerSearchTriggerEvent,\n    projectOrganizerClickEvent,\n    projectSharingEvent,\n    projectSortEvent,\n} from '../utils/ingest';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Any function with any argument can be used\nexport const useAnalytics = <FactoryFn extends (...args: any[]) => any>(formatter: FactoryFn) => {\n    const { dispatchEvent } = useHostConfig();\n\n    return useCallback(\n        (...data: Parameters<FactoryFn>) => {\n            const event = formatter(...data) as ReturnType<FactoryFn>;\n            Ingest.fireEvent(event);\n            dispatchEvent(\n                new CustomEvent('analytics', {\n                    bubbles: true,\n                    composed: true,\n                    detail: event,\n                }),\n            );\n        },\n        [dispatchEvent, formatter],\n    );\n};\n\nexport const useAupAnalytics = (viewLocation: ProjectViewLocations) => {\n    const {\n        dispatchEvent,\n    }: {\n        aupSdk?: IAUPSDK;\n        dispatchEvent: (event: CustomEvent) => void;\n    } = useHostConfig();\n    const aupSdk = SharedConfig.cSdk;\n\n    return useCallback(\n        async (\n            eventName: string,\n            workflowData: Partial<Analytics.WorkflowContext>,\n        ): Promise<void> => {\n            if (!aupSdk) {\n                return;\n            }\n\n            const fullWorkflowData: Analytics.WorkflowContext = {\n                module: {\n                    name: 'AssetBrowser',\n                    version: global.AssetBrowserVersion as string,\n                },\n                ...workflowData,\n            };\n            const fullEventName = getEventName(eventName, viewLocation);\n\n            try {\n                const workflowContext = await aupSdk.createWorkflowContext(fullWorkflowData);\n                await aupSdk.fireAnalyticsEvent(fullEventName, workflowContext.referenceId);\n            } catch (error) {\n                console.error('Error firing event using the AUP SDK:', error);\n            } finally {\n                dispatchEvent(\n                    new CustomEvent('analytics', {\n                        bubbles: true,\n                        composed: true,\n                        detail: {}, // TODO: Assemble payload. Requires https://jira.corp.adobe.com/browse/GLOW-1213 to be completed.\n                    }),\n                );\n            }\n        },\n        [aupSdk, dispatchEvent, viewLocation],\n    );\n};\n\nexport const useProjectActionAnalytics = () =>\n    useAnalytics<typeof projectActionEvent>(projectActionEvent);\n\nexport const useProjectSortAnalytics = () =>\n    useAnalytics<typeof projectSortEvent>(projectSortEvent);\n\nexport const useProjectOrganizerClickAnalytics = () =>\n    useAnalytics<typeof projectOrganizerClickEvent>(projectOrganizerClickEvent);\n\nexport const useProjectListRenderAnalytics = () =>\n    useAnalytics<typeof projectListRenderEvent>(projectListRenderEvent);\n\nexport const useProjectFilterAnalytics = () =>\n    useAnalytics<typeof projectFilterEvent>(projectFilterEvent);\n\nexport const useProjectSharingAnalytics = () =>\n    useAnalytics<typeof projectSharingEvent>(projectSharingEvent);\n\n/* [Express only] Project organizer search analytics */\nexport const useProjectOrganizerSearchTriggerAnalytics = () =>\n    useAnalytics<typeof projectOrganizerSearchTriggerEvent>(projectOrganizerSearchTriggerEvent);\n\nexport const useProjectOrganizerSearchResultRenderAnalytics = () =>\n    useAnalytics<typeof projectOrganizerSearchResultRenderEvent>(\n        projectOrganizerSearchResultRenderEvent,\n    );\n\nexport const useProjectOrganizerSearchResultItemClickAnalytics = () =>\n    useAnalytics<typeof projectOrganizerSearchResultItemClickEvent>(\n        projectOrganizerSearchResultItemClickEvent,\n    );\n\nexport const useProjectContentsRenderAnalytics = () =>\n    useAnalytics<typeof projectContentsRenderEvent>(projectContentsRenderEvent);\n\nexport const useLinkedBrandClickAnalytics = () =>\n    useAnalytics<typeof linkedBrandClickEvent>(linkedBrandClickEvent);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { ProjectViewLocations } from './ingest';\n\nexport default function getEventName(eventName: string, viewLocation: ProjectViewLocations) {\n    let location: string;\n\n    switch (viewLocation) {\n        case ProjectViewLocations.ProjectCreationWizard:\n            location = 'dialog.';\n            break;\n        case ProjectViewLocations.ProjectCreate:\n            location = 'component.';\n            break;\n        case ProjectViewLocations.ProjectContents:\n            location = '1up.';\n            break;\n        default:\n            location = '';\n    }\n\n    return `project.${location}${eventName}`;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { AssetBrowser } from '@ccx-public/component-types';\nimport { useContext } from 'react';\n\nimport { FeatureFlagsContext } from './featureFlags';\n\ntype ProjectsInternalFeatureFlags =\n    /* Allows adding compatible assets to a board */\n    | 'enableAddToBoard'\n    /* Allows loading CSC \"Content Supply Chain\" projects created in Workfront in participating hosts */\n    | 'workfrontProjects'\n    | 'projectsUploadSupport';\nexport type FeatureFlags = AssetBrowser.FeatureFlag | ProjectsInternalFeatureFlags;\n\n/**\n * Hook to get the boolean value of a specific feature flag.\n */\nexport function useFeatureFlagValue(feature: FeatureFlags): boolean {\n    const features = useContext(FeatureFlagsContext);\n    return features.includes(feature as string);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport IconLink from '@ccx-public/spectrum-wrapper/dist/Icon/Link';\nimport { constructAssetLink } from '@csc/adobe-assets-view/dist/src/utils/asset-link/constructAssetLink';\nimport type { ExternalBaseURLs } from '@csc/common';\nimport type { UABSAMCore } from '@csc/sam-utils';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n    sendAnalytics: (event: ITrackProjectAction) => void;\n    intl: IntlShape;\n    routes?: AssetBrowser.RouteTemplates;\n    showToast: AssetBrowser.ShowToastFn;\n    themeInfo: {\n        themeIsSpectrum: boolean;\n        themeIsExpress: boolean;\n    };\n    userId: string;\n    viewLocation: ProjectViewLocations;\n    baseUrls: ExternalBaseURLs;\n    dispatchEvent?: (event: CustomEvent) => void;\n    sam: UABSAMCore;\n}\n\n// All awaited methods happening between user event and clipboard action must be wrapped in this function. See navigator.clipboard comment below.\nexport const getLinkBlob = async ({\n    project,\n    baseUrls,\n    locale,\n    routes,\n    dispatchEvent,\n    sam,\n}: {\n    project: SAM.Project;\n    baseUrls: ExternalBaseURLs;\n    locale: string;\n    routes?: AssetBrowser.RouteTemplates;\n    dispatchEvent?: (event: CustomEvent) => void;\n    sam: UABSAMCore;\n}) => {\n    const link = await constructAssetLink({\n        asset: project,\n        baseUrls,\n        locale,\n        routeTemplates: routes,\n        linkSource: 'copy-link',\n        dispatchEvent,\n        sam,\n    });\n\n    return new Blob([link], { type: 'text/plain' });\n};\n\nexport default function createCopyLinkAction({\n    sendAnalytics,\n    intl,\n    routes,\n    showToast,\n    themeInfo,\n    userId,\n    viewLocation,\n    baseUrls,\n    dispatchEvent,\n    sam,\n}: Dependencies): Action {\n    return {\n        label: themeInfo.themeIsExpress\n            ? intl.formatMessage({\n                  id: '@ace/projects:projects.actionbar.copylink.express',\n                  defaultMessage: 'Copy Link',\n              })\n            : intl.formatMessage({\n                  id: '@ace/projects:projects.actionbar.copylink',\n                  defaultMessage: 'Copy link',\n              }),\n        value: 'copy-link-project',\n        icon: <IconLink />,\n        isVisible: (item) => item.isProject,\n        execute: async (item) => {\n            sendAnalytics({\n                element: item,\n                subcategory: viewLocation,\n                type: 'click',\n                subtype: 'copy-link',\n                sequence: 'context-menu',\n                userId,\n            });\n\n            try {\n                // WARNING: do NOT await or invoke promises before clipboard.write (including in beforeExecute) or else Safari/Webview will throw clipboard permission error\n                await navigator.clipboard.write([\n                    new ClipboardItem({\n                        'text/plain': getLinkBlob({\n                            project: item as SAM.Project,\n                            locale: intl.locale,\n                            routes,\n                            baseUrls,\n                            dispatchEvent,\n                            sam,\n                        }),\n                    }),\n                ]);\n                showToast({\n                    content: intl.formatMessage(\n                        {\n                            id: '@ace/projects:projects.actionbar.copylink.toast.copied',\n                            defaultMessage: 'Link to {name} is copied to clipboard',\n                        },\n                        { name: item.name },\n                    ),\n                    variant: 'positive',\n                });\n                sendAnalytics({\n                    element: item,\n                    subcategory: viewLocation,\n                    type: 'success',\n                    subtype: 'copy-link',\n                    sequence: 'toast',\n                    userId,\n                });\n            } catch (e) {\n                showToast({\n                    content: intl.formatMessage(\n                        {\n                            id: '@ace/projects:projects.actionbar.copylink.toast.failed',\n                            defaultMessage: 'Failed to copy link to {name}',\n                        },\n                        { name: item.name },\n                    ),\n                    variant: 'negative',\n                });\n                sendAnalytics({\n                    element: item,\n                    subcategory: viewLocation,\n                    type: 'error',\n                    sequence: 'toast',\n                    subtype: 'copy-link',\n                    error: e as Error,\n                });\n            }\n        },\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport type { ComponentPropsWithRef } from 'react';\nimport React, { forwardRef } from 'react';\n\nimport styles from './style.module.css';\n\nexport default forwardRef<HTMLDivElement, ComponentPropsWithRef<'div'>>(function DialogContent(\n    { className, children, ...props },\n    ref,\n) {\n    const { themeIsExpress, themeIsSpectrum } = useTheme();\n    return (\n        <div\n            {...props}\n            ref={ref}\n            className={classnames(className, styles.content, {\n                [styles.express]: themeIsExpress,\n                [styles.spectrum]: themeIsSpectrum,\n            })}\n        >\n            {children}\n        </div>\n    );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport ButtonGroup from '@ccx-public/spectrum-wrapper/dist/ButtonGroup';\nimport { useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport styles from './style.module.css';\n\nexport default function DialogFooter({ children, className = '' }) {\n    const { themeIsExpress, themeIsSpectrum } = useTheme();\n    const buttonSize = themeIsExpress ? 'l' : 'm';\n    return (\n        <ButtonGroup\n            className={classnames(className, styles.footer, {\n                [styles.express]: themeIsExpress,\n                [styles.spectrum]: themeIsSpectrum,\n            })}\n            dir=\"ltr\"\n            orientation=\"horizontal\"\n            size={buttonSize}\n        >\n            {children}\n        </ButtonGroup>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport Link from '@ccx-public/spectrum-wrapper/dist/Link';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport Wait from '@ccx-public/spectrum-wrapper/dist/Wait';\nimport ExternalLink from '@csc/adobe-assets-view/dist/src/components/ExternalLink/ExternalLink';\nimport { localizedGoUrl, useHostConfig, useTheme } from '@csc/common';\nimport { useAssetList } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useCallback, useState } from 'react';\nimport type { IntlShape } from 'react-intl';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport { useProjectActionAnalytics } from '../../hooks/useAnalytics';\nimport { usePerformance } from '../../hooks/usePerformance';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../../utils/ingest';\nimport { Content, Footer, Header } from '../Dialog';\nimport dialogStyles from '../Dialog/style.module.css';\nimport { getPrimaryLocale } from '../withProviders/intl';\n\nexport interface Props {\n    onSuccess?: () => unknown;\n    project: SAM.Project;\n    viewLocation: ProjectViewLocations;\n}\n\ninterface UndoProjectDiscardArgs {\n    project: SAM.Project;\n    intl: IntlShape;\n    viewLocation: ProjectViewLocations;\n    trackProjectAction: (args: ITrackProjectAction) => void;\n    showToast: (config: AssetBrowser.ToastConfig) => void;\n}\n\nexport async function UndoProjectDiscard(args: UndoProjectDiscardArgs) {\n    const { project, intl, viewLocation, showToast, trackProjectAction } = args;\n    try {\n        trackProjectAction({\n            element: project,\n            subcategory: viewLocation,\n            type: 'click',\n            subtype: 'undo-delete',\n            sequence: 'toast',\n        });\n\n        await project.restore();\n        showToast({\n            content: intl.formatMessage({\n                id: '@ace/projects:projects.actionbar.discard.toast.undoSuccess',\n                defaultMessage: 'Undo complete',\n            }),\n            variant: 'positive',\n        });\n\n        trackProjectAction({\n            element: project,\n            subcategory: viewLocation,\n            type: 'success',\n            sequence: 'toast',\n            subtype: 'restore',\n        });\n    } catch (e) {\n        trackProjectAction({\n            element: project,\n            subcategory: viewLocation,\n            type: 'error',\n            sequence: 'toast',\n            subtype: 'restore',\n            error: e as Error,\n        });\n        showToast({\n            content: intl.formatMessage({\n                id: '@ace/projects:projects.actionbar.discard.toast.undoFailure',\n                defaultMessage: 'We ran into a problem restoring your project',\n            }),\n            variant: 'negative',\n        });\n    }\n}\n\nexport default observer(function ProjectDiscardDialog({ onSuccess, project, viewLocation }: Props) {\n    const { closeModal, showToast, environment, locale } = useHostConfig();\n    const { themeIsExpress } = useTheme();\n    const intl = useIntl();\n    const perf = usePerformance();\n    const sendAnalytics = useProjectActionAnalytics();\n    const [isLoading, setIsLoading] = useState<boolean>(false);\n    const TOAST_DISMISS_TIME = 5000;\n\n    const assetList = useAssetList({\n        source: project.children,\n        loadAll: false,\n        limit: 1,\n    });\n\n    const handleCancel = useCallback(() => {\n        closeModal({ type: AssetBrowser.ShowModalResultType.Cancel });\n        sendAnalytics({\n            element: project,\n            subcategory: viewLocation,\n            type: 'click',\n            subtype: 'delete-cancel',\n            pagename: 'delete',\n        });\n    }, [project, closeModal, sendAnalytics, viewLocation]);\n\n    const AssetsWebLink = () => {\n        const ASSETS_WEB_DELETED = {\n            stage: 'https://www.stage.adobe.com/files/deleted',\n            prod: 'https://www.adobe.com/files/deleted',\n        };\n        const ASSETS_WEB_DELETED_LINK = ASSETS_WEB_DELETED[environment];\n\n        return (\n            <Link target=\"_blank\" href={ASSETS_WEB_DELETED_LINK}>\n                <FormattedMessage\n                    id=\"@ace/projects:projects.dialog.discard.storage\"\n                    defaultMessage=\"Adobe Cloud storage\"\n                />\n            </Link>\n        );\n    };\n\n    const handleSubmit = useCallback(async () => {\n        if (isLoading) {\n            return;\n        }\n        sendAnalytics({\n            element: project,\n            subcategory: viewLocation,\n            type: 'click',\n            subtype: 'delete-confirm',\n            pagename: 'delete',\n        });\n        try {\n            const finishMeasure = perf.startMeasure('DiscardProject');\n            setIsLoading(true);\n            await project.discard();\n            finishMeasure();\n            onSuccess?.();\n            showToast({\n                content: intl.formatMessage(\n                    {\n                        id: '@ace/projects:projects.actionbar.discard.toast.discarded',\n                        defaultMessage: 'Project {name} has been deleted',\n                    },\n                    { name: project.name },\n                ),\n                dismissTime: TOAST_DISMISS_TIME,\n                actionCallback: {\n                    label: intl.formatMessage({\n                        id: '@ace/projects:button.undo',\n                        defaultMessage: 'Undo',\n                    }),\n                    callback: () => {\n                        void UndoProjectDiscard({\n                            project,\n                            intl,\n                            viewLocation,\n                            showToast,\n                            trackProjectAction: (arg: ITrackProjectAction) => sendAnalytics(arg),\n                        });\n                    },\n                },\n                variant: 'positive',\n            });\n            sendAnalytics({\n                element: project,\n                subcategory: viewLocation,\n                type: 'success',\n                subtype: 'delete',\n                sequence: 'toast',\n            });\n            closeModal({ type: AssetBrowser.ShowModalResultType.Success });\n        } catch (e) {\n            showToast({\n                content: intl.formatMessage({\n                    id: '@ace/projects:projects.actionbar.discard.toast.failed',\n                    defaultMessage: 'We ran into a problem deleting your project',\n                }),\n                variant: 'negative',\n            });\n            sendAnalytics({\n                element: project,\n                subcategory: viewLocation,\n                type: 'error',\n                sequence: 'toast',\n                subtype: 'delete',\n                error: e as Error,\n            });\n            closeModal({ type: AssetBrowser.ShowModalResultType.Error });\n        } finally {\n            setIsLoading(false);\n        }\n    }, [\n        perf,\n        project,\n        sendAnalytics,\n        closeModal,\n        onSuccess,\n        showToast,\n        intl,\n        viewLocation,\n        isLoading,\n    ]);\n\n    if (themeIsExpress && assetList && assetList.status === SAM.AssetListStatus.Loading) {\n        return (\n            <Content data-testid=\"project-discard-dialog\">\n                <div className={dialogStyles.loadingSpinner} data-testid=\"project-contents-loading\">\n                    <Wait size=\"L\" />\n                </div>\n            </Content>\n        );\n    }\n\n    return (\n        <Content data-testid=\"project-discard-dialog\">\n            <Header>\n                <FormattedMessage\n                    id=\"@ace/projects:projects.dialog.discard.heading\"\n                    defaultMessage=\"Delete project\"\n                />\n            </Header>\n            <Rule variant=\"small\" className={dialogStyles.divider} />\n            <div className={dialogStyles.softDelete}>\n                {themeIsExpress ? (\n                    <FormattedMessage\n                        id=\"@ace/projects:projects.dialog.discard.softDeleteExpress\"\n                        defaultMessage=\"{isEmpty,select,true{<strong>Deleted projects can be restored for up to 30 days</strong> in {link}. After 30 days, projects will be <strong>permanently deleted from all apps that use Adobe Cloud storage</strong>.} other{There are assets in here. <strong>Deleted projects can be restored for up to 30 days</strong> in {link}. After 30 days, projects will be <strong>permanently deleted from all apps that use Adobe Cloud storage</strong>.}}\"\n                        values={{\n                            link: <AssetsWebLink />,\n                            strong: (chunks) => <strong>{chunks}</strong>,\n                            isEmpty: assetList?.items.length === 0,\n                        }}\n                    />\n                ) : (\n                    <FormattedMessage\n                        id=\"@ace/projects:projects.dialog.discard.softDelete\"\n                        defaultMessage=\"Members won’t have access and files will become unpublished.\"\n                    />\n                )}\n            </div>\n            <div>\n                {themeIsExpress ? (\n                    <FormattedMessage\n                        id=\"@ace/projects:projects.dialog.discard.hardDeleteExpress\"\n                        defaultMessage=\"Upon deletion, published files will be unpublished, and collaborators will lose access to them.\"\n                    />\n                ) : (\n                    <FormattedMessage\n                        id=\"@ace/projects:projects.dialog.discard.hardDelete\"\n                        defaultMessage=\"Deleted projects will be permanently removed from Adobe cloud storage after 30 days. {link}.\"\n                        values={{\n                            link: (\n                                <ExternalLink\n                                    url={`${localizedGoUrl('deleted-files-retention', getPrimaryLocale(locale) ?? 'en')}`}\n                                >\n                                    <FormattedMessage\n                                        id=\"@ace/projects:learnMore\"\n                                        defaultMessage=\"Learn more\"\n                                    />\n                                </ExternalLink>\n                            ),\n                        }}\n                    />\n                )}\n            </div>\n            <Footer data-testid=\"project-discard-dialog-footer\">\n                <Button\n                    data-testid=\"cancel-discard-project\"\n                    variant=\"secondary\"\n                    onClick={handleCancel}\n                >\n                    <FormattedMessage\n                        id=\"@ace/projects:projects.dialog.discard.cancel\"\n                        defaultMessage=\"Cancel\"\n                    />\n                </Button>\n                <Button\n                    data-testid=\"confirm-discard-project\"\n                    variant=\"negative\"\n                    onClick={handleSubmit}\n                    disabled={isLoading}\n                >\n                    <FormattedMessage\n                        id=\"@ace/projects:projects.dialog.discard.confirm\"\n                        defaultMessage=\"Delete\"\n                    />\n                </Button>\n            </Footer>\n        </Content>\n    );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport IconDelete from '@ccx-public/spectrum-wrapper/dist/Icon/Delete';\nimport type { ShowModalFn } from '@csc/common';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport ProjectDiscardDialog from '../components/ProjectDiscardDialog';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n    sendAnalytics: (event: ITrackProjectAction) => void;\n    intl: IntlShape;\n    onSuccess?: () => unknown;\n    showModal: ShowModalFn;\n    viewLocation: ProjectViewLocations;\n    onBefore?: (elements: SAM.AdobeAsset[]) => Promise<SAM.AdobeAsset[]>;\n}\n\nexport default function createDiscardAction({\n    sendAnalytics,\n    intl,\n    onSuccess,\n    showModal,\n    viewLocation,\n    onBefore,\n}: Dependencies): Action {\n    return {\n        label: intl.formatMessage({\n            id: '@ace/projects:projects.actionbar.discard',\n            defaultMessage: 'Delete',\n        }),\n        value: 'discard-project',\n        icon: <IconDelete />,\n        groupName: 'destructiveActions',\n        isVisible: (item) =>\n            item.isProject &&\n            (item as SAM.Project).directorySubtype !== SAM.ProjectDirectorySubtype.WF_PROJECT &&\n            item.hasPermission(SAM.Permission.Discard),\n        execute: async (item) => {\n            sendAnalytics({\n                element: item,\n                subcategory: viewLocation,\n                type: 'click',\n                subtype: 'delete',\n                sequence: 'context-menu',\n            });\n\n            const filteredElements = (await onBefore?.([item])) ?? [item];\n\n            if (!filteredElements.length) {\n                return;\n            }\n\n            await showModal(\n                <ProjectDiscardDialog\n                    data-testid=\"project-discard-dialog\"\n                    onSuccess={onSuccess}\n                    project={item as SAM.Project}\n                    viewLocation={viewLocation}\n                />,\n                {\n                    size: 'm',\n                    onClose: () => {\n                        sendAnalytics({\n                            element: item,\n                            subcategory: viewLocation,\n                            type: 'click',\n                            subtype: 'close',\n                            pagename: 'delete',\n                        });\n                    },\n                },\n            );\n        },\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport IconInvite from '@ccx-public/spectrum-wrapper/dist/Icon/Invite';\nimport type { ShowModalFn } from '@csc/common';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport ProjectInviteDialog from '../components/ProjectInviteDialog';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n    sendAnalytics: (data: ITrackProjectAction) => void;\n    intl: IntlShape;\n    showModal: ShowModalFn;\n    userId: string;\n    viewLocation: ProjectViewLocations;\n}\n\nexport default function createInviteAction({\n    sendAnalytics,\n    intl,\n    showModal,\n    userId,\n    viewLocation,\n}: Dependencies): Action {\n    return {\n        label: intl.formatMessage({\n            id: '@ace/projects:projects.actionbar.invite',\n            defaultMessage: 'Share',\n        }),\n        value: 'share-project',\n        icon: <IconInvite />,\n        isVisible: (item) =>\n            item.isProject &&\n            (item as SAM.Project).directorySubtype !== SAM.ProjectDirectorySubtype.WF_PROJECT,\n        execute: async (item) => {\n            sendAnalytics({\n                element: item,\n                subcategory: viewLocation,\n                type: 'click',\n                subtype: 'share',\n                sequence: 'context-menu',\n                userId,\n            });\n            await showModal(<ProjectInviteDialog project={item} viewLocation={viewLocation} />, {\n                size: 'm',\n                onClose: () => {\n                    sendAnalytics({\n                        element: item,\n                        subcategory: viewLocation,\n                        type: 'click',\n                        subtype: 'close',\n                        pagename: 'share',\n                        userId,\n                    });\n                },\n            });\n        },\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport { useHostConfig } from '@csc/common';\nimport LoadingState from '@csc/ui/dist/src/LoadingState/LoadingState';\nimport React, { useState, useCallback } from 'react';\nimport type { IntlShape } from 'react-intl';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport leaveDialogStyles from './styles.module.css';\nimport { useProjectActionAnalytics } from '../../hooks/useAnalytics';\nimport type { ProjectViewLocations } from '../../utils/ingest';\nimport { Content, Footer, Header } from '../Dialog';\nimport dialogStyles from '../Dialog/style.module.css';\n\nconst getErrorMessage = ({\n    reason,\n    intl,\n}: {\n    intl: IntlShape;\n    reason?: SAM.ProjectLeaveReason;\n}) => {\n    switch (reason) {\n        case SAM.ProjectLeaveReason.CANNOT_LEAVE_ADDRESS_BOOK_GROUP_MEMBER:\n            return intl.formatMessage({\n                id: '@ace/projects:projects.actionbar.leave.toast.failed.addressBookGroupMember',\n                defaultMessage:\n                    'You can’t leave because you belong to an invited group, try leaving the group.',\n            });\n        case SAM.ProjectLeaveReason.CANNOT_LEAVE_IS_OWNER:\n            return intl.formatMessage({\n                id: '@ace/projects:projects.actionbar.leave.toast.failed.owner',\n                defaultMessage: 'You can’t leave because you’re the owner.',\n            });\n        case SAM.ProjectLeaveReason.CANNOT_LEAVE_IS_ADMIN_OF_PROJECT:\n            return intl.formatMessage({\n                id: '@ace/projects:projects.actionbar.leave.toast.failed.isAdmin',\n                defaultMessage: 'You can’t leave because you’re an admin.',\n            });\n        case SAM.ProjectLeaveReason.CANNOT_LEAVE_LAST_COLLABORATOR:\n        case SAM.ProjectLeaveReason.CANNOT_LEAVE_NO_COLLABORATORS:\n        case SAM.ProjectLeaveReason.CANNOT_LEAVE_LAST_DIRECT_COLLAB_WITH_SHARE_PERMISSION:\n            return intl.formatMessage({\n                id: '@ace/projects:projects.actionbar.leave.toast.failed.onlyContributor',\n                defaultMessage: 'You’re the only editor. Add another before leaving.',\n            });\n        default:\n            return intl.formatMessage({\n                id: '@ace/projects:projects.actionbar.leave.toast.failed.default',\n                defaultMessage: 'We ran into a problem and couldn’t remove you from the project.',\n            });\n    }\n};\n\nexport interface Props {\n    onSuccess?: () => unknown;\n    project: SAM.Project;\n    viewLocation: ProjectViewLocations;\n}\n\nexport default function ProjectLeaveDialog({ onSuccess, project, viewLocation }: Props) {\n    const [isLoading, setIsLoading] = useState<boolean>(false);\n    const { closeModal, showToast } = useHostConfig();\n    const intl = useIntl();\n    const sendAnalytics = useProjectActionAnalytics();\n\n    const handleCanLeave = useCallback(async () => {\n        await project.removeCurrentUserFromCollaborationList();\n        onSuccess?.();\n        showToast({\n            content: intl.formatMessage(\n                {\n                    id: '@ace/projects:projects.actionbar.leave.toast.success',\n                    defaultMessage: 'You have been removed from the “{project}” project',\n                },\n                { project: project.name },\n            ),\n            variant: 'positive',\n        });\n        sendAnalytics({\n            element: project,\n            subcategory: viewLocation,\n            type: 'success',\n            subtype: 'leave',\n            sequence: 'toast',\n        });\n        closeModal({ type: AssetBrowser.ShowModalResultType.Success });\n    }, [onSuccess, sendAnalytics, showToast, closeModal, intl, project, viewLocation]);\n\n    // After user attempts leave, treat CANNOT_LEAVE statuses similar to errors\n    const handleCannotLeave = useCallback(\n        (leaveStatus: SAM.ProjectLeaveReason) => {\n            showToast({\n                content: getErrorMessage({\n                    intl,\n                    reason: leaveStatus,\n                }),\n                variant: 'negative',\n            });\n            sendAnalytics({\n                element: project,\n                subcategory: viewLocation,\n                type: 'error',\n                sequence: 'toast',\n                subtype: 'leave',\n                error: {\n                    name: SAM.ProjectLeaveReason[leaveStatus],\n                } as Error,\n            });\n            closeModal({ type: AssetBrowser.ShowModalResultType.Error });\n        },\n        [closeModal, intl, project, sendAnalytics, showToast, viewLocation],\n    );\n\n    const handleSubmit = useCallback(async () => {\n        sendAnalytics({\n            element: project,\n            subcategory: viewLocation,\n            type: 'click',\n            pagename: 'leave',\n            subtype: 'leave-confirm',\n        });\n        try {\n            setIsLoading(true);\n            const leaveStatus = project.leaveStatus();\n\n            if (leaveStatus === SAM.ProjectLeaveReason.CAN_LEAVE) {\n                await handleCanLeave();\n            } else {\n                handleCannotLeave(leaveStatus);\n            }\n        } catch (e) {\n            showToast({\n                content: getErrorMessage({ intl }),\n                variant: 'negative',\n            });\n            sendAnalytics({\n                element: project,\n                subcategory: viewLocation,\n                type: 'error',\n                sequence: 'toast',\n                subtype: 'leave',\n                error: e as Error,\n            });\n            closeModal({ type: AssetBrowser.ShowModalResultType.Error });\n        } finally {\n            setIsLoading(false);\n        }\n    }, [\n        closeModal,\n        intl,\n        project,\n        sendAnalytics,\n        showToast,\n        viewLocation,\n        handleCanLeave,\n        handleCannotLeave,\n    ]);\n\n    const handleCancel = useCallback(() => {\n        closeModal({ type: AssetBrowser.ShowModalResultType.Cancel });\n        sendAnalytics({\n            element: project,\n            subcategory: viewLocation,\n            type: 'click',\n            subtype: 'leave-cancel',\n            pagename: 'leave',\n        });\n    }, [closeModal, project, sendAnalytics, viewLocation]);\n\n    return (\n        <Content data-testid=\"project-leave-dialog\" className={leaveDialogStyles.container}>\n            <Header>\n                <FormattedMessage\n                    id=\"@ace/projects:projects.dialog.leave.header\"\n                    defaultMessage=\"Saying goodbye?\"\n                />\n            </Header>\n            <div className={dialogStyles.divider}>\n                <Rule variant=\"small\" />\n            </div>\n            {isLoading ? (\n                <LoadingState />\n            ) : (\n                <>\n                    <div\n                        className={leaveDialogStyles.warning}\n                        data-testid=\"project-leave-dialog-warning\"\n                    >\n                        <FormattedMessage\n                            id=\"@ace/projects:projects.dialog.leave.body\"\n                            defaultMessage=\"You won’t be able to undo this If you remove yourself. Contact a member if you want to be added back to this project.\"\n                        />\n                    </div>\n\n                    <Footer data-testid=\"project-leave-dialog-footer\">\n                        <Button\n                            data-testid=\"cancel-leave-project\"\n                            variant=\"secondary\"\n                            onClick={handleCancel}\n                        >\n                            <FormattedMessage\n                                id=\"@ace/projects:projects.dialog.discard.cancel\"\n                                defaultMessage=\"Cancel\"\n                            />\n                        </Button>\n                        <Button\n                            data-testid=\"confirm-leave-project\"\n                            variant=\"cta\"\n                            onClick={handleSubmit}\n                        >\n                            <FormattedMessage\n                                id=\"@ace/projects:projects.dialog.leave.confirm\"\n                                defaultMessage=\"Leave project\"\n                            />\n                        </Button>\n                    </Footer>\n                </>\n            )}\n        </Content>\n    );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport IconLeave from '@ccx-public/spectrum-wrapper/dist/Icon/Export';\nimport type { ShowModalFn } from '@csc/common';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport ProjectLeaveDialog from '../components/ProjectLeaveDialog';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n    sendAnalytics: (event: ITrackProjectAction) => void;\n    intl: IntlShape;\n    showModal: ShowModalFn;\n    onSuccess?: () => unknown;\n    userId: string;\n    viewLocation: ProjectViewLocations;\n    onBefore?: (elements: SAM.AdobeAsset[]) => Promise<SAM.AdobeAsset[]>;\n}\n\nexport default function createLeaveAction({\n    sendAnalytics,\n    intl,\n    onSuccess,\n    showModal,\n    userId,\n    viewLocation,\n    onBefore,\n}: Dependencies): Action {\n    return {\n        label: intl.formatMessage({\n            id: '@ace/projects:projects.actionbar.leaveProject',\n            defaultMessage: 'Leave',\n        }),\n        value: 'leave-project',\n        icon: <IconLeave />,\n        groupName: 'destructiveActions',\n        isVisible: (item) =>\n            item.isProject &&\n            (item as SAM.Project).directorySubtype !== SAM.ProjectDirectorySubtype.WF_PROJECT,\n        execute: async (item) => {\n            sendAnalytics({\n                element: item,\n                subcategory: viewLocation,\n                type: 'click',\n                subtype: 'leave',\n                sequence: 'context-menu',\n                userId,\n            });\n\n            // Exclude project that contains open assets\n            const filteredElements = (await onBefore?.([item])) ?? [item];\n            if (!filteredElements.length) {\n                return;\n            }\n\n            await showModal(\n                <ProjectLeaveDialog\n                    data-testid=\"project-leave-dialog\"\n                    project={item as SAM.Project}\n                    onSuccess={onSuccess}\n                    viewLocation={viewLocation}\n                />,\n                {\n                    size: 'm',\n                    onClose: () => {\n                        sendAnalytics({\n                            element: item,\n                            subcategory: viewLocation,\n                            type: 'click',\n                            subtype: 'close',\n                            pagename: 'leave',\n                        });\n                    },\n                },\n            );\n        },\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport Rename from '@ccx-public/spectrum-wrapper/dist/Icon/Rename';\nimport RenameDialog from '@csc/adobe-assets-view/dist/src/components/RenameDialog/RenameDialog';\nimport type { ShowModalFn } from '@csc/common';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n    sendAnalytics: (event: ITrackProjectAction) => void;\n    intl: IntlShape;\n    performance?: {\n        startMeasure: (id: string) => () => void;\n    };\n    showModal: ShowModalFn;\n    viewLocation: ProjectViewLocations;\n    onBefore?: (elements: SAM.AdobeAsset[]) => Promise<SAM.AdobeAsset[]>;\n}\n\nexport default function createRenameAction({\n    sendAnalytics,\n    intl,\n    performance,\n    showModal,\n    viewLocation,\n    onBefore,\n}: Dependencies): Action {\n    const execute = async (item: SAM.AdobeAsset) => {\n        let finishMeasure: (() => void) | undefined;\n\n        const [testId, perfId] = item.isProject\n            ? ['project-rename-dialog', 'RenameProject']\n            : ['rename-dialog', 'RenameAsset'];\n\n        sendAnalytics({\n            element: item,\n            subcategory: viewLocation,\n            type: 'click',\n            subtype: 'rename',\n            sequence: 'context-menu',\n        });\n\n        const filteredElements = (await onBefore?.([item])) ?? [item];\n        if (!filteredElements.length) {\n            return;\n        }\n\n        await showModal(\n            <RenameDialog\n                data-testid={testId}\n                element={item}\n                onConfirm={() => {\n                    finishMeasure = performance?.startMeasure(perfId);\n                    sendAnalytics({\n                        element: item,\n                        subcategory: viewLocation,\n                        type: 'click',\n                        subtype: 'rename-confirm',\n                        pagename: 'rename',\n                    });\n                }}\n            />,\n            {\n                onClose: () => {\n                    sendAnalytics({\n                        element: item,\n                        subcategory: viewLocation,\n                        type: 'click',\n                        subtype: 'close',\n                        pagename: 'rename',\n                    });\n                },\n                onCancel: () => {\n                    sendAnalytics({\n                        element: item,\n                        subcategory: viewLocation,\n                        type: 'click',\n                        subtype: 'rename-cancel',\n                        pagename: 'rename',\n                    });\n                },\n                onError: () => {\n                    sendAnalytics({\n                        element: item,\n                        subcategory: viewLocation,\n                        type: 'error',\n                        sequence: 'toast',\n                        subtype: 'rename',\n                    });\n                },\n                onSuccess: () => {\n                    sendAnalytics({\n                        element: item,\n                        subcategory: viewLocation,\n                        type: 'success',\n                        subtype: 'rename',\n                        pagename: 'toast',\n                    });\n                    finishMeasure?.();\n                },\n            },\n        );\n    };\n\n    const label = intl.formatMessage({\n        id: '@ace/projects:projects.actionbar.rename',\n        defaultMessage: 'Rename',\n    });\n\n    const isVisible = (item: SAM.AdobeAsset) =>\n        (item.isProject &&\n            item.hasPermission(SAM.Permission.Rename) &&\n            (item as SAM.Project).directorySubtype !== SAM.ProjectDirectorySubtype.WF_PROJECT) ||\n        !item.isProject;\n\n    return {\n        execute,\n        label,\n        icon: <Rename />,\n        isVisible,\n        value: 'rename-project',\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport IconLink from '@ccx-public/spectrum-wrapper/dist/Icon/Link';\nimport { openLink } from '@csc/adobe-assets-view';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n    sendAnalytics: (event: ITrackProjectAction) => void;\n    intl: IntlShape;\n    userId: string;\n    viewLocation: ProjectViewLocations;\n    dispatchEvent: (event: CustomEvent) => void;\n    getWorkfrontContext: () => Promise<SAM.WorkfrontContext>;\n}\n\nexport default function createWorkfrontOpenAction({\n    sendAnalytics,\n    intl,\n    userId,\n    viewLocation,\n    dispatchEvent,\n    getWorkfrontContext,\n}: Dependencies): Action {\n    return {\n        label: intl.formatMessage({\n            id: '@ace/projects:projects.actionbar.workfrontOpen',\n            defaultMessage: 'Open in Workfront',\n        }),\n        value: 'workfront-open',\n        icon: <IconLink />,\n        isVisible: (asset) =>\n            asset.isProject &&\n            (asset as SAM.Project).directorySubtype === SAM.ProjectDirectorySubtype.WF_PROJECT,\n        execute: async (asset: SAM.AdobeAsset) => {\n            sendAnalytics({\n                element: asset,\n                subcategory: viewLocation,\n                type: 'click',\n                subtype: 'workfront-open',\n                sequence: 'context-menu',\n                userId,\n            });\n\n            try {\n                const workfrontContext = await getWorkfrontContext();\n                const link = await workfrontContext.getWorkfrontLink(asset.id);\n\n                if (typeof link !== 'string') {\n                    throw new Error('Error getting link');\n                }\n\n                openLink({\n                    dispatchEvent,\n                    url: link,\n                });\n\n                sendAnalytics({\n                    element: asset,\n                    subcategory: viewLocation,\n                    type: 'success',\n                    subtype: 'workfront-open',\n                    sequence: 'toast',\n                    userId,\n                });\n            } catch (e) {\n                console.log('Error opening in Workfront', e);\n                sendAnalytics({\n                    element: asset,\n                    subcategory: viewLocation,\n                    type: 'error',\n                    sequence: 'toast',\n                    subtype: 'workfront-open',\n                    error: e as Error,\n                });\n            }\n        },\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { checkAllowedAdobeAssetsBeforeOp } from '@csc/adobe-assets-view';\nimport { getBaseUrlMap, useHostConfig, useTheme, useDocumentCallbacks } from '@csc/common';\nimport { useSAM } from '@csc/sam-utils';\nimport { useMemo } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { useProjectActionAnalytics } from './useAnalytics';\nimport { usePerformance } from './usePerformance';\nimport type { Action } from '../actions';\nimport createCopyLinkAction from '../actions/copyLink';\nimport createDiscardAction from '../actions/discard';\nimport createInviteAction from '../actions/invite';\nimport createLeaveAction from '../actions/leave';\nimport createRenameAction from '../actions/rename';\nimport createWorkfrontOpenAction from '../actions/workfrontOpen';\nimport type { ProjectViewLocations } from '../utils/ingest';\n\nexport type Options = {\n    onDestructiveActionSuccess?: () => unknown;\n    viewLocation: ProjectViewLocations;\n    actionFilter?: (value: string) => boolean;\n};\n\nexport default function useProjectActions({\n    onDestructiveActionSuccess,\n    viewLocation,\n    actionFilter = () => true,\n}: Options): Action[] {\n    const intl = useIntl();\n    const themeInfo = useTheme();\n    const { showModal, showToast, routes, imsData, environment, dispatchEvent } = useHostConfig();\n    const sendAnalytics = useProjectActionAnalytics();\n    const performance = usePerformance();\n    const sam = useSAM();\n    const getWorkfrontContext = sam?.getWorkfrontContext;\n    const userId = imsData?.userId;\n    const baseUrls = useMemo(() => getBaseUrlMap(environment), [environment]);\n    const { onBeforeRename, onBeforeDelete, getOpenCloudDocuments } = useDocumentCallbacks();\n\n    return useMemo(() => {\n        const actions = [\n            createWorkfrontOpenAction({\n                sendAnalytics,\n                intl,\n                userId,\n                viewLocation,\n                dispatchEvent,\n                getWorkfrontContext,\n            }),\n            createInviteAction({ sendAnalytics, intl, showModal, userId, viewLocation }),\n            createCopyLinkAction({\n                sendAnalytics,\n                intl,\n                routes,\n                showToast,\n                themeInfo,\n                userId,\n                viewLocation,\n                baseUrls,\n                dispatchEvent,\n                sam,\n            }),\n            createRenameAction({\n                sendAnalytics,\n                intl,\n                performance,\n                showModal,\n                viewLocation,\n                onBefore: async (elements) =>\n                    checkAllowedAdobeAssetsBeforeOp({\n                        elements,\n                        getBlockedAssets: onBeforeRename,\n                        intl,\n                        showToast,\n                        getCurrentlyOpenAssets: getOpenCloudDocuments,\n                        sam,\n                    }),\n            }),\n            createLeaveAction({\n                sendAnalytics,\n                intl,\n                onSuccess: onDestructiveActionSuccess,\n                showModal,\n                userId,\n                viewLocation,\n                onBefore: async (elements) =>\n                    checkAllowedAdobeAssetsBeforeOp({\n                        elements,\n                        intl,\n                        showToast,\n                        getCurrentlyOpenAssets: getOpenCloudDocuments,\n                        sam,\n                    }),\n            }),\n            createDiscardAction({\n                sendAnalytics,\n                intl,\n                onSuccess: onDestructiveActionSuccess,\n                showModal,\n                viewLocation,\n                onBefore: async (elements) =>\n                    checkAllowedAdobeAssetsBeforeOp({\n                        elements,\n                        getBlockedAssets: onBeforeDelete,\n                        intl,\n                        showToast,\n                        getCurrentlyOpenAssets: getOpenCloudDocuments,\n                        sam,\n                    }),\n            }),\n        ];\n        return actions.filter((action) => actionFilter(action.value));\n    }, [\n        sendAnalytics,\n        intl,\n        showModal,\n        userId,\n        viewLocation,\n        routes,\n        showToast,\n        themeInfo,\n        baseUrls,\n        dispatchEvent,\n        performance,\n        onDestructiveActionSuccess,\n        onBeforeRename,\n        getOpenCloudDocuments,\n        sam,\n        onBeforeDelete,\n        actionFilter,\n        getWorkfrontContext,\n    ]);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { LIBRARIES_MIMETYPES } from '@csc/adobe-assets-view/dist/src/utils/filtering-utils/filtering-type-enums';\nimport { useHostConfig } from '@csc/common';\n\nimport { useFeatureFlagValue } from '../components/withProviders/useFeatureFlagValue';\n\n// Control a set of host-specific configurations and logic that are not part of the host config.\nexport default function useHostExtendedConfig() {\n    const { appId } = useHostConfig();\n    const workfrontProjectsEnabled = useFeatureFlagValue('workfrontProjects');\n\n    let supportCreateLibrary = true;\n    let supportLibraryDropdown = false;\n    let supportWorkfrontProjects = false;\n    let supportLinkedBrands = true;\n    let excludeMediaTypes: string[] | undefined;\n\n    if (\n        ['photoshop', 'photoshop_web', 'illustrator', 'in_design', 'firefly'].includes(appId ?? '')\n    ) {\n        excludeMediaTypes = LIBRARIES_MIMETYPES.LIBRARIES;\n        // In Photoshop, 'create library' action from project contents view is not allowed.\n        supportCreateLibrary = false;\n        supportLibraryDropdown = true;\n        supportWorkfrontProjects = workfrontProjectsEnabled;\n        supportLinkedBrands = false;\n    }\n\n    if (appId === 'firefly') {\n        excludeMediaTypes = undefined; // Firefly has library types\n    }\n\n    return {\n        excludeMediaTypes,\n        supportCreateLibrary,\n        supportLibraryDropdown,\n        supportWorkfrontProjects,\n        supportLinkedBrands,\n    };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport { useOnline } from '@csc/common';\nimport { useEffect, useRef } from 'react';\n\n/**\n * Hook to refresh a SAM list automatically when the user comes back online.\n * Must only be called inside a component that is wrapped in a <NetworkContext.Provider>\n * Note - the component where the list is used must NOT be unmounted when the user goes offline (i.e rendering a different Offline Illustrated Message component)\n * Otherwise, the offline to online state change will not be detected and the list will not be refreshed.\n * @param list - The list to refresh on resuming online.\n */\nexport default function useRefreshListOnResume<T extends SAM.AdobeAsset>(\n    list?: SAM.IItemList<SAM.IItemSourceConfig<T>>,\n) {\n    const isOnline = useOnline();\n    const didMount = useRef(false);\n\n    // use a ref to store the list to avoid having the list be a dependency on the onResume useEffect\n    // Changes in like sortby, sortDirection, etc will change the list object causing the useEffect to run\n    // Instead we can use the ref to call various refresh functions against the list\n    // and avoid the dependency on the list object directly in the onResume useEffect\n    const listRef = useRef(list);\n\n    // Update the list ref when the list changes\n    useEffect(() => {\n        listRef.current = list;\n    }, [list]);\n\n    // On Resume, refresh the list\n    useEffect(() => {\n        function onResume() {\n            if (!listRef.current) {\n                return;\n            }\n            listRef.current.items.forEach((item) => {\n                if (item.thumbnailStatus === SAM.RenditionStatus.Error) {\n                    item.clearRenditionError();\n                }\n            });\n            if (listRef.current.status === SAM.AssetListStatus.HadLoaderErrors) {\n                // If the list had loader errors from going offline, we should try to force a refresh\n                // to clear out any error states. In most cases we should avoid using setNeedsRefresh()\n                // as it forces an immediate network request\n                listRef.current.setNeedsRefresh();\n            } else {\n                // If the list is not in an error state, we can call refresh()\n                // Timeouts on the list are respected when using refresh() so we don't need to worry about fetching too often\n                listRef.current.refresh();\n            }\n        }\n\n        if (!didMount.current) {\n            // we don't want the first time the hook is called to be considered going back online\n            didMount.current = true;\n        } else if (isOnline) {\n            // This useEffect is triggered only when isOnline changes\n            // If the value of isOnline is true, it implies that the user has gone from offline to online\n            // and we can call the onResume callback\n            onResume();\n        }\n    }, [isOnline]);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nexport const projectRoles = [\n    { role: 'EDIT_SHARE', label: 'EDIT', preselected: true },\n    { role: 'VIEW', label: 'COMMENT' },\n];\n\nexport type ProjectInviteRole = {\n    role: string;\n    label?: string;\n    preselected?: boolean;\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\n/**\n * Normalized platform values\n */\nexport enum Platform {\n    Mac,\n    Windows,\n    Android,\n    iOS,\n    Web,\n    Linux,\n}\n\nexport default function getPlatform(): Platform {\n    const userAgent = navigator.userAgent.toLowerCase();\n\n    if (/iphone|ipad|ipod/.test(userAgent)) {\n        return Platform.iOS;\n    } else if (/android/.test(userAgent)) {\n        return Platform.Android;\n    } else if (/mac/.test(userAgent)) {\n        return Platform.Mac;\n    } else if (/win/.test(userAgent)) {\n        return Platform.Windows;\n    } else if (/linux/.test(userAgent)) {\n        return Platform.Linux;\n    } else {\n        return Platform.Web;\n    }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { constructAssetLink } from '@csc/adobe-assets-view/dist/src/utils/asset-link/constructAssetLink';\nimport {\n    filterBooleanAttributes,\n    getBaseUrlMap,\n    INVITE_API_VERSION,\n    useHostConfig,\n    useTheme,\n} from '@csc/common';\nimport { useSAM } from '@csc/sam-utils';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport type { ProjectInviteRole } from './types';\nimport { projectRoles } from './types';\nimport { DUMMY_PROJECT_EMAIL_NOTIFICATION } from '../../constants';\nimport useShareSheetPropertiesAndCallbacks from '../../hooks/useShareSheetPropertiesAndCallbacks';\nimport type { IShareSheetCallbacks } from '../../interfaces/ShareSheetInterface';\n\nconst DUMMY_PROJECT_EMAIL_NOTIFICATION_JSON = JSON.stringify(DUMMY_PROJECT_EMAIL_NOTIFICATION);\n\nexport interface BaseProps extends IShareSheetCallbacks {\n    project: SAM.AdobeAsset;\n    hideheader?: boolean;\n    minHeight?: string;\n    minWidth?: string;\n    messageConfigLineHeight?: number;\n}\n\ninterface ProjectProps extends BaseProps {\n    wizarddata?: string;\n    sendmessagerequestevent?: boolean;\n    suppressemailnotifications?: boolean;\n    disablelinkaccess?: boolean;\n    title?: string;\n}\n\ninterface Props extends ProjectProps {\n    roles: ProjectInviteRole[];\n    emailnotification: string;\n    notificationLinkUrl?: string;\n    copyLinkUrl?: string;\n}\n\n/**\n * Common sharesheet configuration for share project/shared folder\n */\nexport const ShareBaseDialog = ({\n    project,\n    wizarddata,\n    sendmessagerequestevent,\n    suppressemailnotifications,\n    disablelinkaccess,\n    roles,\n    emailnotification,\n    notificationLinkUrl,\n    copyLinkUrl,\n    title,\n    hideheader,\n    messageConfigLineHeight = 6,\n    ...callbacks\n}: Props) => {\n    // HTML attributes such as booleans and strings are directly attached to the cc-share-dialog Sharesheet below. However, HTML properties and custom events are managed through this hook.\n    const ref = useShareSheetPropertiesAndCallbacks(callbacks, roles, {\n        lineHeight: messageConfigLineHeight,\n    });\n    const { disableAnalytics, scale } = useHostConfig();\n    const { themeIsExpress } = useTheme();\n\n    return (\n        <cc-share-dialog\n            ref={ref}\n            {...filterBooleanAttributes({\n                sendmessagerequestevent,\n                suppressemailnotifications,\n                disablelinkaccess,\n                hideheader,\n                analyticsenabled: !disableAnalytics,\n                compactlayout: scale === 'large',\n                hideclosebutton: themeIsExpress || Boolean(wizarddata),\n            })}\n            data-testid=\"cc-share-dialog\"\n            assetid={project.id}\n            assetname={project.name}\n            wizarddata={wizarddata}\n            title={title}\n            assettype=\"project\"\n            emailnotification={emailnotification}\n            targeturl={copyLinkUrl}\n            enablefacepile\n            notificationlinkurl={notificationLinkUrl}\n            openeddialog=\"share\"\n            inviteapiversion={INVITE_API_VERSION}\n        />\n    );\n};\n\n/**\n * Common sharesheet configuration for share project workflows:\n * wizard (ProjectCreationWizard) and share dialog (ProjectInviteDialog)\n */\nexport const ShareProjectBaseDialog = ({ project, ...rest }: ProjectProps) => {\n    const { routes: routeTemplates, environment, dispatchEvent, locale } = useHostConfig();\n    const sam = useSAM();\n    const baseUrls = useMemo(() => getBaseUrlMap(environment), [environment]);\n    const [copyLinkUrl, setCopyLinkUrl] = useState<string | undefined>(undefined);\n    const [notificationLinkUrl, setNotificationLinkUrl] = useState<string | undefined>(undefined);\n\n    // Split up targeturl to separate tracking source from email invites vs copy-links via the openFrom query param\n    // See ShareSheet docs for more info https://git.corp.adobe.com/CCX/ccx-sharing/blob/3216350ef5432f0059dce0df1eff19e145bf081b/packages/component-react/README.md#resourceviewurl-default-logic\n    useEffect(() => {\n        void (async () => {\n            const copyLink = await constructAssetLink({\n                asset: project,\n                locale,\n                baseUrls,\n                routeTemplates,\n                linkSource: 'copy-link',\n                dispatchEvent,\n                sam,\n            });\n            const notificationLink = await constructAssetLink({\n                asset: project,\n                locale,\n                baseUrls,\n                routeTemplates,\n                linkSource: 'email-invite',\n                dispatchEvent,\n                sam,\n            });\n            setCopyLinkUrl(copyLink);\n            setNotificationLinkUrl(notificationLink);\n        })();\n    }, [project, locale, baseUrls, routeTemplates, dispatchEvent, sam]);\n\n    if (!copyLinkUrl || !notificationLinkUrl) {\n        return null;\n    }\n    return (\n        <ShareBaseDialog\n            roles={projectRoles}\n            notificationLinkUrl={notificationLinkUrl}\n            copyLinkUrl={copyLinkUrl}\n            // Share project uses server-side external email, but invitations service expects at least a\n            // dummy template. Invite will fail to send if `undefined` template, or will successfully\n            // send but with no email out to invitees if empty object `{}` template.\n            emailnotification={DUMMY_PROJECT_EMAIL_NOTIFICATION_JSON}\n            {...rest}\n            project={project}\n        />\n    );\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useHostConfig } from '@csc/common';\nimport { useEffect, useRef } from 'react';\n\nimport type { ProjectInviteRole } from '../components/ShareBaseDialog/types';\nimport type { IShareSheetCallbacks } from '../interfaces/ShareSheetInterface';\nimport getPlatform from '../utils/getPlatform';\n\nexport default function useShareSheetPropertiesAndCallbacks(\n    callbacks: IShareSheetCallbacks,\n    roles: ProjectInviteRole[],\n    messageConfig: { lineHeight: number },\n) {\n    const {\n        onInviteFulfilled,\n        onInviteRejected,\n        onRemoveFulfilled,\n        onRemoveRejected,\n        onSkip,\n        onIngestEvent,\n    } = callbacks;\n\n    const { productId, appVersion, clientId } = useHostConfig();\n    const ref = useRef<HTMLDivElement>(null);\n\n    useEffect(() => {\n        const { current } = ref;\n        if (current) {\n            // ShareSheet HTML properties (objects and arrays)\n            current['roles'] = roles;\n            current['features'] = { groups: true };\n            current['idpClientId'] = clientId;\n            current['analyticsData'] = {\n                source: {\n                    client_id: clientId,\n                    name: productId,\n                    platform: getPlatform(),\n                    version: appVersion,\n                },\n                event: {\n                    category: 'WEB',\n                },\n            };\n            current['messageConfig'] = messageConfig;\n\n            // ShareSheet HTML custom events (callbacks)\n            if (onIngestEvent) {\n                current.addEventListener('ingestEvent', onIngestEvent as EventListener);\n            }\n            if (onInviteFulfilled) {\n                current.addEventListener('inviteFulfilled', onInviteFulfilled);\n            }\n            if (onInviteRejected) {\n                current.addEventListener('inviteRejected', onInviteRejected);\n            }\n            if (onRemoveFulfilled) {\n                current.addEventListener('removeFulfilled', onRemoveFulfilled);\n            }\n            if (onRemoveRejected) {\n                current.addEventListener('removeRejected', onRemoveRejected);\n            }\n            if (onSkip) {\n                current.addEventListener('skip', onSkip);\n            }\n        }\n\n        return () => {\n            if (current) {\n                if (onIngestEvent) {\n                    current.removeEventListener('ingestEvent', onIngestEvent as EventListener);\n                }\n                if (onInviteFulfilled) {\n                    current.removeEventListener('inviteFulfilled', onInviteFulfilled);\n                }\n                if (onInviteRejected) {\n                    current.removeEventListener('inviteRejected', onInviteRejected);\n                }\n                if (onRemoveFulfilled) {\n                    current.removeEventListener('removeFulfilled', onRemoveFulfilled);\n                }\n                if (onRemoveRejected) {\n                    current.removeEventListener('removeRejected', onRemoveRejected);\n                }\n                if (onSkip) {\n                    current.removeEventListener('skip', onSkip);\n                }\n            }\n        };\n    }, [\n        appVersion,\n        clientId,\n        messageConfig,\n        onIngestEvent,\n        onInviteFulfilled,\n        onInviteRejected,\n        onRemoveFulfilled,\n        onRemoveRejected,\n        onSkip,\n        productId,\n        roles,\n    ]);\n\n    return ref;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useHostConfig, useShareSheetLoader as useShareSheetLoaderCommon } from '@csc/common';\n\nexport default function useShareSheetLoader() {\n    const {\n        appId,\n        environment,\n        locale,\n        clientId,\n        imsData,\n        productId,\n        theme,\n        spectrumTheme,\n        shareSheetVersion,\n    } = useHostConfig();\n\n    return useShareSheetLoaderCommon({\n        appId,\n        environment,\n        locale,\n        clientId,\n        productId,\n        userId: imsData.userId,\n        userEmail: imsData.email,\n        themeType: spectrumTheme,\n        theme,\n        shareSheetVersion,\n    });\n}\n"],"names":["PROJECT_NAME_MAX_LENGTH","DUMMY_PROJECT_EMAIL_NOTIFICATION","sharing","viewer","editor","acceptance","ProjectContext","createContext","NoCollaborators","React","className","styles$2","emptyStateMessage","FormattedMessage","id","defaultMessage","SharedWithSection","observer","collaborators","limit","themeIsExpress","useTheme","people","slice","headerText","map","name","email","collaboratorID","i","key","sharedWithCollaboratorName","CollaboratorName","length","values","count","You","you","_a","userId","useHostConfig","collaboratorName","ellipsis","CreatorName","_b","project","useContext","creator","displayName","CollaboratorPopoverContent","_c","_d","ownerName","storageAssignee","hasPermission","SAM","Write","orgEverybody","collaboratorArray","find","type","c","getProjectOwnerCollaborator","repositoryOwner","ownerID","collaboratorsExcludingOwner","filter","contentBelowDivider","classnames","collaboratorSummary","express","Rule","divider","variant","UserIconAndCount","iconSize","themeIsSpectrum","userIconAndCount","spectrum","IconUserGroup","usersIcon","iconXS","size","userCount","FormattedNumber","value","LoadingPlaceholder","loading","style","children","exampleElement","ExampleElement","dataTestId","styles","loadingGradient","element","FacePileItem","item","avatarURL","getAvatarURL","call","Size50","user","styles$1","facePileItem","facePileItemBackground","src","alt","facePileItemImg","split","n","join","FacePile","items","hasMore","moreCount","faceCount","Math","min","faces","facePileItems","Array","from","reverse","facePile","facePileMore","collaborator","index","facePileItemLoading","CollaboratorCount","isMobile","useMobile","OverlayTrigger","trigger","placement","onClick","e","preventDefault","stopPropagation","tabIndex","Tooltip","open","popoverContent","CollaboratorFacepile","intl","useIntl","ariaLabel","formatMessage","display","CreatorFacePile","useMemo","DirectCollaboratorsFacepile","useDirectCollaborators","projectId","useProject","Provider","ProjectInviteDialog","viewLocation","useShareSheetLoader","sendAnalytics","useProjectSharingAnalytics","width","height","minHeight","minWidth","maxHeight","ShareProjectBaseDialog","onIngestEvent","event","CLIENT_ID","environmentConfigs","stage","FLOODGATE_ENDPOINT","FLOODGATE_CLIENT_ID","FLOODGATE_SANDBOX_NAME","FLOODGATE_GW_IMS_ORG_ID","prod","floodgateFetch","async","accessToken","environment","refreshToken","allowRetry","config","getEnvironmentConfig","url","fetchOptions","method","headers","Authorization","response","fetch","status","newToken","Error","json","releases","features","DEFAULT_FEATURE_FLAGS","floodgateFeatureFlagsCache","FeatureFlagsContext","getSpectrumTheme","spectrumTheme","getBrowserData","ua","version","matches","match","RawProviders","props","documentCallbacks","featureFlags","hostConfigOverrides","mobileConfig","isOnline","sam","enablePerformanceMeasurement","scale","theme","useEffect","window","performance","measure","HostConfigOverrides","MobileProvider","NetworkProvider","online","SpectrumProvider","SAMProvider","IntlProvider","DocumentCallbacksProvider","Providers","adminModeOrgId","appName","appVersion","clientId","disableAnalytics","dispatchEvent","hostFeatureFlags","imsData","locale","productId","showModal","hostShowModal","showToast","hostShowToast","useIntlLoader","samLoaded","useLoadPerformance","useSAMInitializer","loaded","productLocation","ProductLocation","Projects","loadedProps","setLoadedProps","useState","cancelled","preloadSpectrum","then","catch","console","error","useSpectrumPreloader","setFeatureFlags","newFeatureFlags","fetchFeatureFlags","Object","keys","useFeatureFlagsLoader","toastContainer","showToastFallback","useToasts","useCallback","options","showModalResult","useOverlayAPIDialog","Promise","reject","AssetBrowser","NotImplemented","handleShowModalResult","canRender","ingestConfig","allowNoToken","apiKey","data","env","com","navigator","userAgent","category","user_agent","user_guid","source","client_id","platform","product","Ingest","disabled","init","RenderedEvent","withProviders","WrappedComponent","rest","EmptyProjectIllustrationSpectrum","role","viewBox","fill","xmlns","d","strokeWidth","strokeLinecap","strokeLinejoin","cx","cy","r","fillRule","clipRule","IllustratedMessage","heading","imageSrc","imageAlt","img","illustration","IllustratedMessage$1","illustratedMessage","mobile","OfflineIllustration","stroke","ProjectListOfflineState","offlineState","description","noIllustratedMessageTitleToHeading","Header","header","BadgeLoader","TextOverflowEllipsis","target","useRef","setWidth","onResize","debounce","box","useLayoutEffect","current","ceil","getBoundingClientRect","useResizeObserver","ref","round","useWidth","needsTooltip","scrollWidth","offset","wrapper","content","isTabbable","IconWorkfront","Icon","CardActionMenu","actionMenu","hideProjectActions","useOrganizerConfig","DropdownButton","quiet","icon","IconMore","CardBadgeContainer","ProjectBadge","gradient","CardCreatedBy","CardCreatedDate","date","created","unit","selectUnit","FormattedRelativeTime","CardMetadataLoadingPlaceholder","CardTitle","ProjectCardCompact$1","ProjectCardCompact","Boolean","WorkfrontBadge","label","CardCollaborators$1","CardCollaborators","directorySubtype","WF_PROJECT","ProjectCardFull$1","ProjectCardFull","ProjectCardMinimal$1","ProjectCardMinimal","badgeSize","ProjectCardMinimalSmaller$1","ProjectCard","isProject","IconProjectCreate","spectrumSvg","expressSvg","BrandingContext","useBranding","getSpectrumMessages","headingInviteStep","creating","inputPlaceholder","nameHeading","characters","lengthExceeded","maximum","endWithDot","startWithDot","reservedName","duplicate","assetType","inviteFulfilledAll","inviteFailed","getExpressMessages","getAdminConsoleMessages","useMessages","specifiedBranding","branding","selectedBranding","useGradients","projectContext","useSAM","getGradients","gradients","defaultGradient","g","isDefault","useLoading","Swatch","gradientStyle","useFormattedGradient","borderRadius","GradientPicker","onChange","iconsOnly","alignRight","fitContent","Select","icons","gradientPicker","renderItem","option","slot","log","ContentHeaderAdminConsole","messages","adminConsole","ContentHeaderSpectrum","step","useSpectrumMessages","useBreakpoint","isSmallBreakpoint","inviteStep","ContentHeaderExpress","useExpressMessages","contentHeader","createStep","PermissionDeniedContextualHelp","showContextualHelper","component","Button","IconInfo","contextualHelpTrigger","Popover","excludeDialog","popover","positionFix","contextualHelpContent","_CreateSuccessEvent","CustomEvent","constructor","detail","EVENT_NAME","bubbles","composed","CreateSuccessEvent","_CreateFailureEvent","CreateFailureEvent","_CreateCancelEvent","super","CreateCancelEvent","ProjectCreate","setProject","onEvent","ProjectViewLocations","hideGradientPicker","showStepCounter","isExecuting","setIsExecuting","setName","isExpressBranding","useProjectActionAnalytics","sendAupAnalytics","useAupAnalytics","addDuplicate","onNameChange","helpText","useNameValidation","noInput","setGradient","perf","usePerformance","isPermissionReady","setIsPermissionReady","canCreateProjects","setCanCreateProjects","subcategory","subtype","pagename","result","warn","hasError","submitDisabled","randomColorId","floor","random","randomGradient","currentGradient","requireGradient","val","newName","trim","replace","handleEvent","projectName","handleSubmit","finishMeasure","startMeasure","gradientID","createProject","sequence","ui","isSAMError","code","CONFLICT","message","onKeyDown","useEnterKeySubmit","flex","Wait","FooterButtons","stepCounter","total","ButtonGroup","orientation","footerButtons","handleCancel","wizardButton","footer","gradientPickerProps","mobileGradientPicker","textfieldProps","autoFocus","placeholder","textfield","Textfield","mobileTextfield","boxSizing","padding","textfieldWithGradient","textFieldWithGradient","textfieldWithoutGradient","textFieldWithoutGradient","textFieldWithOptionalGradient","formProps","onSubmit","helpTextNode","HelpText","body","badgePreview","alignSelf","mobileFooter","buttonGroup","withDivider","_WizardDoneEvent","WizardDoneEvent","CreateStepContent","WIZARD_DATA","JSON","stringify","enabled","currentStep","totalSteps","showFolderInfoBox","ShareProjectWizardDialog","wizarddata","sendmessagerequestevent","disablelinkaccess","Content","shareSheetProps","onInviteFulfilled","recipients","successCount","statusCode","failureCount","onInviteRejected","onSkip","sharesheet","hideheader","messageConfigLineHeight","sharesheetSpectrum","large","Sidebar$1","illustrationElement","sidebar","info","CreateProjectSidebarAdminConsole","srcSet","illustration1x","illustration2x","illustration3x","InviteToProjectSidebarAdminConsole","illustration1x$1","illustration2x$1","illustration3x$1","Sidebar","CreateProjectSidebarExpress","schedulerInProjects","useFeatureFlagValue","createProject1x","createProject2x","createProject3x","InviteToProjectSidebarExpress","strong","chunks","inviteToProject1x","inviteToProject2x","inviteToProject3x","ProjectCreationWizard","closeModal","containerRef","proceedToInviteStep","NavigationEvent","Project","params","isNewProject","assetId","Success","Cancel","sharedProps","CreateProjectButton","buttonProps","handleClick","_expressUseCustomDesktopWidth","onClose","addEventListener","removeEventListener","ToolbarCreateProjectButton","iconOnly","treatment","IconBuildings","getProjectView","view","All","Yours","SWY","Recent","sortDirToIOrderDirection","sortDir","sortByToProjectOrderField","sortBy","useProjectsDefault","sortDirection","projectView","searchQuery","supportWorkfrontProjects","useHostExtendedConfig","projectsList","loadAll","refreshTimeout","hostAssetContext","list","list2","getProjectsSearchSource","getList","getUSSAdobeAssetOrder","loadAllPages","projects","getProjectOrder","getProjectFilter","directorySubtypes","CC_PROJECTS","useRefreshListOnResume","useProjects","DisplayTypeToggleButton","onViewChange","ListGridIcon","ViewGrid","ViewList","commonProjectViews","expressProjectViews","Labels","all","yours","shared","recent","iconMap","IconAllFiles","IconYourProjects","IconSharedWithYou","BusinessStorageLabel","ProjectSwitcherTabList","selectedIndex","indexOf","tabChanged","location","TabList","Tab","account_type","ProjectViewSwitcherButton","useProjectFilterAnalytics","setOpen","projectViews","onOpen","defaultValue","whiteSpace","IconBusinessStorage","ProjectViewSwitcher","change","projectViewSwitcher","expressPicker","ProjectsSearch","enableSearch","useProjectOrganizerSearchTriggerAnalytics","Search","SortButton","useProjectSortAnalytics","sortOptions","reverseSelected","isReverseSelected","SortIcon","SortOrderUp","SortOrderDown","ReverseSortIcon","onSelect","updatedSortBy","updatedSortDirection","sortType","dropDownMenu","MenuGroup","selects","MenuItem","selected","MenuDivider","dropDownMenuWithTooltip","ProjectsToolbar","isProjectsListEmpty","showListGridToggle","disableViewSwitcher","ReadyFullyLoaded","sortAndDisplayTypeToggleButtonGroup","viewMode","v","viewSwitcher","expressRule","vertical","Toolbar","withOrganizerConfig","CollaboratorColumn","NavigateToGlobalSearchWithQueryButton","ProjectListEmptyState","forwardRef","organizer","slotName","secondaryDescription","button","emptyStateISearchViewllustrationExpress","emptyStateIllustrationExpress","getHeaderCopy","getDescriptionCopy","buttonLabel","getButtonLabelCopy","ProjectListErrorState","errorStateIllustration","PROJECT_CARD_SIZE","minTileWidth","maxTileWidth","tileHeight","infoHeight","rowMargin","columnMargin","PROJECT_CARD_SIZE_MOBILE","ProjectGridItem","GridItem","additionalClassNames","selectionStore","isSelected","hasAny","selectedElements","fireIngestEvent","backingItem","renderRendition","tileWidth","OrganizerConfigProvider","organizerConfig","renderActionMenu","renderTitle","renderTitleAndMetadata","ProjectListCard","hideProjectMetadata","ObservableBadge","ProjectListItem","ListItem","context","styles$3","listItem","listCardItem","this","loadingName","contextType","MobileContext","splitBackedItems","backedItems","unbackedItems","BackedCollectionItem","mapper","mappedItem","title","path","fileExtension","rendition","__decorateClass","computed","prototype","commonProjectPlaceholderProps","ingestSubcategory","onItemClickedHandler","onActionButtonClick","dragDisabled","commonProjectElementPlaceholder","projectGridItemPlaceholder","cardSize","projectListItemPlaceholder","columns","Column","Title","CDO_FEATURE_FLAGS","focusManagementEnabled","enableOnboarding","enableCDOActionBar","enableIconsWithActions","cdoSortDir","UXSortDir","CDO","selectionDisabled","selectionManager","samList","shouldRenderItemAsDisabled","onBeforeItemClicked","onItemClick","cdoTheme","Themes","darkest","dark","lightest","light","themeToCDOTheme","projectActions","actions","useProjectActions","action","execute","isVisible","groupName","Action","valid","exec","elements","_store","useCDOProjectActions","operationStore","OperationStore","SelectionStore","onSelectionChange","SelectionChangeEvent","selection","e2","useProjectOrganizerClickAnalytics","sendSearchAnalytics","useProjectOrganizerSearchResultItemClickAnalytics","itemIndex","findIndex","rank","getRenderer","renderers","asset","getGridViewItem","actionMenuTabIndex","getListViewItem","getItemRenderer","rendererMap","Map","renderer","get","useItemRenderer","listViewColumns","col","uxSortColumn","columnType","ColumnType","Default","activeSortDirection","isActiveSort","cellContentRender","render","overrideListColumns","columns2","nameIndex","predefinedColumn","disableViewOnlyProjects","extendedShouldRenderItemAsDisabled","isItemDisabled","setSelectionBehavior","single","hideFileCheckbox","hideFolderCheckbox","shouldHideCheckbox","onSortSelected","cdoSortBy2","desc","asc","UXSortBy","createDate","pagination","useSAMListPagination","initialPlaceholderElements","renderGridItemPlaceholder","renderListItemPlaceholder","CDOView","launchItems","startOperation","operationState","assetOpState","ProcessingState","Idle","setOperationState","state","setAssetOpState","isFeatureFlagEnabled","flag","themeVariables","ViewMode","List","Grid","activeSort","actionMenuItems","hideActionMenu","toastConfig","GridView","additionalChangeProps","isHeaderVisible","modifiedDate","getPropsForItem","_a2","ListView","hideSelectAllCheckbox","ProjectList","useProjectListRenderAnalytics","useProjectOrganizerSearchResultRenderAnalytics","listCount","totalCount","listDataLoaded","ReadyHasMorePages","cdoMounted","onCDOMount","singleSelectionMode","SingleSelectionManager","selectionUXConfig","clickSelectionMode","ClickSelectType","Single","showCheckbox","showEllipsisOnHover","alwaysShowEllipsis","HadLoaderErrors","getColumns","isSortDisabled","headerTitle","toolbar","SingleBreadcrumb","rootTitle","ProjectsOrganizer$1","hideHeader","useOnline","styles$7","root","Organizer","ProjectsOrganizer","useAnalytics","formatter","fireEvent","aupSdk","SharedConfig","cSdk","eventName","workflowData","fullWorkflowData","module","global","AssetBrowserVersion","fullEventName","ProjectContents","getEventName","workflowContext","createWorkflowContext","fireAnalyticsEvent","referenceId","projectActionEvent","projectSortEvent","projectOrganizerClickEvent","projectListRenderEvent","projectFilterEvent","projectSharingEvent","projectOrganizerSearchTriggerEvent","projectOrganizerSearchResultRenderEvent","projectOrganizerSearchResultItemClickEvent","useLinkedBrandClickAnalytics","linkedBrandClickEvent","feature","includes","getLinkBlob","baseUrls","routes","link","constructAssetLink","routeTemplates","linkSource","Blob","createCopyLinkAction","themeInfo","IconLink","clipboard","write","ClipboardItem","DialogFooter","buttonSize","dir","ProjectDiscardDialog","onSuccess","isLoading","setIsLoading","assetList","useAssetList","AssetsWebLink","ASSETS_WEB_DELETED_LINK","Link","href","discard","dismissTime","actionCallback","callback","args","trackProjectAction","restore","UndoProjectDiscard","arg","Loading","dialogStyles","loadingSpinner","softDelete","isEmpty","ExternalLink","localizedGoUrl","getPrimaryLocale","createDiscardAction","onBefore","IconDelete","Discard","createInviteAction","IconInvite","getErrorMessage","reason","CANNOT_LEAVE_ADDRESS_BOOK_GROUP_MEMBER","CANNOT_LEAVE_IS_OWNER","CANNOT_LEAVE_IS_ADMIN_OF_PROJECT","CANNOT_LEAVE_LAST_COLLABORATOR","CANNOT_LEAVE_NO_COLLABORATORS","CANNOT_LEAVE_LAST_DIRECT_COLLAB_WITH_SHARE_PERMISSION","ProjectLeaveDialog","handleCanLeave","removeCurrentUserFromCollaborationList","handleCannotLeave","leaveStatus","CAN_LEAVE","leaveDialogStyles","container","LoadingState","warning","createLeaveAction","IconLeave","createRenameAction","testId","perfId","RenameDialog","onConfirm","onCancel","onError","Rename","createWorkfrontOpenAction","getWorkfrontContext","workfrontContext","getWorkfrontLink","openLink","onDestructiveActionSuccess","actionFilter","getBaseUrlMap","onBeforeRename","onBeforeDelete","getOpenCloudDocuments","useDocumentCallbacks","checkAllowedAdobeAssetsBeforeOp","getBlockedAssets","getCurrentlyOpenAssets","appId","workfrontProjectsEnabled","excludeMediaTypes","supportCreateLibrary","supportLibraryDropdown","supportLinkedBrands","LIBRARIES_MIMETYPES","LIBRARIES","didMount","listRef","forEach","thumbnailStatus","clearRenditionError","setNeedsRefresh","refresh","projectRoles","preselected","getPlatform","toLowerCase","test","DUMMY_PROJECT_EMAIL_NOTIFICATION_JSON","ShareBaseDialog","suppressemailnotifications","roles","emailnotification","notificationLinkUrl","copyLinkUrl","callbacks","messageConfig","onRemoveFulfilled","onRemoveRejected","groups","useShareSheetPropertiesAndCallbacks","lineHeight","filterBooleanAttributes","analyticsenabled","compactlayout","hideclosebutton","assetid","assetname","assettype","targeturl","enablefacepile","notificationlinkurl","openeddialog","inviteapiversion","INVITE_API_VERSION","setCopyLinkUrl","setNotificationLinkUrl","copyLink","notificationLink","shareSheetVersion","useShareSheetLoader$1","userEmail","themeType"],"sourceRoot":""}