Viewing File: /home/markqprx/iniasli.pro/bootstrap-20260222054357/ssr/server-entry.mjs.map
{"version":3,"file":"server-entry.mjs","sources":["../../common/resources/client/workspace/active-workspace-id.ts","../../common/resources/client/utils/urls/is-absolute-url.ts","../../common/resources/client/utils/http/error-status-is.ts","../../common/resources/client/http/query-client.ts","../../common/resources/client/core/bootstrap-data/use-backend-bootstrap-data.ts","../../common/resources/client/core/settings/site-config-context.ts","../../common/resources/client/i18n/message.ts","../../resources/client/admin/verts/page-top.png","../../resources/client/admin/verts/splash-top.png","../../resources/client/admin/verts/splash-bottom.png","../../resources/client/admin/verts/dashboard-top.png","../../resources/client/admin/verts/frame-top.png","../../resources/client/admin/verts/landing-top.png","../../resources/client/admin/verts/biolink-top.png","../../resources/client/site-config.tsx","../../common/resources/client/icons/svg-icon.tsx","../../common/resources/client/icons/create-svg-icon.tsx","../../common/resources/client/icons/material/GroupAdd.tsx","../../common/resources/client/icons/material/People.tsx","../../common/resources/client/icons/material/FileDownloadDone.tsx","../../common/resources/client/utils/urls/get-asset-url.ts","../../common/resources/client/ui/images/svg-image/svg-image.tsx","../../common/resources/client/ui/images/mixed-image.tsx","../../common/resources/client/ui/buttons/button-size.ts","../../common/resources/client/ui/buttons/get-shared-button-style.ts","../../common/resources/client/utils/dom/create-event-handler.ts","../../common/resources/client/ui/buttons/button-base.tsx","../../common/resources/client/ui/buttons/button.tsx","../../common/resources/client/utils/shallow-equal.ts","../../common/resources/client/core/bootstrap-data/bootstrap-data-context.ts","../../common/resources/client/i18n/selected-locale.ts","../../common/resources/client/i18n/use-user-timezone.ts","../../common/resources/client/i18n/handle-plural-message.tsx","../../common/resources/client/i18n/trans.tsx","../../common/resources/client/i18n/formatted-relative-time.tsx","../../common/resources/client/notifications/notification-line.tsx","../../common/resources/client/notifications/dialog/requests/user-notifications.ts","../../common/resources/client/ui/toast/toast-timer.ts","../../common/resources/client/ui/toast/toast-store.ts","../../common/resources/client/ui/toast/toast.ts","../../common/resources/client/utils/http/get-axios-error-message.ts","../../common/resources/client/utils/http/show-http-error-toast.ts","../../common/resources/client/notifications/requests/use-mark-notifications-as-read.ts","../../common/resources/client/utils/hooks/use-navigate.ts","../../common/resources/client/core/settings/use-settings.ts","../../common/resources/client/notifications/notification-list.tsx","../../common/resources/client/workspace/requests/workspace-query-keys.ts","../../common/resources/client/workspace/user-workspaces.ts","../../common/resources/client/utils/dom/is-ssr.ts","../../common/resources/client/utils/hooks/use-cookie.ts","../../common/resources/client/workspace/active-workspace-id-context.tsx","../../common/resources/client/workspace/requests/join-workspace.ts","../../common/resources/client/workspace/requests/delete-invite.ts","../../common/resources/client/ui/overlays/dialog/dialog-context.ts","../../common/resources/client/workspace/notifications/workspace-invite-notification-renderer.tsx","../../common/resources/client/core/settings/base-site-config.ts","../../common/resources/client/core/root-el.ts","../../common/resources/client/ui/themes/utils/set-theme-value.ts","../../common/resources/client/ui/themes/utils/apply-theme-to-dom.ts","../../common/resources/client/ui/themes/theme-selector-context.ts","../../common/resources/client/core/theme-provider.tsx","../../common/resources/client/core/bootstrap-data/bootstrap-data-provider.tsx","../../common/resources/client/core/common-provider.tsx","../../common/resources/client/utils/hooks/local-storage.ts","../../common/resources/client/auth/use-auth.ts","../../common/resources/client/ui/buttons/icon-button.tsx","../../common/resources/client/icons/material/Close.tsx","../../common/resources/client/i18n/mixed-text.tsx","../../common/resources/client/icons/material/ErrorOutline.tsx","../../common/resources/client/icons/material/CheckCircle.tsx","../../common/resources/client/utils/number/clamp.ts","../../common/resources/client/i18n/use-number-formatter.ts","../../common/resources/client/ui/progress/progress-circle.tsx","../../common/resources/client/ui/toast/toast-container.tsx","../../common/resources/client/auth/ui/use-user.ts","../../common/resources/client/auth/ui/email-verification-page/mail-sent.svg","../../common/resources/client/auth/requests/use-resend-verification-email.ts","../../common/resources/client/ui/themes/use-is-dark-mode.ts","../../common/resources/client/admin/appearance/commands/use-appearance-editor-mode.ts","../../common/resources/client/auth/requests/logout.ts","../../common/resources/client/auth/ui/email-verification-page/email-verification-page.tsx","../../common/resources/client/ui/overlays/store/dialog-store.ts","../../common/resources/client/ui/overlays/floating-position.ts","../../common/resources/client/utils/hooks/use-media-query.ts","../../common/resources/client/utils/hooks/is-mobile-media-query.ts","../../common/resources/client/ui/overlays/popover-animation.ts","../../common/resources/client/ui/overlays/use-overlay-viewport.ts","../../common/resources/client/ui/overlays/popover.tsx","../../common/resources/client/ui/animation/opacity-animation.ts","../../common/resources/client/ui/overlays/underlay.tsx","../../common/resources/client/ui/overlays/tray.tsx","../../common/resources/client/ui/overlays/modal.tsx","../../common/resources/client/ui/forms/listbox/section.tsx","../../common/resources/client/ui/forms/listbox/build-listbox-collection.ts","../../common/resources/client/ui/forms/listbox/use-listbox.ts","../../common/resources/client/ui/forms/listbox/listbox-context.ts","../../common/resources/client/utils/hooks/is-mobile-device.ts","../../common/resources/client/ui/forms/listbox/listbox.tsx","../../common/resources/client/icons/material/Check.tsx","../../common/resources/client/ui/list/list-item-base.tsx","../../common/resources/client/ui/forms/listbox/item.tsx","../../common/resources/client/ui/forms/listbox/use-listbox-keyboard-navigation.ts","../../common/resources/client/i18n/use-collator.ts","../../common/resources/client/ui/forms/listbox/use-type-select.ts","../../common/resources/client/icons/material/Search.tsx","../../common/resources/client/ui/forms/input-field/get-input-field-class-names.ts","../../common/resources/client/ui/forms/input-field/adornment.tsx","../../common/resources/client/utils/objects/remove-empty-values-from-object.ts","../../common/resources/client/ui/forms/input-field/field.tsx","../../common/resources/client/ui/focus/use-auto-focus.ts","../../common/resources/client/ui/forms/input-field/use-field.ts","../../common/resources/client/ui/forms/input-field/text-field/text-field.tsx","../../common/resources/client/ui/navigation/menu/menu-trigger.tsx","../../common/resources/client/ui/navigation/menu/context-menu.tsx","../../common/resources/client/utils/hooks/use-callback-ref.ts","../../common/resources/client/ui/overlays/dialog/dialog-trigger.tsx","../../common/resources/client/ui/overlays/store/dialog-store-outlet.tsx","../../common/resources/client/utils/http/lazy-loader.ts","../../common/resources/client/ui/font-picker/load-fonts.ts","../../common/resources/client/admin/appearance/commands/appearance-listener.tsx","../../common/resources/client/menus/use-custom-menu.ts","../../common/resources/client/menus/custom-menu.tsx","../../common/resources/client/ui/cookie-notice/cookie-notice.tsx","../../common/resources/client/auth/guards/guest-route.tsx","../../common/resources/client/ui/forms/form.tsx","../../common/resources/client/ui/buttons/external-link.tsx","../../common/resources/client/errors/on-form-query-error.ts","../../common/resources/client/auth/requests/use-register.ts","../../common/resources/client/auth/requests/connect-social-with-password.ts","../../common/resources/client/i18n/use-trans.ts","../../common/resources/client/ui/overlays/dialog/dismiss-button.tsx","../../common/resources/client/ui/overlays/dialog/dialog.tsx","../../common/resources/client/ui/overlays/dialog/dialog-header.tsx","../../common/resources/client/ui/overlays/dialog/dialog-body.tsx","../../common/resources/client/ui/overlays/dialog/dialog-footer.tsx","../../common/resources/client/auth/requests/disconnect-social.ts","../../common/resources/client/auth/requests/use-social-login.ts","../../common/resources/client/icons/social/google.tsx","../../common/resources/client/icons/social/facebook.tsx","../../common/resources/client/icons/social/twitter.tsx","../../common/resources/client/icons/social/envato.tsx","../../common/resources/client/auth/ui/social-auth-section.tsx","../../common/resources/client/auth/ui/auth-layout/auth-layout-footer.tsx","../../common/resources/client/auth/ui/auth-layout/auth-bg.svg","../../common/resources/client/auth/ui/auth-layout/auth-layout.tsx","../../common/resources/client/icons/material/CheckBoxOutlineBlank.tsx","../../common/resources/client/ui/forms/toggle/checkbox-filled-icon.tsx","../../common/resources/client/ui/forms/toggle/indeterminate-checkbox-filled-icon.tsx","../../common/resources/client/ui/forms/toggle/checkbox.tsx","../../common/resources/client/recaptcha/use-recaptcha.ts","../../common/resources/client/seo/helmet.tsx","../../common/resources/client/seo/static-page-title.tsx","../../common/resources/client/auth/ui/register-page.tsx","../../common/resources/client/custom-page/use-custom-page.ts","../../common/resources/client/icons/material/Notifications.tsx","../../common/resources/client/ui/badge/badge.tsx","../../common/resources/client/icons/material/DoneAll.tsx","../../common/resources/client/ui/images/illustrated-message.tsx","../../common/resources/client/notifications/empty-state/notify.svg","../../common/resources/client/notifications/empty-state/notification-empty-state-message.tsx","../../common/resources/client/icons/material/Settings.tsx","../../common/resources/client/notifications/dialog/notification-dialog-trigger.tsx","../../common/resources/client/icons/material/Menu.tsx","../../common/resources/client/icons/material/Person.tsx","../../common/resources/client/icons/material/ArrowDropDown.tsx","../../common/resources/client/icons/material/Payments.tsx","../../common/resources/client/icons/material/AccountCircle.tsx","../../common/resources/client/icons/material/DarkMode.tsx","../../common/resources/client/icons/material/LightMode.tsx","../../common/resources/client/icons/material/ExitToApp.tsx","../../common/resources/client/ui/navigation/navbar/navbar-auth-menu.tsx","../../common/resources/client/ui/navigation/navbar/navbar-auth-user.tsx","../../common/resources/client/ui/navigation/navbar/navbar-auth-buttons.tsx","../../common/resources/client/ui/themes/use-dark-theme-variables.ts","../../common/resources/client/ui/navigation/navbar/logo.tsx","../../common/resources/client/ui/themes/use-light-theme-variables.ts","../../common/resources/client/ui/navigation/navbar/navbar.tsx","../../common/resources/client/http/value-lists.ts","../../common/resources/client/icons/material/Language.tsx","../../common/resources/client/icons/material/KeyboardArrowDown.tsx","../../common/resources/client/i18n/change-locale.ts","../../common/resources/client/i18n/locale-switcher.tsx","../../common/resources/client/icons/material/Lightbulb.tsx","../../common/resources/client/ui/footer/footer.tsx","../../common/resources/client/text-editor/highlight/highlight-code.ts","../../common/resources/client/custom-page/custom-page-body.tsx","../../common/resources/client/seo/default-meta-tags.tsx","../../common/resources/client/http/page-meta-tags.tsx","../../common/resources/client/ui/progress/full-page-loader.tsx","../../common/resources/client/ui/not-found-page/404-1.png","../../common/resources/client/ui/not-found-page/404-2.png","../../common/resources/client/ui/not-found-page/not-found-page.tsx","../../common/resources/client/icons/material/Error.tsx","../../common/resources/client/errors/page-error-message.tsx","../../common/resources/client/utils/hooks/use-spin-delay.ts","../../common/resources/client/http/page-status.tsx","../../common/resources/client/custom-page/custom-page-layout.tsx","../../common/resources/client/auth/requests/use-login.ts","../../common/resources/client/auth/ui/two-factor/requests/use-two-factor-challenge.ts","../../common/resources/client/auth/ui/two-factor/two-factor-challenge-page.tsx","../../common/resources/client/auth/ui/login-page.tsx","../../common/resources/client/auth/ui/login-page-wrapper.tsx","../../common/resources/client/ui/dynamic-homepage.tsx","../../common/resources/client/admin/ads/ad-host.tsx","../../resources/client/dashboard/links/utils/url-is-valid.ts","../../resources/client/landing/landing-page-new-link-form.tsx","../../resources/client/landing/use-landing-page-stats.ts","../../common/resources/client/icons/material/Link.tsx","../../common/resources/client/icons/material/Mouse.tsx","../../common/resources/client/i18n/formatted-number.tsx","../../resources/client/landing/landing-page-stats.tsx","../../common/resources/client/ui/skeleton/skeleton.tsx","../../common/resources/client/billing/pricing-table/use-products.ts","../../common/resources/client/billing/pricing-table/find-best-price.ts","../../common/resources/client/ui/forms/input-field/chip-field/cancel-filled-icon.tsx","../../common/resources/client/icons/material/Warning.tsx","../../common/resources/client/ui/tooltip/tooltip.tsx","../../common/resources/client/ui/forms/input-field/chip-field/chip.tsx","../../common/resources/client/i18n/formatted-currency.tsx","../../common/resources/client/i18n/formatted-price.tsx","../../common/resources/client/billing/pricing-table/product-feature-list.tsx","../../common/resources/client/billing/pricing-table/pricing-table.tsx","../../common/resources/client/ui/forms/radio-group/radio.tsx","../../common/resources/client/ui/forms/radio-group/radio-group.tsx","../../common/resources/client/billing/pricing-table/upsell-label.tsx","../../common/resources/client/billing/pricing-table/billing-cycle-radio.tsx","../../resources/client/landing/landing-page.tsx","../../common/resources/client/auth/guards/auth-route.tsx","../../common/resources/client/auth/ui/account-settings/account-settings-panel.tsx","../../common/resources/client/ui/list/list.tsx","../../common/resources/client/icons/material/Login.tsx","../../common/resources/client/icons/material/Lock.tsx","../../common/resources/client/icons/material/PhonelinkLock.tsx","../../common/resources/client/icons/material/Api.tsx","../../common/resources/client/icons/material/Dangerous.tsx","../../common/resources/client/icons/material/Devices.tsx","../../common/resources/client/auth/ui/account-settings/account-settings-sidenav.tsx","../../common/resources/client/auth/ui/account-settings/social-login-panel.tsx","../../common/resources/client/auth/ui/account-settings/basic-info-panel/update-account-details.ts","../../common/resources/client/auth/ui/account-settings/avatar/upload-avatar.ts","../../common/resources/client/auth/ui/account-settings/avatar/remove-avatar.ts","../../common/resources/client/uploads/uploader/strategy/s3-multipart-upload.ts","../../common/resources/client/uploads/uploader/strategy/tus-upload.ts","../../common/resources/client/uploads/types/backend-metadata.ts","../../common/resources/client/uploads/uploader/strategy/s3-upload.ts","../../common/resources/client/uploads/uploader/strategy/axios-upload.ts","../../common/resources/client/uploads/utils/pretty-bytes.ts","../../common/resources/client/uploads/uploader/validate-upload.ts","../../common/resources/client/uploads/uploader/progress-timeout.ts","../../common/resources/client/uploads/uploader/start-uploading.tsx","../../common/resources/client/uploads/utils/extension-from-filename.ts","../../common/resources/client/uploads/utils/get-file-mime.ts","../../common/resources/client/uploads/uploaded-file.ts","../../common/resources/client/uploads/uploader/create-file-upload.ts","../../common/resources/client/uploads/uploader/file-upload-store.ts","../../common/resources/client/uploads/uploader/file-upload-provider.tsx","../../common/resources/client/uploads/utils/create-upload-input.ts","../../common/resources/client/uploads/utils/open-upload-window.ts","../../common/resources/client/uploads/requests/delete-file-entries.ts","../../common/resources/client/uploads/uploader/use-active-upload.ts","../../common/resources/client/uploads/types/upload-input-config.ts","../../common/resources/client/ui/progress/progress-bar-base.tsx","../../common/resources/client/ui/progress/progress-bar.tsx","../../common/resources/client/icons/material/AddAPhoto.tsx","../../common/resources/client/auth/ui/account-settings/avatar/avatar-placeholder-icon.tsx","../../common/resources/client/ui/images/image-selector.tsx","../../common/resources/client/auth/ui/account-settings/basic-info-panel/basic-info-panel.tsx","../../common/resources/client/auth/ui/account-settings/change-password-panel/use-update-password.ts","../../common/resources/client/auth/ui/account-settings/change-password-panel/change-password-panel.tsx","../../common/resources/client/ui/forms/combobox/combobox-end-adornment.tsx","../../common/resources/client/ui/forms/combobox/combobox.tsx","../../common/resources/client/ui/forms/select/select.tsx","../../common/resources/client/auth/ui/account-settings/timezone-select.tsx","../../common/resources/client/auth/ui/account-settings/localization-panel.tsx","../../common/resources/client/i18n/use-date-formatter.ts","../../common/resources/client/i18n/formatted-date.tsx","../../common/resources/client/ui/overlays/dialog/confirmation-dialog.tsx","../../common/resources/client/auth/ui/account-settings/access-token-panel/delete-access-token.ts","../../common/resources/client/auth/ui/account-settings/access-token-panel/create-new-token.ts","../../common/resources/client/auth/ui/account-settings/access-token-panel/create-new-token-dialog.tsx","../../common/resources/client/auth/ui/account-settings/access-token-panel/secure-files.svg","../../common/resources/client/auth/ui/account-settings/access-token-panel/access-token-panel.tsx","../../common/resources/client/auth/ui/account-settings/danger-zone-panel/delete-account.ts","../../common/resources/client/auth/ui/account-settings/danger-zone-panel/danger-zone-panel.tsx","../../common/resources/client/auth/ui/two-factor/requests/use-enable-two-factor.ts","../../common/resources/client/auth/ui/two-factor/stepper/two-factor-stepper-layout.tsx","../../common/resources/client/auth/ui/confirm-password/requests/use-password-confirmation-status.ts","../../common/resources/client/auth/ui/confirm-password/requests/use-confirm-password.ts","../../common/resources/client/auth/ui/confirm-password/confirm-password-dialog.tsx","../../common/resources/client/auth/ui/confirm-password/use-password-confirmed-action.ts","../../common/resources/client/auth/ui/two-factor/stepper/two-factor-disabled-step.tsx","../../common/resources/client/auth/ui/two-factor/requests/use-two-factor-qr-code.ts","../../common/resources/client/auth/ui/two-factor/requests/use-confirm-two-factor.ts","../../common/resources/client/auth/ui/two-factor/requests/use-disable-two-factor.ts","../../common/resources/client/auth/ui/two-factor/stepper/two-factor-confirmation-step.tsx","../../common/resources/client/auth/ui/two-factor/requests/use-regenerate-two-factor-codes.ts","../../common/resources/client/auth/ui/two-factor/stepper/two-factor-enabled-step.tsx","../../common/resources/client/auth/ui/two-factor/stepper/two-factor-auth-stepper.tsx","../../common/resources/client/auth/ui/account-settings/sessions-panel/requests/use-user-sessions.ts","../../common/resources/client/icons/material/Computer.tsx","../../common/resources/client/icons/material/Smartphone.tsx","../../common/resources/client/icons/material/Tablet.tsx","../../common/resources/client/auth/ui/account-settings/sessions-panel/requests/use-logout-other-sessions.ts","../../common/resources/client/auth/ui/account-settings/sessions-panel/sessions-panel.tsx","../../common/resources/client/auth/ui/account-settings/account-settings-page.tsx","../../common/resources/client/auth/requests/send-reset-password-email.ts","../../common/resources/client/auth/ui/forgot-password-page.tsx","../../common/resources/client/auth/requests/reset-password.ts","../../common/resources/client/auth/ui/reset-password-page.tsx","../../common/resources/client/auth/auth-routes.tsx","../../common/resources/client/icons/material/Forum.tsx","../../common/resources/client/billing/pricing-table/pricing-page.tsx","../../common/resources/client/billing/billing-routes.tsx","../../common/resources/client/notifications/notifications-page.tsx","../../common/resources/client/notifications/subscriptions/requests/notification-subscriptions.ts","../../common/resources/client/notifications/subscriptions/requests/update-notification-settings.ts","../../common/resources/client/notifications/subscriptions/notification-settings-page.tsx","../../common/resources/client/notifications/notification-routes.tsx","../../common/resources/client/contact/use-submit-contact-form.ts","../../common/resources/client/contact/contact-us-page.tsx","../../common/resources/client/icons/material/Share.tsx","../../resources/client/dashboard/links/sharing/copy-link-icon.tsx","../../common/resources/client/icons/material/QrCode2.tsx","../../common/resources/client/utils/urls/share-link-socially.ts","../../resources/client/dashboard/links/sharing/share-link-button.tsx","../../resources/client/dashboard/links/utils/build-long-url-with-utm.ts","../../resources/client/short-links/renderers/redirect-countdown-button.tsx","../../resources/client/short-links/renderers/link-page-renderer.tsx","../../resources/client/short-links/floating-link-overlay.tsx","../../resources/client/short-links/renderers/link-overlay-renderer.tsx","../../resources/client/short-links/renderers/link-iframe-renderer.tsx","../../resources/client/short-links/renderers/link-splash-renderer.tsx","../../common/resources/client/utils/urls/remove-protocol.ts","../../common/resources/client/ui/remote-favicon.tsx","../../resources/client/dashboard/links/sharing/link-clipboard-button.tsx","../../common/resources/client/ui/infinite-scroll/infinite-scroll-sentinel.tsx","../../resources/client/dashboard/links/share-link.svg","../../common/resources/client/http/backend-response/pagination-response.ts","../../common/resources/client/ui/infinite-scroll/use-infinite-data.ts","../../resources/client/short-links/renderers/link-group-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/css-props-from-bg-config.ts","../../common/resources/client/icons/material/Image.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/image-widget/image-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/video-embed-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/youtube-widget/youtube-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/text-widget/text-widget-renderer.tsx","../../common/resources/client/icons/material/Email.tsx","../../common/resources/client/icons/social/instagram.tsx","../../common/resources/client/icons/social/tiktok.tsx","../../common/resources/client/icons/social/youtube.tsx","../../common/resources/client/icons/social/soundcloud.tsx","../../common/resources/client/icons/social/bandcamp.tsx","../../common/resources/client/icons/social/linkedin.tsx","../../common/resources/client/icons/social/whatsapp.tsx","../../common/resources/client/icons/social/telegram.tsx","../../common/resources/client/icons/social/twitch.tsx","../../common/resources/client/icons/social/patreon.tsx","../../common/resources/client/icons/social/pinterest.tsx","../../common/resources/client/icons/social/spotify.tsx","../../common/resources/client/icons/social/amazon.tsx","../../common/resources/client/icons/social/snapchat.tsx","../../common/resources/client/icons/social/apple.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-list.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/twitch-widget/twitch-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/soundcloud-widget/soundcloud-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/vimeo-widget/vimeo-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/util.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/spotify-uri.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/local.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/search.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/playlist.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/artist.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/album.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/track.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/episode.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/show.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/user.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/parse.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri/index.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/tiktok-widget/tiktok.png","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/tiktok-widget/tiktok-widget-renderer.tsx","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/types/widget-type.ts","../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-renderers.ts","../../common/resources/client/ui/themes/utils/get-color-brightness.ts","../../resources/client/short-links/renderers/biolink-renderer/biolink-layout.tsx","../../resources/client/short-links/renderers/biolink-renderer/biolink-renderer.tsx","../../resources/client/short-links/requests/use-check-link-password.ts","../../resources/client/short-links/password-page.tsx","../../resources/client/short-links/linkeable-renderer.tsx","../../resources/client/app-routes.tsx","../../resources/client/server-entry.tsx"],"sourcesContent":["// store this in a separate file, to avoid importing query client and axios in pixie\n\nlet activeWorkspaceId = 0;\n\n// for access outside react\nexport function getActiveWorkspaceId() {\n return activeWorkspaceId;\n}\n\nexport function setActiveWorkspaceId(id: number) {\n activeWorkspaceId = id;\n}\n","export function isAbsoluteUrl(url?: string): boolean {\n if (!url) return false;\n return /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/.test(url);\n}\n","import axios from 'axios';\n\nexport function errorStatusIs(err: unknown, status: number): boolean {\n return axios.isAxiosError(err) && err.response?.status == status;\n}\n","import {QueryClient} from '@tanstack/react-query';\nimport axios, {AxiosRequestConfig} from 'axios';\nimport {getActiveWorkspaceId} from '../workspace/active-workspace-id';\nimport {isAbsoluteUrl} from '../utils/urls/is-absolute-url';\nimport {errorStatusIs} from '@common/utils/http/error-status-is';\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30000,\n retry: (failureCount, err) => {\n return (\n !errorStatusIs(err, 401) &&\n !errorStatusIs(err, 403) &&\n !errorStatusIs(err, 404) &&\n failureCount < 2\n );\n },\n },\n },\n});\n\nexport const apiClient = axios.create();\napiClient.defaults.withCredentials = true;\napiClient.defaults.responseType = 'json';\n// @ts-ignore\napiClient.defaults.headers = {\n common: {\n Accept: 'application/json',\n },\n};\n\n// @ts-ignore\napiClient.interceptors.request.use((config: AxiosRequestConfig) => {\n if (\n !config.url?.startsWith('auth') &&\n !config.url?.startsWith('secure') &&\n !isAbsoluteUrl(config?.url)\n ) {\n config.url = `api/v1/${config.url}`;\n }\n\n const method = config.method?.toUpperCase();\n\n // transform array query params in GET request to comma separated string\n if (method === 'GET' && Array.isArray(config.params?.with)) {\n config.params.with = config.params.with.join(',');\n }\n if (method === 'GET' && Array.isArray(config.params?.load)) {\n config.params.load = config.params.load.join(',');\n }\n if (method === 'GET' && Array.isArray(config.params?.loadCount)) {\n config.params.loadCount = config.params.loadCount.join(',');\n }\n\n // add workspace query parameter\n const workspaceId = getActiveWorkspaceId();\n if (workspaceId) {\n const method = config.method?.toLowerCase();\n if (['get', 'post', 'put'].includes(method!)) {\n config.params = {...config.params, workspaceId};\n }\n }\n\n // override PUT, DELETE, PATCH methods, they might not be supported on the backend\n if (method === 'PUT' || method === 'DELETE' || method === 'PATCH') {\n config.headers = {\n ...config.headers,\n 'X-HTTP-Method-Override': method,\n };\n config.method = 'POST';\n config.params = {\n ...config.params,\n _method: method,\n };\n }\n\n if (import.meta.env.SSR) {\n config.headers = {\n ...config.headers,\n referer: 'http://localhost',\n };\n }\n\n return config;\n});\n","import {apiClient, queryClient} from '../../http/query-client';\nimport {BootstrapData} from './bootstrap-data';\nimport {keepPreviousData, useQuery} from '@tanstack/react-query';\n\nconst queryKey = ['bootstrapData'];\n\nexport function getBootstrapData(): BootstrapData {\n return queryClient.getQueryData(queryKey)!;\n}\n\nexport function invalidateBootstrapData() {\n queryClient.invalidateQueries({queryKey});\n}\n\nexport function setBootstrapData(data: string | BootstrapData) {\n queryClient.setQueryData<BootstrapData>(\n queryKey,\n typeof data === 'string' ? decodeBootstrapData(data) : data,\n );\n}\n\nexport function mergeBootstrapData(partialData: Partial<BootstrapData>) {\n setBootstrapData({\n ...getBootstrapData(),\n ...partialData,\n });\n}\n\n// set bootstrap data that was provided with initial request from backend\nconst initialBootstrapData = (\n typeof window !== 'undefined' && window.bootstrapData\n ? decodeBootstrapData(window.bootstrapData)\n : undefined\n) as BootstrapData;\n\n// make sure initial data is available right away when accessing it via \"getBootstrapData()\"\nqueryClient.setQueryData(queryKey, initialBootstrapData);\n\nexport function useBackendBootstrapData() {\n return useQuery({\n queryKey: queryKey,\n queryFn: () => fetchBootstrapData(),\n staleTime: Infinity,\n placeholderData: keepPreviousData,\n initialData: initialBootstrapData,\n });\n}\n\nconst fetchBootstrapData = async (): Promise<BootstrapData> => {\n return apiClient\n .get('http://bedesk.test/api/v1/bootstrap-data')\n .then(response => {\n return decodeBootstrapData(response.data.data);\n });\n};\n\nfunction decodeBootstrapData(data: string | BootstrapData): BootstrapData {\n return typeof data === 'string' ? JSON.parse(data) : data;\n}\n","import React, {ComponentType} from 'react';\nimport type {NotificationListItemProps} from '../../notifications/notification-list';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {User} from '@common/auth/user';\nimport {SvgIconProps} from '@common/icons/svg-icon';\n\nexport interface AdConfig {\n slot: string;\n description: MessageDescriptor;\n image: string;\n}\n\nexport interface TagType {\n name: string;\n system?: boolean;\n}\n\nexport interface CustomPageType {\n type: string;\n label: MessageDescriptor;\n}\n\nexport interface HomepageOption {\n label: MessageDescriptor;\n value: string;\n}\n\nexport interface SiteConfigContextValue {\n auth: {\n redirectUri: string;\n // redirect uri to use when homepage is set to login page, to avoid infinite loop\n secondaryRedirectUri?: string;\n adminRedirectUri: string;\n getUserProfileLink?: (user: User) => string;\n registerFields?: ComponentType;\n accountSettingsPanels?: {\n icon: ComponentType<SvgIconProps>;\n label: MessageDescriptor;\n id: string;\n component: ComponentType<{user: User}>;\n }[];\n };\n notifications: {\n renderMap?: Record<string, ComponentType<NotificationListItemProps>>;\n };\n tags: {\n types: TagType[];\n };\n customPages: {\n types: CustomPageType[];\n };\n settings?: {\n showIncomingMailMethod?: boolean;\n showRecaptchaLinkSwitch?: boolean;\n };\n admin: {\n ads: AdConfig[];\n };\n demo: {\n loginPageDefaults: 'singleAccount' | 'randomAccount';\n email?: string;\n password?: string;\n };\n homepage: {\n options: HomepageOption[];\n };\n}\n\nexport const SiteConfigContext = React.createContext<SiteConfigContextValue>(\n null!,\n);\n","import {MessageDescriptor} from './message-descriptor';\n\ninterface MessageProps extends Omit<MessageDescriptor, 'message'> {}\nexport function message(msg: string, props?: MessageProps): MessageDescriptor {\n return {...props, message: msg};\n}\n","export default \"__VITE_ASSET__a9c2684e__\"","export default \"__VITE_ASSET__01781b47__\"","export default \"__VITE_ASSET__1fd99325__\"","export default \"__VITE_ASSET__c3306937__\"","export default \"__VITE_ASSET__8ef23d46__\"","export default \"__VITE_ASSET__2759f39a__\"","export default \"__VITE_ASSET__8c1c99b5__\"","import {SiteConfigContextValue} from '@common/core/settings/site-config-context';\nimport {message} from '@common/i18n/message';\nimport pageTop from './admin/verts/page-top.png';\nimport splashTop from './admin/verts/splash-top.png';\nimport splashBottom from './admin/verts/splash-bottom.png';\nimport dashboardTop from './admin/verts/dashboard-top.png';\nimport frameTop from './admin/verts/frame-top.png';\nimport landingTop from './admin/verts/landing-top.png';\nimport biolinkTop from './admin/verts/biolink-top.png';\n\nexport const SiteConfig: Partial<SiteConfigContextValue> = {\n homepage: {\n options: [{label: message('Landing page'), value: 'landingPage'}],\n },\n settings: {\n showRecaptchaLinkSwitch: true,\n },\n auth: {\n redirectUri: '/dashboard',\n adminRedirectUri: '/admin',\n },\n tags: {\n types: [{name: 'label', system: true}],\n },\n customPages: {\n types: [{type: 'link_page', label: message('Link page')}],\n },\n admin: {\n ads: [\n {\n slot: 'ads.biolink_top',\n description: message(\n 'This ad will appear at the top of biolink pages.'\n ),\n image: biolinkTop,\n },\n {\n slot: 'ads.splash_top',\n description: message(\n 'This ad will appear at the top of link splash pages.'\n ),\n image: splashTop,\n },\n {\n slot: 'ads.splash_bottom',\n description: message(\n 'This ad will appear at the bottom of link splash pages.'\n ),\n image: splashBottom,\n },\n {\n slot: 'ads.dashboard',\n description: message('This ad will appear on user dashboard page.'),\n image: dashboardTop,\n },\n {\n slot: 'ads.frame',\n description: message('This ad will appear on link frame page.'),\n image: frameTop,\n },\n {\n slot: 'ads.landing',\n description: message('This ad will appear at the top of landing page.'),\n image: landingTop,\n },\n {\n slot: 'ads.link_page',\n description: message('This ad will appear on custom link pages.'),\n image: pageTop,\n },\n ],\n },\n};\n","import React, {forwardRef} from 'react';\nimport clsx from 'clsx';\n\nexport type IconSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | string;\n\nexport interface SvgIconProps extends React.SVGAttributes<SVGElement> {\n children?: React.ReactNode;\n size?: IconSize;\n color?: string;\n title?: string;\n}\n\nexport const SvgIcon = forwardRef<SVGSVGElement, SvgIconProps & {attr?: {}}>(\n (props, ref) => {\n const {\n attr,\n size,\n title,\n className,\n color,\n style,\n children,\n viewBox,\n width,\n height,\n ...svgProps\n } = props;\n\n return (\n <svg\n aria-hidden={!title}\n focusable={false}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={viewBox || '0 0 24 24'}\n {...attr}\n {...svgProps}\n className={clsx('svg-icon', className, getSizeClassName(size))}\n style={{\n color,\n ...style,\n }}\n ref={ref}\n height={height || '1em'}\n width={width || '1em'}\n >\n {title && <title>{title}</title>}\n {children}\n </svg>\n );\n }\n);\n\nfunction getSizeClassName(size?: IconSize) {\n switch (size) {\n case '2xs':\n return 'icon-2xs';\n case 'xs':\n return 'icon-xs';\n case 'sm':\n return 'icon-sm';\n case 'md':\n return 'icon-md';\n case 'lg':\n return 'icon-lg';\n case 'xl':\n return 'icon-xl';\n default:\n return size;\n }\n}\n","import React, {ComponentType, ReactElement, RefObject} from 'react';\nimport {SvgIcon, SvgIconProps} from './svg-icon';\n\nexport function createSvgIcon(\n path: ReactElement | ReactElement[],\n displayName: string = '',\n viewBox?: string\n): ComponentType<SvgIconProps> {\n const Component = (props: SvgIconProps, ref: RefObject<SVGSVGElement>) => (\n <SvgIcon\n data-testid={`${displayName}Icon`}\n ref={ref}\n viewBox={viewBox}\n {...props}\n size={props.size || 'md'}\n >\n {path}\n </SvgIcon>\n );\n\n if (process.env.NODE_ENV !== 'production') {\n // Need to set `displayName` on the inner component for React.memo.\n // React prior to 16.14 ignores `displayName` on the wrapper.\n Component.displayName = `${displayName}Icon`;\n }\n\n return React.memo(React.forwardRef(Component as any));\n}\n\nexport interface IconTree {\n tag: string;\n attr?: {[key: string]: string};\n // Can't use \"IconTree\", otherwise there's circular reference error in hook form\n child?: {tag: string; attr?: {[key: string]: string}}[];\n}\nexport function createSvgIconFromTree(\n data: IconTree[],\n displayName: string = ''\n) {\n const path = treeToElement(data);\n return createSvgIcon(path!, displayName);\n}\n\nfunction treeToElement(\n tree?: IconTree[]\n): React.ReactElement<{}>[] | undefined {\n return (\n tree?.map &&\n tree.map((node, i) => {\n return React.createElement(\n node.tag,\n {key: i, ...node.attr},\n treeToElement(node.child)\n );\n })\n );\n}\n\nexport function elementToTree(el: HTMLElement | SVGElement): IconTree {\n const attributes: IconTree['attr'] = {};\n const tree: IconTree = {tag: el.tagName, attr: attributes};\n Array.from(el.attributes).forEach(attribute => {\n attributes[attribute.name] = attribute.value;\n });\n if (el.children.length) {\n tree.child = Array.from(el.children).map(child =>\n elementToTree(child as HTMLElement)\n );\n }\n return tree;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const GroupAddIcon = createSvgIcon(\n <path d=\"M22 9V7h-2v2h-2v2h2v2h2v-2h2V9zM8 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0-6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm0 7c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4zm6 5H2v-.99C2.2 16.29 5.3 15 8 15s5.8 1.29 6 2v1zM12.51 4.05C13.43 5.11 14 6.49 14 8s-.57 2.89-1.49 3.95C14.47 11.7 16 10.04 16 8s-1.53-3.7-3.49-3.95zm4.02 9.78C17.42 14.66 18 15.7 18 17v3h2v-3c0-1.45-1.59-2.51-3.47-3.17z\" />\n, 'GroupAddOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PeopleIcon = createSvgIcon(\n <path d=\"M9 13.75c-2.34 0-7 1.17-7 3.5V19h14v-1.75c0-2.33-4.66-3.5-7-3.5zM4.34 17c.84-.58 2.87-1.25 4.66-1.25s3.82.67 4.66 1.25H4.34zM9 12c1.93 0 3.5-1.57 3.5-3.5S10.93 5 9 5 5.5 6.57 5.5 8.5 7.07 12 9 12zm0-5c.83 0 1.5.67 1.5 1.5S9.83 10 9 10s-1.5-.67-1.5-1.5S8.17 7 9 7zm7.04 6.81c1.16.84 1.96 1.96 1.96 3.44V19h4v-1.75c0-2.02-3.5-3.17-5.96-3.44zM15 12c1.93 0 3.5-1.57 3.5-3.5S16.93 5 15 5c-.54 0-1.04.13-1.5.35.63.89 1 1.98 1 3.15s-.37 2.26-1 3.15c.46.22.96.35 1.5.35z\" />\n, 'PeopleOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FileDownloadDoneIcon = createSvgIcon(\n <path d=\"M20.13 5.41 18.72 4l-9.19 9.19-4.25-4.24-1.41 1.41 5.66 5.66zM5 18h14v2H5z\" />\n, 'FileDownloadDoneOutlined');\n","import {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {isAbsoluteUrl} from '@common/utils/urls/is-absolute-url';\n\nexport function getAssetUrl(url: string) {\n if (isAbsoluteUrl(url)) {\n return url;\n }\n const assetUrl =\n getBootstrapData().settings.asset_url ||\n getBootstrapData().settings.base_url;\n\n //remove leading slash\n url = url.replace(/^\\/+/g, '');\n\n if (url.startsWith('assets/')) {\n return `${assetUrl}/build/${url}`;\n }\n\n return `${assetUrl}/${url}`;\n}\n","import axios from 'axios';\nimport {useQuery} from '@tanstack/react-query';\nimport {memo} from 'react';\nimport clsx from 'clsx';\nimport {getAssetUrl} from '@common/utils/urls/get-asset-url';\n\ntype DangerousHtml = {__html: string} | undefined;\n\ninterface Props {\n src: string;\n className?: string;\n height?: string | false;\n}\nexport const SvgImage = memo(({src, className, height = 'h-full'}: Props) => {\n const {data: svgString} = useSvgImageContent(src);\n // render container even if image is not loaded yet, so there's\n // no layout shift if height is provided via className\n return (\n <div\n className={clsx(\n 'svg-image-container inline-block bg-no-repeat',\n height,\n className,\n )}\n dangerouslySetInnerHTML={svgString}\n />\n );\n});\n\nfunction useSvgImageContent(src: string) {\n return useQuery({\n queryKey: ['svgImage', getAssetUrl(src)],\n queryFn: () => fetchSvgImageContent(src),\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n staleTime: Infinity,\n enabled: !!src,\n });\n}\n\nfunction fetchSvgImageContent(src: string): Promise<DangerousHtml> {\n return axios\n .get(src, {\n responseType: 'text',\n })\n .then(response => {\n return {__html: response.data};\n });\n}\n","import {ComponentType, HTMLAttributes, memo} from 'react';\nimport {SvgImage} from './svg-image/svg-image';\nimport {SvgIconProps} from '../../icons/svg-icon';\nimport {isAbsoluteUrl} from '@common/utils/urls/is-absolute-url';\n\ninterface Props extends HTMLAttributes<HTMLElement> {\n src: string | ComponentType<SvgIconProps>;\n className?: string;\n}\nexport const MixedImage = memo(({src, className, ...domProps}: Props) => {\n let type: 'svg' | 'image' | 'icon' | null = null;\n\n if (!src) {\n type = null;\n } else if (typeof src === 'object') {\n type = 'icon';\n } else if (\n (src as string).endsWith('.svg') &&\n !isAbsoluteUrl(src as string)\n ) {\n type = 'svg';\n } else {\n type = 'image';\n }\n\n if (type === 'svg') {\n return (\n <SvgImage\n {...domProps}\n className={className}\n src={src as string}\n height={false}\n />\n );\n }\n\n if (type === 'image') {\n return (\n <img {...domProps} className={className} src={src as string} alt=\"\" />\n );\n }\n\n if (type === 'icon') {\n const Icon = src;\n return (\n <Icon\n {...(domProps as HTMLAttributes<SVGElement>)}\n className={className}\n />\n );\n }\n\n return null;\n});\n","import {ButtonVariant} from './get-shared-button-style';\n\nexport type ButtonSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | null;\n\ninterface Props {\n padding?: string;\n equalWidth?: boolean;\n variant?: ButtonVariant;\n}\n\nexport function getButtonSizeStyle(\n size?: ButtonSize,\n {padding, equalWidth, variant}: Props = {}\n): string {\n switch (size) {\n case '2xs':\n if (variant === 'link') return 'text-xs';\n return `text-xs h-24 ${equalWidth ? 'w-24' : padding || 'px-10'}`;\n case 'xs':\n if (variant === 'link') return 'text-xs';\n return `text-xs h-30 ${equalWidth ? 'w-30' : padding || 'px-14'}`;\n case 'sm':\n if (variant === 'link') return 'text-sm';\n return `text-sm h-36 ${equalWidth ? 'w-36' : padding || 'px-18'}`;\n case 'md':\n if (variant === 'link') return 'text-base';\n return `text-base h-42 ${equalWidth ? 'w-42' : padding || 'px-22'}`;\n case 'lg':\n if (variant === 'link') return 'text-lg';\n return `text-base h-50 ${equalWidth ? 'w-50' : padding || 'px-26'}`;\n case 'xl':\n if (variant === 'link') return 'text-xl';\n return `text-lg h-60 ${equalWidth ? 'w-60' : padding || 'px-32'}`;\n default:\n return size || '';\n }\n}\n","export type ButtonVariant =\n | 'text'\n | 'flat'\n | 'raised'\n | 'outline'\n | 'link'\n | null;\nexport type ButtonColor =\n | null\n | 'primary'\n | 'danger'\n | 'positive'\n | 'paper'\n | 'chip'\n | 'white';\n\ninterface SharedButtonStyleProps {\n variant?: ButtonVariant;\n color?: ButtonColor;\n border?: string;\n shadow?: string;\n whitespace?: string;\n display?: string;\n}\nexport function getSharedButtonStyle(\n props: SharedButtonStyleProps,\n): (string | boolean | null | undefined)[] {\n const {\n variant,\n shadow,\n whitespace = 'whitespace-nowrap',\n display = 'inline-flex',\n } = props;\n const variantProps = {...props, border: props.border || 'border'};\n let style: string[] = [];\n if (variant === 'outline') {\n style = outline(variantProps);\n } else if (variant === 'text') {\n style = text(variantProps);\n } else if (variant === 'flat' || variant === 'raised') {\n style = contained(variantProps);\n } else if (variant === 'link') {\n style = link(variantProps);\n }\n\n return [\n ...style,\n shadow || (variant === 'raised' && 'shadow-md'),\n whitespace,\n display,\n variant &&\n 'align-middle flex-shrink-0 items-center transition-button duration-200',\n 'select-none appearance-none no-underline outline-none disabled:pointer-events-none disabled:cursor-default',\n ];\n}\n\nfunction outline({color, border}: SharedButtonStyleProps) {\n const disabled =\n 'disabled:text-disabled disabled:bg-transparent disabled:border-disabled-bg';\n switch (color) {\n case 'primary':\n return [\n `text-primary bg-transparent ${border} border-primary/50`,\n 'hover:bg-primary/hover hover:border-primary',\n disabled,\n ];\n case 'danger':\n return [\n `text-danger bg-transparent ${border} border-danger/50`,\n 'hover:bg-danger/4 hover:border-danger',\n disabled,\n ];\n case 'positive':\n return [\n `text-positive bg-transparent ${border} border-positive/50`,\n 'hover:bg-positive/4 hover:border-positive',\n disabled,\n ];\n case 'paper':\n return [`text bg-paper ${border}`, 'hover:bg-hover', disabled];\n case 'white':\n return [\n 'text-white bg-transparent border border-white',\n 'hover:bg-white/20',\n 'disabled:text-white/70 disabled:border-white/70 disabled:bg-transparent',\n ];\n default:\n return [`bg-transparent ${border}`, 'hover:bg-hover', disabled];\n }\n}\n\nfunction text({color}: SharedButtonStyleProps) {\n const disabled = 'disabled:text-disabled disabled:bg-transparent';\n switch (color) {\n case 'primary':\n return [\n 'text-primary bg-transparent border-transparent',\n 'hover:bg-primary/4',\n disabled,\n ];\n case 'danger':\n return [\n 'text-danger bg-transparent border-transparent',\n 'hover:bg-danger/4',\n disabled,\n ];\n case 'positive':\n return [\n 'text-positive bg-transparent border-transparent',\n 'hover:bg-positive/4',\n disabled,\n ];\n case 'white':\n return [\n 'text-white bg-transparent border-transparent',\n 'hover:bg-white/20',\n 'disabled:text-white/70 disabled:bg-transparent',\n ];\n default:\n return ['bg-transparent border-transparent', 'hover:bg-hover', disabled];\n }\n}\n\nfunction link({color}: SharedButtonStyleProps) {\n switch (color) {\n case 'primary':\n return ['text-primary', 'hover:underline', 'disabled:text-disabled'];\n case 'danger':\n return ['text-danger', 'hover:underline', 'disabled:text-disabled'];\n default:\n return ['text-main', 'hover:underline', 'disabled:text-disabled'];\n }\n}\n\nfunction contained({color, border}: SharedButtonStyleProps) {\n const disabled =\n 'disabled:text-disabled disabled:bg-disabled disabled:border-transparent disabled:shadow-none';\n switch (color) {\n case 'primary':\n return [\n `text-on-primary bg-primary ${border} border-primary`,\n 'hover:bg-primary-dark hover:border-primary-dark',\n disabled,\n ];\n case 'danger':\n return [\n `text-white bg-danger ${border} border-danger`,\n 'hover:bg-danger/90 hover:border-danger/90',\n disabled,\n ];\n case 'chip':\n return [\n `text-main bg-chip ${border} border-chip`,\n 'hover:bg-chip/90 hover:border-chip/90',\n disabled,\n ];\n case 'paper':\n return [\n `text-main bg-paper ${border} border-paper`,\n 'hover:bg-paper/90 hover:border-paper/90',\n disabled,\n ];\n case 'white':\n return [\n `text-black bg-white ${border} border-white`,\n 'hover:bg-white',\n disabled,\n ];\n default:\n return [`bg ${border} border-background`, 'hover:bg-hover', disabled];\n }\n}\n","import {EventHandler, SyntheticEvent} from 'react';\n\nexport function createEventHandler(handler?: EventHandler<SyntheticEvent>) {\n if (!handler) return handler;\n\n return (e: SyntheticEvent) => {\n // ignore events bubbling up from portals\n if (e.currentTarget.contains(e.target as HTMLElement)) {\n handler(e);\n }\n };\n}\n","import React, {\n ComponentPropsWithRef,\n forwardRef,\n JSXElementConstructor,\n} from 'react';\nimport clsx from 'clsx';\nimport {RelativeRoutingType, To} from 'react-router-dom';\nimport {\n ButtonColor,\n ButtonVariant,\n getSharedButtonStyle,\n} from './get-shared-button-style';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\n\nexport interface ButtonBaseProps\n extends Omit<ComponentPropsWithRef<'button'>, 'color'> {\n color?: ButtonColor;\n variant?: ButtonVariant;\n value?: any;\n justify?: string;\n display?: string;\n radius?: string;\n shadow?: string;\n border?: string;\n whitespace?: string;\n form?: string;\n to?: To;\n relative?: RelativeRoutingType;\n href?: string;\n target?: '_blank';\n rel?: string;\n replace?: boolean;\n end?: boolean;\n elementType?: 'button' | 'a' | JSXElementConstructor<any>;\n download?: boolean;\n}\n\nexport const ButtonBase = forwardRef<\n HTMLButtonElement | HTMLLinkElement,\n ButtonBaseProps\n>((props, ref) => {\n const {\n children,\n color = null,\n variant,\n radius,\n shadow,\n whitespace,\n justify = 'justify-center',\n className,\n href,\n form,\n border,\n elementType,\n to,\n relative,\n replace,\n end,\n display,\n type = 'button',\n onClick,\n onPointerDown,\n onPointerUp,\n onKeyDown,\n ...domProps\n } = props;\n const Element = elementType || (href ? 'a' : 'button');\n const isLink = Element === 'a';\n\n return (\n <Element\n ref={ref as any}\n form={isLink ? undefined : form}\n href={href}\n to={to}\n relative={relative}\n type={isLink ? undefined : type}\n replace={replace}\n end={end}\n onPointerDown={createEventHandler(onPointerDown)}\n onPointerUp={createEventHandler(onPointerUp)}\n onClick={createEventHandler(onClick)}\n onKeyDown={createEventHandler(onKeyDown)}\n className={clsx(\n 'focus-visible:ring',\n getSharedButtonStyle({variant, color, border, whitespace, display}),\n radius,\n justify,\n className\n )}\n {...domProps}\n >\n {children}\n </Element>\n );\n});\n","import React, {ReactElement} from 'react';\nimport clsx from 'clsx';\nimport {ButtonSize, getButtonSizeStyle} from './button-size';\nimport {ButtonBase, ButtonBaseProps} from './button-base';\nimport {IconSize} from '../../icons/svg-icon';\n\nexport interface ButtonProps extends ButtonBaseProps {\n size?: ButtonSize;\n sizeClassName?: string;\n equalWidth?: boolean;\n startIcon?: ReactElement | null | false;\n endIcon?: ReactElement | null | false;\n}\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n startIcon,\n endIcon,\n size = 'sm',\n sizeClassName,\n className,\n equalWidth = false,\n radius = 'rounded-button',\n variant = 'text',\n ...other\n },\n ref,\n ) => {\n const mergedClassName = clsx(\n 'font-semibold',\n sizeClassName || getButtonSizeStyle(size, {equalWidth, variant}),\n className,\n );\n return (\n <ButtonBase\n className={mergedClassName}\n ref={ref}\n radius={radius}\n variant={variant}\n {...other}\n >\n {startIcon && (\n <InlineIcon position=\"start\" icon={startIcon} size={size} />\n )}\n {children}\n {endIcon && <InlineIcon position=\"end\" icon={endIcon} size={size} />}\n </ButtonBase>\n );\n },\n);\n\ntype InlineIconProps = {\n icon: ReactElement;\n position: 'start' | 'end';\n size?: IconSize | null;\n};\nfunction InlineIcon({icon, position, size}: InlineIconProps): ReactElement {\n const className = clsx(\n 'm-auto',\n {\n '-ml-4 mr-8': position === 'start',\n '-mr-4 ml-8': position === 'end',\n },\n icon.props.className,\n );\n return React.cloneElement(icon, {className, size});\n}\n","export function shallowEqual<\n T extends Record<string, unknown> = Record<string, unknown>\n>(objA?: T, objB?: T) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objB);\n const len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (let i = 0; i < len; i++) {\n const key = aKeys[i];\n\n if (\n objA[key] !== objB[key] ||\n !Object.prototype.hasOwnProperty.call(objB, key)\n ) {\n return false;\n }\n }\n\n return true;\n}\n","import {BootstrapData} from './bootstrap-data';\nimport {createContext, useContext} from 'react';\n\nexport interface BoostrapDataContextValue<T = BootstrapData> {\n data: T;\n setBootstrapData: (data: string | T) => void;\n mergeBootstrapData: (data: Partial<T>) => void;\n invalidateBootstrapData: () => void;\n}\n\nexport const BoostrapDataContext = createContext<BoostrapDataContextValue>(\n null!\n);\n\nexport function useBootstrapData() {\n return useContext(BoostrapDataContext);\n}\n","import {useBootstrapData} from '../core/bootstrap-data/bootstrap-data-context';\n\nexport function useSelectedLocale() {\n const {\n data: {i18n},\n } = useBootstrapData();\n return {\n locale: i18n,\n localeCode: i18n?.language || 'en',\n lines: i18n?.lines,\n };\n}\n","import {useContext, useMemo} from 'react';\nimport {BoostrapDataContext} from '../core/bootstrap-data/bootstrap-data-context';\nimport {getLocalTimeZone} from '@internationalized/date';\n\nexport function useUserTimezone(): string {\n const {\n data: {user, settings},\n } = useContext(BoostrapDataContext);\n const defaultTimezone = settings.dates.default_timezone;\n const preferredTimezone = user?.timezone || defaultTimezone || 'auto';\n\n return useMemo(() => {\n return !preferredTimezone || preferredTimezone === 'auto'\n ? getLocalTimeZone()\n : preferredTimezone;\n }, [preferredTimezone]);\n}\n","import memoize from 'nano-memoize';\nimport {MessageDescriptor} from './message-descriptor';\n\n// this will get memoized by enclosing function (<Trans> or useTrans)\nexport function handlePluralMessage(\n localeCode: string,\n {message, values}: MessageDescriptor\n): string {\n // find plural config e.g. [one 1 item|other :count items]\n const match = message.match(/\\[(.+?)]/);\n const count = values?.count;\n if (match && match[1] && !Number.isNaN(count)) {\n // get config without brackets and split by pipe e.g. [one 1 item, other :count items]\n const [pluralPlaceholder, pluralConfig] = match;\n const choices = pluralConfig.split('|');\n if (!choices.length) return message;\n\n // use Intl.PluralRules to determine which choice to use, based on special \"count\" value\n const rules = getRules(localeCode);\n const choiceName = rules.select(count as number);\n\n // find the correct choice from config, or use first one\n let choiceConfig = choices.find(c => {\n return c.startsWith(choiceName);\n });\n if (!choiceConfig) {\n choiceConfig = choices[0];\n }\n\n // get rid of plural prefix e.g. one 1 item => 1 item\n const choice = choiceConfig.substring(choiceConfig.indexOf(' ') + 1);\n\n return message.replace(pluralPlaceholder, choice);\n }\n return message;\n}\n\nconst getRules = memoize((localeCode: string) => {\n return new Intl.PluralRules(localeCode);\n});\n","import {cloneElement, Fragment, isValidElement, memo} from 'react';\nimport {shallowEqual} from '../utils/shallow-equal';\nimport {useSelectedLocale} from './selected-locale';\nimport {handlePluralMessage} from './handle-plural-message';\nimport {MessageDescriptor} from './message-descriptor';\n\nexport const Trans = memo((props: MessageDescriptor) => {\n const {message: initialMessage, values} = props;\n const {lines, localeCode} = useSelectedLocale();\n let translatedMessage: string | undefined;\n\n if (Object?.hasOwn(lines || {}, initialMessage)) {\n translatedMessage = lines?.[initialMessage];\n } else if (Object?.hasOwn(lines || {}, initialMessage?.toLowerCase())) {\n translatedMessage = lines?.[initialMessage.toLowerCase()];\n } else {\n translatedMessage = initialMessage;\n }\n\n if (!values || !translatedMessage) {\n return <Fragment>{translatedMessage}</Fragment>;\n }\n\n translatedMessage = handlePluralMessage(localeCode, {\n message: translatedMessage,\n values,\n });\n\n // placeholders that need to be replaced with react element, eg. <Icon/>\n const nodePlaceholders: string[] = [];\n // placeholders that need to be replaced with render fn, eg. <a>link text</a>\n const tagNames: string[] = [];\n\n Object.entries(values).forEach(([key, value]) => {\n // value is react render function\n if (typeof value === 'function') {\n tagNames.push(key);\n // value is react element\n } else if (isValidElement(value)) {\n nodePlaceholders.push(key);\n // value is primitive, can do simple string replace\n } else if (value != undefined) {\n translatedMessage = translatedMessage?.replace(`:${key}`, `${value}`);\n }\n });\n\n // if we need to replace placeholder with react element or render fn, we will need to split the\n // string by these placeholders and replace static string values with matching react element value\n if (tagNames.length || nodePlaceholders.length) {\n // we'll build simple OR regex to split the string eg. (<[ab]>content</[ab]>)|({(?:icon|link)})\n const regexArray: string[] = [];\n if (tagNames.length) {\n const tagNameMatchers = tagNames.join('');\n regexArray.push(`(<[${tagNameMatchers}]>.+?<\\\\/[${tagNameMatchers}]>)`);\n }\n if (nodePlaceholders.length) {\n const nodePlaceholderMatchers = nodePlaceholders.join('|');\n regexArray.push(`(\\:(?:${nodePlaceholderMatchers}))`);\n }\n\n const regex = new RegExp(regexArray.join('|'), 'gm');\n const parts = translatedMessage.split(regex);\n\n // get rid of any empty strings or undefined from split by regex\n const compiledMessage = parts.filter(Boolean).map((part, i) => {\n // it's a tag name placeholder, eg. <a>content</a>\n if (part.startsWith('<') && part.endsWith('>')) {\n // grab tag content\n const matches = part.match(/<([a-z]+)>(.+?)<\\/([a-z]+)>/);\n if (matches) {\n const [, tagName, content] = matches;\n const renderFn = values?.[tagName];\n if (typeof renderFn === 'function') {\n // pass it to render fn from values\n const node = renderFn(content);\n // add a key to avoid react errors\n return cloneElement(node, {key: i});\n }\n }\n }\n\n // it's a regular placeholder with react element value, eg. {icon}\n if (part.startsWith(':')) {\n const key = part.replace(':', '');\n const node = values?.[key];\n if (isValidElement(node)) {\n return cloneElement(node, {key: i});\n }\n }\n\n // it's a regular string\n return part;\n });\n return <Fragment>{compiledMessage}</Fragment>;\n }\n\n return <Fragment>{translatedMessage}</Fragment>;\n}, areEqual);\n\nexport function areEqual<T extends MessageDescriptor = MessageDescriptor>(\n prevProps: T,\n nextProps: T,\n): boolean {\n const {values, ...otherProps} = prevProps;\n const {values: nextValues, ...nextOtherProps} = nextProps;\n return (\n shallowEqual(nextValues, values) &&\n shallowEqual(otherProps as any, nextOtherProps)\n );\n}\n","import {DateValue, parseAbsoluteToLocal} from '@internationalized/date';\nimport {Fragment, memo, useMemo} from 'react';\nimport {shallowEqual} from '@common/utils/shallow-equal';\nimport {useSelectedLocale} from '@common/i18n/selected-locale';\nimport {useUserTimezone} from '@common/i18n/use-user-timezone';\nimport {Trans} from '@common/i18n/trans';\n\nconst DIVISIONS: {amount: number; name: Intl.RelativeTimeFormatUnit}[] = [\n {amount: 60, name: 'seconds'},\n {amount: 60, name: 'minutes'},\n {amount: 24, name: 'hours'},\n {amount: 7, name: 'days'},\n {amount: 4.34524, name: 'weeks'},\n {amount: 12, name: 'months'},\n {amount: Number.POSITIVE_INFINITY, name: 'years'},\n];\n\ninterface FormattedDateProps {\n date?: string | DateValue | Date;\n style?: Intl.RelativeTimeFormatStyle;\n}\nexport const FormattedRelativeTime = memo(\n ({date, style}: FormattedDateProps) => {\n const {localeCode} = useSelectedLocale();\n const timezone = useUserTimezone();\n\n const formatter = useMemo(\n () =>\n new Intl.RelativeTimeFormat(localeCode, {\n numeric: 'auto',\n style,\n }),\n [localeCode, style]\n );\n\n if (!date) {\n return null;\n }\n\n // make sure date with invalid format does not blow up the app\n try {\n if (typeof date === 'string') {\n date = parseAbsoluteToLocal(date).toDate();\n } else if ('toDate' in date) {\n date = date.toDate(timezone);\n }\n } catch (e) {\n return null;\n }\n\n let duration = (date.getTime() - Date.now()) / 1000;\n\n for (let i = 0; i <= DIVISIONS.length; i++) {\n const division = DIVISIONS[i];\n if (Math.abs(duration) < division.amount) {\n if (division.name === 'seconds') {\n return <Trans message=\"a few seconds ago\" />;\n }\n return (\n <Fragment>\n {formatter.format(Math.round(duration), division.name)}\n </Fragment>\n );\n }\n duration /= division.amount;\n }\n\n return <Fragment>{formatter.format(Math.round(duration), 'day')}</Fragment>;\n },\n shallowEqual\n);\n","import {MixedImage} from '../ui/images/mixed-image';\nimport clsx from 'clsx';\nimport React, {JSXElementConstructor} from 'react';\nimport {\n DatabaseNotification,\n DatabaseNotificationLine,\n} from './database-notification';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\n\ninterface LineProps {\n notification: DatabaseNotification;\n line: DatabaseNotificationLine;\n index: number;\n iconRenderer?: JSXElementConstructor<{icon: string}>;\n}\n\nexport function Line({notification, line, index, iconRenderer}: LineProps) {\n const isPrimary = line.type === 'primary' || index === 0;\n const Icon = iconRenderer || DefaultIconRenderer;\n const Element = line.action ? 'a' : 'div';\n\n return (\n <>\n <Element\n key={index}\n className={clsx(\n 'flex items-center gap-8',\n line.action && 'hover:underline',\n isPrimary\n ? 'text-sm mnarktext-main whitespace-nowrap'\n : 'text-xs text-muted mt-6'\n )}\n href={line.action?.action}\n title={line.action?.label}\n >\n {line.icon && <Icon icon={line.icon} />}\n <div\n className=\"overflow-hidden text-ellipsis\"\n dangerouslySetInnerHTML={{__html: line.content}}\n />\n </Element>\n {index === 0 && (\n <time className=\"text-xs text-muted\">\n <FormattedRelativeTime date={notification.created_at} />\n </time>\n )}\n </>\n );\n}\n\ninterface DefaultIconRendererProps {\n icon: string;\n}\nfunction DefaultIconRenderer({icon}: DefaultIconRendererProps) {\n return <MixedImage src={icon} />;\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {DatabaseNotification} from '@common/notifications/database-notification';\nimport {apiClient} from '@common/http/query-client';\n\nconst Endpoint = 'notifications';\n\nexport interface FetchUserNotificationsResponse\n extends PaginatedBackendResponse<DatabaseNotification> {\n //\n}\n\ninterface Payload {\n perPage?: number;\n}\n\nexport function useUserNotifications(payload?: Payload) {\n return useQuery({\n queryKey: useUserNotifications.key,\n queryFn: () => fetchUserNotifications(payload),\n });\n}\n\nfunction fetchUserNotifications(\n payload?: Payload,\n): Promise<FetchUserNotificationsResponse> {\n return apiClient\n .get(Endpoint, {params: payload})\n .then(response => response.data);\n}\n\nuseUserNotifications.key = [Endpoint];\n","export class ToastTimer {\n private timerId?: ReturnType<typeof setTimeout>;\n private createdAt: number = 0;\n\n constructor(private callback: () => void, private remaining: number) {\n this.resume();\n }\n\n pause() {\n clearTimeout(this.timerId);\n this.remaining -= Date.now() - this.createdAt;\n }\n\n resume() {\n this.createdAt = Date.now();\n if (this.timerId) {\n clearTimeout(this.timerId);\n }\n this.timerId = setTimeout(this.callback, this.remaining);\n }\n\n clear() {\n clearTimeout(this.timerId);\n }\n}\n","import {create} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {nanoid} from 'nanoid';\nimport {ToastTimer} from './toast-timer';\n\ntype ToastType = 'danger' | 'default' | 'positive' | 'loading' | null;\ntype ToastPosition = 'bottom-center' | 'bottom-right';\n\ninterface ToastAction {\n label: string | MessageDescriptor;\n action: string;\n}\n\nexport interface ToastOptions {\n type?: ToastType;\n action?: ToastAction;\n id?: string | number;\n duration?: number;\n position?: 'bottom-center' | 'bottom-right';\n disableExitAnimation?: boolean;\n disableEnterAnimation?: boolean;\n}\n\ninterface Toast {\n timer?: ToastTimer | null;\n message: string | MessageDescriptor;\n type: ToastType;\n id: string | number;\n duration: number;\n action?: ToastAction;\n position: ToastPosition;\n disableExitAnimation?: boolean;\n disableEnterAnimation?: boolean;\n}\n\ninterface ToastStore {\n toasts: Toast[];\n add: (message: Toast['message'], opts?: ToastOptions) => void;\n remove: (toastId: string | number) => void;\n}\n\nconst maximumVisible = 1;\n\nfunction getDefaultDuration(type: ToastType) {\n switch (type) {\n case 'danger':\n return 8000;\n case 'loading':\n return 0;\n default:\n return 3000;\n }\n}\n\nexport const useToastStore = create<ToastStore>()(\n immer((set, get) => ({\n toasts: [],\n add: (message, opts) => {\n const amountToRemove = get().toasts.length + 1 - maximumVisible;\n if (amountToRemove > 0) {\n set(state => {\n state.toasts.splice(0, amountToRemove);\n });\n }\n\n const toastId = opts?.id || nanoid(6);\n const toastType = opts?.type || 'positive';\n const duration = opts?.duration ?? getDefaultDuration(toastType);\n const toast: Toast = {\n timer:\n duration > 0\n ? new ToastTimer(() => get().remove(toastId), duration)\n : null,\n message,\n ...opts,\n id: toastId,\n type: toastType,\n position: opts?.position || 'bottom-center',\n duration,\n disableExitAnimation: opts?.disableExitAnimation,\n disableEnterAnimation: opts?.disableEnterAnimation,\n };\n\n const toastIndex = get().toasts.findIndex(t => t.id === toast.id);\n if (toastIndex > -1) {\n set(state => {\n state.toasts[toastIndex] = toast;\n });\n } else {\n set(state => {\n state.toasts.push(toast);\n });\n }\n },\n remove: toastId => {\n const newToasts = get().toasts.filter(toast => {\n if (toastId === toast.id) {\n toast.timer?.clear();\n return false;\n }\n return true;\n });\n set(state => {\n state.toasts = newToasts;\n });\n },\n }))\n);\n\nexport function toastState() {\n return useToastStore.getState();\n}\n","import {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {ToastOptions, toastState} from './toast-store';\n\nexport function toast(\n message: MessageDescriptor | string,\n opts?: ToastOptions\n) {\n toastState().add(message, opts);\n}\n\ntoast.danger = (message: MessageDescriptor | string, opts?: ToastOptions) => {\n toastState().add(message, {...opts, type: 'danger'});\n};\n\ntoast.positive = (message: MessageDescriptor | string, opts?: ToastOptions) => {\n toastState().add(message, {...opts, type: 'positive'});\n};\n\ntoast.loading = (message: MessageDescriptor | string, opts?: ToastOptions) => {\n toastState().add(message, {...opts, type: 'loading'});\n};\n","import axios from 'axios';\nimport {BackendErrorResponse} from '../../errors/backend-error-response';\n\nexport function getAxiosErrorMessage(\n err: unknown,\n field?: string | null\n): string | undefined {\n if (axios.isAxiosError(err) && err.response) {\n const response = err.response.data as BackendErrorResponse;\n\n if (field != null) {\n const fieldMessage = response.errors?.[field];\n return Array.isArray(fieldMessage) ? fieldMessage[0] : fieldMessage;\n }\n\n return response?.message;\n }\n}\n","import {toast} from '../../ui/toast/toast';\nimport {getAxiosErrorMessage} from './get-axios-error-message';\nimport {message} from '../../i18n/message';\nimport {ToastOptions} from '@common/ui/toast/toast-store';\n\nconst defaultErrorMessage = message('There was an issue. Please try again.');\n\nexport function showHttpErrorToast(\n err: unknown,\n defaultMessage = defaultErrorMessage,\n field?: string | null,\n toastOptions?: ToastOptions\n) {\n toast.danger(getAxiosErrorMessage(err, field) || defaultMessage, {\n action: (err as any).response?.data?.action,\n ...toastOptions,\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {useUserNotifications} from '../dialog/requests/user-notifications';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\nimport {useBootstrapData} from '../../core/bootstrap-data/bootstrap-data-context';\n\ninterface Response extends BackendResponse {\n unreadCount: number;\n}\n\ninterface Payload {\n ids?: string[];\n markAllAsUnread?: boolean;\n}\n\nexport function useMarkNotificationsAsRead() {\n const {data, mergeBootstrapData} = useBootstrapData();\n return useMutation({\n mutationFn: (props: Payload) => UseMarkNotificationsAsRead(props),\n onSuccess: response => {\n queryClient.invalidateQueries({queryKey: useUserNotifications.key});\n if (response.unreadCount === 0) {\n mergeBootstrapData({\n user: {...data.user!, unread_notifications_count: 0},\n });\n }\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction UseMarkNotificationsAsRead(payload: Payload): Promise<Response> {\n return apiClient\n .post('notifications/mark-as-read', payload)\n .then(r => r.data);\n}\n","import {\n createPath,\n NavigateFunction,\n resolvePath,\n useLocation,\n useNavigate as useRouterNavigate\n} from 'react-router-dom';\nimport {useCallback} from 'react';\n\nexport function useNavigate() {\n const routerNavigate = useRouterNavigate();\n const location = useLocation();\n\n return useCallback(\n (to, options) => {\n // prevent duplicates in history when navigating to the same url\n const replace =\n createPath(location) === createPath(resolvePath(to, location.pathname));\n\n routerNavigate(to, {\n ...options,\n replace: options?.replace !== false && replace,\n });\n },\n [routerNavigate, location]\n ) as NavigateFunction;\n}\n","import {Settings} from './settings';\nimport {useBootstrapData} from '../bootstrap-data/bootstrap-data-context';\n\nexport function useSettings(): Settings {\n const {\n data: {settings},\n } = useBootstrapData();\n return settings;\n}\n","import React, {JSXElementConstructor, useContext} from 'react';\nimport {GroupAddIcon} from '../icons/material/GroupAdd';\nimport {PeopleIcon} from '../icons/material/People';\nimport {FileDownloadDoneIcon} from '../icons/material/FileDownloadDone';\nimport {\n DatabaseNotification,\n DatabaseNotificationAction,\n} from './database-notification';\nimport {MixedImage} from '../ui/images/mixed-image';\nimport {Button} from '../ui/buttons/button';\nimport {SiteConfigContext} from '../core/settings/site-config-context';\nimport {Line} from './notification-line';\nimport {SvgIconProps} from '../icons/svg-icon';\nimport clsx from 'clsx';\nimport {useMarkNotificationsAsRead} from './requests/use-mark-notifications-as-read';\nimport {useNavigate} from '../utils/hooks/use-navigate';\nimport {isAbsoluteUrl} from '../utils/urls/is-absolute-url';\nimport {Link} from 'react-router-dom';\nimport {useSettings} from '../core/settings/use-settings';\n\nconst iconMap = {\n 'group-add': GroupAddIcon,\n people: PeopleIcon,\n 'export-csv': FileDownloadDoneIcon,\n} as Record<string, JSXElementConstructor<SvgIconProps>>;\n\ninterface NotificationListProps {\n notifications: DatabaseNotification[];\n className?: string;\n}\nexport function NotificationList({\n notifications,\n className,\n}: NotificationListProps) {\n const {notifications: config} = useContext(SiteConfigContext);\n\n return (\n <div className={className}>\n {notifications.map((notification, index) => {\n const isLast = notifications.length - 1 === index;\n const Renderer =\n config?.renderMap?.[notification.type] || NotificationListItem;\n return (\n <Renderer\n key={notification.id}\n notification={notification}\n isLast={isLast}\n />\n );\n })}\n </div>\n );\n}\n\nexport interface NotificationListItemProps {\n notification: DatabaseNotification;\n onActionButtonClick?: ButtonActionsProps['onActionClick'];\n lineIconRenderer?: JSXElementConstructor<{icon: string}>;\n isLast: boolean;\n}\nexport function NotificationListItem({\n notification,\n onActionButtonClick,\n lineIconRenderer,\n isLast,\n}: NotificationListItemProps) {\n const markAsRead = useMarkNotificationsAsRead();\n const navigate = useNavigate();\n const mainAction = notification.data.mainAction;\n\n const showUnreadIndicator = !notification.data.image && !notification.read_at;\n\n return (\n <div\n onClick={() => {\n if (!markAsRead.isPending && !notification.read_at) {\n markAsRead.mutate({ids: [notification.id]});\n }\n if (mainAction?.action) {\n if (isAbsoluteUrl(mainAction.action)) {\n window.open(mainAction.action, '_blank')?.focus();\n } else {\n navigate(mainAction.action);\n }\n }\n }}\n className={clsx(\n 'flex items-start gap-14 px-32 py-20 bg-alt relative',\n !isLast && 'border-b',\n mainAction?.action && 'cursor-pointer',\n !notification.read_at\n ? 'bg-paper hover:bg-primary/10'\n : 'hover:bg-hover',\n )}\n title={mainAction?.label ? mainAction.label : undefined}\n >\n {showUnreadIndicator && (\n <div className=\"absolute left-16 top-26 w-8 h-8 shadow rounded-full bg-primary flex-shrink-0\" />\n )}\n {notification.data.image && (\n <MixedImage\n className=\"w-24 h-24 flex-shrink-0 text-muted\"\n src={iconMap[notification.data.image] || notification.data.image}\n />\n )}\n <div className=\"min-w-0\">\n {notification.data.lines.map((line, index) => (\n <Line\n iconRenderer={lineIconRenderer}\n notification={notification}\n line={line}\n index={index}\n key={index}\n />\n ))}\n <ButtonActions\n onActionClick={onActionButtonClick}\n notification={notification}\n />\n </div>\n </div>\n );\n}\n\ninterface ButtonActionsProps {\n notification: DatabaseNotification;\n onActionClick?: (\n e: React.MouseEvent,\n action: DatabaseNotificationAction,\n ) => void;\n}\nfunction ButtonActions({notification, onActionClick}: ButtonActionsProps) {\n const {base_url} = useSettings();\n if (!notification.data.buttonActions) return null;\n\n // if there's no action handler provided, assume action is internal url and render a link\n return (\n <div className=\"mt-12 flex items-center gap-12\">\n {notification.data.buttonActions.map((action, index) => (\n <Button\n key={index}\n size=\"xs\"\n variant={index === 0 ? 'flat' : 'outline'}\n color={index === 0 ? 'primary' : null}\n elementType={!onActionClick ? Link : undefined}\n to={!onActionClick ? action.action.replace(base_url, '') : undefined}\n onClick={e => {\n onActionClick?.(e, action);\n }}\n >\n {action.label}\n </Button>\n ))}\n </div>\n );\n}\n","export const WorkspaceQueryKeys = {\n fetchUserWorkspaces: ['user-workspaces'],\n workspaceWithMembers: (id: number) => ['workspace-with-members', id],\n};\n","import {useQuery} from '@tanstack/react-query';\nimport {WorkspaceQueryKeys} from './requests/workspace-query-keys';\nimport {Workspace} from './types/workspace';\nimport {BackendResponse} from '../http/backend-response/backend-response';\nimport {apiClient} from '../http/query-client';\n\nexport interface FetchUserWorkspacesResponse extends BackendResponse {\n workspaces: Workspace[];\n}\n\nexport const PersonalWorkspace: Workspace = {\n name: 'Default',\n default: true,\n id: 0,\n members_count: 1,\n};\n\nfunction fetchUserWorkspaces(): Promise<FetchUserWorkspacesResponse> {\n return apiClient.get(`me/workspaces`).then(response => response.data);\n}\n\nfunction addPersonalWorkspaceToResponse(response: FetchUserWorkspacesResponse) {\n return [PersonalWorkspace, ...response.workspaces];\n}\n\nexport function useUserWorkspaces() {\n return useQuery({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n queryFn: fetchUserWorkspaces,\n placeholderData: {workspaces: []},\n select: addPersonalWorkspaceToResponse,\n });\n}\n","export function isSsr() {\n return import.meta.env.SSR;\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {isSsr} from '@common/utils/dom/is-ssr';\n\ninterface Options {\n days?: number;\n path?: string;\n domain?: string;\n SameSite?: 'None' | 'Lax' | 'Strict';\n Secure?: boolean;\n HttpOnly?: boolean;\n}\n\n// used to notify different instances of useCookie hook about cookie changes\nconst listeners = new Set<{name: string; callback: any}>();\nconst listenForCookieChange = (\n name: string,\n callback: (value: string) => void\n) => {\n if (isSsr()) return () => {};\n const listener = {name, callback};\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n};\n\nexport function stringifyOptions(options: Options) {\n return Object.keys(options).reduce((acc, _key) => {\n const key = _key as keyof Options;\n if (key === 'days') {\n return acc;\n } else {\n if (options[key] === false) {\n return acc;\n } else if (options[key] === true) {\n return `${acc}; ${key}`;\n } else {\n return `${acc}; ${key}=${options[key]}`;\n }\n }\n }, '');\n}\n\nexport const setCookie = (name: string, value: string, options?: Options) => {\n if (isSsr()) return;\n\n const optionsWithDefaults = {\n days: 7,\n path: '/',\n ...options,\n };\n\n const expires = new Date(\n Date.now() + optionsWithDefaults.days * 864e5\n ).toUTCString();\n\n document.cookie =\n name +\n '=' +\n encodeURIComponent(value) +\n '; expires=' +\n expires +\n stringifyOptions(optionsWithDefaults);\n\n listeners.forEach(listener => {\n if (listener.name === name) {\n listener.callback(value);\n }\n });\n};\n\nexport const getCookie = (name: string, initialValue = '') => {\n return (\n (!isSsr() &&\n document.cookie.split('; ').reduce((r, v) => {\n const parts = v.split('=');\n return parts[0] === name ? decodeURIComponent(parts[1]) : r;\n }, '')) ||\n initialValue\n );\n};\n\nexport function useCookie(key: string, initialValue?: string) {\n const [item, setItem] = useState(() => {\n return getCookie(key, initialValue);\n });\n\n useEffect(() => {\n return listenForCookieChange(key, value => {\n setItem(value);\n });\n }, [key]);\n\n const updateItem = useCallback(\n (value: string, options?: Options) => {\n setItem(value);\n setCookie(key, value, options);\n },\n [key]\n );\n\n return [item, updateItem] as const;\n}\n","import React, {useContext, useEffect, useMemo} from 'react';\nimport {Workspace} from './types/workspace';\nimport {PersonalWorkspace, useUserWorkspaces} from './user-workspaces';\nimport {setActiveWorkspaceId} from './active-workspace-id';\nimport {useCookie} from '@common/utils/hooks/use-cookie';\n\nexport interface ActiveWorkspaceIdContextValue {\n workspaceId: number | null;\n setWorkspaceId: (id: number) => void;\n}\n\n// add default context value so it does not error out, if there's no context provider\nexport const ActiveWorkspaceIdContext =\n React.createContext<ActiveWorkspaceIdContextValue>({\n // set default as null, so it's not sent via query params in admin and\n // other places if component is not wrapped in workspace context explicitly\n workspaceId: null,\n setWorkspaceId: () => {},\n });\n\nexport function useActiveWorkspaceId(): ActiveWorkspaceIdContextValue {\n return useContext(ActiveWorkspaceIdContext);\n}\n\nexport function useActiveWorkspace(): Workspace | null | undefined {\n const {workspaceId} = useActiveWorkspaceId();\n const query = useUserWorkspaces();\n if (query.data) {\n return query.data.find(workspace => workspace.id === workspaceId);\n }\n return null;\n}\n\ninterface ActiveWorkspaceProviderProps {\n children: any;\n}\nexport function ActiveWorkspaceProvider({\n children,\n}: ActiveWorkspaceProviderProps) {\n const [workspaceId, setCookieId] = useCookie(\n 'activeWorkspaceId',\n `${PersonalWorkspace.id}`\n );\n\n useEffect(() => {\n setActiveWorkspaceId(parseInt(workspaceId));\n // clear workspace id when unmounting workspace provider\n return () => {\n setActiveWorkspaceId(0);\n };\n }, [workspaceId]);\n\n const contextValue: ActiveWorkspaceIdContextValue = useMemo(() => {\n return {\n workspaceId: parseInt(workspaceId),\n setWorkspaceId: (id: number) => {\n setCookieId(`${id}`);\n },\n };\n }, [workspaceId, setCookieId]);\n\n return (\n <ActiveWorkspaceIdContext.Provider value={contextValue}>\n {children}\n </ActiveWorkspaceIdContext.Provider>\n );\n}\n","import axios from 'axios';\nimport {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {Workspace} from '../types/workspace';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {useActiveWorkspaceId} from '../active-workspace-id-context';\nimport {useUserNotifications} from '../../notifications/dialog/requests/user-notifications';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n workspace: Workspace;\n}\n\ninterface Props {\n inviteId: string;\n}\n\nexport function useJoinWorkspace() {\n const {setWorkspaceId} = useActiveWorkspaceId() || {};\n return useMutation({\n mutationFn: (props: Props) => joinWorkspace(props),\n onSuccess: response => {\n toast(message('Joined workspace'));\n setWorkspaceId(response.workspace.id);\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n queryClient.invalidateQueries({queryKey: useUserNotifications.key});\n },\n onError: e => {\n if (axios.isAxiosError(e) && e.response && e.response.status === 404) {\n queryClient.invalidateQueries({queryKey: useUserNotifications.key});\n toast.danger(message('This invite is no longer valid'));\n } else {\n showHttpErrorToast(e);\n }\n },\n });\n}\n\nfunction joinWorkspace({inviteId}: Props): Promise<Response> {\n return apiClient.get(`workspace/join/${inviteId}`).then(r => r.data);\n}\n","import axios from 'axios';\nimport {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {useUserNotifications} from '../../notifications/dialog/requests/user-notifications';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Props {\n inviteId: string;\n}\n\nfunction deleteInvite({inviteId}: Props): Promise<Response> {\n return apiClient.delete(`workspace/invite/${inviteId}`).then(r => r.data);\n}\n\nexport function useDeleteInvite() {\n return useMutation({\n mutationFn: (props: Props) => deleteInvite(props),\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: useUserNotifications.key});\n toast(message('Declined workspace invitation'));\n },\n onError: e => {\n if (axios.isAxiosError(e) && e.response && e.response.status === 404) {\n queryClient.invalidateQueries({queryKey: useUserNotifications.key});\n toast.danger(message('This invite is no longer valid'));\n } else {\n showHttpErrorToast(e);\n }\n },\n });\n}\n","import React, {ComponentPropsWithRef, useContext} from 'react';\n\nexport type DialogType = 'modal' | 'popover' | 'tray';\n\nexport interface DialogContextValue {\n labelId: string;\n descriptionId: string;\n type: DialogType;\n isDismissable?: boolean;\n close: (value?: any) => void;\n formId: string;\n dialogProps: ComponentPropsWithRef<'div'>;\n disableInitialTransition?: boolean;\n}\n\nexport const DialogContext = React.createContext<DialogContextValue>(null!);\n\nexport function useDialogContext() {\n return useContext(DialogContext);\n}\n","import {\n NotificationListItem,\n NotificationListItemProps,\n} from '../../notifications/notification-list';\nimport {\n DatabaseNotification,\n DatabaseNotificationData,\n} from '../../notifications/database-notification';\nimport {useJoinWorkspace} from '../requests/join-workspace';\nimport {useDeleteInvite} from '../requests/delete-invite';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\n\nexport interface WorkspaceInviteNotification extends DatabaseNotification {\n data: DatabaseNotificationData & {inviteId: string};\n}\n\nexport function WorkspaceInviteNotificationRenderer(\n props: NotificationListItemProps\n) {\n const {notification} = props;\n const joinWorkspace = useJoinWorkspace();\n const deleteInvite = useDeleteInvite();\n const dialogContextValue = useDialogContext();\n\n return (\n <NotificationListItem\n {...props}\n onActionButtonClick={(e, {action}) => {\n const data = (notification as WorkspaceInviteNotification).data;\n if (action === 'join') {\n joinWorkspace.mutate({\n inviteId: data.inviteId,\n });\n }\n if (action === 'decline') {\n deleteInvite.mutate({\n inviteId: data.inviteId,\n });\n }\n dialogContextValue?.close();\n }}\n />\n );\n}\n","import {SiteConfigContextValue} from './site-config-context';\nimport {WorkspaceInviteNotificationRenderer} from '../../workspace/notifications/workspace-invite-notification-renderer';\nimport {message} from '../../i18n/message';\n\nconst workspaceInviteNotif =\n 'Common\\\\Workspaces\\\\Notifications\\\\WorkspaceInvitation';\n\nexport const BaseSiteConfig: SiteConfigContextValue = {\n auth: {\n redirectUri: '/',\n adminRedirectUri: '/admin',\n },\n tags: {\n types: [{name: 'custom'}],\n },\n customPages: {\n types: [{type: 'default', label: message('Default')}],\n },\n notifications: {\n renderMap: {\n [workspaceInviteNotif]: WorkspaceInviteNotificationRenderer,\n },\n },\n admin: {\n ads: [],\n },\n demo: {\n loginPageDefaults: 'singleAccount',\n },\n homepage: {\n options: [\n {label: message('Login page'), value: 'loginPage'},\n {label: message('Registration page'), value: 'registerPage'},\n ],\n },\n};\n","export let rootEl = (\n typeof document !== 'undefined'\n ? document.getElementById('root') ?? document.body\n : undefined\n) as HTMLElement;\n\nexport let themeEl = (\n typeof document !== 'undefined' ? document.documentElement : undefined\n) as HTMLElement;\n\nexport function setRootEl(el: HTMLElement) {\n rootEl = el;\n themeEl = el;\n}\n","import {themeEl} from '@common/core/root-el';\n\nexport function setThemeValue(key: string, value: string) {\n themeEl?.style.setProperty(key, value);\n}\n\nexport function removeThemeValue(key: string) {\n themeEl?.style.removeProperty(key);\n}\n","import {CssTheme} from '../css-theme';\nimport {setThemeValue} from './set-theme-value';\nimport {themeEl} from '@common/core/root-el';\n\nexport function applyThemeToDom(theme: CssTheme) {\n Object.entries(theme.values).forEach(([key, value]) => {\n setThemeValue(key, value);\n });\n if (theme.is_dark) {\n themeEl.classList.add('dark');\n } else {\n themeEl.classList.remove('dark');\n }\n}\n","import {createContext, useContext} from 'react';\nimport {CssTheme} from './css-theme';\n\nexport type ThemeId = 'light' | 'dark' | number;\n\nexport interface ThemeSelectorContextValue {\n allThemes: CssTheme[];\n selectedTheme: CssTheme;\n selectTheme: (themeId: ThemeId) => void;\n}\n\nexport const ThemeSelectorContext = createContext<ThemeSelectorContextValue>(\n null!\n);\n\nexport function useThemeSelector() {\n return useContext(ThemeSelectorContext);\n}\n","import React, {useMemo} from 'react';\nimport {applyThemeToDom} from '../ui/themes/utils/apply-theme-to-dom';\nimport {\n ThemeId,\n ThemeSelectorContext,\n ThemeSelectorContextValue,\n} from '../ui/themes/theme-selector-context';\nimport {CssTheme} from '../ui/themes/css-theme';\nimport {useSettings} from './settings/use-settings';\nimport {useBootstrapData} from './bootstrap-data/bootstrap-data-context';\nimport {useCookie} from '@common/utils/hooks/use-cookie';\n\nconst STORAGE_KEY = 'be-active-theme';\n\ninterface ThemeProviderProps {\n children: any;\n}\nexport function ThemeProvider({children}: ThemeProviderProps) {\n const {themes} = useSettings();\n const canChangeTheme = themes?.user_change;\n const {data} = useBootstrapData();\n const allThemes = useMemo(() => data.themes.all || [], [data.themes.all]);\n const initialThemeId = data.themes.selectedThemeId || undefined;\n\n const [selectedThemeId, setSelectedThemeId] = useCookie(\n STORAGE_KEY,\n `${initialThemeId}`,\n );\n\n let selectedTheme = canChangeTheme\n ? allThemes.find(t => t.id == selectedThemeId)\n : allThemes.find(t => t.id == themes?.default_id);\n if (!selectedTheme) {\n selectedTheme = allThemes[0];\n }\n\n const contextValue: ThemeSelectorContextValue = useMemo(() => {\n return {\n allThemes,\n selectedTheme: selectedTheme!,\n selectTheme: (id: ThemeId) => {\n if (!canChangeTheme) return;\n const theme = findTheme(allThemes, id);\n if (theme) {\n setSelectedThemeId(`${theme.id}`);\n applyThemeToDom(theme);\n }\n },\n };\n }, [allThemes, selectedTheme, setSelectedThemeId, canChangeTheme]);\n\n return (\n <ThemeSelectorContext.Provider value={contextValue}>\n {children}\n </ThemeSelectorContext.Provider>\n );\n}\n\nfunction findTheme(themes: CssTheme[], id: ThemeId) {\n return themes.find(t => {\n if (id === 'light') {\n return t.default_light === true;\n }\n if (id === 'dark') {\n return t.default_dark === true;\n }\n return t.id === id;\n });\n}\n","import React, {useMemo} from 'react';\nimport {\n invalidateBootstrapData,\n mergeBootstrapData,\n setBootstrapData,\n useBackendBootstrapData,\n} from './use-backend-bootstrap-data';\nimport {\n BoostrapDataContext,\n BoostrapDataContextValue,\n} from './bootstrap-data-context';\n\ninterface BootstrapDataProviderProps {\n children: any;\n}\nexport function BootstrapDataProvider({children}: BootstrapDataProviderProps) {\n const {data} = useBackendBootstrapData();\n\n const value: BoostrapDataContextValue = useMemo(() => {\n return {\n data: data,\n setBootstrapData: setBootstrapData,\n mergeBootstrapData: mergeBootstrapData,\n invalidateBootstrapData: invalidateBootstrapData,\n };\n }, [data]);\n\n return (\n <BoostrapDataContext.Provider value={value}>\n {children}\n </BoostrapDataContext.Provider>\n );\n}\n","import React from 'react';\nimport {QueryClientProvider} from '@tanstack/react-query';\nimport {domAnimation, LazyMotion} from 'framer-motion';\nimport {queryClient} from '../http/query-client';\nimport {SiteConfigContext} from './settings/site-config-context';\nimport {SiteConfig} from '@app/site-config';\nimport deepMerge from 'deepmerge';\nimport {BaseSiteConfig} from './settings/base-site-config';\nimport {ThemeProvider} from './theme-provider';\nimport {BootstrapDataProvider} from './bootstrap-data/bootstrap-data-provider';\n\ninterface ProvidersProps {\n children: any;\n}\n\nconst mergedConfig = deepMerge(BaseSiteConfig, SiteConfig);\n\nexport function CommonProvider({children}: ProvidersProps) {\n return (\n <QueryClientProvider client={queryClient}>\n <LazyMotion features={domAnimation}>\n <SiteConfigContext.Provider value={mergedConfig}>\n <BootstrapDataProvider>\n <ThemeProvider>{children}</ThemeProvider>\n </BootstrapDataProvider>\n </SiteConfigContext.Provider>\n </LazyMotion>\n </QueryClientProvider>\n );\n}\n","import {useEffect, useState} from 'react';\n\ninterface StoreEvent {\n detail: {\n key: string;\n newValue: any;\n };\n}\n\nexport function useLocalStorage<T>(key: string, initialValue: T | null = null) {\n const [storedValue, setStoredValue] = useState<T>(() => {\n return getFromLocalStorage<T>(key, initialValue);\n });\n\n const setValue = (value: T | ((val: T) => T)) => {\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n setInLocalStorage(key, valueToStore);\n window.dispatchEvent(\n new CustomEvent('storage', {\n detail: {key, newValue: valueToStore},\n })\n );\n };\n\n // update state value using custom storage event. This will re-render\n // component even if local storage value was set from different hook instance\n useEffect(() => {\n const handleStorageChange = (event: StoreEvent) => {\n if (event.detail?.key === key) {\n setStoredValue(event.detail.newValue);\n }\n };\n window.addEventListener('storage', handleStorageChange as any);\n return () =>\n window.removeEventListener('storage', handleStorageChange as any);\n }, [key]);\n\n return [storedValue, setValue] as const;\n}\n\nexport function getFromLocalStorage<T>(\n key: string,\n initialValue: T | null = null\n) {\n if (typeof window === 'undefined') {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return item != null ? JSON.parse(item) : initialValue;\n } catch (error) {\n return initialValue;\n }\n}\n\nexport function setInLocalStorage<T>(key: string, value: T) {\n try {\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(key, JSON.stringify(value));\n }\n } catch (error) {\n //\n }\n}\n\nexport function removeFromLocalStorage(key: string) {\n try {\n if (typeof window !== 'undefined') {\n window.localStorage.removeItem(key);\n }\n } catch (error) {\n //\n }\n}\n","import {User} from './user';\nimport {useCallback, useContext} from 'react';\nimport {SiteConfigContext} from '../core/settings/site-config-context';\nimport {getFromLocalStorage} from '../utils/hooks/local-storage';\nimport {useBootstrapData} from '../core/bootstrap-data/bootstrap-data-context';\nimport {Permission} from '@common/auth/permission';\n\ninterface UseAuthReturn {\n user: User | null;\n hasPermission: (permission: string) => boolean;\n getPermission: (permission: string) => Permission | undefined;\n getRestrictionValue: (\n permission: string,\n restriction: string,\n ) => string | number | boolean | undefined | null;\n hasRole: (roleId: number) => boolean;\n isLoggedIn: boolean;\n isSubscribed: boolean;\n getRedirectUri: () => string;\n}\nexport function useAuth(): UseAuthReturn {\n const {\n data: {user, guest_role},\n } = useBootstrapData();\n const {\n auth: {redirectUri = '/'},\n } = useContext(SiteConfigContext);\n\n const getPermission = useCallback(\n (name: string): Permission | undefined => {\n const permissions = user?.permissions || guest_role?.permissions;\n if (!permissions) return;\n return permissions.find(p => p.name === name);\n },\n [user?.permissions, guest_role?.permissions],\n );\n\n const getRestrictionValue = useCallback(\n (\n permissionName: string,\n restrictionName: string,\n ): string | number | boolean | undefined | null => {\n const permission = getPermission(permissionName);\n let restrictionValue = null;\n if (permission) {\n const restriction = permission.restrictions.find(\n r => r.name === restrictionName,\n );\n restrictionValue = restriction ? restriction.value : undefined;\n }\n return restrictionValue;\n },\n [getPermission],\n );\n\n const hasPermission = useCallback(\n (name: string): boolean => {\n const permissions = user?.permissions || guest_role?.permissions;\n\n const isAdmin = permissions?.find(p => p.name === 'admin') != null;\n return isAdmin || getPermission(name) != null;\n },\n [user?.permissions, guest_role?.permissions, getPermission],\n );\n\n const isSubscribed = user?.subscriptions?.find(sub => sub.valid) != null;\n\n const getRedirectUri = useCallback(() => {\n const onboarding = getFromLocalStorage('be.onboarding.selected');\n if (onboarding) {\n return `/checkout/${onboarding.productId}/${onboarding.priceId}`;\n }\n return redirectUri;\n }, [redirectUri]);\n\n const hasRole = useCallback(\n (roleId: number) => {\n return user?.roles?.find(role => role.id === roleId) != null;\n },\n [user],\n );\n\n return {\n user,\n hasPermission,\n getPermission,\n getRestrictionValue,\n isLoggedIn: !!user,\n isSubscribed,\n hasRole,\n // where to redirect user after successful login\n getRedirectUri,\n };\n}\n","import React, {cloneElement, forwardRef, ReactElement} from 'react';\nimport clsx from 'clsx';\nimport {ButtonSize, getButtonSizeStyle} from './button-size';\nimport {ButtonBase, ButtonBaseProps} from './button-base';\nimport {BadgeProps} from '@common/ui/badge/badge';\n\nexport interface IconButtonProps extends ButtonBaseProps {\n children: ReactElement;\n padding?: string;\n size?: ButtonSize | null;\n iconSize?: ButtonSize | null;\n equalWidth?: boolean;\n badge?: ReactElement<BadgeProps>;\n}\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n children,\n size = 'md',\n // only set icon size based on button size if \"ButtonSize\" is passed in and not custom className\n iconSize = size && size.length <= 3 ? size : 'md',\n variant = 'text',\n radius = 'rounded-button',\n className,\n padding,\n equalWidth = true,\n badge,\n ...other\n },\n ref,\n ) => {\n const mergedClassName = clsx(\n getButtonSizeStyle(size, {padding, equalWidth, variant}),\n className,\n badge && 'relative',\n );\n\n return (\n <ButtonBase\n {...other}\n ref={ref}\n radius={radius}\n variant={variant}\n className={mergedClassName}\n >\n {cloneElement(children, {size: iconSize})}\n {badge}\n </ButtonBase>\n );\n },\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CloseIcon = createSvgIcon(\n <path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n, 'CloseOutlined');\n","import {MessageDescriptor} from './message-descriptor';\nimport {Trans} from './trans';\nimport {Fragment} from 'react';\n\ninterface Props {\n value?: string | MessageDescriptor | null;\n}\nexport function MixedText({value}: Props) {\n if (!value) {\n return null;\n }\n if (typeof value === 'string') {\n return <Fragment>{value}</Fragment>;\n }\n return <Trans {...value} />;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ErrorOutlineIcon = createSvgIcon(\n <path d=\"M11 15h2v2h-2v-2zm0-8h2v6h-2V7zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\" />\n, 'ErrorOutlineOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CheckCircleIcon = createSvgIcon(\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm4.59-12.42L10 14.17l-2.59-2.58L6 13l4 4 8-8z\" />\n, 'CheckCircleOutlined');\n","export function clamp(num: number, min: number, max: number) {\n return Math.min(Math.max(num, min), max);\n}\n","import {NumberFormatOptions, NumberFormatter} from '@internationalized/number';\nimport {useMemo} from 'react';\nimport {useSelectedLocale} from './selected-locale';\n\nexport function useNumberFormatter(\n options: NumberFormatOptions = {}\n): Intl.NumberFormat {\n const {localeCode} = useSelectedLocale();\n return useMemo(\n () => new NumberFormatter(localeCode, options),\n [localeCode, options]\n );\n}\n","import React, {ComponentPropsWithoutRef, CSSProperties} from 'react';\nimport clsx from 'clsx';\nimport {clamp} from '../../utils/number/clamp';\nimport {useNumberFormatter} from '../../i18n/use-number-formatter';\n\nexport interface ProgressCircleProps extends ComponentPropsWithoutRef<'div'> {\n value?: number;\n minValue?: number;\n maxValue?: number;\n size?: 'xs' | 'sm' | 'md' | 'lg' | string;\n isIndeterminate?: boolean;\n className?: string;\n position?: string;\n trackColor?: string;\n fillColor?: string;\n}\nexport const ProgressCircle = React.forwardRef<\n HTMLDivElement,\n ProgressCircleProps\n>((props, ref) => {\n let {\n value = 0,\n minValue = 0,\n maxValue = 100,\n size = 'md',\n isIndeterminate = false,\n className,\n position = 'relative',\n trackColor,\n fillColor = 'border-primary',\n ...domProps\n } = props;\n\n value = clamp(value, minValue, maxValue);\n const circleSize = getCircleStyle(size);\n\n const percentage = (value - minValue) / (maxValue - minValue);\n const formatter = useNumberFormatter({style: 'percent'});\n\n let valueLabel = '';\n if (!isIndeterminate && !valueLabel) {\n valueLabel = formatter.format(percentage);\n }\n\n const subMask1Style: CSSProperties = {};\n const subMask2Style: CSSProperties = {};\n if (!isIndeterminate) {\n const percentage = ((value - minValue) / (maxValue - minValue)) * 100;\n let angle;\n if (percentage > 0 && percentage <= 50) {\n angle = -180 + (percentage / 50) * 180;\n subMask1Style.transform = `rotate(${angle}deg)`;\n subMask2Style.transform = 'rotate(-180deg)';\n } else if (percentage > 50) {\n angle = -180 + ((percentage - 50) / 50) * 180;\n subMask1Style.transform = 'rotate(0deg)';\n subMask2Style.transform = `rotate(${angle}deg)`;\n }\n }\n\n return (\n <div\n {...domProps}\n aria-valuenow={isIndeterminate ? undefined : value}\n aria-valuemin={minValue}\n aria-valuemax={maxValue}\n aria-valuetext={isIndeterminate ? undefined : valueLabel}\n role=\"progressbar\"\n ref={ref}\n className={clsx(\n 'progress-circle',\n position,\n circleSize,\n isIndeterminate && 'indeterminate',\n className\n )}\n >\n <div className={clsx(circleSize, trackColor, 'rounded-full border-4')} />\n <div\n className={clsx(\n 'fills absolute left-0 top-0 h-full w-full',\n isIndeterminate && 'progress-circle-fills-animate'\n )}\n >\n <FillMask\n circleSize={circleSize}\n subMaskStyle={subMask1Style}\n isIndeterminate={isIndeterminate}\n className=\"rotate-180\"\n fillColor={fillColor}\n subMaskClassName={clsx(\n isIndeterminate && 'progress-circle-fill-submask-1-animate'\n )}\n />\n <FillMask\n circleSize={circleSize}\n subMaskStyle={subMask2Style}\n isIndeterminate={isIndeterminate}\n fillColor={fillColor}\n subMaskClassName={clsx(\n isIndeterminate && 'progress-circle-fill-submask-2-animate'\n )}\n />\n </div>\n </div>\n );\n});\n\ninterface FillMaskProps {\n className?: string;\n circleSize?: string;\n subMaskStyle: CSSProperties;\n subMaskClassName: string;\n isIndeterminate?: boolean;\n fillColor?: string;\n}\nfunction FillMask({\n subMaskStyle,\n subMaskClassName,\n className,\n circleSize,\n isIndeterminate,\n fillColor,\n}: FillMaskProps) {\n return (\n <div\n className={clsx(\n 'absolute h-full w-1/2 origin-[100%] overflow-hidden',\n className\n )}\n >\n <div\n className={clsx(\n 'h-full w-full origin-[100%] rotate-180 overflow-hidden',\n !isIndeterminate && 'transition-transform duration-100',\n subMaskClassName\n )}\n style={subMaskStyle}\n >\n <div className={clsx(circleSize, fillColor, 'rounded-full border-4')} />\n </div>\n </div>\n );\n}\n\nfunction getCircleStyle(size: ProgressCircleProps['size']) {\n switch (size) {\n case 'xs':\n return 'w-20 h-20';\n case 'sm':\n return 'w-24 h-24';\n case 'md':\n return 'w-32 h-32';\n case 'lg':\n return 'w-42 h-42';\n default:\n return size;\n }\n}\n","import {AnimatePresence, m, Target, TargetAndTransition} from 'framer-motion';\nimport React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../buttons/icon-button';\nimport {CloseIcon} from '../../icons/material/Close';\nimport {MixedText} from '../../i18n/mixed-text';\nimport {Button} from '../buttons/button';\nimport {toastState, useToastStore} from './toast-store';\nimport {Link} from 'react-router-dom';\nimport {ErrorOutlineIcon} from '../../icons/material/ErrorOutline';\nimport {CheckCircleIcon} from '../../icons/material/CheckCircle';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\n\nconst initial: Target = {opacity: 0, y: 50, scale: 0.3};\nconst animate: TargetAndTransition = {opacity: 1, y: 0, scale: 1};\nconst exit: TargetAndTransition = {\n opacity: 0,\n scale: 0.5,\n};\n\nexport function ToastContainer() {\n const toasts = useToastStore(s => s.toasts);\n\n return (\n <div className=\"relative pointer-events-none\">\n <AnimatePresence initial={false}>\n {toasts.map(toast => (\n <div\n key={toast.id}\n className={clsx(\n 'fixed mx-auto p-20 z-toast',\n toast.position === 'bottom-center'\n ? 'left-0 right-0 bottom-0'\n : 'right-0 bottom-0'\n )}\n >\n <m.div\n initial={toast.disableEnterAnimation ? undefined : initial}\n animate={toast.disableEnterAnimation ? undefined : animate}\n exit={toast.disableExitAnimation ? undefined : exit}\n className={clsx(\n 'flex items-center gap-10 min-w-288 max-w-500 shadow-lg w-min rounded-lg pl-16 pr-6 py-6 text-sm pointer-events-auto max-h-100 bg-paper text-main bg-paper border mx-auto min-h-50'\n )}\n onPointerEnter={() => toast.timer?.pause()}\n onPointerLeave={() => toast.timer?.resume()}\n role=\"alert\"\n aria-live={toast.type === 'danger' ? 'assertive' : 'polite'}\n >\n {toast.type === 'danger' && (\n <ErrorOutlineIcon\n className=\"text-danger flex-shrink-0\"\n size=\"md\"\n />\n )}\n {toast.type === 'loading' && (\n <ProgressCircle\n size=\"sm\"\n className=\"flex-shrink-0\"\n isIndeterminate\n />\n )}\n {toast.type === 'positive' && (\n <CheckCircleIcon\n className=\"text-positive flex-shrink-0\"\n size=\"md\"\n />\n )}\n\n <div\n className=\"overflow-hidden overflow-ellipsis w-max mr-auto\"\n data-testid=\"toast-message\"\n >\n <MixedText value={toast.message} />\n </div>\n\n {toast.action && (\n <Button\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n className=\"flex-shrink-0\"\n onFocus={() => toast.timer?.pause()}\n onBlur={() => toast.timer?.resume()}\n onClick={() => toastState().remove(toast.id)}\n elementType={Link}\n to={toast.action.action}\n >\n <MixedText value={toast.action.label} />\n </Button>\n )}\n {toast.type !== 'loading' && (\n <IconButton\n onFocus={() => toast.timer?.pause()}\n onBlur={() => toast.timer?.resume()}\n type=\"button\"\n className=\"flex-shrink-0\"\n onClick={() => {\n toastState().remove(toast.id);\n }}\n size=\"sm\"\n >\n <CloseIcon />\n </IconButton>\n )}\n </m.div>\n </div>\n ))}\n </AnimatePresence>\n </div>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {User} from '../user';\nimport {apiClient} from '../../http/query-client';\n\nexport interface FetchUseUserResponse extends BackendResponse {\n user: User;\n}\n\ninterface Params {\n with: string[];\n}\n\ntype UserId = number | string | 'me';\nconst queryKey = (id: UserId, params?: Params) => {\n const key: any[] = ['users', `${id}`];\n if (params) {\n key.push(params);\n }\n return key;\n};\n\nexport function useUser(id: UserId, params?: Params) {\n return useQuery({\n queryKey: queryKey(id, params),\n queryFn: () => fetchUser(id, params),\n });\n}\n\nfunction fetchUser(id: UserId, params?: Params): Promise<FetchUseUserResponse> {\n return apiClient.get(`users/${id}`, {params}).then(response => response.data);\n}\n","export default \"__VITE_ASSET__29738208__\"","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {message} from '../../i18n/message';\nimport {apiClient} from '../../http/query-client';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n message: string;\n}\n\nexport interface ResendConfirmEmailPayload {\n email: string;\n}\n\nexport function useResendVerificationEmail() {\n return useMutation({\n mutationFn: resendEmail,\n onSuccess: () => {\n toast(message('Email sent'));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction resendEmail(payload: ResendConfirmEmailPayload): Promise<Response> {\n return apiClient\n .post('auth/email/verification-notification', payload)\n .then(response => response.data);\n}\n","import {useThemeSelector} from './theme-selector-context';\n\nexport function useIsDarkMode(): boolean {\n const {selectedTheme} = useThemeSelector();\n return selectedTheme.is_dark ?? false;\n}\n","import {isSsr} from '@common/utils/dom/is-ssr';\n\nexport function useAppearanceEditorMode() {\n return {\n isAppearanceEditorActive:\n !isSsr() &&\n ((window.frameElement as HTMLIFrameElement) || undefined)?.src.includes(\n 'appearanceEditor=true'\n ),\n };\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\nimport {useAppearanceEditorMode} from '../../admin/appearance/commands/use-appearance-editor-mode';\nimport {message} from '../../i18n/message';\nimport {useBootstrapData} from '../../core/bootstrap-data/bootstrap-data-context';\n\ninterface Response extends BackendResponse {\n bootstrapData: string;\n}\n\nconst appearanceMessage = \"Can't logout while in appearance editor.\";\n\nexport function useLogout() {\n const navigate = useNavigate();\n const {isAppearanceEditorActive} = useAppearanceEditorMode();\n const {setBootstrapData} = useBootstrapData();\n return useMutation({\n mutationFn: () => (isAppearanceEditorActive ? noopLogout() : logout()),\n onSuccess: response => {\n // need to update bootstrap data in order for redirect to login page to work\n setBootstrapData(response.bootstrapData);\n queryClient.clear();\n navigate('/login');\n\n // need to clear query client and then set bootstrap data again immediately,\n // because there's no way to clear everything except one in react query\n queryClient.clear();\n setBootstrapData(response.bootstrapData);\n },\n onError: err =>\n showHttpErrorToast(\n err,\n isAppearanceEditorActive ? message(appearanceMessage) : undefined,\n ),\n });\n}\n\nfunction logout(): Promise<Response> {\n return apiClient.post('auth/logout').then(r => r.data);\n}\n\nfunction noopLogout() {\n return Promise.reject(appearanceMessage);\n}\n","import {useUser} from '@common/auth/ui/use-user';\nimport {Trans} from '@common/i18n/trans';\nimport mailSentSvg from './mail-sent.svg';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {Button} from '@common/ui/buttons/button';\nimport {useResendVerificationEmail} from '@common/auth/requests/use-resend-verification-email';\nimport {useIsDarkMode} from '@common/ui/themes/use-is-dark-mode';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useLogout} from '@common/auth/requests/logout';\n\nexport function EmailVerificationPage() {\n const {data} = useUser('me');\n const resendEmail = useResendVerificationEmail();\n const {\n branding: {logo_light, logo_dark},\n } = useSettings();\n const isDarkMode = useIsDarkMode();\n const logoSrc = isDarkMode ? logo_light : logo_dark;\n const logout = useLogout();\n\n return (\n <div className=\"flex min-h-screen w-screen flex-col items-center bg-alt p-24\">\n {logoSrc && (\n <img\n src={logoSrc}\n alt=\"Site logo\"\n className=\"my-60 block h-42 w-auto\"\n />\n )}\n <div className=\"flex max-w-580 flex-col items-center rounded border bg-paper px-14 py-28 text-center shadow\">\n <SvgImage src={mailSentSvg} className=\"h-144\" />\n <h1 className=\"mb-20 mt-40 text-3xl\">\n <Trans message=\"Verify your email\" />\n </h1>\n <div className=\"mb-24 text-sm\">\n <Trans\n message=\"We've sent an email to “:email“ to verify your email address and activate your account. The link in the the email will expire in 24 hours.\"\n values={{email: data?.user.email}}\n />\n </div>\n <div className=\"text-sm\">\n <Trans message=\"If you did not receive an email, click the button below and we will send you another one.\" />\n </div>\n <div className=\"mt-30\">\n <Button\n className=\"mr-10\"\n variant=\"flat\"\n color=\"primary\"\n disabled={resendEmail.isPending || !data?.user.email}\n onClick={() => {\n resendEmail.mutate({email: data!.user.email});\n }}\n >\n <Trans message=\"Resend email\" />\n </Button>\n <Button variant=\"outline\" onClick={() => logout.mutate()}>\n <Trans message=\"Logout\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import {create} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport React, {JSXElementConstructor} from 'react';\n\ninterface DialogStore<\n C extends JSXElementConstructor<unknown> = JSXElementConstructor<any>,\n D = React.ComponentProps<C>\n> {\n dialog: C | null;\n data: D;\n openDialog: (dialog: C, data?: D) => Promise<any>;\n closeActiveDialog: (value: any) => void;\n resolveClosePromise: null | ((value: any) => void);\n}\n\nexport const useDialogStore = create<DialogStore>()(\n immer((set, get) => ({\n dialog: null,\n data: undefined,\n resolveClosePromise: null,\n openDialog: (dialog, data) => {\n return new Promise(resolve => {\n set(state => {\n state.dialog = dialog;\n state.data = data;\n state.resolveClosePromise = resolve;\n });\n });\n },\n closeActiveDialog: value => {\n get().resolveClosePromise?.(value);\n set(state => {\n state.dialog = null;\n state.data = undefined;\n state.resolveClosePromise = null;\n });\n },\n }))\n);\n\nexport const openDialog = useDialogStore.getState().openDialog;\nexport const closeDialog = (value?: any) => {\n useDialogStore.getState().closeActiveDialog(value);\n};\n","import {\n arrow,\n autoUpdate,\n flip,\n offset as offsetMiddleware,\n OffsetOptions,\n Placement,\n ReferenceType,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react-dom';\nimport {CSSProperties, Ref, useMemo, useRef} from 'react';\nimport {mergeRefs} from 'react-merge-refs';\nimport {UseFloatingOptions} from '@floating-ui/react-dom/src/types';\n\ninterface Props {\n floatingWidth?: 'auto' | 'matchTrigger';\n ref?: Ref<HTMLElement>;\n disablePositioning?: boolean;\n placement?: Placement;\n offset?: OffsetOptions;\n showArrow?: boolean;\n maxHeight?: number;\n shiftCrossAxis?: boolean;\n fallbackPlacements?: Placement[];\n}\nexport function useFloatingPosition({\n floatingWidth,\n ref,\n disablePositioning = false,\n placement = 'bottom',\n offset = 2,\n showArrow = false,\n maxHeight,\n shiftCrossAxis = true,\n fallbackPlacements,\n}: Props) {\n const arrowRef = useRef<HTMLElement>(null);\n\n const floatingConfig: UseFloatingOptions = {placement, strategy: 'fixed'};\n\n if (!disablePositioning) {\n floatingConfig.whileElementsMounted = autoUpdate;\n floatingConfig.middleware = [\n offsetMiddleware(offset),\n shift({padding: 16, crossAxis: shiftCrossAxis, mainAxis: true}),\n flip({\n padding: 16,\n fallbackPlacements,\n }),\n size({\n apply({rects, availableHeight, availableWidth, elements}) {\n if (floatingWidth === 'matchTrigger' && maxHeight != null) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n maxWidth: `${availableWidth}`,\n maxHeight: `${Math.min(availableHeight, maxHeight)}px`,\n });\n } else if (maxHeight != null) {\n Object.assign(elements.floating.style, {\n maxHeight: `${Math.min(availableHeight, maxHeight)}px`,\n });\n }\n },\n padding: 16,\n }),\n ];\n if (showArrow) {\n floatingConfig.middleware.push(arrow({element: arrowRef}));\n }\n }\n\n const floatingProps = useFloating(floatingConfig);\n\n const mergedReferenceRef = useMemo(\n () => mergeRefs<ReferenceType>([ref!, floatingProps.refs.setReference]),\n [floatingProps.refs.setReference, ref]\n );\n\n const {x: arrowX, y: arrowY} = floatingProps.middlewareData.arrow || {};\n\n const staticSide = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[floatingProps.placement.split('-')[0]]!;\n\n const arrowStyle: CSSProperties = {\n left: arrowX,\n top: arrowY,\n right: '',\n bottom: '',\n [staticSide]: '-4px',\n };\n\n return {\n ...floatingProps,\n reference: mergedReferenceRef,\n arrowRef,\n arrowStyle,\n };\n}\n","import {useEffect, useState} from 'react';\n\nexport interface UseMediaQueryOptions {\n noSSR?: boolean;\n}\n\nexport function useMediaQuery(\n query: string,\n {noSSR}: UseMediaQueryOptions = {noSSR: true}\n) {\n const supportsMatchMedia =\n typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n const [matches, setMatches] = useState(\n noSSR\n ? () => (supportsMatchMedia ? window.matchMedia(query).matches : false)\n : null\n );\n\n useEffect(() => {\n if (!supportsMatchMedia) {\n return;\n }\n\n const mq = window.matchMedia(query);\n const onChange = () => {\n setMatches(mq.matches);\n };\n\n mq.addEventListener('change', onChange);\n if (!noSSR) {\n onChange();\n }\n\n return () => {\n mq.removeEventListener('change', onChange);\n };\n }, [supportsMatchMedia, query, noSSR]);\n\n // If in SSR, the media query should never match. Once the page hydrates,\n // this will update and the real value will be returned.\n return typeof window === 'undefined' ? null : matches;\n}\n","import { useMediaQuery, UseMediaQueryOptions } from \"./use-media-query\";\n\nexport function useIsMobileMediaQuery(options?: UseMediaQueryOptions) {\n return useMediaQuery(\"(max-width: 768px)\", options);\n}\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const PopoverAnimation: HTMLMotionProps<'div'> = {\n initial: {opacity: 0, y: 5},\n animate: {opacity: 1, y: 0},\n exit: {opacity: 0, y: 5},\n transition: {type: 'tween', duration: 0.125},\n};\n","import {useViewportSize} from '@react-aria/utils';\n\nexport function useOverlayViewport(): Record<string, string> {\n const {width, height} = useViewportSize();\n return {\n '--be-viewport-height': `${height}px`,\n '--be-viewport-width': `${width}px`,\n };\n}\n","import React, {\n forwardRef,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from 'react';\nimport {m} from 'framer-motion';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {PopoverAnimation} from './popover-animation';\nimport {OverlayProps} from './overlay-props';\nimport {useOverlayViewport} from './use-overlay-viewport';\nimport {FocusScope} from '@react-aria/focus';\nimport {VirtualElement} from '@floating-ui/react-dom';\n\nexport const Popover = forwardRef<HTMLDivElement, OverlayProps>(\n (\n {\n children,\n style,\n autoFocus = false,\n restoreFocus = true,\n isDismissable,\n isContextMenu,\n isOpen,\n onClose,\n triggerRef,\n arrowRef,\n arrowStyle,\n onPointerLeave,\n onPointerEnter,\n },\n ref\n ) => {\n const viewPortStyle = useOverlayViewport();\n const objRef = useObjectRef(ref);\n\n const {domProps} = useCloseOnInteractOutside(\n {\n isDismissable,\n isOpen,\n onClose,\n triggerRef,\n isContextMenu,\n },\n objRef\n );\n\n return (\n <m.div\n className=\"z-popover isolate\"\n role=\"presentation\"\n ref={objRef}\n style={{...viewPortStyle, ...style, position: 'fixed'}}\n {...PopoverAnimation}\n {...mergeProps(domProps as any, {onPointerLeave, onPointerEnter})}\n >\n <FocusScope\n restoreFocus={restoreFocus}\n autoFocus={autoFocus}\n contain={false}\n >\n {children}\n </FocusScope>\n </m.div>\n );\n }\n);\n\n// this should only be rendered when overlay is open\nconst visibleOverlays: RefObject<Element>[] = [];\ninterface useCloseOnInteractOutsideProps {\n isOpen: boolean;\n onClose: () => void;\n isDismissable: boolean;\n isContextMenu?: boolean;\n triggerRef: OverlayProps['triggerRef'];\n}\nfunction useCloseOnInteractOutside(\n {\n onClose,\n isDismissable = true,\n triggerRef,\n isContextMenu = false,\n }: useCloseOnInteractOutsideProps,\n ref: RefObject<Element>\n) {\n const stateRef = useRef({\n isPointerDown: false,\n isContextMenu,\n onClose,\n });\n const state = stateRef.current;\n state.isContextMenu = isContextMenu;\n state.onClose = onClose;\n\n const isValidEvent = useCallback(\n (e: PointerEvent | MouseEvent) => {\n // if (e.button > 0 && (!state.isContextMenu || e.button !== 2)) {\n // return false;\n // }\n\n const target = e.target as Element;\n\n // if the event target is no longer in the document\n if (target) {\n const ownerDocument = target.ownerDocument;\n if (!ownerDocument || !ownerDocument.documentElement.contains(target)) {\n return false;\n }\n }\n\n return ref.current && !ref.current.contains(target);\n },\n [ref]\n );\n\n // Only hide the overlay when it is the topmost visible overlay in the stack.\n // For context menu, hide it regardless\n const isTopMostPopover = useCallback(() => {\n return visibleOverlays[visibleOverlays.length - 1] === ref;\n }, [ref]);\n\n const hideOverlay = useCallback(() => {\n if (isTopMostPopover()) {\n state.onClose();\n }\n }, [isTopMostPopover, state]);\n\n const clickedOnTriggerElement = useCallback(\n (el: Element) => {\n if (triggerRef.current && 'contains' in triggerRef.current) {\n return triggerRef.current.contains?.(el);\n }\n return false;\n },\n [triggerRef]\n );\n\n const onInteractOutsideStart = useCallback(\n (e: PointerEvent) => {\n if (!clickedOnTriggerElement(e.target as Element)) {\n if (isTopMostPopover()) {\n e.stopPropagation();\n e.preventDefault();\n }\n }\n },\n [clickedOnTriggerElement, isTopMostPopover]\n );\n\n const onInteractOutside = useCallback(\n (e: PointerEvent) => {\n if (!clickedOnTriggerElement(e.target as Element)) {\n if (isTopMostPopover()) {\n e.stopPropagation();\n e.preventDefault();\n }\n // don't close context menu on right click, it will be done in \"onInteractOutsideStart\" already.\n // And it would prevent repositioning of context menu when right-clicking on the same element\n if (!state.isContextMenu || e.button !== 2) {\n hideOverlay();\n }\n }\n },\n [clickedOnTriggerElement, hideOverlay, state, isTopMostPopover]\n );\n\n // Add popover ref to the stack of visible popovers on mount, and remove on unmount.\n useEffect(() => {\n visibleOverlays.push(ref);\n\n // handle pointer up and down events\n const onPointerDown = (e: PointerEvent) => {\n if (isValidEvent(e)) {\n onInteractOutsideStart(e);\n stateRef.current.isPointerDown = true;\n }\n };\n const onPointerUp = (e: PointerEvent) => {\n if (stateRef.current.isPointerDown && isValidEvent(e)) {\n stateRef.current.isPointerDown = false;\n onInteractOutside(e);\n }\n };\n\n // handle context menu event\n const onContextMenu = (e: MouseEvent) => {\n e.preventDefault();\n if (isValidEvent(e)) {\n hideOverlay();\n }\n };\n\n // handle closing on scroll\n const onScroll = (e: Event) => {\n if (!triggerRef.current) {\n return;\n }\n\n const scrollableRegion = e.target;\n let triggerEl: Element | undefined;\n if (triggerRef.current instanceof Node) {\n triggerEl = triggerRef.current;\n } else if ('contextElement' in triggerRef.current) {\n triggerEl = (triggerRef.current as VirtualElement).contextElement;\n }\n // window is not a Node and doesn't have \"contain\", but window contains everything\n if (\n !(scrollableRegion instanceof Node) ||\n !triggerEl ||\n scrollableRegion.contains(triggerEl)\n ) {\n state.onClose();\n }\n };\n\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('pointerup', onPointerUp, true);\n document.addEventListener('contextmenu', onContextMenu, true);\n document.addEventListener('scroll', onScroll, true);\n\n return () => {\n const index = visibleOverlays.indexOf(ref);\n if (index >= 0) {\n visibleOverlays.splice(index, 1);\n }\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('pointerup', onPointerUp, true);\n document.removeEventListener('contextmenu', onContextMenu, true);\n document.removeEventListener('scroll', onScroll, true);\n };\n }, [\n ref,\n isValidEvent,\n state,\n onInteractOutside,\n onInteractOutsideStart,\n triggerRef,\n clickedOnTriggerElement,\n hideOverlay,\n ]);\n\n // Handle the escape key\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n hideOverlay();\n }\n };\n\n return {\n domProps: {\n onKeyDown,\n },\n };\n}\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const opacityAnimation: HTMLMotionProps<any> = {\n initial: {opacity: 0},\n animate: {opacity: 1},\n exit: {opacity: 0},\n transition: {duration: 0.2},\n};\n","import {m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {ComponentPropsWithoutRef} from 'react';\nimport {opacityAnimation} from '../animation/opacity-animation';\n\ninterface UnderlayProps\n extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'onAnimationStart' | 'onDragStart' | 'onDragEnd' | 'onDrag'\n > {\n position?: 'fixed' | 'absolute';\n className?: string;\n isTransparent?: boolean;\n disableInitialTransition?: boolean;\n}\nexport function Underlay({\n position = 'absolute',\n className,\n isTransparent = false,\n disableInitialTransition,\n ...domProps\n}: UnderlayProps) {\n return (\n <m.div\n {...domProps}\n className={clsx(\n className,\n !isTransparent && 'bg-background/80',\n 'inset-0 z-10 h-full w-full',\n position,\n 'backdrop-blur-sm'\n )}\n aria-hidden\n initial={disableInitialTransition ? undefined : {opacity: 0}}\n animate={{opacity: 1}}\n exit={{opacity: 0}}\n {...opacityAnimation}\n transition={{duration: 0.15}}\n />\n );\n}\n","import {m} from 'framer-motion';\nimport {forwardRef} from 'react';\nimport {OverlayProps} from './overlay-props';\nimport {useOverlayViewport} from './use-overlay-viewport';\nimport {Underlay} from './underlay';\nimport {FocusScope} from '@react-aria/focus';\nimport {useObjectRef} from '@react-aria/utils';\n\nexport const Tray = forwardRef<HTMLDivElement, OverlayProps>(\n (\n {\n children,\n autoFocus = false,\n restoreFocus = true,\n isDismissable,\n isOpen,\n onClose,\n },\n ref\n ) => {\n const viewPortStyle = useOverlayViewport();\n const objRef = useObjectRef(ref);\n\n return (\n <div className=\"isolate z-tray fixed inset-0\" style={viewPortStyle}>\n <Underlay\n key=\"tray-underlay\"\n onClick={() => {\n if (isDismissable) {\n onClose();\n }\n }}\n />\n <m.div\n ref={objRef}\n className=\"absolute bottom-0 left-0 right-0 w-full z-20 rounded-t overflow-hidden max-w-375 max-h-tray mx-auto pb-safe-area\"\n role=\"presentation\"\n initial={{opacity: 0, y: '100%'}}\n animate={{opacity: 1, y: 0}}\n exit={{opacity: 0, y: '100%'}}\n transition={{type: 'tween', duration: 0.2}}\n >\n <FocusScope restoreFocus={restoreFocus} autoFocus={autoFocus} contain>\n {children}\n </FocusScope>\n </m.div>\n </div>\n );\n }\n);\n","import {forwardRef} from 'react';\nimport {m} from 'framer-motion';\nimport {OverlayProps} from './overlay-props';\nimport {useOverlayViewport} from './use-overlay-viewport';\nimport {Underlay} from './underlay';\nimport {FocusScope} from '@react-aria/focus';\nimport {useObjectRef} from '@react-aria/utils';\nimport clsx from 'clsx';\n\nexport const Modal = forwardRef<HTMLDivElement, OverlayProps>(\n (\n {\n children,\n autoFocus = false,\n restoreFocus = true,\n isDismissable = true,\n isOpen = false,\n placement = 'center',\n onClose,\n },\n ref\n ) => {\n const viewPortStyle = useOverlayViewport();\n const objRef = useObjectRef(ref);\n\n return (\n <div\n className=\"fixed inset-0 isolate z-modal\"\n style={viewPortStyle}\n onKeyDown={e => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n onClose();\n }\n }}\n >\n <Underlay\n key=\"modal-underlay\"\n onClick={() => {\n if (isDismissable) {\n onClose();\n }\n }}\n />\n <m.div\n ref={objRef}\n className={clsx(\n 'pointer-events-none absolute inset-0 z-20 flex h-full w-full',\n placement === 'center' && 'items-center justify-center',\n placement === 'top' && 'items-start justify-center pt-40'\n )}\n role=\"presentation\"\n initial={{opacity: 0, scale: placement === 'top' ? 1 : 0.7}}\n animate={{opacity: 1, scale: 1}}\n exit={{opacity: 0, scale: 1}}\n transition={{duration: 0.1}}\n >\n <FocusScope restoreFocus={restoreFocus} autoFocus={autoFocus} contain>\n {children}\n </FocusScope>\n </m.div>\n </div>\n );\n }\n);\n","import React, {ReactNode, useId} from 'react';\nimport clsx from 'clsx';\n\nexport interface ListboxSectionProps {\n label?: ReactNode;\n children: React.ReactNode;\n index?: number;\n}\nexport function Section({children, label, index}: ListboxSectionProps) {\n const id = useId();\n\n return (\n <div\n role=\"group\"\n className={clsx(index !== 0 && 'border-t my-4')}\n aria-labelledby={label ? `be-select-${id}` : undefined}\n >\n {label && (\n <div\n className=\"block uppercase text-muted text-xs px-16 py-10\"\n role=\"presentation\"\n id={`be-select-${id}`}\n aria-hidden=\"true\"\n >\n {label}\n </div>\n )}\n {children}\n </div>\n );\n}\n","import {Children, isValidElement, ReactElement, ReactNode} from 'react';\nimport memoize from 'nano-memoize';\nimport {ListboxItemProps} from './item';\nimport {ListboxSectionProps, Section} from './section';\nimport {ListBoxChildren} from './types';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport type ListboxCollection = Map<string | number, CollectionItem<any>>;\n\nexport type CollectionItem<T> = {\n index: number;\n textLabel: string;\n element: ReactElement<ListboxItemProps>;\n value: string | number;\n item?: T;\n isDisabled?: boolean;\n section?: ReactElement<ListboxSectionProps>;\n};\n\ntype Props<T> = ListBoxChildren<T> & {\n inputValue?: string;\n maxItems?: number;\n};\n\nexport const buildListboxCollection = memoize(\n ({maxItems, children, items, inputValue}: Props<any>) => {\n let collection = childrenToCollection({children, items});\n let filteredCollection = filterCollection({collection, inputValue});\n\n if (maxItems) {\n collection = new Map([...collection.entries()].slice(0, maxItems));\n filteredCollection = new Map(\n [...filteredCollection.entries()].slice(0, maxItems)\n );\n }\n\n return {collection, filteredCollection};\n }\n);\n\ntype filterCollectionProps = {\n collection: ListboxCollection;\n inputValue?: string;\n};\nconst filterCollection = memoize(\n ({collection, inputValue}: filterCollectionProps) => {\n let filteredCollection: ListboxCollection = new Map();\n\n const query = inputValue ? `${inputValue}`.toLowerCase().trim() : '';\n if (!query) {\n filteredCollection = collection;\n } else {\n let filterIndex = 0;\n collection.forEach((meta, value) => {\n const haystack = meta.item ? JSON.stringify(meta.item) : meta.textLabel;\n if (haystack.toLowerCase().trim().includes(query)) {\n filteredCollection.set(value, {...meta, index: filterIndex++});\n }\n });\n }\n\n return filteredCollection;\n }\n);\n\nconst childrenToCollection = memoize(\n ({children, items}: ListBoxChildren<any>) => {\n let reactChildren: ReactNode;\n if (items && typeof children === 'function') {\n reactChildren = items.map(item => children(item));\n } else {\n reactChildren = children as ReactNode;\n }\n\n const collection = new Map<string | number, CollectionItem<any>>();\n let optionIndex = 0;\n\n const setOption = (\n element: ReactElement<ListboxItemProps>,\n section?: any,\n sectionIndex?: number,\n sectionItemIndex?: number\n ) => {\n const index = optionIndex++;\n const item = section\n ? // get item from nested array\n items?.[sectionIndex!].items[sectionItemIndex!]\n : // get item from flat array\n items?.[index];\n\n collection.set(element.props.value, {\n index,\n element,\n textLabel: getTextLabel(element),\n item,\n section,\n isDisabled: element.props.isDisabled,\n value: element.props.value,\n });\n };\n\n Children.forEach(reactChildren, (child, childIndex) => {\n if (!isValidElement(child)) return;\n if (child.type === Section) {\n Children.forEach(\n child.props.children,\n (nestedChild, nestedChildIndex) => {\n setOption(nestedChild, child, childIndex, nestedChildIndex);\n }\n );\n } else {\n setOption(child as ReactElement<ListboxItemProps>);\n }\n });\n\n return collection;\n }\n);\n\nfunction getTextLabel(item: ReactElement<ListboxItemProps>): string {\n const content = item.props.children as any;\n\n if (item.props.textLabel) {\n return item.props.textLabel;\n }\n if ((content?.props as MessageDescriptor)?.message) {\n return content.props.message;\n }\n\n return `${content}` || '';\n}\n","import React, {Ref, useCallback, useId, useMemo, useRef, useState} from 'react';\nimport {useControlledState} from '@react-stately/utils';\nimport {\n buildListboxCollection,\n CollectionItem,\n} from './build-listbox-collection';\nimport {useFloatingPosition} from '../../overlays/floating-position';\nimport {\n ListBoxChildren,\n ListboxProps,\n PrimitiveValue,\n UseListboxReturn,\n} from './types';\nimport {VirtualElement} from '@floating-ui/react-dom';\n\nexport function useListbox<T>(\n props: ListboxProps & ListBoxChildren<T>,\n ref?: Ref<HTMLElement>,\n): UseListboxReturn {\n const {\n children,\n items,\n role = 'listbox',\n virtualFocus,\n loopFocus = false,\n autoFocusFirstItem = true,\n onItemSelected,\n clearInputOnItemSelection,\n blurReferenceOnItemSelection,\n floatingWidth = 'matchTrigger',\n floatingMinWidth,\n floatingMaxHeight,\n offset,\n placement,\n showCheckmark,\n showEmptyMessage,\n maxItems,\n isAsync,\n allowCustomValue,\n clearSelectionOnInputClear,\n } = props;\n const selectionMode = props.selectionMode || 'none';\n const id = useId();\n const listboxId = `${id}-listbox`;\n\n // controlled state for text input (if in combobox mode)\n const [inputValue, setInputValue] = useControlledState(\n props.inputValue,\n props.defaultInputValue || '',\n props.onInputValueChange,\n );\n\n // mostly for combobox, so can show all collection items on dropdown icon click, even if user has filtered via input\n const [activeCollection, setActiveCollection] = useState<'all' | 'filtered'>(\n 'all',\n );\n\n const collections = buildListboxCollection({\n children,\n items,\n // don't filter on client side if async, it will already be filtered on server\n inputValue: isAsync ? undefined : inputValue,\n maxItems,\n });\n const collection =\n activeCollection === 'all'\n ? collections.collection\n : collections.filteredCollection;\n\n // items for keyboard navigation\n const listItemsRef = useRef<Array<HTMLElement | null>>([]);\n\n // plain text labels for typeahead\n const listContent: (string | null)[] = useMemo(() => {\n return [...collection.values()].map(o =>\n o.isDisabled ? null : o.textLabel,\n );\n }, [collection]);\n\n // state for currently selected values (always array, even in single selection mode)\n const {selectedValues, selectValues} = useControlledSelection(props);\n\n const [isOpen, setIsOpen] = useControlledState(\n props.isOpen,\n props.defaultIsOpen,\n props.onOpenChange,\n );\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n\n // handle listbox positioning relative to trigger\n const floatingProps = useFloatingPosition({\n floatingWidth,\n ref,\n placement,\n offset,\n maxHeight: floatingMaxHeight ?? 420,\n // don't shift floating menu on the sides of combobox, otherwise input might get obscured\n shiftCrossAxis: !virtualFocus,\n });\n const {refs, strategy, x, y} = floatingProps;\n\n // handle selection state for syncing with active index in keyboard navigation\n const selectedOption =\n selectionMode === 'none' ? undefined : collection.get(selectedValues[0]);\n const selectedIndex =\n selectionMode === 'none' ? undefined : selectedOption?.index;\n const setSelectedIndex = (index: number) => {\n if (selectionMode !== 'none') {\n const item = [...collection.values()][index];\n if (item) {\n selectValues(item.value);\n }\n }\n };\n\n // focus and scroll to specified index, in both virtual and regular mode.\n // will also skip disabled indices and focus next or previous non-disabled index instead\n const focusItem = useCallback(\n (fallbackOperation: 'increment' | 'decrement', newIndex: number) => {\n const items = [...collection.values()];\n const allItemsDisabled = !items.find(i => !i.isDisabled);\n const lastIndex = collection.size - 1;\n\n // invalid index\n if (\n newIndex == null ||\n !collection.size ||\n newIndex > lastIndex ||\n newIndex < 0 ||\n allItemsDisabled\n ) {\n setActiveIndex(null);\n return;\n }\n\n // get next or previous non-disabled item\n newIndex = getNonDisabledIndex(\n items,\n newIndex,\n loopFocus,\n fallbackOperation,\n );\n\n setActiveIndex(newIndex);\n\n if (virtualFocus) {\n listItemsRef.current[newIndex]?.scrollIntoView({\n block: 'nearest',\n });\n } else {\n listItemsRef.current[newIndex]?.focus();\n }\n },\n [collection, virtualFocus, loopFocus],\n );\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n\n setActiveCollection(e.target.value.trim() ? 'filtered' : 'all');\n\n if (e.target.value) {\n setIsOpen(true);\n } else if (clearSelectionOnInputClear) {\n // deselect currently selected option if user fully clears the input\n selectValues('');\n }\n\n if (autoFocusFirstItem && activeIndex == null) {\n focusItem('increment', 0);\n } else {\n setActiveIndex(null);\n }\n },\n [\n setInputValue,\n setIsOpen,\n setActiveCollection,\n selectValues,\n clearSelectionOnInputClear,\n focusItem,\n autoFocusFirstItem,\n activeIndex,\n ],\n );\n\n const handleItemSelection = (value: PrimitiveValue) => {\n const reference = refs.reference.current as\n | HTMLElement\n | VirtualElement\n | null;\n if (selectionMode !== 'none') {\n selectValues(value);\n } else {\n if (reference && 'focus' in reference) {\n reference.focus();\n }\n }\n // is combobox\n if (virtualFocus) {\n setInputValue(clearInputOnItemSelection ? '' : `${value}`);\n if (blurReferenceOnItemSelection && reference && 'blur' in reference) {\n reference.blur();\n }\n }\n setActiveCollection('all');\n setIsOpen(false);\n onItemSelected?.(value);\n // make sure \"onItemSelected\" callback has a chance to use activeIndex value, before clearing it\n setActiveIndex(null);\n };\n\n return {\n // even handlers\n handleItemSelection,\n onInputChange,\n loopFocus,\n\n // config\n floatingWidth,\n floatingMinWidth,\n floatingMaxHeight,\n showCheckmark,\n collection,\n collections,\n virtualFocus,\n focusItem,\n showEmptyMessage: showEmptyMessage && !!inputValue,\n allowCustomValue,\n\n // floating ui\n refs,\n reference: floatingProps.reference,\n floating: refs.setFloating,\n positionStyle: {\n position: strategy,\n top: y ?? '',\n left: x ?? '',\n },\n\n listContent,\n listItemsRef,\n listboxId,\n role,\n\n state: {\n // currently focused or active (if virtual focus) option\n activeIndex,\n setActiveIndex,\n selectedIndex,\n setSelectedIndex,\n selectionMode,\n selectedValues,\n selectValues,\n inputValue,\n setInputValue,\n isOpen,\n setIsOpen,\n setActiveCollection,\n },\n };\n}\n\nfunction getNonDisabledIndex(\n items: CollectionItem<unknown>[],\n newIndex: number,\n loopFocus: boolean,\n operation: 'increment' | 'decrement',\n) {\n const lastIndex = items.length - 1;\n while (items[newIndex]?.isDisabled) {\n if (operation === 'increment') {\n newIndex++;\n if (newIndex >= lastIndex) {\n // loop from the start, if end reached\n if (loopFocus) {\n newIndex = 0;\n // if focus is not looping, stay on the previous index\n } else {\n return newIndex - 1;\n }\n }\n } else {\n newIndex--;\n // loop from the end, if start reached\n if (newIndex < 0) {\n if (loopFocus) {\n newIndex = lastIndex;\n // if focus is not looping, stay on the previous index\n } else {\n return newIndex + 1;\n }\n }\n }\n }\n\n return newIndex;\n}\n\nfunction useControlledSelection(props: ListboxProps) {\n const {selectionMode, allowEmptySelection} = props;\n const selectionEnabled =\n selectionMode === 'single' || selectionMode === 'multiple';\n\n const [stateValues, setStateValues] = useControlledState<any>(\n !selectionEnabled ? undefined : props.selectedValue,\n !selectionEnabled ? undefined : props.defaultSelectedValue,\n !selectionEnabled ? undefined : props.onSelectionChange,\n );\n\n const selectedValues = useMemo(() => {\n // allow specifying null as selected value, but not undefined\n if (typeof stateValues === 'undefined') {\n return [];\n }\n return Array.isArray(stateValues) ? stateValues : [stateValues];\n }, [stateValues]);\n\n const selectValues = useCallback(\n (mixedValue: PrimitiveValue | PrimitiveValue[] | null) => {\n const newValues = Array.isArray(mixedValue) ? mixedValue : [mixedValue];\n if (selectionMode === 'single') {\n setStateValues(newValues[0]);\n } else {\n newValues.forEach(newValue => {\n const index = selectedValues.indexOf(newValue);\n if (index === -1) {\n selectedValues.push(newValue);\n setStateValues([...selectedValues]);\n } else if (selectedValues.length > 1 || allowEmptySelection) {\n selectedValues.splice(index, 1);\n setStateValues([...selectedValues]);\n }\n });\n }\n },\n [allowEmptySelection, selectedValues, selectionMode, setStateValues],\n );\n\n return {\n selectedValues,\n selectValues,\n };\n}\n","import {createContext, useContext} from 'react';\nimport {UseListboxReturn} from './types';\n\ntype ListBoxReturnType = UseListboxReturn;\nexport type ListboxContextValue = ListBoxReturnType;\n\nexport const ListBoxContext = createContext<ListboxContextValue>(null!);\n\nexport function useListboxContext() {\n return useContext(ListBoxContext);\n}\n","import {useIsSSR} from '@react-aria/ssr';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst MOBILE_SCREEN_WIDTH = 768;\n\nexport function useIsMobileDevice(): boolean {\n const isSSR = useIsSSR();\n if (isSSR || typeof window === 'undefined') {\n return getBootstrapData().is_mobile_device;\n }\n\n return window.screen.width <= MOBILE_SCREEN_WIDTH;\n}\n","import {AnimatePresence} from 'framer-motion';\nimport React, {\n cloneElement,\n ComponentPropsWithoutRef,\n JSXElementConstructor,\n ReactElement,\n ReactNode,\n RefObject,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport clsx from 'clsx';\nimport {ListBoxContext, useListboxContext} from './listbox-context';\nimport {useIsMobileDevice} from '@common/utils/hooks/is-mobile-device';\nimport {Popover} from '../../overlays/popover';\nimport {Tray} from '../../overlays/tray';\nimport {Trans} from '@common/i18n/trans';\nimport {createPortal} from 'react-dom';\nimport {UseListboxReturn} from './types';\nimport {OverlayProps} from '../../overlays/overlay-props';\nimport {rootEl} from '@common/core/root-el';\n\ninterface Props extends ComponentPropsWithoutRef<'div'> {\n listbox: UseListboxReturn;\n mobileOverlay?: JSXElementConstructor<OverlayProps>;\n children?: ReactElement;\n searchField?: ReactNode;\n isLoading?: boolean;\n onClose?: () => void;\n prepend?: boolean;\n}\nexport function Listbox({\n listbox,\n children: trigger,\n isLoading,\n mobileOverlay = Tray,\n searchField,\n onClose,\n prepend,\n className: listboxClassName,\n ...domProps\n}: Props) {\n const isMobile = useIsMobileDevice();\n const {\n floatingWidth,\n floatingMinWidth = 'min-w-180',\n collection,\n showEmptyMessage,\n state: {isOpen, setIsOpen},\n positionStyle,\n floating,\n refs,\n } = listbox;\n\n const Overlay = !prepend && isMobile ? mobileOverlay : Popover;\n\n const className = clsx(\n 'text-base sm:text-sm outline-none bg-paper max-h-inherit flex flex-col',\n !prepend && 'shadow-xl border py-4',\n listboxClassName,\n\n // tray will apply its own rounding and max width\n Overlay === Popover && 'rounded-panel',\n Overlay === Popover && floatingWidth === 'auto'\n ? `max-w-288 ${floatingMinWidth}`\n : '',\n );\n\n const children = useMemo(() => {\n let sectionIndex = 0;\n const renderedSections: ReactElement[] = [];\n return [...collection.values()].reduce<ReactElement[]>((prev, curr) => {\n if (!curr.section) {\n prev.push(\n cloneElement(curr.element, {\n key: curr.element.key || curr.element.props.value,\n }),\n );\n } else if (!renderedSections.includes(curr.section)) {\n const section = cloneElement(curr.section, {\n key: curr.section.key || sectionIndex,\n index: sectionIndex,\n });\n prev.push(section);\n // clone element will create new instance of object, need to keep\n // track of original instance so sections are not duplicated\n renderedSections.push(curr.section);\n sectionIndex++;\n }\n return prev;\n }, []);\n }, [collection]);\n\n const showContent = children.length > 0 || (showEmptyMessage && !isLoading);\n\n const innerContent = showContent ? (\n <div className={className} role=\"presentation\">\n {searchField}\n <FocusContainer isLoading={isLoading} {...domProps}>\n {children}\n </FocusContainer>\n </div>\n ) : null;\n\n return (\n <ListBoxContext.Provider value={listbox}>\n {trigger}\n {prepend\n ? innerContent\n : rootEl &&\n createPortal(\n <AnimatePresence>\n {isOpen && showContent && (\n <Overlay\n triggerRef={refs.reference as RefObject<HTMLElement>}\n restoreFocus\n isOpen={isOpen}\n onClose={() => {\n onClose?.();\n setIsOpen(false);\n }}\n isDismissable\n style={positionStyle}\n ref={floating}\n >\n {innerContent!}\n </Overlay>\n )}\n </AnimatePresence>,\n rootEl,\n )}\n </ListBoxContext.Provider>\n );\n}\n\ninterface WrapperProps extends ComponentPropsWithoutRef<'div'> {\n isLoading?: boolean;\n children: ReactElement[];\n}\nfunction FocusContainer({\n className,\n children,\n isLoading,\n ...domProps\n}: WrapperProps) {\n const {\n role,\n listboxId,\n virtualFocus,\n focusItem,\n state: {activeIndex, setActiveIndex, selectedIndex},\n } = useListboxContext();\n const autoFocusRef = useRef(true);\n const domRef = useRef<HTMLDivElement>(null);\n\n // reset activeIndex on unmount\n useEffect(() => {\n return () => setActiveIndex(null);\n }, [setActiveIndex]);\n\n // focus active index or menu on mount, because menu will be closed\n // on trigger keyDown and focus won't be applied to items\n useEffect(() => {\n if (autoFocusRef.current) {\n const indexToFocus = activeIndex ?? selectedIndex;\n // if no activeIndex, focus menu itself\n if (indexToFocus == null && !virtualFocus) {\n requestAnimationFrame(() => {\n domRef.current?.focus({preventScroll: true});\n });\n } else if (indexToFocus != null) {\n // wait until next frame, otherwise auto scroll might not work\n requestAnimationFrame(() => {\n focusItem('increment', indexToFocus);\n });\n }\n }\n autoFocusRef.current = false;\n }, [activeIndex, selectedIndex, focusItem, virtualFocus]);\n\n return (\n <div\n tabIndex={virtualFocus ? undefined : -1}\n role={role}\n id={listboxId}\n className=\"flex-auto overflow-y-auto overscroll-contain outline-none\"\n ref={domRef}\n {...domProps}\n >\n {children.length ? children : <EmptyMessage />}\n </div>\n );\n}\n\nfunction EmptyMessage() {\n return (\n <div className=\"px-8 py-4 text-sm italic text-muted\">\n <Trans message=\"There are no items matching your query\" />\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CheckIcon = createSvgIcon(\n <path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n, 'CheckOutlined');\n","import clsx from 'clsx';\nimport React, {\n ComponentPropsWithRef,\n JSXElementConstructor,\n ReactNode,\n} from 'react';\nimport {CheckIcon} from '../../icons/material/Check';\nimport {To} from 'react-router-dom';\n\nexport interface ListItemBaseProps extends ComponentPropsWithRef<'div'> {\n startIcon?: ReactNode;\n endIcon?: ReactNode;\n endSection?: ReactNode;\n description?: ReactNode;\n textLabel?: string;\n capitalizeFirst?: boolean;\n isSelected?: boolean;\n isDisabled?: boolean;\n isActive?: boolean;\n className?: string;\n showCheckmark?: boolean;\n elementType?: 'a' | JSXElementConstructor<any> | 'div';\n target?: string;\n to?: To;\n href?: string;\n radius?: string;\n padding?: string;\n}\n\nexport const ListItemBase = React.forwardRef<HTMLDivElement, ListItemBaseProps>(\n (props, ref) => {\n let {\n startIcon,\n capitalizeFirst,\n children,\n description,\n endIcon,\n endSection,\n isDisabled,\n isActive,\n isSelected,\n showCheckmark,\n elementType = 'div',\n radius,\n padding,\n ...domProps\n } = props;\n\n if (!startIcon && showCheckmark) {\n startIcon = (\n <CheckIcon\n size=\"sm\"\n className={clsx('text-primary', !isSelected && 'invisible')}\n />\n );\n }\n\n // if (!endIcon && !endSection && showCheckmark) {\n // endIcon = (\n // <CheckIcon size=\"sm\" className={clsx('text-primary', 'invisible')} />\n // );\n // }\n\n const iconClassName = clsx(\n 'icon-sm rounded overflow-hidden flex-shrink-0',\n !isDisabled && 'text-muted',\n );\n const endSectionClassName = clsx(!isDisabled && 'text-muted');\n\n const Element = elementType;\n\n return (\n <Element\n {...domProps}\n aria-disabled={isDisabled}\n className={itemClassName(props)}\n ref={ref}\n >\n {startIcon && <div className={iconClassName}>{startIcon}</div>}\n <div\n className={clsx(\n 'min-w-auto mr-auto w-full overflow-hidden overflow-ellipsis',\n capitalizeFirst && 'first-letter:capitalize',\n )}\n >\n {children}\n {description && (\n <div\n className={clsx(\n 'mt-4 whitespace-normal text-xs',\n isDisabled ? 'text-disabled' : 'text-muted',\n )}\n >\n {description}\n </div>\n )}\n </div>\n {(endIcon || endSection) && (\n <div className={endIcon ? iconClassName : endSectionClassName}>\n {endIcon || endSection}\n </div>\n )}\n </Element>\n );\n },\n);\n\nfunction itemClassName({\n className,\n isSelected,\n isActive,\n isDisabled,\n showCheckmark,\n endIcon,\n endSection,\n radius,\n padding: userPadding,\n}: ListItemBaseProps): string {\n let state: string = '';\n if (isDisabled) {\n state = 'text-disabled pointer-events-none';\n } else if (isSelected) {\n if (isActive) {\n state = 'bg-primary/focus';\n } else {\n state = 'bg-primary/selected hover:bg-primary/focus';\n }\n } else if (isActive) {\n state = 'hover:bg-fg-base/15 bg-focus';\n } else {\n state = 'hover:bg-hover';\n }\n\n let padding;\n\n if (userPadding) {\n padding = userPadding;\n } else if (showCheckmark) {\n if (endIcon || endSection) {\n padding = 'pl-8 pr-8';\n } else {\n padding = 'pl-8 pr-24';\n }\n } else {\n padding = 'px-20';\n }\n\n return clsx(\n 'w-full select-none outline-none cursor-pointer',\n 'py-8 text-sm truncate flex items-center gap-10',\n !isDisabled && 'text-main',\n padding,\n state,\n className,\n radius,\n );\n}\n","import React from 'react';\nimport {useListboxContext} from './listbox-context';\nimport {ListItemBase, ListItemBaseProps} from '../../list/list-item-base';\n\nexport interface ListboxItemProps extends ListItemBaseProps {\n value: any;\n textLabel?: string;\n onSelected?: () => void;\n onKeyDown?: any;\n tabIndex?: number;\n className?: string;\n capitalizeFirst?: boolean;\n}\nexport function Item({\n children,\n value,\n startIcon,\n endIcon,\n endSection,\n description,\n capitalizeFirst,\n textLabel,\n isDisabled,\n onSelected,\n onClick,\n ...domProps\n}: ListboxItemProps) {\n const {\n collection,\n showCheckmark,\n virtualFocus,\n listboxId,\n role,\n listItemsRef,\n handleItemSelection,\n state: {selectedValues, activeIndex, setActiveIndex},\n } = useListboxContext();\n const isSelected = selectedValues.includes(value);\n const index = collection.get(value)?.index;\n const isActive = activeIndex === index;\n\n // context value might get out of sync with item due to AnimatePresence\n if (index == null) {\n return null;\n }\n\n const tabIndex = isActive && !isDisabled ? -1 : 0;\n\n return (\n <ListItemBase\n {...domProps}\n onFocus={() => {\n if (!virtualFocus) {\n setActiveIndex(index);\n }\n }}\n onPointerEnter={e => {\n setActiveIndex(index);\n if (!virtualFocus) {\n e.currentTarget.focus();\n }\n }}\n onPointerDown={e => {\n if (virtualFocus) {\n e.preventDefault();\n }\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleItemSelection(value);\n onSelected?.();\n }\n }}\n onClick={e => {\n handleItemSelection(value);\n onSelected?.();\n onClick?.(e);\n }}\n ref={node => (listItemsRef.current[index] = node)}\n id={`${listboxId}-${index}`}\n role={role === 'menu' ? 'menuitem' : 'option'}\n tabIndex={virtualFocus ? undefined : tabIndex}\n aria-selected={isActive && isSelected}\n showCheckmark={showCheckmark}\n isDisabled={isDisabled}\n isActive={isActive}\n isSelected={isSelected}\n startIcon={startIcon}\n description={description}\n endIcon={endIcon}\n endSection={endSection}\n capitalizeFirst={capitalizeFirst}\n data-value={value}\n >\n {children}\n </ListItemBase>\n );\n}\n","import React, {KeyboardEvent} from 'react';\nimport {UseListboxReturn} from './types';\n\nexport function useListboxKeyboardNavigation({\n state: {isOpen, setIsOpen, selectedIndex, activeIndex, setInputValue},\n loopFocus,\n collection,\n focusItem,\n handleItemSelection,\n allowCustomValue,\n}: UseListboxReturn) {\n const handleTriggerKeyDown = (e: React.KeyboardEvent): true | void => {\n // ignore if dropdown is open or if event bubbled up from portal\n if (isOpen || !e.currentTarget.contains(e.target as HTMLElement)) return;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setIsOpen(true);\n focusItem('increment', selectedIndex != null ? selectedIndex : 0);\n return true;\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setIsOpen(true);\n focusItem(\n 'decrement',\n selectedIndex != null ? selectedIndex : collection.size - 1\n );\n return true;\n } else if (e.key === 'Enter' || e.key === 'Space') {\n e.preventDefault();\n setIsOpen(true);\n focusItem('increment', selectedIndex != null ? selectedIndex : 0);\n return true;\n }\n };\n\n const handleListboxKeyboardNavigation = (\n e: React.KeyboardEvent\n ): true | void => {\n const lastIndex = Math.max(0, collection.size - 1);\n // ignore if event bubbled up from portal, or dropdown is closed\n if (!isOpen || !e.currentTarget.contains(e.target as HTMLElement)) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (activeIndex == null) {\n focusItem('increment', 0);\n } else if (activeIndex >= lastIndex) {\n // if focus is not looping, stay on last index\n if (loopFocus) {\n focusItem('increment', 0);\n }\n } else {\n focusItem('increment', activeIndex + 1);\n }\n return true;\n case 'ArrowUp':\n e.preventDefault();\n if (activeIndex == null) {\n focusItem('decrement', lastIndex);\n } else if (activeIndex <= 0) {\n // if focus is not looping, stay on first index\n if (loopFocus) {\n focusItem('decrement', lastIndex);\n }\n } else {\n focusItem('decrement', activeIndex - 1);\n }\n return true;\n case 'Home':\n e.preventDefault();\n focusItem('increment', 0);\n return true;\n case 'End':\n e.preventDefault();\n focusItem('decrement', lastIndex);\n return true;\n case 'Tab':\n setIsOpen(false);\n return true;\n }\n };\n\n const handleListboxSearchFieldKeydown = (\n e: KeyboardEvent<HTMLInputElement>\n ) => {\n if (e.key === 'Enter' && activeIndex != null && collection.size) {\n // prevent form submit when selecting item in combobox via \"enter\"\n e.preventDefault();\n const [value, obj] = [...collection.entries()][activeIndex];\n if (value) {\n handleItemSelection(value);\n // \"onSelected\" will not be called for dropdown items, because keydown\n // event will never be triggered for them in \"virtualFocus\" mode\n obj.element.props.onSelected?.();\n }\n return;\n }\n\n // on escape, clear input and close dropdown\n if (e.key === 'Escape' && isOpen) {\n setIsOpen(false);\n if (!allowCustomValue) {\n setInputValue('');\n }\n }\n\n const handled = handleTriggerKeyDown(e);\n if (!handled) {\n handleListboxKeyboardNavigation(e);\n }\n };\n\n return {\n handleTriggerKeyDown,\n handleListboxKeyboardNavigation,\n handleListboxSearchFieldKeydown,\n };\n}\n","import {useSelectedLocale} from './selected-locale';\n\nconst cache = new Map<string, Intl.Collator>();\n\nexport function useCollator(options?: Intl.CollatorOptions): Intl.Collator {\n const {localeCode} = useSelectedLocale();\n\n const cacheKey =\n localeCode +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey)!;\n }\n\n const formatter = new Intl.Collator(localeCode, options);\n cache.set(cacheKey, formatter);\n return formatter;\n}\n","import React, {useRef} from 'react';\nimport {useCollator} from '../../../i18n/use-collator';\n\ninterface UseTypeSelectReturn {\n findMatchingItem: (\n e: React.KeyboardEvent,\n listContent: (string | null)[],\n fromIndex?: number | null\n ) => number | null;\n}\n\ninterface SearchState {\n search: string;\n timeout: ReturnType<typeof setTimeout> | undefined;\n}\n\nexport function useTypeSelect(): UseTypeSelectReturn {\n const collator = useCollator({usage: 'search', sensitivity: 'base'});\n const state = useRef<SearchState>({\n search: '',\n timeout: undefined,\n }).current;\n\n const getMatchingIndex = (\n listContent: (string | null)[],\n fromIndex?: number | null\n ) => {\n let index = fromIndex ?? 0;\n while (index != null) {\n const item = listContent[index];\n const substring = item?.slice(0, state.search.length);\n\n if (substring && collator.compare(substring, state.search) === 0) {\n return index;\n }\n\n if (index < listContent.length - 1) {\n index++;\n // reached the end of list\n } else {\n return null;\n }\n }\n\n return null;\n };\n\n const findMatchingItem: UseTypeSelectReturn['findMatchingItem'] = (\n e,\n listContent,\n fromIndex = 0\n ) => {\n const character = getStringForKey(e.key);\n if (!character || e.ctrlKey || e.metaKey) {\n return null;\n }\n\n // Do not propagate the Spacebar event if it's meant to be part of the search.\n // When we time out, the search term becomes empty, hence the check on length.\n // Trimming is to account for the case of pressing the Spacebar more than once,\n // which should cycle through the selection/deselection of the focused item.\n if (character === ' ' && state.search.trim().length > 0) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n state.search += character;\n\n // Use the delegate to find a key to focus.\n // Prioritize items after the currently focused item, falling back to searching the whole list.\n let index = getMatchingIndex(listContent, fromIndex);\n\n // If no key found, search from the top.\n if (index == null) {\n index = getMatchingIndex(listContent, 0);\n }\n\n clearTimeout(state.timeout);\n state.timeout = setTimeout(() => {\n state.search = '';\n }, 500);\n\n return index ?? null;\n };\n\n return {findMatchingItem};\n}\n\nfunction getStringForKey(key: string) {\n // If the key is of length 1, it is an ASCII value.\n // Otherwise, if there are no ASCII characters in the key name,\n // it is a Unicode character.\n // See https://www.w3.org/TR/uievents-key/\n if (key.length === 1 || !/^[A-Z]/i.test(key)) {\n return key;\n }\n\n return '';\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SearchIcon = createSvgIcon(\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n, 'SearchOutlined');\n","import clsx from 'clsx';\nimport {BaseFieldProps} from './base-field-props';\nimport {ButtonSize, getButtonSizeStyle} from '../../buttons/button-size';\n\nexport interface InputFieldStyle {\n label: string;\n input: string;\n wrapper: string;\n inputWrapper: string;\n adornment: string;\n append: {size: string; radius: string};\n size: {font: string; height: string};\n description: string;\n error: string;\n}\n\ntype InputFieldStyleProps = Omit<\n BaseFieldProps,\n 'value' | 'defaultValue' | 'onChange'\n>;\n\nexport function getInputFieldClassNames(\n props: InputFieldStyleProps = {},\n): InputFieldStyle {\n const {\n size = 'md',\n startAppend,\n endAppend,\n className,\n labelPosition,\n labelDisplay = 'block',\n inputClassName,\n inputWrapperClassName,\n unstyled,\n invalid,\n disabled,\n background = 'bg-transparent',\n flexibleHeight,\n inputShadow = 'shadow-sm',\n descriptionPosition = 'bottom',\n inputRing,\n inputFontSize,\n } = {...props};\n\n if (unstyled) {\n return {\n label: '',\n input: inputClassName || '',\n wrapper: className || '',\n inputWrapper: inputWrapperClassName || '',\n adornment: '',\n append: {size: '', radius: ''},\n size: {font: '', height: ''},\n description: '',\n error: '',\n };\n }\n\n const sizeClass = inputSizeClass({\n size: props.size,\n flexibleHeight,\n });\n if (inputFontSize) {\n sizeClass.font = inputFontSize;\n }\n\n const isInputGroup = startAppend || endAppend;\n\n const ringColor = invalid\n ? 'focus:ring-danger/focus focus:border-danger/60'\n : 'focus:ring-primary/focus focus:border-primary/60';\n const ringClassName = inputRing || `focus:ring ${ringColor}`;\n\n const radius = getRadius(props);\n\n return {\n label: clsx(\n labelDisplay,\n 'first-letter:capitalize text-left whitespace-nowrap',\n disabled && 'text-disabled',\n sizeClass.font,\n labelPosition === 'side' ? 'mr-16' : 'mb-4',\n ),\n input: clsx(\n 'block text-left relative w-full appearance-none transition-shadow text',\n background,\n\n // radius\n radius.input,\n\n getInputBorder(props),\n !disabled && `${ringClassName} focus:outline-none ${inputShadow}`,\n disabled && 'text-disabled cursor-not-allowed',\n inputClassName,\n sizeClass.font,\n sizeClass.height,\n getInputPadding(props),\n ),\n adornment: iconSizeClass(size),\n append: {\n size: getButtonSizeStyle(size),\n radius: radius.append,\n },\n wrapper: clsx(className, sizeClass.font, {\n 'flex items-center': labelPosition === 'side',\n }),\n inputWrapper: clsx(\n 'isolate relative',\n inputWrapperClassName,\n isInputGroup && 'flex items-stretch',\n ),\n size: sizeClass,\n description: `text-muted ${\n descriptionPosition === 'bottom' ? 'pt-10' : 'pb-10'\n } text-xs`,\n error: 'text-danger pt-10 text-xs',\n };\n}\n\nfunction getInputBorder({\n startAppend,\n endAppend,\n inputBorder,\n invalid,\n}: InputFieldStyleProps) {\n if (inputBorder) return inputBorder;\n\n const isInputGroup = startAppend || endAppend;\n const borderColor = invalid ? 'border-danger' : 'border-divider';\n\n if (!isInputGroup) {\n return `${borderColor} border`;\n }\n if (startAppend) {\n return `${borderColor} border-y border-r`;\n }\n return `${borderColor} border-y border-l`;\n}\n\nfunction getInputPadding({\n startAdornment,\n endAdornment,\n inputRadius,\n}: InputFieldStyleProps) {\n if (inputRadius === 'rounded-full') {\n return clsx(\n startAdornment ? 'pl-54' : 'pl-28',\n endAdornment ? 'pr-54' : 'pr-28',\n );\n }\n return clsx(\n startAdornment ? 'pl-46' : 'pl-12',\n endAdornment ? 'pr-46' : 'pr-12',\n );\n}\n\nfunction getRadius(props: InputFieldStyleProps): {\n input: string;\n append: string;\n} {\n const {startAppend, endAppend, inputRadius} = props;\n const isInputGroup = startAppend || endAppend;\n\n if (inputRadius === 'rounded-full') {\n return {\n input: clsx(\n !isInputGroup && 'rounded-full',\n startAppend && 'rounded-r-full rounded-l-none',\n endAppend && 'rounded-l-full rounded-r-none',\n ),\n append: startAppend ? 'rounded-l-full' : 'rounded-r-full',\n };\n } else if (inputRadius === 'rounded-none') {\n return {\n input: '',\n append: '',\n };\n } else if (inputRadius) {\n return {\n input: inputRadius,\n append: inputRadius,\n };\n }\n return {\n input: clsx(\n !isInputGroup && 'rounded-input',\n startAppend && 'rounded-input-r rounded-l-none',\n endAppend && 'rounded-input-l rounded-r-none',\n ),\n append: startAppend ? 'rounded-input-l' : 'rounded-input-r',\n };\n}\n\nfunction inputSizeClass({size, flexibleHeight}: BaseFieldProps) {\n switch (size) {\n case '2xs':\n return {font: 'text-xs', height: flexibleHeight ? 'min-h-24' : 'h-24'};\n case 'xs':\n return {font: 'text-xs', height: flexibleHeight ? 'min-h-30' : 'h-30'};\n case 'sm':\n return {font: 'text-sm', height: flexibleHeight ? 'min-h-36' : 'h-36'};\n case 'lg':\n return {\n font: 'text-md md:text-lg',\n height: flexibleHeight ? 'min-h-50' : 'h-50',\n };\n case 'xl':\n return {font: 'text-xl', height: flexibleHeight ? 'min-h-60' : 'h-60'};\n default:\n return {font: 'text-sm', height: flexibleHeight ? 'min-h-42' : 'h-42'};\n }\n}\n\nfunction iconSizeClass(size?: ButtonSize): string {\n switch (size) {\n case '2xs':\n return 'icon-2xs';\n case 'xs':\n return 'icon-xs';\n case 'sm':\n return 'icon-sm';\n case 'md':\n return 'icon-sm';\n case 'lg':\n return 'icon-lg';\n case 'xl':\n return 'icon-xl';\n default:\n // can't return \"size\" variable here, append in field will not work with it\n return '';\n }\n}\n","import React from 'react';\nimport clsx from 'clsx';\n\ntype AdornmentProps = {\n children: React.ReactNode;\n direction: 'start' | 'end';\n position?: string;\n className?: string;\n};\nexport function Adornment({\n children,\n direction,\n className,\n position = direction === 'start' ? 'left-0' : 'right-0',\n}: AdornmentProps) {\n if (!children) return null;\n return (\n <div\n className={clsx(\n 'pointer-events-none absolute top-0 z-10 flex h-full min-w-42 items-center justify-center text-muted',\n position,\n className\n )}\n >\n {children}\n </div>\n );\n}\n","export function removeEmptyValuesFromObject<T extends Record<string, unknown>>(\n obj: T,\n options?: {copy?: boolean; deep?: boolean; arrays?: boolean},\n): T {\n const shouldCopy = options?.copy ?? true;\n const newObj = shouldCopy ? {...obj} : obj;\n Object.keys(newObj).forEach(_key => {\n const key = _key as keyof T;\n if (\n options?.arrays &&\n Array.isArray(newObj[key]) &&\n (newObj[key] as any[]).length === 0\n ) {\n delete newObj[key];\n } else if (\n options?.deep &&\n newObj[key] &&\n typeof newObj[key] === 'object'\n ) {\n newObj[key] = removeEmptyValuesFromObject(newObj[key] as any, options);\n if (Object.keys(newObj[key] as object).length === 0) {\n delete newObj[key];\n }\n } else if (newObj[key] == null || newObj[key] === '') {\n delete newObj[key];\n }\n });\n return shouldCopy ? newObj : obj;\n}\n","import React, {ComponentPropsWithoutRef, ReactElement, ReactNode} from 'react';\nimport {Adornment} from './adornment';\nimport {InputFieldStyle} from './get-input-field-class-names';\nimport {BaseFieldProps} from './base-field-props';\nimport {removeEmptyValuesFromObject} from '@common/utils/objects/remove-empty-values-from-object';\nimport clsx from 'clsx';\n\nexport interface FieldProps extends BaseFieldProps {\n children: ReactNode;\n wrapperProps?: ComponentPropsWithoutRef<'div'>;\n labelProps?: ComponentPropsWithoutRef<'label' | 'span'>;\n descriptionProps?: ComponentPropsWithoutRef<'div'>;\n errorMessageProps?: ComponentPropsWithoutRef<'div'>;\n fieldClassNames: InputFieldStyle;\n}\nexport const Field = React.forwardRef<HTMLDivElement, FieldProps>(\n (props, ref) => {\n const {\n children,\n // Not every component that uses <Field> supports help text.\n description,\n errorMessage,\n descriptionProps = {},\n errorMessageProps = {},\n startAdornment,\n endAdornment,\n adornmentPosition,\n startAppend,\n endAppend,\n fieldClassNames,\n disabled,\n wrapperProps,\n } = props;\n\n return (\n <div className={fieldClassNames.wrapper} ref={ref} {...wrapperProps}>\n <Label {...props} />\n <div className={fieldClassNames.inputWrapper}>\n <Adornment\n direction=\"start\"\n className={fieldClassNames.adornment}\n position={adornmentPosition}\n >\n {startAdornment}\n </Adornment>\n {startAppend && (\n <Append style={fieldClassNames.append} disabled={disabled}>\n {startAppend}\n </Append>\n )}\n {children}\n {endAppend && (\n <Append style={fieldClassNames.append} disabled={disabled}>\n {endAppend}\n </Append>\n )}\n <Adornment\n direction=\"end\"\n className={fieldClassNames.adornment}\n position={adornmentPosition}\n >\n {endAdornment}\n </Adornment>\n </div>\n {description && !errorMessage && (\n <div className={fieldClassNames.description} {...descriptionProps}>\n {description}\n </div>\n )}\n {errorMessage && (\n <div className={fieldClassNames.error} {...errorMessageProps}>\n {errorMessage}\n </div>\n )}\n </div>\n );\n },\n);\n\nfunction Label({\n labelElementType,\n fieldClassNames,\n labelProps,\n label,\n labelSuffix,\n labelSuffixPosition = 'spaced',\n required,\n}: Omit<FieldProps, 'children'>) {\n if (!label) {\n return null;\n }\n\n const ElementType = labelElementType || 'label';\n const labelNode = (\n <ElementType className={fieldClassNames.label} {...labelProps}>\n {label}\n {required && <span className=\"text-danger\"> *</span>}\n </ElementType>\n );\n\n if (labelSuffix) {\n return (\n <div className=\"flex w-full items-center gap-4\">\n {labelNode}\n <div\n className={clsx(\n 'mb-4 text-xs text-muted',\n labelSuffixPosition === 'spaced' ? 'ml-auto' : '',\n )}\n >\n {labelSuffix}\n </div>\n </div>\n );\n }\n\n return labelNode;\n}\n\ninterface AppendProps {\n children: ReactElement;\n style: InputFieldStyle['append'];\n disabled?: boolean;\n}\nfunction Append({children, style, disabled}: AppendProps) {\n return React.cloneElement(children, {\n ...children.props,\n disabled: children.props.disabled || disabled,\n // make sure append styles are not overwritten with empty values\n ...removeEmptyValuesFromObject(style),\n });\n}\n","import {RefObject, useEffect, useRef} from 'react';\n\nexport interface AutoFocusProps {\n autoFocus?: boolean;\n autoSelectText?: boolean;\n disabled?: boolean;\n}\nexport function useAutoFocus(\n {autoFocus, autoSelectText}: AutoFocusProps,\n ref: RefObject<HTMLElement>\n) {\n const autoFocusRef = useRef(autoFocus);\n\n useEffect(() => {\n if (autoFocusRef.current && ref.current) {\n // run inside animation frame to prevent issues when opening\n // dialog with via keyboard shortcut and focusing input\n requestAnimationFrame(() => {\n ref.current?.focus();\n if (autoSelectText && ref.current?.nodeName.toLowerCase() === 'input') {\n (ref.current as HTMLInputElement).select();\n }\n });\n }\n autoFocusRef.current = false;\n }, [ref, autoSelectText]);\n}\n","import {HTMLAttributes, HTMLProps, RefObject, useId} from 'react';\nimport {BaseFieldPropsWithDom} from './base-field-props';\nimport {useAutoFocus} from '../../focus/use-auto-focus';\nimport type {FieldProps} from './field';\n\ninterface UseFieldReturn<T> {\n fieldProps: Omit<FieldProps, 'fieldClassNames' | 'children'>;\n inputProps: HTMLAttributes<T>;\n}\n\ninterface Props<T> extends BaseFieldPropsWithDom<T> {\n focusRef: RefObject<HTMLElement>;\n}\nexport function useField<T>(props: Props<T>): UseFieldReturn<T> {\n const {\n focusRef,\n labelElementType = 'label',\n label,\n labelSuffix,\n labelSuffixPosition,\n autoFocus,\n autoSelectText,\n labelPosition,\n descriptionPosition,\n size,\n errorMessage,\n description,\n flexibleHeight,\n startAdornment,\n endAdornment,\n startAppend,\n adornmentPosition,\n endAppend,\n className,\n inputClassName,\n inputWrapperClassName,\n unstyled,\n background,\n invalid,\n disabled,\n id,\n inputRadius,\n inputBorder,\n inputShadow,\n inputRing,\n inputFontSize,\n ...inputDomProps\n } = props;\n\n useAutoFocus(props, focusRef);\n\n const defaultId = useId();\n const inputId = id || defaultId;\n const labelId = `${inputId}-label`;\n const descriptionId = `${inputId}-description`;\n const errorId = `${inputId}-error`;\n\n const labelProps = {\n id: labelId,\n htmlFor: labelElementType === 'label' ? inputId : undefined,\n };\n const descriptionProps = {\n id: descriptionId,\n };\n const errorMessageProps = {\n id: errorId,\n };\n\n const ariaLabel =\n !props.label && !props['aria-label'] && props.placeholder\n ? props.placeholder\n : props['aria-label'];\n\n const inputProps: HTMLProps<T> = {\n 'aria-label': ariaLabel,\n 'aria-invalid': invalid || undefined,\n id: inputId,\n disabled,\n ...inputDomProps,\n };\n\n const labelledBy = [];\n if (label) {\n labelledBy.push(labelProps.id);\n }\n if (inputProps['aria-labelledby']) {\n labelledBy.push(inputProps['aria-labelledby']);\n }\n inputProps['aria-labelledby'] = labelledBy.length\n ? labelledBy.join(' ')\n : undefined;\n\n const describedBy = [];\n if (description) {\n describedBy.push(descriptionProps.id);\n }\n if (errorMessage) {\n describedBy.push(errorMessageProps.id);\n }\n if (inputProps['aria-describedby']) {\n describedBy.push(inputProps['aria-describedby']);\n }\n inputProps['aria-describedby'] = describedBy.length\n ? describedBy.join(' ')\n : undefined;\n\n return {\n fieldProps: {\n errorMessageProps,\n descriptionProps,\n labelProps,\n disabled,\n label,\n labelSuffix,\n labelSuffixPosition,\n autoFocus,\n autoSelectText,\n labelPosition,\n descriptionPosition,\n size,\n errorMessage,\n description,\n flexibleHeight,\n startAdornment,\n endAdornment,\n startAppend,\n adornmentPosition,\n endAppend,\n className,\n inputClassName,\n inputWrapperClassName,\n unstyled,\n background,\n invalid,\n },\n inputProps,\n };\n}\n","import React, {forwardRef, HTMLProps, Ref} from 'react';\nimport {useController} from 'react-hook-form';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {BaseFieldPropsWithDom} from '../base-field-props';\nimport {getInputFieldClassNames} from '../get-input-field-class-names';\nimport {Field} from '../field';\nimport {useField} from '../use-field';\n\nexport interface TextFieldProps\n extends BaseFieldPropsWithDom<HTMLInputElement> {\n rows?: number;\n inputElementType?: 'input' | 'textarea';\n inputRef?: Ref<HTMLInputElement>;\n value?: string | number;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}\nexport const TextField = forwardRef<HTMLDivElement, TextFieldProps>(\n (\n {\n inputElementType = 'input',\n flexibleHeight,\n inputRef,\n inputTestId,\n ...props\n },\n ref\n ) => {\n const inputObjRef = useObjectRef(inputRef);\n\n const {fieldProps, inputProps} = useField<HTMLInputElement>({\n ...props,\n focusRef: inputObjRef,\n });\n\n const isTextArea = inputElementType === 'textarea';\n const ElementType: React.ElementType = isTextArea ? 'textarea' : 'input';\n const inputFieldClassNames = getInputFieldClassNames({\n ...props,\n flexibleHeight: flexibleHeight || inputElementType === 'textarea',\n });\n\n if (inputElementType === 'textarea' && !props.unstyled) {\n inputFieldClassNames.input = `${inputFieldClassNames.input} py-12`;\n }\n\n return (\n <Field ref={ref} fieldClassNames={inputFieldClassNames} {...fieldProps}>\n <ElementType\n data-testid={inputTestId}\n ref={inputObjRef}\n {...(inputProps as any)}\n rows={\n isTextArea\n ? (inputProps as HTMLProps<HTMLTextAreaElement>).rows || 4\n : undefined\n }\n className={inputFieldClassNames.input}\n />\n </Field>\n );\n }\n);\n\nexport interface FormTextFieldProps extends TextFieldProps {\n name: string;\n}\nexport const FormTextField = React.forwardRef<\n HTMLDivElement,\n FormTextFieldProps\n>(({name, ...props}, ref) => {\n const {\n field: {onChange, onBlur, value = '', ref: inputRef},\n fieldState: {invalid, error},\n } = useController({\n name,\n });\n\n const formProps: TextFieldProps = {\n onChange,\n onBlur,\n value: value == null ? '' : value, // avoid issues with \"null\" value when setting form defaults from backend model\n invalid,\n errorMessage: error?.message,\n inputRef,\n name,\n };\n\n return <TextField ref={ref} {...mergeProps(formProps, props)} />;\n});\n","import React, {cloneElement, forwardRef, ReactElement, useId} from 'react';\nimport {useListbox} from '@common/ui/forms/listbox/use-listbox';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Section} from '@common/ui/forms/listbox/section';\nimport {Listbox} from '@common/ui/forms/listbox/listbox';\nimport {useListboxKeyboardNavigation} from '@common/ui/forms/listbox/use-listbox-keyboard-navigation';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {useTypeSelect} from '@common/ui/forms/listbox/use-type-select';\nimport {ListBoxChildren, ListboxProps} from '@common/ui/forms/listbox/types';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\n\ntype Props = ListboxProps & {\n searchPlaceholder?: string;\n showSearchField?: boolean;\n children: [ReactElement, ReactElement<ListBoxChildren<string | number>>];\n};\nexport const MenuTrigger = forwardRef<HTMLButtonElement, Props>(\n (props, ref) => {\n const {\n searchPlaceholder,\n showSearchField,\n children: [menuTrigger, menu],\n floatingWidth = 'auto',\n isLoading,\n } = props;\n\n const id = useId();\n\n const isMobile = useIsMobileMediaQuery();\n const listbox = useListbox(\n {\n ...props,\n clearInputOnItemSelection: true,\n showEmptyMessage: showSearchField,\n // on mobile menu will be shown as bottom drawer, so make it fullscreen width always\n floatingWidth: isMobile ? 'auto' : floatingWidth,\n virtualFocus: showSearchField,\n role: showSearchField ? 'listbox' : 'menu',\n loopFocus: !showSearchField,\n children: menu.props.children,\n },\n ref\n );\n\n const {\n state: {isOpen, setIsOpen, activeIndex, inputValue, setInputValue},\n listboxId,\n focusItem,\n listContent,\n reference,\n onInputChange,\n } = listbox;\n\n const {\n handleTriggerKeyDown,\n handleListboxKeyboardNavigation,\n handleListboxSearchFieldKeydown,\n } = useListboxKeyboardNavigation(listbox);\n const {findMatchingItem} = useTypeSelect();\n\n // focus matching item when user types, if dropdown is open\n const handleListboxTypeSelect = (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n const i = findMatchingItem(e, listContent, activeIndex);\n if (i != null) {\n focusItem('increment', i);\n }\n };\n\n return (\n <Listbox\n listbox={listbox}\n onKeyDownCapture={\n !showSearchField ? handleListboxTypeSelect : undefined\n }\n onKeyDown={handleListboxKeyboardNavigation}\n onClose={showSearchField ? () => setInputValue('') : undefined}\n aria-labelledby={id}\n isLoading={isLoading}\n searchField={\n showSearchField ? (\n <TextField\n size=\"sm\"\n placeholder={searchPlaceholder}\n startAdornment={<SearchIcon />}\n className=\"flex-shrink-0 px-8 pb-8 pt-4\"\n autoFocus\n aria-expanded={isOpen ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n aria-controls={isOpen ? listboxId : undefined}\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n value={inputValue}\n onChange={onInputChange}\n onKeyDown={e => {\n handleListboxSearchFieldKeydown(e);\n }}\n />\n ) : null\n }\n >\n {cloneElement(menuTrigger, {\n id,\n 'aria-expanded': isOpen ? 'true' : 'false',\n 'aria-haspopup': 'menu',\n 'aria-controls': isOpen ? listboxId : undefined,\n ref: reference,\n onKeyDown: handleTriggerKeyDown,\n onClick: createEventHandler(e => {\n menuTrigger.props?.onClick?.(e);\n setIsOpen(!isOpen);\n }),\n })}\n </Listbox>\n );\n }\n);\n\nexport function Menu({children}: ListBoxChildren<string | number>) {\n return children as unknown as ReactElement;\n}\n\nexport {Item as MenuItem};\nexport {Section as MenuSection};\n","import React, {ReactElement, useEffect} from 'react';\nimport {useListbox} from '../../forms/listbox/use-listbox';\nimport {Listbox} from '../../forms/listbox/listbox';\nimport {Menu} from './menu-trigger';\nimport {useListboxKeyboardNavigation} from '../../forms/listbox/use-listbox-keyboard-navigation';\nimport {useTypeSelect} from '../../forms/listbox/use-type-select';\nimport {ListBoxChildren, ListboxProps} from '../../forms/listbox/types';\nimport {VirtualElement} from '@floating-ui/react-dom';\n\nconst preventContextOnMenu = (e: MouseEvent) => {\n e.preventDefault();\n};\n\ntype Props = ListboxProps &\n ListBoxChildren<any> & {\n position?: {x: number; y: number} | null;\n };\n\nexport function ContextMenu({position, children, ...props}: Props) {\n const listbox = useListbox({\n ...props,\n isOpen: props.isOpen && !!position,\n placement: 'right-start',\n floatingWidth: 'auto',\n offset: {mainAxis: 5, alignmentAxis: 4},\n role: 'menu',\n loopFocus: true,\n children:\n (children as ReactElement)?.type === Menu\n ? (children as ReactElement).props.children\n : children,\n });\n const {\n reference,\n refs,\n state: {isOpen, setIsOpen, activeIndex},\n focusItem,\n listContent,\n } = listbox;\n\n useEffect(() => {\n if (refs.floating.current) {\n refs.floating.current.addEventListener(\n 'contextmenu',\n preventContextOnMenu\n );\n return () => {\n refs.floating.current?.removeEventListener(\n 'contextmenu',\n preventContextOnMenu\n );\n };\n }\n }, [refs.floating]);\n\n useEffect(() => {\n if (position) {\n reference(pointToVirtualElement(position));\n setIsOpen(true);\n }\n }, [position, reference, setIsOpen]);\n\n const {handleListboxKeyboardNavigation} =\n useListboxKeyboardNavigation(listbox);\n\n const {findMatchingItem} = useTypeSelect();\n\n return (\n <Listbox\n listbox={listbox}\n onKeyDownCapture={e => {\n if (!isOpen) return;\n const i = findMatchingItem(e, listContent, activeIndex);\n if (i) {\n focusItem('increment', i);\n }\n }}\n onKeyDown={handleListboxKeyboardNavigation}\n />\n );\n}\n\nexport function pointToVirtualElement(\n {x, y}: {x: number; y: number},\n contextElement?: Element\n): VirtualElement {\n return {\n getBoundingClientRect() {\n return {\n x,\n y,\n width: 0,\n height: 0,\n top: y,\n right: x,\n bottom: y,\n left: x,\n };\n },\n contextElement,\n };\n}\n","import {useEffect, useMemo, useRef} from 'react';\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nexport function useCallbackRef<T extends (...args: any[]) => any>(\n callback: T | undefined\n): T {\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, []);\n}\n","import React, {\n Children,\n cloneElement,\n Fragment,\n HTMLProps,\n ReactElement,\n ReactNode,\n RefObject,\n useCallback,\n useId,\n useMemo,\n useRef,\n} from 'react';\nimport {AnimatePresence} from 'framer-motion';\nimport {useControlledState} from '@react-stately/utils';\nimport {mergeProps, useLayoutEffect} from '@react-aria/utils';\nimport {useFloatingPosition} from '../floating-position';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {DialogContext, DialogContextValue} from './dialog-context';\nimport {Popover} from '../popover';\nimport {Tray} from '../tray';\nimport {Modal} from '../modal';\nimport {createPortal} from 'react-dom';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {OffsetOptions, Placement, VirtualElement} from '@floating-ui/react-dom';\nimport {rootEl} from '@common/core/root-el';\nimport {pointToVirtualElement} from '@common/ui/navigation/menu/context-menu';\nimport {useCallbackRef} from '@common/utils/hooks/use-callback-ref';\n\ntype PopoverProps = {\n type: 'popover';\n mobileType?: 'tray' | 'modal';\n placement?: Placement;\n offset?: OffsetOptions;\n};\ntype ModalProps = {\n type: 'modal' | 'tray';\n mobileType?: 'tray' | 'modal';\n placement?: Placement;\n};\ntype Props<T = any> = (PopoverProps | ModalProps) & {\n children: [ReactElement, (ctx: DialogContextValue) => void] | ReactNode;\n disableInitialTransition?: boolean;\n onClose?: (value?: T) => void;\n isDismissable?: boolean;\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n defaultIsOpen?: boolean;\n triggerRef?: RefObject<HTMLElement> | RefObject<VirtualElement>;\n moveFocusToDialog?: boolean;\n returnFocusToTrigger?: boolean;\n triggerOnHover?: boolean;\n triggerOnContextMenu?: boolean;\n currentValue?: T;\n usePortal?: boolean;\n};\nexport function DialogTrigger(props: Props) {\n let {\n children,\n type,\n disableInitialTransition,\n isDismissable = true,\n moveFocusToDialog = true,\n returnFocusToTrigger = true,\n triggerOnHover = false,\n currentValue,\n triggerOnContextMenu = false,\n usePortal = true,\n mobileType,\n } = props;\n\n // for context menu we will set triggerRef to VirtualElement in \"onContextMenu\" event.\n // If dialog is not triggered on context menu, leave triggerRef null (unless it's passed in via props)\n // otherwise it will prevent dialog from opening in \"popover\" mode.\n const contextMenuTriggerRef = useRef<VirtualElement | null>(null);\n const triggerRef =\n triggerOnContextMenu && !props.triggerRef\n ? contextMenuTriggerRef\n : props.triggerRef;\n const initialValueRef = useRef(currentValue);\n const [isOpen, setIsOpen] = useControlledState(\n props.isOpen,\n props.defaultIsOpen,\n props.onOpenChange,\n );\n\n // On small devices, show a modal or tray instead of a popover.\n const isMobile = useIsMobileMediaQuery();\n if (isMobile && type === 'popover') {\n type = mobileType || 'modal';\n }\n\n const hoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const {x, y, reference, strategy, refs} = useFloatingPosition({\n ...props,\n disablePositioning: type === 'modal',\n });\n\n const floatingStyle =\n type === 'popover'\n ? {\n position: strategy,\n top: y ?? '',\n left: x ?? '',\n }\n : {};\n\n const id = useId();\n const labelId = `${id}-label`;\n const descriptionId = `${id}-description`;\n const formId = `${id}-form`;\n\n const onClose = useCallbackRef(props.onClose);\n const close = useCallback(\n (value?: any) => {\n // initial value can be used to restore state to what it was before opening the dialog, for example in color picker\n onClose?.(value ?? initialValueRef.current);\n setIsOpen(false);\n },\n [onClose, setIsOpen],\n );\n\n const open = useCallback(() => {\n setIsOpen(true);\n // set current value that is active at the time of opening dialog\n initialValueRef.current = currentValue;\n }, [currentValue, setIsOpen]);\n\n // position dropdown relative to provided ref, not the trigger\n useLayoutEffect(() => {\n if (triggerRef?.current && refs.reference.current !== triggerRef.current) {\n reference(triggerRef.current);\n }\n }, [reference, triggerRef?.current, refs]);\n\n const dialogProps = useMemo(() => {\n return {\n 'aria-labelledby': labelId,\n 'aria-describedby': descriptionId,\n };\n }, [labelId, descriptionId]);\n\n let Overlay: typeof Modal | typeof Tray | typeof Popover;\n if (type === 'modal') {\n Overlay = Modal;\n } else if (type === 'tray') {\n Overlay = Tray;\n } else {\n Overlay = Popover;\n }\n\n const contextValue: DialogContextValue = useMemo(() => {\n return {\n dialogProps,\n type,\n labelId,\n descriptionId,\n isDismissable,\n close,\n formId,\n };\n }, [close, descriptionId, dialogProps, formId, labelId, type, isDismissable]);\n\n triggerOnHover = triggerOnHover && type === 'popover';\n\n const handleTriggerHover: HTMLProps<HTMLElement> = {\n onPointerEnter: createEventHandler((e: React.PointerEvent) => {\n open();\n }),\n onPointerLeave: createEventHandler((e: React.PointerEvent) => {\n hoverTimeoutRef.current = setTimeout(() => {\n close();\n }, 150);\n }),\n };\n\n const handleFloatingHover: HTMLProps<HTMLElement> = {\n onPointerEnter: createEventHandler((e: React.PointerEvent) => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n }),\n onPointerLeave: createEventHandler((e: React.PointerEvent) => {\n close();\n }),\n };\n\n const handleTriggerContextMenu: HTMLProps<HTMLElement> = {\n onContextMenu: createEventHandler((e: React.MouseEvent) => {\n e.preventDefault();\n contextMenuTriggerRef.current = pointToVirtualElement(\n {x: e.clientX, y: e.clientY},\n e.currentTarget,\n );\n open();\n }),\n };\n\n const handleTriggerClick: HTMLProps<HTMLElement> = {\n onClick: createEventHandler((e: React.MouseEvent) => {\n // prevent propagating to parent, in case floating element\n // is attached to input field and button is inside the field\n e.stopPropagation();\n if (isOpen) {\n close();\n } else {\n open();\n }\n }),\n };\n\n const {dialogTrigger, dialog} = extractChildren(children, contextValue);\n\n const dialogContent = (\n <AnimatePresence initial={!disableInitialTransition}>\n {isOpen && (\n <DialogContext.Provider value={contextValue}>\n <Overlay\n {...(triggerOnHover ? handleFloatingHover : {})}\n ref={refs.setFloating}\n triggerRef={refs.reference}\n style={floatingStyle}\n restoreFocus={returnFocusToTrigger}\n autoFocus={moveFocusToDialog}\n isOpen={isOpen}\n onClose={close}\n isDismissable={isDismissable}\n isContextMenu={triggerOnContextMenu}\n placement={props.placement}\n >\n {dialog}\n </Overlay>\n </DialogContext.Provider>\n )}\n </AnimatePresence>\n );\n\n return (\n <Fragment>\n {dialogTrigger &&\n cloneElement(\n dialogTrigger,\n mergeProps(\n {\n // make sure ref specified on trigger element is not overwritten\n ...(!triggerRef && !triggerOnContextMenu ? {ref: reference} : {}),\n ...(!triggerOnContextMenu ? handleTriggerClick : {}),\n ...(triggerOnHover ? handleTriggerHover : {}),\n ...(triggerOnContextMenu ? handleTriggerContextMenu : {}),\n },\n {\n ...dialogTrigger.props,\n },\n ),\n )}\n {usePortal\n ? rootEl && createPortal(dialogContent, rootEl)\n : dialogContent}\n </Fragment>\n );\n}\n\nfunction extractChildren(\n rawChildren: Props['children'],\n ctx: DialogContextValue,\n) {\n const children = Array.isArray(rawChildren)\n ? rawChildren\n : Children.toArray(rawChildren);\n\n let dialog: any = children.length === 2 ? children[1] : children[0];\n dialog = typeof dialog === 'function' ? dialog(ctx) : dialog;\n\n // trigger and dialog passed as children\n if (children.length === 2) {\n return {\n dialogTrigger: children[0] as ReactElement,\n dialog: dialog as ReactElement,\n };\n }\n\n // only dialog passed as child\n return {dialog: dialog as ReactElement};\n}\n","import {\n closeDialog,\n useDialogStore,\n} from '@common/ui/overlays/store/dialog-store';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport React from 'react';\n\nexport function DialogStoreOutlet() {\n const {dialog: DialogElement, data} = useDialogStore();\n return (\n <DialogTrigger\n type=\"modal\"\n isOpen={DialogElement != null}\n onClose={value => {\n closeDialog(value);\n }}\n >\n {DialogElement ? <DialogElement {...data} /> : null}\n </DialogTrigger>\n );\n}\n","import {isAbsoluteUrl} from '../urls/is-absolute-url';\n\ninterface Options {\n id?: string;\n force?: boolean;\n type?: 'js' | 'css';\n parentEl?: HTMLElement;\n document?: Document;\n}\n\ninterface LoadAssetOptions {\n url: string;\n id: string;\n resolve: (value?: any | PromiseLike<any>) => void;\n parentEl?: HTMLElement;\n document?: Document;\n}\n\nclass LazyLoader {\n private loadedAssets: Record<\n string,\n {\n state: 'loaded' | Promise<void>;\n doc?: Document;\n }\n > = {};\n\n loadAsset(url: string, params: Options = {type: 'js'}): Promise<any> {\n const currentState = this.loadedAssets[url]?.state;\n\n // script is already loaded, return resolved promise\n if (currentState === 'loaded' && !params.force) {\n return new Promise<void>(resolve => resolve());\n }\n\n const neverLoaded =\n !currentState || this.loadedAssets[url].doc !== params.document;\n // script has never been loaded before, load it, return promise and resolve on script load event\n if (neverLoaded || (params.force && currentState === 'loaded')) {\n this.loadedAssets[url] = {\n state: new Promise(resolve => {\n const finalUrl = isAbsoluteUrl(url) ? url : `assets/${url}`;\n const finalId = buildId(url, params.id);\n\n const assetOptions: LoadAssetOptions = {\n url: finalUrl,\n id: finalId,\n resolve,\n parentEl: params.parentEl,\n document: params.document,\n };\n\n if (params.type === 'css') {\n this.loadStyleAsset(assetOptions);\n } else {\n this.loadScriptAsset(assetOptions);\n }\n }),\n doc: params.document,\n };\n return this.loadedAssets[url].state as Promise<void>;\n }\n\n // script is still loading, return existing promise\n return this.loadedAssets[url].state as Promise<void>;\n }\n\n /**\n * Check whether asset is loading or has already loaded.\n */\n isLoadingOrLoaded(url: string): boolean {\n return this.loadedAssets[url] != null;\n }\n\n private loadStyleAsset(options: LoadAssetOptions) {\n const doc = options.document || document;\n const parentEl = options.parentEl || doc.head;\n const style = doc.createElement('link');\n const prefixedId = buildId(options.url, options.id);\n\n style.rel = 'stylesheet';\n style.id = prefixedId;\n style.href = options.url;\n\n try {\n if (parentEl.querySelector(`#${prefixedId}`)) {\n parentEl.querySelector(`#${prefixedId}`)?.remove();\n }\n } catch (e) {}\n\n style.onload = () => {\n this.loadedAssets[options.url].state = 'loaded';\n options.resolve();\n };\n\n parentEl.appendChild(style);\n }\n\n private loadScriptAsset(options: LoadAssetOptions) {\n const doc = options.document || document;\n const parentEl = options.parentEl || doc.body;\n const script: HTMLScriptElement = doc.createElement('script');\n const prefixedId = buildId(options.url, options.id);\n\n script.async = true;\n script.id = prefixedId;\n script.src = options.url;\n\n try {\n if (parentEl.querySelector(`#${prefixedId}`)) {\n parentEl.querySelector(`#${prefixedId}`)?.remove();\n }\n } catch (e) {}\n\n script.onload = () => {\n this.loadedAssets[options.url].state = 'loaded';\n options.resolve();\n };\n\n (parentEl || parentEl).appendChild(script);\n }\n}\n\nfunction buildId(url: string, id?: string): string {\n if (id) return id;\n return btoa(url.split('/').pop() as string);\n}\n\nexport default new LazyLoader();\n","import {FontFaceConfig} from './font-face-config';\nimport {FontConfig} from '@common/http/value-lists';\nimport lazyLoader from '@common/utils/http/lazy-loader';\n\nfunction prefixId(id: string) {\n return `be-fonts-${id}`;\n}\n\nexport function loadFonts(\n fonts: (FontFaceConfig | FontConfig)[],\n options: {\n prefixSrc?: (src?: string) => string;\n id: string;\n forceAssetLoad?: boolean;\n document?: Document;\n weights?: number[];\n },\n): Promise<FontFace[]> {\n const doc = options.document || document;\n const googleFonts: FontConfig[] = [];\n const customFonts: FontFaceConfig[] = [];\n\n let promises = [];\n\n fonts.forEach(font => {\n if ('google' in font && font.google) {\n googleFonts.push(font);\n } else if ('src' in font) {\n customFonts.push(font);\n }\n // native fonts don't need to be loaded, they are already available in the browser\n });\n\n if (googleFonts?.length) {\n const weights = options.weights || [400];\n const families = fonts\n .map(f => `${f.family}:${weights.join(',')}`)\n .join('|');\n const googlePromise = lazyLoader.loadAsset(\n `https://fonts.googleapis.com/css?family=${families}&display=swap`,\n {\n type: 'css',\n id: prefixId(options.id),\n force: options.forceAssetLoad,\n document: doc,\n },\n );\n promises.push(googlePromise);\n }\n\n if (customFonts?.length) {\n const customFontPromises = customFonts.map(async fontConfig => {\n const loadedFont = Array.from(doc.fonts.values()).find(current => {\n return current.family === fontConfig.family;\n });\n if (loadedFont) {\n return loadedFont.loaded;\n }\n const fontFace = new FontFace(\n fontConfig.family,\n `url(${\n options?.prefixSrc\n ? options.prefixSrc(fontConfig.src)\n : fontConfig.src\n })`,\n fontConfig.descriptors,\n );\n doc.fonts.add(fontFace);\n return fontFace.load();\n });\n promises = promises.concat(customFontPromises);\n }\n\n return Promise.all(promises);\n}\n","import {useCallback, useEffect} from 'react';\nimport {useNavigate} from 'react-router-dom';\nimport {AllCommands} from '@common/admin/appearance/commands/commands';\nimport {\n removeThemeValue,\n setThemeValue,\n} from '@common/ui/themes/utils/set-theme-value';\nimport {applyThemeToDom} from '@common/ui/themes/utils/apply-theme-to-dom';\nimport {useBootstrapData} from '@common/core/bootstrap-data/bootstrap-data-context';\nimport {loadFonts} from '@common/ui/font-picker/load-fonts';\n\nexport function AppearanceListener() {\n const navigate = useNavigate();\n const {mergeBootstrapData, data: currentData} = useBootstrapData();\n\n const handleCommand = useCallback(\n (command: AllCommands) => {\n switch (command.type) {\n case 'navigate':\n return navigate(command.to);\n case 'setValues':\n return mergeBootstrapData({\n themes: {\n ...currentData.themes,\n all: command.values.appearance.themes.all,\n },\n settings: {\n ...currentData.settings,\n ...command.values.settings,\n },\n });\n case 'setThemeFont':\n if (command.value) {\n setThemeValue('--be-font-family', command.value.family);\n loadFonts([command.value], {\n id: 'be-primary-font',\n forceAssetLoad: true,\n });\n } else {\n removeThemeValue('--be-font-family');\n }\n return;\n case 'setThemeValue':\n return setThemeValue(command.name, command.value);\n case 'setActiveTheme':\n const theme = currentData.themes.all.find(\n t => t.id === command.themeId,\n );\n if (theme) {\n applyThemeToDom(theme);\n }\n return;\n case 'setCustomCode':\n return renderCustomCode(command.mode, command.value);\n default:\n }\n },\n [currentData, mergeBootstrapData, navigate],\n );\n\n useEffect(() => {\n const handleMessage = (e: MessageEvent) => {\n if (isAppearanceEvent(e) && eventIsTrusted(e)) {\n handleCommand(e.data);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [navigate, handleCommand]);\n return null;\n}\n\nfunction isAppearanceEvent(e: MessageEvent) {\n return e.data?.source === 'be-appearance-editor';\n}\n\nfunction eventIsTrusted(e: MessageEvent): boolean {\n return new URL(e.origin).hostname === window.location.hostname;\n}\n\nfunction renderCustomCode(mode: 'html' | 'css', value?: string) {\n const parent = mode === 'html' ? document.body : document.head;\n const nodeType = mode === 'html' ? 'div' : 'style';\n let customNode = parent.querySelector('#be-custom-code');\n\n if (!value) {\n if (customNode) {\n customNode.remove();\n }\n } else {\n if (!customNode) {\n customNode = document.createElement(nodeType);\n customNode.id = 'be-custom-code';\n parent.appendChild(customNode);\n }\n customNode.innerHTML = value;\n }\n}\n","import {MenuConfig} from '../core/settings/settings';\nimport {useAuth} from '../auth/use-auth';\nimport {useSettings} from '../core/settings/use-settings';\n\nexport function useCustomMenu(menuOrPosition?: string | MenuConfig) {\n const settings = useSettings();\n const {user, hasPermission} = useAuth();\n\n if (!menuOrPosition) {\n return null;\n }\n\n const menu =\n typeof menuOrPosition === 'string'\n ? settings.menus?.find(s => s.positions?.includes(menuOrPosition))\n : menuOrPosition;\n\n if (menu) {\n menu.items = menu.items.filter(item => {\n const hasRoles = (item.roles || []).every(a =>\n user?.roles.find(b => b.id === a)\n );\n const hasPermissions = (item.permissions || []).every(a =>\n hasPermission(a)\n );\n // make sure item has action, otherwise router link will error out\n return item.action && hasRoles && hasPermissions;\n });\n }\n return menu;\n}\n","import React, {forwardRef, Fragment, ReactElement} from 'react';\nimport {NavLink} from 'react-router-dom';\nimport clsx from 'clsx';\nimport {MenuConfig, MenuItemConfig} from '../core/settings/settings';\nimport {createSvgIconFromTree} from '../icons/create-svg-icon';\nimport {Orientation} from '../ui/forms/orientation';\nimport {useCustomMenu} from './use-custom-menu';\nimport {Trans} from '../i18n/trans';\nimport {IconSize} from '@common/icons/svg-icon';\n\ntype MatchDescendants = undefined | boolean | ((to: string) => boolean);\n\ninterface CustomMenuProps {\n className?: string;\n matchDescendants?: MatchDescendants;\n iconClassName?: string;\n iconSize?: IconSize;\n itemClassName?:\n | string\n | ((props: {\n isActive: boolean;\n item: MenuItemConfig;\n }) => string | undefined);\n gap?: string;\n menu?: string | MenuConfig;\n children?: (menuItem: MenuItemConfig) => ReactElement;\n orientation?: Orientation;\n onlyShowIcons?: boolean;\n unstyled?: boolean;\n}\nexport function CustomMenu({\n className,\n iconClassName,\n itemClassName,\n gap = 'gap-30',\n menu: menuOrPosition,\n orientation = 'horizontal',\n children,\n matchDescendants,\n onlyShowIcons,\n iconSize,\n unstyled = false,\n}: CustomMenuProps) {\n const menu = useCustomMenu(menuOrPosition);\n if (!menu) return null;\n\n return (\n <div\n className={clsx(\n 'flex',\n gap,\n orientation === 'vertical' ? 'flex-col items-start' : 'items-center',\n className\n )}\n data-menu-id={menu.id}\n >\n {menu.items.map(item => {\n if (children) {\n return children(item);\n }\n return (\n <CustomMenuItem\n unstyled={unstyled}\n onlyShowIcon={onlyShowIcons}\n matchDescendants={matchDescendants}\n iconClassName={iconClassName}\n iconSize={iconSize}\n className={props => {\n return typeof itemClassName === 'function'\n ? itemClassName({...props, item})\n : itemClassName;\n }}\n key={item.id}\n item={item}\n />\n );\n })}\n </div>\n );\n}\n\ninterface MenuItemProps extends React.RefAttributes<HTMLAnchorElement> {\n item: MenuItemConfig;\n iconClassName?: string;\n className?: (props: {isActive: boolean}) => string | undefined;\n matchDescendants?: MatchDescendants;\n onlyShowIcon?: boolean;\n iconSize?: IconSize;\n unstyled?: boolean;\n}\nexport const CustomMenuItem = forwardRef<HTMLAnchorElement, MenuItemProps>(\n (\n {\n item,\n className,\n matchDescendants,\n unstyled,\n onlyShowIcon,\n iconClassName,\n iconSize = 'sm',\n ...linkProps\n },\n ref\n ) => {\n const label = <Trans message={item.label} />;\n const Icon = item.icon && createSvgIconFromTree(item.icon);\n const content = (\n <Fragment>\n {Icon && <Icon size={iconSize} className={iconClassName} />}\n {(!Icon || !onlyShowIcon) && label}\n </Fragment>\n );\n\n const baseClassName =\n !unstyled &&\n 'block whitespace-nowrap flex items-center justify-start gap-10';\n\n const focusClassNames = !unstyled && 'outline-none focus-visible:ring-2';\n\n if (item.type === 'link') {\n return (\n <a\n className={clsx(\n baseClassName,\n className?.({isActive: false}),\n focusClassNames\n )}\n href={item.action}\n target={item.target}\n data-menu-item-id={item.id}\n ref={ref}\n {...linkProps}\n >\n {content}\n </a>\n );\n }\n return (\n <NavLink\n end={\n typeof matchDescendants === 'function'\n ? matchDescendants(item.action)\n : matchDescendants\n }\n className={props =>\n clsx(baseClassName, className?.(props), focusClassNames)\n }\n to={item.action}\n target={item.target}\n data-menu-item-id={item.id}\n ref={ref}\n {...linkProps}\n >\n {content}\n </NavLink>\n );\n }\n);\n","import clsx from 'clsx';\nimport {Trans} from '../../i18n/trans';\nimport {CustomMenuItem} from '../../menus/custom-menu';\nimport {Button} from '../buttons/button';\nimport {useSettings} from '../../core/settings/use-settings';\nimport {useState} from 'react';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {useCookie} from '@common/utils/hooks/use-cookie';\n\nexport function CookieNotice() {\n const {\n cookie_notice: {position, enable},\n } = useSettings();\n\n const [, setCookie] = useCookie('cookie_notice');\n\n const [alreadyAccepted, setAlreadyAccepted] = useState(() => {\n return !getBootstrapData().show_cookie_notice;\n });\n\n if (!enable || alreadyAccepted) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n 'fixed z-50 flex w-full items-center justify-center gap-30 bg-toast p-14 text-sm text-white shadow',\n position == 'top' ? 'top-0' : 'bottom-0'\n )}\n >\n <Trans\n message=\"We use cookies to optimize site functionality and provide you with the\n best possible experience.\"\n />\n <InfoLink />\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n onClick={() => {\n setCookie('true', {days: 30, path: '/'});\n setAlreadyAccepted(true);\n }}\n >\n <Trans message=\"OK\" />\n </Button>\n </div>\n );\n}\n\nfunction InfoLink() {\n const {\n cookie_notice: {button},\n } = useSettings();\n\n if (!button?.label) {\n return null;\n }\n\n return (\n <CustomMenuItem\n className={() => 'text-primary-light hover:underline'}\n item={button}\n />\n );\n}\n","import {useAuth} from '../use-auth';\nimport {ReactElement, useContext} from 'react';\nimport {Navigate, Outlet, useLocation} from 'react-router-dom';\nimport {useAppearanceEditorMode} from '../../admin/appearance/commands/use-appearance-editor-mode';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\ninterface GuestRouteProps {\n children: ReactElement;\n}\nexport function GuestRoute({children}: GuestRouteProps) {\n const {isLoggedIn, getRedirectUri} = useAuth();\n const {isAppearanceEditorActive} = useAppearanceEditorMode();\n const redirectUri = getRedirectUri();\n const {auth} = useContext(SiteConfigContext);\n const {pathname} = useLocation();\n\n if (isLoggedIn && !isAppearanceEditorActive) {\n // prevent recursive redirects\n if (redirectUri !== pathname) {\n return <Navigate to={redirectUri} replace />;\n } else if (auth.secondaryRedirectUri) {\n return <Navigate to={auth.secondaryRedirectUri} replace />;\n }\n }\n\n return children || <Outlet />;\n}\n","import {\n FieldValues,\n FormProvider,\n SubmitHandler,\n UseFormReturn,\n} from 'react-hook-form';\nimport {FocusEventHandler, ReactNode} from 'react';\n\ninterface Props<T extends FieldValues> {\n children: ReactNode;\n form: UseFormReturn<T>;\n className?: string;\n onSubmit: SubmitHandler<T>;\n onBeforeSubmit?: () => void;\n onBlur?: FocusEventHandler<HTMLFormElement>;\n id?: string;\n}\nexport function Form<T extends FieldValues>({\n children,\n onBeforeSubmit,\n onSubmit,\n form,\n className,\n id,\n onBlur,\n}: Props<T>) {\n return (\n <FormProvider {...form}>\n <form\n id={id}\n onBlur={onBlur}\n className={className}\n onSubmit={e => {\n // prevent parent forms from submitting, if nested\n e.stopPropagation();\n onBeforeSubmit?.();\n form.handleSubmit(onSubmit)(e);\n }}\n >\n {children}\n </form>\n </FormProvider>\n );\n}\n","import {ComponentPropsWithRef} from 'react';\n\nexport const LinkStyle =\n 'text-primary hover:underline hover:text-primary-dark focus-visible:ring focus-visible:ring-2 focus-visible:ring-offset-2 outline-none rounded transition-colors';\n\ninterface ExternalLinkProps extends ComponentPropsWithRef<'a'> {}\nexport function ExternalLink({\n children,\n className,\n target = '_blank',\n ...domProps\n}: ExternalLinkProps) {\n return (\n <a className={LinkStyle} target={target} {...domProps}>\n {children}\n </a>\n );\n}\n","import axios from 'axios';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendErrorResponse} from './backend-error-response';\nimport {toast} from '../ui/toast/toast';\nimport {message} from '../i18n/message';\n\nexport function onFormQueryError(r: unknown, form: UseFormReturn<any>) {\n if (form && axios.isAxiosError(r) && r.response) {\n const response = r.response.data as BackendErrorResponse;\n if (!response.errors) {\n toast.danger(\n response.message ??\n message('There was an issue. Please try again later.')\n );\n } else {\n Object.entries(response.errors || {}).forEach(([key, errors], index) => {\n if (typeof errors === 'string') {\n form.setError(key, {message: errors}, {shouldFocus: index === 0});\n } else {\n errors.forEach((message, subIndex) => {\n form.setError(\n key,\n {message},\n {shouldFocus: index === 0 && subIndex === 0}\n );\n });\n }\n });\n }\n }\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {apiClient} from '../../http/query-client';\nimport {useAuth} from '../use-auth';\nimport {useBootstrapData} from '../../core/bootstrap-data/bootstrap-data-context';\n\ninterface Response extends BackendResponse {\n bootstrapData?: string;\n message?: string;\n status: 'success' | 'needs_email_verification';\n}\n\nexport interface RegisterPayload {\n email: string;\n password: string;\n password_confirmation: string;\n}\n\nexport function useRegister(form: UseFormReturn<RegisterPayload>) {\n const navigate = useNavigate();\n const {getRedirectUri} = useAuth();\n const {setBootstrapData} = useBootstrapData();\n\n return useMutation({\n mutationFn: register,\n onSuccess: response => {\n setBootstrapData(response.bootstrapData!);\n if (response.status === 'needs_email_verification') {\n navigate('/');\n } else {\n navigate(getRedirectUri(), {replace: true});\n }\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction register(payload: RegisterPayload): Promise<Response> {\n return apiClient\n .post('auth/register', payload)\n .then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {apiClient} from '../../http/query-client';\nimport {useAuth} from '../use-auth';\nimport {useBootstrapData} from '../../core/bootstrap-data/bootstrap-data-context';\n\ninterface Response extends BackendResponse {\n bootstrapData: string;\n}\n\nexport interface ConnectSocialPayload {\n password: string;\n}\n\nexport function useConnectSocialWithPassword(\n form: UseFormReturn<ConnectSocialPayload>,\n) {\n const navigate = useNavigate();\n const {getRedirectUri} = useAuth();\n const {setBootstrapData} = useBootstrapData();\n return useMutation({\n mutationFn: connect,\n onSuccess: response => {\n setBootstrapData(response.bootstrapData);\n navigate(getRedirectUri(), {replace: true});\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction connect(payload: ConnectSocialPayload): Promise<Response> {\n return apiClient\n .post('secure/auth/social/connect', payload)\n .then(response => response.data);\n}\n","import {useCallback} from 'react';\nimport memoize from 'nano-memoize';\nimport {useSelectedLocale} from './selected-locale';\nimport {handlePluralMessage} from './handle-plural-message';\nimport {MessageDescriptor} from './message-descriptor';\nimport {shallowEqual} from '../utils/shallow-equal';\n\nexport interface UseTransReturn {\n trans: (props: MessageDescriptor) => string;\n}\n\nexport function useTrans(): UseTransReturn {\n const {lines, localeCode} = useSelectedLocale();\n const trans = useCallback(\n (props: MessageDescriptor): string => {\n return translate({...props, lines, localeCode});\n },\n [lines, localeCode],\n );\n\n return {trans};\n}\n\ninterface TranslateProps extends MessageDescriptor {\n lines?: Record<string, string>;\n localeCode: string;\n}\nconst translate = memoize(\n (props: TranslateProps) => {\n let {lines, message, values, localeCode} = props;\n message = lines?.[message] || lines?.[message.toLowerCase()] || message;\n\n if (!values) {\n return message;\n }\n\n message = handlePluralMessage(localeCode, props);\n\n Object.entries(values).forEach(([key, value]) => {\n message = message.replace(`:${key}`, `${value}`);\n });\n\n return message;\n },\n {equals: shallowEqual, callTimeout: 0},\n);\n","import React from 'react';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {message} from '../../../i18n/message';\n\ninterface DismissButtonProps {\n onDismiss?: () => void;\n}\nexport function DismissButton({onDismiss}: DismissButtonProps) {\n const {trans} = useTrans();\n\n const onClick = () => {\n if (onDismiss) {\n onDismiss();\n }\n };\n\n return (\n <button\n className=\"sr-only\"\n aria-label={trans(message('Dismiss'))}\n tabIndex={-1}\n onClick={onClick}\n />\n );\n}\n","import React, {\n Children,\n cloneElement,\n ComponentPropsWithoutRef,\n CSSProperties,\n isValidElement,\n ReactElement,\n ReactNode,\n useContext,\n} from 'react';\nimport clsx from 'clsx';\nimport {mergeProps} from '@react-aria/utils';\nimport {DialogContext} from './dialog-context';\nimport {InputSize} from '../../forms/input-field/input-size';\nimport {DismissButton} from './dismiss-button';\n\nexport type DialogSize =\n | InputSize\n | '2xl'\n | 'auto'\n | 'fullscreen'\n | 'fullscreenTakeover'\n | string;\n\nexport interface DialogProps\n extends Omit<ComponentPropsWithoutRef<'div'>, 'size'> {\n children: ReactNode;\n size?: DialogSize;\n background?: string;\n className?: string;\n radius?: string;\n maxWidth?: string;\n}\nexport function Dialog(props: DialogProps) {\n const {\n type = 'modal',\n dialogProps,\n ...contextProps\n } = useContext(DialogContext);\n\n const {\n children,\n className,\n size = 'md',\n background,\n radius = 'rounded',\n maxWidth = 'max-w-dialog',\n ...domProps\n } = props;\n\n // If rendered in a popover or tray there won't be a visible dismiss button,\n // so we render a hidden one for screen readers.\n let dismissButton: ReactElement | null = null;\n if (type === 'popover' || type === 'tray') {\n dismissButton = <DismissButton onDismiss={contextProps.close} />;\n }\n\n const isTrayOrFullScreen = size === 'fullscreenTakeover' || type === 'tray';\n const mergedClassName = clsx(\n 'mx-auto pointer-events-auto outline-none flex flex-col overflow-hidden',\n background || 'bg-paper',\n type !== 'tray' && sizeStyle(size),\n type === 'tray' && 'rounded-t border-b-bg',\n size !== 'fullscreenTakeover' && `shadow-2xl border max-h-dialog`,\n !isTrayOrFullScreen && `${radius} ${maxWidth}`,\n className,\n );\n\n return (\n <div\n {...mergeProps({role: 'dialog', tabIndex: -1}, dialogProps, domProps)}\n style={{...props.style, '--be-dialog-padding': '24px'} as CSSProperties}\n aria-modal\n className={mergedClassName}\n >\n {Children.toArray(children).map(child => {\n if (isValidElement<DialogProps>(child)) {\n return cloneElement<DialogProps>(child, {\n size: child.props.size ?? size,\n });\n }\n return child;\n })}\n {dismissButton}\n </div>\n );\n}\n\nfunction sizeStyle(dialogSize?: DialogSize) {\n switch (dialogSize) {\n case '2xs':\n return 'w-256';\n case 'xs':\n return 'w-320';\n case 'sm':\n return 'w-384';\n case 'md':\n return 'w-440';\n case 'lg':\n return 'w-620';\n case 'xl':\n return 'w-780';\n case '2xl':\n return 'w-850';\n case 'fullscreen':\n return 'w-1280';\n case 'fullscreenTakeover':\n return 'w-full h-full';\n default:\n return dialogSize;\n }\n}\n","import React, {ReactNode, useContext} from 'react';\nimport clsx from 'clsx';\nimport {DialogContext} from './dialog-context';\nimport {IconButton} from '../../buttons/icon-button';\nimport {CloseIcon} from '../../../icons/material/Close';\nimport {DialogSize} from './dialog';\nimport {ButtonSize} from '@common/ui/buttons/button-size';\n\ninterface DialogHeaderProps {\n children: ReactNode;\n className?: string;\n color?: string | null;\n onDismiss?: () => void;\n hideDismissButton?: boolean;\n leftAdornment?: ReactNode;\n // Will hide default close button visually, but still accessible by screen readers\n rightAdornment?: ReactNode;\n // Will show between title and close button\n actions?: ReactNode;\n size?: DialogSize;\n padding?: string;\n justify?: string;\n showDivider?: boolean;\n titleTextSize?: string;\n titleFontWeight?: string;\n closeButtonSize?: ButtonSize;\n}\nexport function DialogHeader(props: DialogHeaderProps) {\n const {\n children,\n className,\n color,\n onDismiss,\n leftAdornment,\n rightAdornment,\n hideDismissButton = false,\n size,\n showDivider,\n justify = 'justify-between',\n titleFontWeight = 'font-semibold',\n titleTextSize = size === 'xs' ? 'text-xs' : 'text-sm',\n closeButtonSize = size === 'xs' ? 'xs' : 'sm',\n actions,\n } = props;\n const {labelId, isDismissable, close} = useContext(DialogContext);\n\n return (\n <div\n className={clsx(\n className,\n 'flex flex-shrink-0 items-center gap-10',\n titleFontWeight,\n showDivider && 'border-b',\n getPadding(props),\n color || 'text-main',\n justify\n )}\n >\n {leftAdornment}\n <h3\n id={labelId}\n className={clsx(titleTextSize, 'mr-auto leading-5 opacity-90')}\n >\n {children}\n </h3>\n {rightAdornment}\n {actions}\n {isDismissable && !hideDismissButton && (\n <IconButton\n aria-label=\"Dismiss\"\n onClick={() => {\n if (onDismiss) {\n onDismiss();\n } else {\n close();\n }\n }}\n size={closeButtonSize}\n className={clsx('-mr-8 text-muted', rightAdornment && 'sr-only')}\n >\n <CloseIcon />\n </IconButton>\n )}\n </div>\n );\n}\n\nfunction getPadding({size, padding}: DialogHeaderProps) {\n if (padding) {\n return padding;\n }\n switch (size) {\n case '2xs':\n case 'xs':\n return 'px-14 py-4';\n case 'sm':\n return 'px-18 py-4';\n default:\n return 'px-24 py-6';\n }\n}\n","import React, {ComponentProps, forwardRef, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {DialogSize} from './dialog';\n\ninterface DialogBodyProps extends ComponentProps<'div'> {\n children: ReactNode;\n className?: string;\n padding?: string | null;\n size?: DialogSize;\n}\nexport const DialogBody = forwardRef<HTMLDivElement, DialogBodyProps>(\n (props, ref) => {\n const {children, className, padding, size, ...domProps} = props;\n return (\n <div\n {...domProps}\n ref={ref}\n className={clsx(\n className,\n getPadding(props),\n 'overflow-y-auto overflow-x-hidden overscroll-contain text-sm flex-auto'\n )}\n >\n {children}\n </div>\n );\n }\n);\n\nfunction getPadding({size, padding}: DialogBodyProps) {\n if (padding) {\n return padding;\n }\n switch (size) {\n case 'xs':\n return 'p-14';\n case 'sm':\n return 'p-18';\n default:\n return 'px-24 py-20';\n }\n}\n","import React, {ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {DialogSize} from './dialog';\n\ninterface DialogFooterProps {\n children: ReactNode;\n startAction?: ReactNode;\n className?: string;\n dividerTop?: boolean;\n size?: DialogSize;\n padding?: string;\n}\nexport function DialogFooter(props: DialogFooterProps) {\n const {children, startAction, className, dividerTop, padding, size} = props;\n\n return (\n <div\n className={clsx(\n className,\n dividerTop && 'border-t',\n getPadding(props),\n 'flex items-center gap-10 flex-shrink-0'\n )}\n >\n <div>{startAction}</div>\n <div className=\"ml-auto flex items-center gap-10\">{children}</div>\n </div>\n );\n}\n\nfunction getPadding({padding, size}: DialogFooterProps) {\n if (padding) {\n return padding;\n }\n switch (size) {\n case 'xs':\n return 'p-14';\n case 'sm':\n return 'p-18';\n default:\n return 'px-24 py-20';\n }\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient} from '../../http/query-client';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n service: string;\n}\n\nexport function useDisconnectSocial() {\n return useMutation({\n mutationFn: disconnect,\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction disconnect(payload: Payload): Promise<Response> {\n return apiClient\n .post(`secure/auth/social/${payload.service}/disconnect`, payload)\n .then(response => response.data);\n}\n","import {useCallback, useState} from 'react';\nimport {toast} from '../../ui/toast/toast';\nimport {useDisconnectSocial} from './disconnect-social';\nimport {useTrans} from '../../i18n/use-trans';\nimport {getBootstrapData} from '../../core/bootstrap-data/use-backend-bootstrap-data';\nimport {useBootstrapData} from '../../core/bootstrap-data/bootstrap-data-context';\n\nexport type SocialService = 'google' | 'twitter' | 'facebook' | 'envato';\n\ninterface SocialMessageEvent {\n status?: 'SUCCESS' | 'ALREADY_LOGGED_IN' | 'REQUEST_PASSWORD' | 'ERROR';\n callbackData?: {\n bootstrapData?: string;\n errorMessage?: string;\n };\n}\n\nexport function useSocialLogin() {\n const {trans} = useTrans();\n const {setBootstrapData} = useBootstrapData();\n const disconnectSocial = useDisconnectSocial();\n\n const [requestingPassword, setIsRequestingPassword] = useState(false);\n\n const handleSocialLoginCallback = useCallback(\n (e: SocialMessageEvent) => {\n const {status, callbackData} = e;\n if (!status) return;\n switch (status.toUpperCase()) {\n case 'SUCCESS':\n if (callbackData?.bootstrapData) {\n setBootstrapData(callbackData.bootstrapData);\n }\n return e;\n case 'REQUEST_PASSWORD':\n setIsRequestingPassword(true);\n return e;\n case 'ERROR':\n const message: string =\n callbackData?.errorMessage ||\n trans({\n message: 'An error occurred. Please try again later',\n });\n toast.danger(message);\n return e;\n default:\n return e;\n }\n },\n [trans, setBootstrapData],\n );\n\n return {\n requestingPassword,\n setIsRequestingPassword,\n loginWithSocial: async (serviceName: SocialService) => {\n const event = await openNewSocialAuthWindow(\n `secure/auth/social/${serviceName}/login`,\n );\n return handleSocialLoginCallback(event);\n },\n connectSocial: async (serviceNameOrUrl: SocialService | string) => {\n const url = serviceNameOrUrl.includes('/')\n ? serviceNameOrUrl\n : `secure/auth/social/${serviceNameOrUrl}/connect`;\n const event = await openNewSocialAuthWindow(url);\n return handleSocialLoginCallback(event);\n },\n disconnectSocial,\n };\n}\n\nconst windowHeight = 550;\nconst windowWidth = 650;\nlet win: Window | null;\n\nfunction openNewSocialAuthWindow(url: string): Promise<SocialMessageEvent> {\n const left = window.screen.width / 2 - windowWidth / 2;\n const top = window.screen.height / 2 - windowHeight / 2;\n\n return new Promise(resolve => {\n win = window.open(\n url,\n 'Authenticate Account',\n `menubar=0, location=0, toolbar=0, titlebar=0, status=0, scrollbars=1, width=${windowWidth}, height=${windowHeight}, left=${left}, top=${top}`,\n );\n\n const messageListener = (e: MessageEvent) => {\n const baseUrl = getBootstrapData().settings.base_url;\n if (e.data.type === 'social-auth' && baseUrl.indexOf(e.origin) > -1) {\n resolve(e.data);\n window.removeEventListener('message', messageListener);\n }\n };\n\n window.addEventListener('message', messageListener);\n\n // if user closes social login callback without interacting with it, remove message event listener\n const timer = setInterval(() => {\n if (!win || win.closed) {\n clearInterval(timer);\n resolve({});\n window.removeEventListener('message', messageListener);\n }\n }, 1000);\n });\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const GoogleIcon = createSvgIcon(\n <g>\n <path\n fill=\"#EA4335\"\n d=\"M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z\"\n />\n <path\n fill=\"#4285F4\"\n d=\"M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z\"\n />\n <path fill=\"none\" d=\"M0 0h48v48H0z\" />\n </g>\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FacebookIcon = createSvgIcon(\n <path d=\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2m13 2h-2.5A3.5 3.5 0 0 0 12 8.5V11h-2v3h2v7h3v-7h3v-3h-3V9a1 1 0 0 1 1-1h2V5z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TwitterIcon = createSvgIcon(\n <path d=\"M22.46 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.37 4.5 17.26 4 16 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98C8.28 9.09 5.11 7.38 3 4.79c-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 0 1-1.93.07 4.28 4.28 0 0 0 4 2.98 8.521 8.521 0 0 1-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.44 20.29 5.7 21 8.12 21 16 21 20.33 14.46 20.33 8.79c0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const EnvatoIcon = createSvgIcon(\n <path d=\"M 23.898438 47 C 13.65625 47 5.003906 38.355469 5.003906 28.125 L 5.003906 28 C 4.929688 23.074219 6.558594 19.714844 7.261719 18.5 C 8.621094 16.152344 10.296875 14.410156 10.8125 14.136719 C 11.566406 13.734375 12.121094 14.332031 12.363281 14.585938 C 12.832031 15.085938 12.597656 15.695313 12.507813 15.925781 C 11.613281 18.265625 10.929688 20.28125 11.003906 23.097656 C 11.097656 26.90625 12.488281 28.699219 13.085938 29.292969 C 13.460938 29.671875 13.769531 29.847656 14.015625 29.933594 C 14.054688 28.671875 14.203125 26.148438 14.773438 23.304688 C 15.113281 21.589844 16.28125 17.085938 19.6875 12.296875 C 23.714844 6.632813 28.449219 4.273438 29.214844 4.042969 C 30.570313 3.636719 33.535156 3.128906 35.957031 3.019531 C 38.53125 2.910156 39.160156 3.574219 39.921875 5.035156 L 40.046875 5.277344 C 41.820313 8.613281 45.03125 18.832031 43.65625 29.132813 C 42.011719 39.992188 34.257813 47 23.898438 47 Z M 14.648438 30 C 14.640625 30 14.632813 30 14.628906 30 L 14.652344 30 C 14.648438 30 14.648438 30 14.648438 30 Z \" />\n);\n","import {useForm} from 'react-hook-form';\nimport {Fragment, ReactElement, ReactNode} from 'react';\nimport {\n ConnectSocialPayload,\n useConnectSocialWithPassword,\n} from '../requests/connect-social-with-password';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {Form} from '../../ui/forms/form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../ui/buttons/button';\nimport {SocialService, useSocialLogin} from '../requests/use-social-login';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {GoogleIcon} from '../../icons/social/google';\nimport {FacebookIcon} from '../../icons/social/facebook';\nimport {TwitterIcon} from '../../icons/social/twitter';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {Trans} from '../../i18n/trans';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {useAuth} from '../use-auth';\nimport {useTrans} from '../../i18n/use-trans';\nimport {message} from '../../i18n/message';\nimport {useSettings} from '../../core/settings/use-settings';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport clsx from 'clsx';\nimport {EnvatoIcon} from '@common/icons/social/envato';\n\nconst googleLabel = message('Continue with google');\nconst facebookLabel = message('Continue with facebook');\nconst twitterLabel = message('Continue with twitter');\nconst envatoLabel = message('Continue with envato');\n\ninterface SocialAuthSectionProps {\n dividerMessage: ReactNode;\n}\nexport function SocialAuthSection({dividerMessage}: SocialAuthSectionProps) {\n const {social} = useSettings();\n const navigate = useNavigate();\n const {getRedirectUri} = useAuth();\n const {loginWithSocial, requestingPassword, setIsRequestingPassword} =\n useSocialLogin();\n\n const allSocialsDisabled =\n !social?.google?.enable &&\n !social?.facebook?.enable &&\n !social?.twitter?.enable &&\n !social?.envato?.enable;\n\n if (allSocialsDisabled) {\n return null;\n }\n\n const handleSocialLogin = async (service: SocialService) => {\n const e = await loginWithSocial(service);\n if (e?.status === 'SUCCESS' || e?.status === 'ALREADY_LOGGED_IN') {\n navigate(getRedirectUri(), {replace: true});\n }\n };\n\n return (\n <Fragment>\n <div className=\"relative my-20 text-center before:absolute before:left-0 before:top-1/2 before:h-1 before:w-full before:-translate-y-1/2 before:bg-divider\">\n <span className=\"relative z-10 bg-paper px-10 text-sm text-muted\">\n {dividerMessage}\n </span>\n </div>\n <div\n className={clsx(\n 'flex items-center justify-center gap-14',\n !social.compact_buttons && 'flex-col',\n )}\n >\n {social?.google?.enable ? (\n <SocialLoginButton\n label={googleLabel}\n icon={<GoogleIcon viewBox=\"0 0 48 48\" />}\n onClick={() => handleSocialLogin('google')}\n />\n ) : null}\n {social?.facebook?.enable ? (\n <SocialLoginButton\n label={facebookLabel}\n icon={<FacebookIcon className=\"text-facebook\" />}\n onClick={() => handleSocialLogin('facebook')}\n />\n ) : null}\n {social?.twitter?.enable ? (\n <SocialLoginButton\n label={twitterLabel}\n icon={<TwitterIcon className=\"text-twitter\" />}\n onClick={() => handleSocialLogin('twitter')}\n />\n ) : null}\n {social?.envato?.enable ? (\n <SocialLoginButton\n label={envatoLabel}\n icon={<EnvatoIcon viewBox=\"0 0 50 50\" className=\"text-envato\" />}\n onClick={() => handleSocialLogin('envato')}\n />\n ) : null}\n </div>\n <DialogTrigger\n type=\"modal\"\n isOpen={requestingPassword}\n onOpenChange={setIsRequestingPassword}\n >\n <RequestPasswordDialog />\n </DialogTrigger>\n </Fragment>\n );\n}\n\nfunction RequestPasswordDialog() {\n const form = useForm<ConnectSocialPayload>();\n const {formId} = useDialogContext();\n const connect = useConnectSocialWithPassword(form);\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Password required\" />\n </DialogHeader>\n <DialogBody>\n <div className=\"mb-30 text-sm text-muted\">\n <Trans message=\"An account with this email address already exists. If you want to connect the two accounts, enter existing account password.\" />\n </div>\n <Form\n form={form}\n id={formId}\n onSubmit={payload => {\n connect.mutate(payload);\n }}\n >\n <FormTextField\n autoFocus\n name=\"password\"\n type=\"password\"\n required\n label={<Trans message=\"Password\" />}\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button variant=\"text\">\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n type=\"submit\"\n form={formId}\n variant=\"flat\"\n color=\"primary\"\n disabled={connect.isPending}\n >\n <Trans message=\"Connect\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n\ninterface SocialLoginButtonProps {\n onClick: () => void;\n label: MessageDescriptor;\n icon: ReactElement;\n}\nfunction SocialLoginButton({onClick, label, icon}: SocialLoginButtonProps) {\n const {trans} = useTrans();\n const {\n social: {compact_buttons},\n } = useSettings();\n\n if (compact_buttons) {\n return (\n <IconButton variant=\"outline\" aria-label={trans(label)} onClick={onClick}>\n {icon}\n </IconButton>\n );\n }\n\n return (\n <Button\n variant=\"outline\"\n startIcon={icon}\n onClick={onClick}\n className=\"min-h-42 w-full\"\n >\n <span className=\"min-w-160 text-start\">\n <Trans {...label} />\n </span>\n </Button>\n );\n}\n","import {Link} from 'react-router-dom';\nimport {CustomMenu} from '../../../menus/custom-menu';\nimport {useSettings} from '../../../core/settings/use-settings';\n\nexport function AuthLayoutFooter() {\n const {branding} = useSettings();\n return (\n <div className=\"pt-42 pb-32 flex items-center gap-30 text-sm text-muted mt-auto\">\n <Link className=\"hover:text-fg-base transition-colors\" to=\"/\">\n © {branding.site_name}\n </Link>\n <CustomMenu\n menu=\"auth-page-footer\"\n orientation=\"horizontal\"\n itemClassName=\"hover:text-fg-base transition-colors\"\n />\n </div>\n );\n}\n","export default \"__VITE_ASSET__b6eba7cf__\"","import {Link} from 'react-router-dom';\nimport {ReactNode} from 'react';\nimport {AuthLayoutFooter} from './auth-layout-footer';\nimport {useIsDarkMode} from '@common/ui/themes/use-is-dark-mode';\nimport authBgSvg from './auth-bg.svg';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useSettings} from '@common/core/settings/use-settings';\n\ninterface AuthPageProps {\n heading?: ReactNode;\n message?: ReactNode;\n children: ReactNode;\n}\nexport function AuthLayout({heading, children, message}: AuthPageProps) {\n const {branding} = useSettings();\n const isDarkMode = useIsDarkMode();\n const {trans} = useTrans();\n\n return (\n <main\n className=\"h-screen flex flex-col items-center bg-alt dark:bg-none pt-70 px-14 md:px-10vw overflow-y-auto\"\n style={{backgroundImage: isDarkMode ? undefined : `url(\"${authBgSvg}\")`}}\n >\n <Link\n to=\"/\"\n className=\"block flex-shrink-0 mb-40\"\n aria-label={trans({message: 'Go to homepage'})}\n >\n <img\n src={isDarkMode ? branding.logo_light : branding?.logo_dark}\n className=\"block h-42 w-auto m-auto\"\n alt=\"\"\n />\n </Link>\n <div className=\"rounded-lg max-w-440 px-40 pt-40 pb-32 w-full mx-auto bg-paper shadow md:shadow-xl\">\n {heading && <h1 className=\"mb-20 text-xl\">{heading}</h1>}\n {children}\n </div>\n {message && <div className=\"mt-36 text-sm\">{message}</div>}\n <AuthLayoutFooter />\n </main>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CheckBoxOutlineBlankIcon = createSvgIcon(\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\" />\n, 'CheckBoxOutlineBlankOutlined');\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const CheckboxFilledIcon = createSvgIcon(\n <path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />,\n 'CheckBox'\n);\n","import {createSvgIcon} from \"../../../icons/create-svg-icon\";\n\nexport const IndeterminateCheckboxFilledIcon = createSvgIcon(\n <path d=\"M19,3H5C3.9,3,3,3.9,3,5v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V5C21,3.9,20.1,3,19,3z M17,13H7v-2h10V13z\" />,\n 'CheckBox'\n);\n","import React, {\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n ComponentType,\n forwardRef,\n useCallback,\n useEffect,\n} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {useControlledState} from '@react-stately/utils';\nimport {InputSize} from '../input-field/input-size';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {CheckBoxOutlineBlankIcon} from '@common/icons/material/CheckBoxOutlineBlank';\nimport {CheckboxFilledIcon} from './checkbox-filled-icon';\nimport {IndeterminateCheckboxFilledIcon} from './indeterminate-checkbox-filled-icon';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {Orientation} from '../orientation';\nimport {AutoFocusProps, useAutoFocus} from '../../focus/use-auto-focus';\n\nexport interface CheckboxProps\n extends AutoFocusProps,\n Omit<ComponentPropsWithoutRef<'input'>, 'size'> {\n size?: InputSize;\n className?: string;\n icon?: React.ComponentType;\n checkedIcon?: React.ComponentType;\n orientation?: Orientation;\n errorMessage?: string;\n isIndeterminate?: boolean;\n invalid?: boolean;\n inputTestId?: string;\n}\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (props, ref) => {\n const {\n size = 'md',\n children,\n className,\n icon,\n checkedIcon,\n disabled,\n isIndeterminate,\n errorMessage,\n invalid,\n orientation = 'horizontal',\n onChange,\n autoFocus,\n required,\n value,\n name,\n inputTestId,\n } = props;\n\n const style = getInputFieldClassNames({...props, label: children});\n const Icon = icon || CheckBoxOutlineBlankIcon;\n const CheckedIcon =\n checkedIcon ||\n (isIndeterminate ? IndeterminateCheckboxFilledIcon : CheckboxFilledIcon);\n\n const inputObjRef = useObjectRef(ref);\n useAutoFocus({autoFocus}, inputObjRef);\n\n useEffect(() => {\n // indeterminate is a property, but it can only be set via javascript\n if (inputObjRef.current) {\n inputObjRef.current.indeterminate = isIndeterminate || false;\n }\n });\n\n const [isSelected, setSelected] = useControlledState(\n props.checked,\n props.defaultChecked || false\n );\n\n const updateChecked: ChangeEventHandler<HTMLInputElement> = useCallback(\n e => {\n onChange?.(e);\n setSelected(e.target.checked);\n },\n [onChange, setSelected]\n );\n\n const mergedClassName = clsx(\n 'select-none',\n className,\n invalid && 'text-danger',\n !invalid && disabled && 'text-disabled'\n );\n\n let CheckboxIcon: ComponentType<SvgIconProps>;\n let checkboxColor = invalid ? 'text-danger' : null;\n if (isIndeterminate) {\n CheckboxIcon = IndeterminateCheckboxFilledIcon;\n checkboxColor = checkboxColor || 'text-primary';\n } else if (isSelected) {\n CheckboxIcon = CheckedIcon;\n checkboxColor = checkboxColor || 'text-primary';\n } else {\n CheckboxIcon = Icon;\n checkboxColor = checkboxColor || 'text-muted';\n }\n\n // input and icon sizes need to match, as checkbox input is being clicked and not the icon due to pointer-events-none\n return (\n <div>\n <label className={mergedClassName}>\n <div\n className={clsx(\n 'relative flex items-center',\n orientation === 'vertical' && 'flex-col flex-col-reverse'\n )}\n >\n <input\n className=\"focus-visible:ring ring-inset transition-shadow outline-none absolute left-0 top-0 w-24 h-24 rounded appearance-none\"\n type=\"checkbox\"\n aria-checked={isIndeterminate ? 'mixed' : isSelected}\n aria-invalid={invalid || undefined}\n onChange={updateChecked}\n ref={inputObjRef}\n required={required}\n disabled={disabled}\n value={value}\n name={name}\n data-testid={inputTestId}\n />\n <CheckboxIcon\n size={size}\n className={clsx(\n 'pointer-events-none',\n disabled ? 'text-disabled' : checkboxColor\n )}\n />\n {children && (\n <div\n className={clsx(\n 'first-letter:capitalize',\n style.size.font,\n orientation === 'vertical' ? 'mb-6' : 'ml-6'\n )}\n >\n {children}\n </div>\n )}\n </div>\n </label>\n {errorMessage && <div className={style.error}>{errorMessage}</div>}\n </div>\n );\n }\n);\n\ninterface FormCheckboxProps extends CheckboxProps {\n name: string;\n}\nexport function FormCheckbox(props: FormCheckboxProps) {\n const {\n field: {onChange, onBlur, value = false, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<CheckboxProps> = {\n onChange,\n onBlur,\n checked: value,\n invalid,\n errorMessage: error?.message,\n name: props.name,\n };\n\n return <Checkbox ref={ref} {...mergeProps(formProps, props)} />;\n}\n","import lazyLoader from '../utils/http/lazy-loader';\nimport {useCallback, useEffect, useState} from 'react';\nimport {apiClient} from '../http/query-client';\nimport {RecaptchaAction} from '../core/settings/settings';\nimport {toast} from '../ui/toast/toast';\nimport {message} from '../i18n/message';\nimport {useSettings} from '../core/settings/use-settings';\n\nexport function useRecaptcha(action: RecaptchaAction) {\n const {recaptcha: {site_key, enable} = {}} = useSettings();\n const enabled = site_key && enable?.[action];\n\n const [isVerifying, setIsVerifying] = useState(false);\n\n useEffect(() => {\n if (enabled) {\n load(site_key);\n }\n }, [enabled, site_key]);\n\n const verify = useCallback(async () => {\n if (!enabled) return true;\n setIsVerifying(true);\n const isValid = await execute(site_key, action);\n if (!isValid) {\n toast.danger(message('Could not verify you are human.'));\n }\n setIsVerifying(false);\n return isValid;\n }, [enabled, site_key, action]);\n\n return {verify, isVerifying};\n}\n\nasync function execute(siteKey: string, action: string): Promise<boolean> {\n await load(siteKey);\n return new Promise(resolve => {\n window.grecaptcha?.ready(async () => {\n const token = await window.grecaptcha?.execute(siteKey, {action});\n const result = apiClient\n .post('recaptcha/verify', {token})\n .then(r => r.data.success)\n .catch(() => false);\n resolve(result ?? false);\n });\n });\n}\n\nfunction load(siteKey: string) {\n return lazyLoader.loadAsset(\n `https://www.google.com/recaptcha/api.js?render=${siteKey}`,\n {id: 'recaptcha-js'},\n );\n}\n","import {Children, memo, ReactElement} from 'react';\nimport {shallowEqual} from '../utils/shallow-equal';\nimport {MetaTag} from './meta-tag';\nimport {TitleMetaTagChildren} from './static-page-title';\nimport {useTrans, UseTransReturn} from '../i18n/use-trans';\nimport {isSsr} from '@common/utils/dom/is-ssr';\n\nconst rafPolyfill = (() => {\n let clock = Date.now();\n\n return (callback: Function) => {\n const currentTime = Date.now();\n\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(() => {\n rafPolyfill(callback);\n }, 0);\n }\n };\n})();\n\nconst cafPolyfill = (id: string | number) => clearTimeout(id);\n\nconst requestAnimationFrame = !isSsr()\n ? window.requestAnimationFrame\n : global.requestAnimationFrame || rafPolyfill;\n\nconst cancelAnimationFrame = !isSsr()\n ? window.cancelAnimationFrame\n : global.cancelAnimationFrame || cafPolyfill;\n\nexport const helmetAttribute = 'data-be-helmet';\nlet rafId: number | null;\n\ninterface HelmetProps {\n children?: ReactElement | ReactElement[];\n tags?: MetaTag[];\n}\nexport const Helmet = memo(({children, tags}: HelmetProps) => {\n const {trans} = useTrans();\n\n if (isSsr()) return null;\n\n if (!tags && children) {\n tags = mapChildrenToTags(children, trans);\n }\n\n updateTags(tags);\n\n return null;\n}, shallowEqual);\n\nfunction mapChildrenToTags(\n children: ReactElement | ReactElement[],\n trans: UseTransReturn['trans'],\n): MetaTag[] {\n return Children.map(children, child => {\n switch (child.type) {\n case 'title':\n return {\n nodeName: 'title',\n _text: titleTagChildrenToString(child.props.children, trans),\n };\n case 'meta':\n return {...child.props, nodeName: 'meta'};\n }\n });\n}\n\nfunction titleTagChildrenToString(\n children: TitleMetaTagChildren,\n trans: UseTransReturn['trans'],\n): string {\n if (children == null) return '';\n if (typeof children === 'string') return children;\n if (Array.isArray(children)) {\n return children.map(c => titleTagChildrenToString(c, trans)).join('');\n }\n if ('message' in children) {\n return trans(children);\n }\n return trans(children.props);\n}\n\nfunction removeOldTags() {\n if (isSsr()) return;\n document.head\n .querySelectorAll(\n 'meta:not([data-keep]), script meta:not([data-keep]), title, link[rel=\"canonical\"]',\n )\n .forEach(tag => {\n document.head.removeChild(tag);\n });\n}\n\nfunction updateTags(tags?: MetaTag[] | string) {\n if (rafId) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n removeOldTags();\n\n if (typeof tags === 'string') {\n const template = document.createElement('template');\n template.innerHTML = tags;\n template.content.childNodes.forEach(node => {\n if (node instanceof HTMLElement) {\n node.setAttribute(helmetAttribute, 'true');\n document.head.prepend(node);\n }\n });\n } else {\n tags?.forEach(tag => {\n updateTag(tag);\n });\n }\n\n rafId = null;\n });\n}\n\nfunction updateTag(tag: MetaTag) {\n // update title\n if (tag.nodeName === 'title') {\n if (typeof tag._text !== 'undefined' && document.title !== tag._text) {\n document.title = tag._text;\n }\n return;\n }\n\n // update <meta> tag\n const newElement = document.createElement(tag.nodeName);\n for (const key in tag) {\n const attribute = key as keyof MetaTag;\n if (attribute === 'nodeName') continue;\n if (attribute === '_text') {\n newElement.textContent =\n typeof tag._text === 'string' ? tag._text : JSON.stringify(tag._text);\n } else {\n const value = tag[attribute] == null ? '' : tag[attribute];\n newElement.setAttribute(attribute, value as string);\n }\n }\n\n newElement.setAttribute(helmetAttribute, 'true');\n document.head.prepend(newElement);\n}\n","import {Helmet} from './helmet';\nimport {ReactElement} from 'react';\nimport {MessageDescriptor} from '../i18n/message-descriptor';\nimport {useSettings} from '../core/settings/use-settings';\n\ntype TitleChild =\n | string\n | null\n | ReactElement<MessageDescriptor>\n | MessageDescriptor;\nexport type TitleMetaTagChildren = TitleChild | TitleChild[];\n\ninterface StaticPageTitleProps {\n children: TitleMetaTagChildren;\n}\nexport function StaticPageTitle({children}: StaticPageTitleProps) {\n const {\n branding: {site_name},\n } = useSettings();\n return (\n <Helmet>\n {children ? (\n // @ts-ignore\n <title>\n {children as any} - {site_name}\n </title>\n ) : undefined}\n </Helmet>\n );\n}\n","import {Link, Navigate, useLocation, useSearchParams} from 'react-router-dom';\nimport {useForm} from 'react-hook-form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {Button} from '../../ui/buttons/button';\nimport {Form} from '../../ui/forms/form';\nimport {LinkStyle} from '../../ui/buttons/external-link';\nimport {RegisterPayload, useRegister} from '../requests/use-register';\nimport {SocialAuthSection} from './social-auth-section';\nimport {AuthLayout} from './auth-layout/auth-layout';\nimport {Trans} from '../../i18n/trans';\nimport {FormCheckbox} from '../../ui/forms/toggle/checkbox';\nimport {CustomMenuItem} from '../../menus/custom-menu';\nimport {useRecaptcha} from '../../recaptcha/use-recaptcha';\nimport {StaticPageTitle} from '../../seo/static-page-title';\nimport {useSettings} from '../../core/settings/use-settings';\nimport {useContext} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\nexport function RegisterPage() {\n const {\n branding,\n registration: {disable},\n social,\n } = useSettings();\n const {auth} = useContext(SiteConfigContext);\n const {verify, isVerifying} = useRecaptcha('register');\n\n const {pathname} = useLocation();\n const [searchParams] = useSearchParams();\n\n const isWorkspaceRegister = pathname.includes('workspace');\n const isBillingRegister = searchParams.get('redirectFrom') === 'pricing';\n const searchParamsEmail = searchParams.get('email') || undefined;\n\n const form = useForm<RegisterPayload>({\n defaultValues: {email: searchParamsEmail},\n });\n const register = useRegister(form);\n\n if (disable) {\n return <Navigate to=\"/login\" replace />;\n }\n\n let heading = <Trans message=\"Create a new account\" />;\n if (isWorkspaceRegister) {\n heading = (\n <Trans\n values={{siteName: branding?.site_name}}\n message=\"To join your team on :siteName, create an account\"\n />\n );\n } else if (isBillingRegister) {\n heading = <Trans message=\"First, let's create your account\" />;\n }\n\n const message = (\n <Trans\n values={{\n a: parts => (\n <Link className={LinkStyle} to=\"/login\">\n {parts}\n </Link>\n ),\n }}\n message=\"Already have an account? <a>Sign in.</a>\"\n />\n );\n\n return (\n <AuthLayout heading={heading} message={message}>\n <StaticPageTitle>\n <Trans message=\"Register\" />\n </StaticPageTitle>\n <Form\n form={form}\n onSubmit={async payload => {\n const isValid = await verify();\n if (isValid) {\n register.mutate(payload);\n }\n }}\n >\n <FormTextField\n className=\"mb-32\"\n name=\"email\"\n type=\"email\"\n disabled={!!searchParamsEmail}\n label={<Trans message=\"Email\" />}\n required\n />\n <FormTextField\n className=\"mb-32\"\n name=\"password\"\n type=\"password\"\n label={<Trans message=\"Password\" />}\n required\n />\n <FormTextField\n className=\"mb-32\"\n name=\"password_confirmation\"\n type=\"password\"\n label={<Trans message=\"Confirm password\" />}\n required\n />\n {auth?.registerFields ? <auth.registerFields /> : null}\n <PolicyCheckboxes />\n <Button\n className=\"block w-full\"\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n size=\"md\"\n disabled={register.isPending || isVerifying}\n >\n <Trans message=\"Create account\" />\n </Button>\n <SocialAuthSection\n dividerMessage={\n social.compact_buttons ? (\n <Trans message=\"Or sign up with\" />\n ) : (\n <Trans message=\"OR\" />\n )\n }\n />\n </Form>\n </AuthLayout>\n );\n}\n\nfunction PolicyCheckboxes() {\n const {\n registration: {policies},\n } = useSettings();\n\n if (!policies) return null;\n\n return (\n <div className=\"mb-32\">\n {policies.map(policy => (\n <FormCheckbox\n key={policy.id}\n name={policy.id}\n className=\"mb-4 block\"\n required\n >\n <Trans\n message=\"I accept the :name\"\n values={{\n name: (\n <CustomMenuItem\n unstyled\n className={() => LinkStyle}\n item={policy}\n />\n ),\n }}\n />\n </FormCheckbox>\n ))}\n </div>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '../http/query-client';\nimport {BackendResponse} from '../http/backend-response/backend-response';\nimport {CustomPage} from '../admin/custom-pages/custom-page';\nimport {useParams} from 'react-router-dom';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst endpoint = (slugOrId: number | string) => `custom-pages/${slugOrId}`;\n\nexport interface FetchCustomPageResponse extends BackendResponse {\n page: CustomPage;\n}\n\nexport function useCustomPage(pageId?: number | string) {\n const params = useParams();\n if (!pageId) {\n pageId = params.pageId;\n }\n return useQuery({\n queryKey: [endpoint(pageId!)],\n queryFn: () => fetchCustomPage(pageId!),\n initialData: () => {\n const data = getBootstrapData().loaders?.customPage;\n if (data?.page && (data.page.id == pageId || data.page.slug == pageId)) {\n return data;\n }\n },\n });\n}\n\nfunction fetchCustomPage(\n slugOrId: number | string,\n): Promise<FetchCustomPageResponse> {\n return apiClient.get(endpoint(slugOrId)).then(response => response.data);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const NotificationsIcon = createSvgIcon(\n <path d=\"M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-2 1H8v-6c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6z\" />\n, 'NotificationsOutlined');\n","import {ReactNode} from 'react';\nimport clsx from 'clsx';\n\nexport interface BadgeProps {\n children: ReactNode;\n className?: string;\n withBorder?: boolean;\n top?: string;\n right?: string;\n}\nexport function Badge({\n children,\n className,\n withBorder = true,\n top = 'top-2',\n right = 'right-4',\n}: BadgeProps) {\n return (\n <span\n className={clsx(\n 'absolute flex items-center justify-center whitespace-nowrap rounded-full bg-warning text-xs font-bold text-white shadow',\n withBorder && 'border-2 border-white',\n children ? 'h-18 w-18' : 'h-12 w-12',\n className,\n top,\n right\n )}\n >\n {children}\n </span>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DoneAllIcon = createSvgIcon(\n <path d=\"m18 7-1.41-1.41-6.34 6.34 1.41 1.41L18 7zm4.24-1.41L11.66 16.17 7.48 12l-1.41 1.41L11.66 19l12-12-1.42-1.41zM.41 13.41 6 19l1.41-1.41L1.83 12 .41 13.41z\" />,\n 'DoneAllOutlined'\n);\n","import React, {ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {InputSize} from '../forms/input-field/input-size';\n\nexport interface IllustratedMessageProps {\n className?: string;\n size?: InputSize;\n image?: ReactNode;\n imageHeight?: string;\n imageMargin?: string;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\nexport function IllustratedMessage({\n image,\n title,\n description,\n action,\n className,\n size = 'md',\n imageHeight,\n imageMargin = 'mb-24',\n}: IllustratedMessageProps) {\n const style = getSizeClassName(size, imageHeight);\n return (\n <div className={clsx('text-center', className)}>\n {image && <div className={clsx(style.image, imageMargin)}>{image}</div>}\n {title && (\n <div className={clsx(style.title, 'mb-2 text-main')}>{title}</div>\n )}\n {description && (\n <div className={clsx(style.description, 'text-muted')}>\n {description}\n </div>\n )}\n {action && <div className=\"mt-20\">{action}</div>}\n </div>\n );\n}\n\nfunction getSizeClassName(size: InputSize, imageHeight?: string) {\n switch (size) {\n case 'xs':\n return {\n image: imageHeight || 'h-60',\n title: 'text-sm',\n description: 'text-xs',\n };\n case 'sm':\n return {\n image: imageHeight || 'h-80',\n title: 'text-base',\n description: 'text-sm',\n };\n default:\n return {\n image: imageHeight || 'h-128',\n title: 'text-lg',\n description: 'text-base',\n };\n }\n}\n","export default \"__VITE_ASSET__534ff342__\"","import {IllustratedMessage} from '../../ui/images/illustrated-message';\nimport {SvgImage} from '../../ui/images/svg-image/svg-image';\nimport notifySvg from './notify.svg';\nimport {Trans} from '../../i18n/trans';\nimport {Button} from '../../ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {useSettings} from '../../core/settings/use-settings';\n\nexport function NotificationEmptyStateMessage() {\n const {notif} = useSettings();\n return (\n <IllustratedMessage\n size=\"sm\"\n image={<SvgImage src={notifySvg} />}\n title={<Trans message=\"Hang tight!\" />}\n description={\n <Trans message=\"Notifications will start showing up here soon.\" />\n }\n action={\n notif.subs.integrated && (\n <Button\n elementType={Link}\n variant=\"outline\"\n to=\"/notifications/settings\"\n size=\"xs\"\n color=\"primary\"\n >\n <Trans message=\"Notification settings\" />\n </Button>\n )\n }\n />\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SettingsIcon = createSvgIcon(\n <path d=\"M19.43 12.98c.04-.32.07-.64.07-.98 0-.34-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.09-.16-.26-.25-.44-.25-.06 0-.12.01-.17.03l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.06-.02-.12-.03-.18-.03-.17 0-.34.09-.43.25l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98 0 .33.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.09.16.26.25.44.25.06 0 .12-.01.17-.03l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.06.02.12.03.18.03.17 0 .34-.09.43-.25l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zm-1.98-1.71c.04.31.05.52.05.73 0 .21-.02.43-.05.73l-.14 1.13.89.7 1.08.84-.7 1.21-1.27-.51-1.04-.42-.9.68c-.43.32-.84.56-1.25.73l-1.06.43-.16 1.13-.2 1.35h-1.4l-.19-1.35-.16-1.13-1.06-.43c-.43-.18-.83-.41-1.23-.71l-.91-.7-1.06.43-1.27.51-.7-1.21 1.08-.84.89-.7-.14-1.13c-.03-.31-.05-.54-.05-.74s.02-.43.05-.73l.14-1.13-.89-.7-1.08-.84.7-1.21 1.27.51 1.04.42.9-.68c.43-.32.84-.56 1.25-.73l1.06-.43.16-1.13.2-1.35h1.39l.19 1.35.16 1.13 1.06.43c.43.18.83.41 1.23.71l.91.7 1.06-.43 1.27-.51.7 1.21-1.07.85-.89.7.14 1.13zM12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\" />\n, 'SettingsOutlined');\n","import {IconButton} from '../../ui/buttons/icon-button';\nimport {NotificationsIcon} from '../../icons/material/Notifications';\nimport {Button} from '../../ui/buttons/button';\nimport {useUserNotifications} from './requests/user-notifications';\nimport {ProgressCircle} from '../../ui/progress/progress-circle';\nimport {NotificationList} from '../notification-list';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {Trans} from '../../i18n/trans';\nimport {useAuth} from '../../auth/use-auth';\nimport {Badge} from '../../ui/badge/badge';\nimport {DoneAllIcon} from '../../icons/material/DoneAll';\nimport {useMarkNotificationsAsRead} from '../requests/use-mark-notifications-as-read';\nimport {NotificationEmptyStateMessage} from '../empty-state/notification-empty-state-message';\nimport {SettingsIcon} from '@common/icons/material/Settings';\nimport {Link} from 'react-router-dom';\nimport {useSettings} from '@common/core/settings/use-settings';\n\ninterface NotificationDialogTriggerProps {\n className?: string;\n}\nexport function NotificationDialogTrigger({\n className,\n}: NotificationDialogTriggerProps) {\n const {user} = useAuth();\n const {notif} = useSettings();\n const query = useUserNotifications();\n const markAsRead = useMarkNotificationsAsRead();\n const hasUnread = !!user?.unread_notifications_count;\n\n const handleMarkAsRead = () => {\n if (!query.data) return;\n markAsRead.mutate({\n markAllAsUnread: true,\n });\n };\n\n return (\n <DialogTrigger type=\"popover\">\n <IconButton\n size=\"md\"\n className={className}\n badge={\n hasUnread ? (\n <Badge className=\"max-md:hidden\">\n {user?.unread_notifications_count}\n </Badge>\n ) : undefined\n }\n >\n <NotificationsIcon />\n </IconButton>\n <Dialog>\n <DialogHeader\n showDivider\n actions={\n !hasUnread &&\n notif.subs.integrated && (\n <IconButton\n className=\"text-muted\"\n size=\"sm\"\n elementType={Link}\n to=\"/notifications/settings\"\n target=\"_blank\"\n >\n <SettingsIcon />\n </IconButton>\n )\n }\n rightAdornment={\n hasUnread && (\n <Button\n variant=\"text\"\n color=\"primary\"\n size=\"xs\"\n startIcon={<DoneAllIcon />}\n onClick={handleMarkAsRead}\n disabled={markAsRead.isPending}\n className=\"max-md:hidden\"\n >\n <Trans message=\"Mark all as read\" />\n </Button>\n )\n }\n >\n <Trans message=\"Notifications\" />\n </DialogHeader>\n <DialogBody padding=\"p-0\">\n <DialogContent />\n </DialogBody>\n </Dialog>\n </DialogTrigger>\n );\n}\n\nfunction DialogContent() {\n const {data, isLoading} = useUserNotifications();\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center px-24 py-20\">\n <ProgressCircle aria-label=\"Loading notifications...\" isIndeterminate />\n </div>\n );\n }\n if (!data?.pagination.data.length) {\n return (\n <div className=\"px-24 py-20\">\n <NotificationEmptyStateMessage />\n </div>\n );\n }\n return (\n <div>\n <NotificationList notifications={data.pagination.data} />\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MenuIcon = createSvgIcon(\n <path d=\"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z\" />\n, 'MenuOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PersonIcon = createSvgIcon(\n <path d=\"M12 6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2m0 10c2.7 0 5.8 1.29 6 2H6c.23-.72 3.31-2 6-2m0-12C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 10c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n, 'PersonOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowDropDownIcon = createSvgIcon(\n <path d=\"m7 10 5 5 5-5H7z\" />\n, 'ArrowDropDownOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PaymentsIcon = createSvgIcon(\n <path d=\"M19 14V6c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zm-2 0H3V6h14v8zm-7-7c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm13 0v11c0 1.1-.9 2-2 2H4v-2h17V7h2z\" />\n, 'PaymentsOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AccountCircleIcon = createSvgIcon(\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM7.07 18.28c.43-.9 3.05-1.78 4.93-1.78s4.51.88 4.93 1.78C15.57 19.36 13.86 20 12 20s-3.57-.64-4.93-1.72zm11.29-1.45c-1.43-1.74-4.9-2.33-6.36-2.33s-4.93.59-6.36 2.33C4.62 15.49 4 13.82 4 12c0-4.41 3.59-8 8-8s8 3.59 8 8c0 1.82-.62 3.49-1.64 4.83zM12 6c-1.94 0-3.5 1.56-3.5 3.5S10.06 13 12 13s3.5-1.56 3.5-3.5S13.94 6 12 6zm0 5c-.83 0-1.5-.67-1.5-1.5S11.17 8 12 8s1.5.67 1.5 1.5S12.83 11 12 11z\" />\n, 'AccountCircleOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DarkModeIcon = createSvgIcon(\n <path d=\"M9.37 5.51c-.18.64-.27 1.31-.27 1.99 0 4.08 3.32 7.4 7.4 7.4.68 0 1.35-.09 1.99-.27C17.45 17.19 14.93 19 12 19c-3.86 0-7-3.14-7-7 0-2.93 1.81-5.45 4.37-6.49zM12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1z\" />\n, 'DarkModeOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LightModeIcon = createSvgIcon(\n <path d=\"M12 9c1.65 0 3 1.35 3 3s-1.35 3-3 3-3-1.35-3-3 1.35-3 3-3m0-2c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zM2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1zm18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1zM11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1zm0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zM5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41L5.99 4.58zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41l-1.06-1.06zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06z\" />\n, 'LightModeOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ExitToAppIcon = createSvgIcon(\n <path d=\"M10.09 15.59 11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\" />\n, 'ExitToAppOutlined');\n","import {ReactElement, useContext} from 'react';\nimport {ListboxItemProps} from '@common/ui/forms/listbox/item';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {useLogout} from '@common/auth/requests/logout';\nimport {useCustomMenu} from '@common/menus/use-custom-menu';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useThemeSelector} from '@common/ui/themes/theme-selector-context';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {NotificationsIcon} from '@common/icons/material/Notifications';\nimport {Trans} from '@common/i18n/trans';\nimport {PaymentsIcon} from '@common/icons/material/Payments';\nimport {createSvgIconFromTree} from '@common/icons/create-svg-icon';\nimport {AccountCircleIcon} from '@common/icons/material/AccountCircle';\nimport {DarkModeIcon} from '@common/icons/material/DarkMode';\nimport {LightModeIcon} from '@common/icons/material/LightMode';\nimport {ExitToAppIcon} from '@common/icons/material/ExitToApp';\n\ninterface Props {\n children: ReactElement;\n items?: ReactElement<ListboxItemProps>[];\n}\nexport function NavbarAuthMenu({children, items}: Props) {\n const {auth} = useContext(SiteConfigContext);\n const logout = useLogout();\n const menu = useCustomMenu('auth-dropdown');\n const {notifications, themes} = useSettings();\n const {user, isSubscribed} = useAuth();\n const navigate = useNavigate();\n const {selectedTheme, selectTheme} = useThemeSelector();\n if (!selectedTheme || !user) return null;\n const hasUnreadNotif = !!user.unread_notifications_count;\n\n const notifMenuItem = (\n <MenuItem\n className=\"md:hidden\"\n value=\"notifications\"\n startIcon={<NotificationsIcon />}\n onSelected={() => {\n navigate('/notifications');\n }}\n >\n <Trans message=\"Notifications\" />\n {hasUnreadNotif ? ` (${user.unread_notifications_count})` : undefined}\n </MenuItem>\n );\n\n const billingMenuItem = (\n <MenuItem\n value=\"billing\"\n startIcon={<PaymentsIcon />}\n onSelected={() => {\n navigate('/billing');\n }}\n >\n <Trans message=\"Billing\" />\n </MenuItem>\n );\n\n return (\n <MenuTrigger>\n {children}\n <Menu>\n {menu &&\n menu.items.map(item => {\n const Icon = item.icon && createSvgIconFromTree(item.icon);\n return (\n <MenuItem\n value={item.id}\n key={item.id}\n startIcon={Icon && <Icon />}\n onSelected={() => {\n if (item.type === 'link') {\n window.open(item.action, '_blank');\n } else {\n navigate(item.action);\n }\n }}\n >\n <Trans message={item.label} />\n </MenuItem>\n );\n })}\n {auth.getUserProfileLink && (\n <MenuItem\n value=\"profile\"\n startIcon={<AccountCircleIcon />}\n onSelected={() => {\n navigate(auth.getUserProfileLink!(user));\n }}\n >\n <Trans message=\"Profile page\" />\n </MenuItem>\n )}\n {items?.map(item => item)}\n {notifications?.integrated ? notifMenuItem : undefined}\n {isSubscribed && billingMenuItem}\n {themes?.user_change && !selectedTheme.is_dark && (\n <MenuItem\n value=\"light\"\n startIcon={<DarkModeIcon />}\n onSelected={() => {\n selectTheme('dark');\n }}\n >\n <Trans message=\"Dark mode\" />\n </MenuItem>\n )}\n {themes?.user_change && selectedTheme.is_dark && (\n <MenuItem\n value=\"dark\"\n startIcon={<LightModeIcon />}\n onSelected={() => {\n selectTheme('light');\n }}\n >\n <Trans message=\"Light mode\" />\n </MenuItem>\n )}\n <MenuItem\n value=\"logout\"\n startIcon={<ExitToAppIcon />}\n onSelected={() => {\n logout.mutate();\n }}\n >\n <Trans message=\"Log out\" />\n </MenuItem>\n </Menu>\n </MenuTrigger>\n );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport {useThemeSelector} from '@common/ui/themes/theme-selector-context';\nimport {Badge} from '@common/ui/badge/badge';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {PersonIcon} from '@common/icons/material/Person';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {ArrowDropDownIcon} from '@common/icons/material/ArrowDropDown';\nimport {ReactElement} from 'react';\nimport {ListboxItemProps} from '@common/ui/forms/listbox/item';\nimport {NavbarAuthMenu} from '@common/ui/navigation/navbar/navbar-auth-menu';\n\nexport interface NavbarAuthUserProps {\n items?: ReactElement<ListboxItemProps>[];\n}\nexport function NavbarAuthUser({items = []}: NavbarAuthUserProps) {\n const {user} = useAuth();\n const {selectedTheme} = useThemeSelector();\n if (!selectedTheme || !user) return null;\n const hasUnreadNotif = !!user.unread_notifications_count;\n\n const mobileButton = (\n <IconButton\n size=\"md\"\n className=\"md:hidden\"\n role=\"presentation\"\n aria-label=\"toggle authentication menu\"\n badge={\n hasUnreadNotif ? (\n <Badge>{user.unread_notifications_count}</Badge>\n ) : undefined\n }\n >\n <PersonIcon />\n </IconButton>\n );\n const desktopButton = (\n <ButtonBase className=\"flex items-center max-md:hidden\" role=\"presentation\">\n <img\n className=\"mr-12 h-32 w-32 flex-shrink-0 rounded object-cover\"\n src={user.avatar}\n alt=\"\"\n />\n <span className=\"mr-2 block max-w-124 overflow-x-hidden overflow-ellipsis text-sm\">\n {user.display_name}\n </span>\n <ArrowDropDownIcon className=\"block icon-sm\" />\n </ButtonBase>\n );\n\n return (\n <NavbarAuthMenu items={items}>\n <span role=\"button\">\n {mobileButton}\n {desktopButton}\n </span>\n </NavbarAuthMenu>\n );\n}\n","import {ButtonColor} from '@common/ui/buttons/get-shared-button-style';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {PersonIcon} from '@common/icons/material/Person';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport {Button} from '@common/ui/buttons/button';\nimport {NavbarProps} from '@common/ui/navigation/navbar/navbar';\nimport {Fragment} from 'react';\n\ninterface NavbarAuthButtonsProps {\n primaryButtonColor?: ButtonColor;\n navbarColor?: NavbarProps['color'];\n}\nexport function NavbarAuthButtons({\n primaryButtonColor,\n navbarColor,\n}: NavbarAuthButtonsProps) {\n if (!primaryButtonColor) {\n primaryButtonColor = navbarColor === 'primary' ? 'paper' : 'primary';\n }\n\n return (\n <Fragment>\n <MobileButtons />\n <DesktopButtons primaryButtonColor={primaryButtonColor} />\n </Fragment>\n );\n}\n\ninterface DesktopButtonsProps {\n primaryButtonColor: ButtonColor;\n}\nfunction DesktopButtons({primaryButtonColor}: DesktopButtonsProps) {\n const {registration} = useSettings();\n return (\n <div className=\"text-sm max-md:hidden\">\n {!registration.disable && (\n <Button\n elementType={Link}\n to=\"/register\"\n variant=\"text\"\n className=\"mr-10\"\n >\n <Trans message=\"Register\" />\n </Button>\n )}\n <Button\n elementType={Link}\n to=\"/login\"\n variant=\"raised\"\n color={primaryButtonColor}\n >\n <Trans message=\"Login\" />\n </Button>\n </div>\n );\n}\n\nfunction MobileButtons() {\n const {registration} = useSettings();\n const navigate = useNavigate();\n return (\n <MenuTrigger>\n <IconButton size=\"md\" className=\"md:hidden\">\n <PersonIcon />\n </IconButton>\n <Menu>\n <Item value=\"login\" onSelected={() => navigate('/login')}>\n <Trans message=\"Login\" />\n </Item>\n {!registration.disable && (\n <Item value=\"register\" onSelected={() => navigate('/register')}>\n <Trans message=\"Register\" />\n </Item>\n )}\n </Menu>\n </MenuTrigger>\n );\n}\n","import {useBootstrapData} from '@common/core/bootstrap-data/bootstrap-data-context';\nimport {useIsDarkMode} from '@common/ui/themes/use-is-dark-mode';\n\nexport function useDarkThemeVariables() {\n const {data} = useBootstrapData();\n const isDarkMode = useIsDarkMode();\n // already in dark mode, no need to set variables again\n if (isDarkMode) {\n return undefined;\n }\n return data.themes.all.find(theme => theme.is_dark && theme.default_dark)\n ?.values;\n}\n","import {useTrans} from '@common/i18n/use-trans';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {Link} from 'react-router-dom';\nimport {NavbarProps} from '@common/ui/navigation/navbar/navbar';\n\ninterface LogoProps {\n color?: NavbarProps['color'];\n logoColor?: NavbarProps['logoColor'];\n isDarkMode?: boolean;\n}\nexport function Logo({color, logoColor, isDarkMode}: LogoProps) {\n const {trans} = useTrans();\n const {branding} = useSettings();\n\n let desktopLogo: string;\n let mobileLogo: string;\n if (\n isDarkMode ||\n !branding.logo_dark ||\n (logoColor !== 'dark' && color !== 'bg' && color !== 'bg-alt')\n ) {\n desktopLogo = branding.logo_light;\n mobileLogo = branding.logo_light_mobile;\n } else {\n desktopLogo = branding.logo_dark;\n mobileLogo = branding.logo_dark_mobile;\n }\n\n if (!mobileLogo && !desktopLogo) {\n return null;\n }\n\n return (\n <Link\n to=\"/\"\n className=\"mr-4 block h-full max-h-26 flex-shrink-0 md:mr-24 md:max-h-36\"\n aria-label={trans({message: 'Go to homepage'})}\n >\n <picture>\n <source srcSet={mobileLogo || desktopLogo} media=\"(max-width: 768px)\" />\n <source srcSet={desktopLogo} media=\"(min-width: 768px)\" />\n <img\n className=\"block h-full max-h-26 w-auto md:max-h-36\"\n alt={trans({message: 'Site logo'})}\n />\n </picture>\n </Link>\n );\n}\n","import {useBootstrapData} from '@common/core/bootstrap-data/bootstrap-data-context';\n\nexport function useLightThemeVariables() {\n const {data} = useBootstrapData();\n return data.themes.all.find(theme => !theme.is_dark && theme.default_light)\n ?.values;\n}\n","import {ReactElement, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {useAuth} from '@common/auth/use-auth';\nimport {NotificationDialogTrigger} from '@common/notifications/dialog/notification-dialog-trigger';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {useCustomMenu} from '@common/menus/use-custom-menu';\nimport {createSvgIconFromTree} from '@common/icons/create-svg-icon';\nimport {Trans} from '@common/i18n/trans';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useIsDarkMode} from '@common/ui/themes/use-is-dark-mode';\nimport {CustomMenu} from '@common/menus/custom-menu';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {ButtonColor} from '@common/ui/buttons/get-shared-button-style';\nimport {MenuIcon} from '@common/icons/material/Menu';\nimport {MenuItemConfig} from '@common/core/settings/settings';\nimport {\n NavbarAuthUser,\n NavbarAuthUserProps,\n} from '@common/ui/navigation/navbar/navbar-auth-user';\nimport {NavbarAuthButtons} from '@common/ui/navigation/navbar/navbar-auth-buttons';\nimport {useDarkThemeVariables} from '@common/ui/themes/use-dark-theme-variables';\nimport {Logo} from '@common/ui/navigation/navbar/logo';\nimport {useLightThemeVariables} from '@common/ui/themes/use-light-theme-variables';\n\ntype NavbarColor = 'primary' | 'bg' | 'bg-alt' | 'transparent' | string;\n\nexport interface NavbarProps {\n hideLogo?: boolean | null;\n toggleButton?: ReactElement;\n children?: ReactNode;\n className?: string;\n color?: NavbarColor;\n bgOpacity?: number | string;\n darkModeColor?: NavbarColor;\n logoColor?: 'dark' | 'light';\n textColor?: string;\n primaryButtonColor?: ButtonColor;\n border?: string;\n size?: 'xs' | 'sm' | 'md';\n rightChildren?: ReactNode;\n menuPosition?: string;\n authMenuItems?: NavbarAuthUserProps['items'];\n alwaysDarkMode?: boolean;\n wrapInContainer?: boolean;\n}\nexport function Navbar(props: NavbarProps) {\n let {\n hideLogo,\n toggleButton,\n children,\n className,\n border,\n size = 'md',\n color,\n textColor,\n darkModeColor,\n rightChildren,\n menuPosition,\n logoColor,\n primaryButtonColor,\n authMenuItems,\n alwaysDarkMode = false,\n wrapInContainer = false,\n } = props;\n const isDarkMode = useIsDarkMode() || alwaysDarkMode;\n const {notifications} = useSettings();\n const {isLoggedIn} = useAuth();\n const darkThemeVars = useDarkThemeVariables();\n const lightThemeVars = useLightThemeVariables();\n const showNotifButton = isLoggedIn && notifications?.integrated;\n color = color ?? lightThemeVars?.['--be-navbar-color'] ?? 'primary';\n darkModeColor =\n darkModeColor ?? darkModeColor?.['--be-navbar-color'] ?? 'bg-alt';\n\n if (isDarkMode) {\n color = darkModeColor;\n }\n\n return (\n <div\n style={alwaysDarkMode ? darkThemeVars : undefined}\n className={clsx(\n getColorStyle(color, textColor),\n size === 'md' && 'h-64 py-8',\n size === 'sm' && 'h-54 py-4',\n size === 'xs' && 'h-48 py-4',\n border,\n className,\n )}\n >\n <div\n className={clsx(\n 'flex h-full items-center justify-end gap-10 pl-14 pr-8 md:pl-20 md:pr-20',\n wrapInContainer && 'container mx-auto',\n )}\n >\n {!hideLogo && (\n <Logo isDarkMode={isDarkMode} color={color} logoColor={logoColor} />\n )}\n {toggleButton}\n {children}\n <MobileMenu position={menuPosition} />\n <DesktopMenu position={menuPosition} />\n <div className=\"ml-auto flex items-center gap-4 md:gap-14\">\n {rightChildren}\n {showNotifButton && <NotificationDialogTrigger />}\n {isLoggedIn ? (\n <NavbarAuthUser items={authMenuItems} />\n ) : (\n <NavbarAuthButtons\n navbarColor={color}\n primaryButtonColor={primaryButtonColor}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface DesktopMenuProps {\n position: NavbarProps['menuPosition'];\n}\nfunction DesktopMenu({position}: DesktopMenuProps) {\n return (\n <CustomMenu\n className=\"mx-14 text-sm max-md:hidden\"\n itemClassName={isActive =>\n clsx(\n 'opacity-90 hover:underline hover:opacity-100',\n isActive && 'opacity-100',\n )\n }\n menu={position}\n />\n );\n}\n\ninterface MobileMenuProps {\n position: NavbarProps['menuPosition'];\n}\nfunction MobileMenu({position}: MobileMenuProps) {\n const navigate = useNavigate();\n const menu = useCustomMenu(position);\n\n if (!menu?.items.length) {\n return null;\n }\n\n const handleItemClick = (item: MenuItemConfig) => {\n if (item.type === 'route') {\n navigate(item.action);\n } else {\n window.open(item.action, item.target)?.focus();\n }\n };\n\n return (\n <MenuTrigger>\n <IconButton className=\"md:hidden\" aria-label=\"Toggle menu\">\n <MenuIcon />\n </IconButton>\n <Menu>\n {menu.items.map(item => {\n const Icon = item.icon && createSvgIconFromTree(item.icon);\n return (\n <Item\n value={item.action}\n onSelected={() => handleItemClick(item)}\n key={item.id}\n startIcon={Icon && <Icon />}\n >\n <Trans message={item.label} />\n </Item>\n );\n })}\n </Menu>\n </MenuTrigger>\n );\n}\n\nfunction getColorStyle(color: string, textColor?: string): string {\n switch (color) {\n case 'primary':\n return `bg-primary ${textColor || 'text-on-primary'} border-b-primary`;\n case 'bg':\n return `bg ${textColor || 'text-main'} border-b`;\n case 'bg-alt':\n return `bg-alt ${textColor || 'text-main'} border-b`;\n case 'transparent':\n return `bg-transparent ${textColor || 'text-white'}`;\n default:\n return `${color} ${textColor}`;\n }\n}\n","import {keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from './backend-response/backend-response';\nimport {Localization} from '../i18n/localization';\nimport {CssTheme} from '../ui/themes/css-theme';\nimport {Role} from '../auth/role';\nimport {Permission} from '../auth/permission';\nimport {apiClient, queryClient} from './query-client';\nimport {MenuItemCategory} from '../admin/appearance/sections/menus/menu-item-category';\nimport {CustomPage} from '../admin/custom-pages/custom-page';\nimport {CustomDomain} from '../custom-domains/custom-domain';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport interface FetchValueListsResponse extends BackendResponse {\n countries?: CountryListItem[];\n timezones?: {[key: string]: Timezone[]};\n languages?: LanguageListItem[];\n localizations?: Localization[];\n currencies?: {[key: string]: Currency};\n domains?: CustomDomain[];\n pages?: CustomPage[];\n themes?: CssTheme[];\n permissions?: Permission[];\n workspacePermissions?: Permission[];\n roles?: Role[];\n menuItemCategories?: MenuItemCategory[];\n googleFonts?: FontConfig[];\n workspaceRoles?: Role[];\n}\n\nexport interface CountryListItem {\n name: string;\n code: string;\n}\n\nexport interface LanguageListItem {\n name: string;\n nativeName?: string;\n code: string;\n}\n\nexport interface Currency {\n name: string;\n decimal_digits: number;\n symbol: string;\n code: string;\n}\n\nexport interface Timezone {\n text: string;\n value: string;\n}\n\nexport interface FontConfig {\n label?: MessageDescriptor;\n family: string;\n category?: string;\n google?: boolean;\n}\n\ninterface Options {\n disabled?: boolean;\n}\n\nexport function useValueLists(\n names: (keyof FetchValueListsResponse)[],\n params?: Record<string, string | number | undefined>,\n options: Options = {},\n) {\n return useQuery({\n queryKey: ['value-lists', names, params],\n queryFn: () => fetchValueLists(names, params),\n // if there are params, make sure we update lists when they change\n staleTime: !params ? Infinity : undefined,\n placeholderData: keepPreviousData,\n enabled: !options.disabled,\n initialData: () => {\n // check if we have already fetched value lists for all specified names previously,\n // if so, return cached response for this query, as there's no need to fetch it again\n const previousData = queryClient\n .getQueriesData<FetchValueListsResponse>({queryKey: ['ValueLists']})\n .find(([, response]) => {\n if (response && names.every(n => response[n])) {\n return response;\n }\n return null;\n });\n if (previousData) {\n return previousData[1];\n }\n },\n });\n}\n\nexport function prefetchValueLists(\n names: (keyof FetchValueListsResponse)[],\n params?: Record<string, string | number | undefined>,\n) {\n queryClient.prefetchQuery({\n queryKey: ['value-lists', names, params],\n queryFn: () => fetchValueLists(names, params),\n });\n}\n\nfunction fetchValueLists(\n names: (keyof FetchValueListsResponse)[],\n params?: Record<string, string | number | undefined>,\n): Promise<FetchValueListsResponse> {\n return apiClient\n .get(`value-lists/${names}`, {params})\n .then(response => response.data);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LanguageIcon = createSvgIcon(\n <path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zm6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56zM12 4.04c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zM4.26 14C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2s.06 1.34.14 2H4.26zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56zm2.95-8H5.08c.96-1.66 2.49-2.93 4.33-3.56C8.81 5.55 8.35 6.75 8.03 8zM12 19.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zM14.34 14H9.66c-.09-.66-.16-1.32-.16-2s.07-1.35.16-2h4.68c.09.65.16 1.32.16 2s-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56zM16.36 14c.08-.66.14-1.32.14-2s-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2h-3.38z\" />\n, 'LanguageOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowDownIcon = createSvgIcon(\n <path d=\"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\" />\n, 'KeyboardArrowDownOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../http/backend-response/backend-response';\nimport {Localization} from './localization';\nimport {apiClient} from '../http/query-client';\nimport {showHttpErrorToast} from '../utils/http/show-http-error-toast';\nimport {useBootstrapData} from '../core/bootstrap-data/bootstrap-data-context';\n\nexport interface ChangeLocaleResponse extends BackendResponse {\n locale: Localization;\n}\n\nexport function useChangeLocale() {\n const {mergeBootstrapData} = useBootstrapData();\n return useMutation({\n mutationFn: (props: {locale?: string}) => changeLocale(props),\n onSuccess: response => {\n mergeBootstrapData({\n i18n: response.locale,\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction changeLocale(props: {locale?: string}): Promise<ChangeLocaleResponse> {\n return apiClient.post(`users/me/locale`, props).then(r => r.data);\n}\n","import {useValueLists} from '../http/value-lists';\nimport {Button} from '../ui/buttons/button';\nimport {LanguageIcon} from '../icons/material/Language';\nimport {KeyboardArrowDownIcon} from '../icons/material/KeyboardArrowDown';\nimport {useSelectedLocale} from './selected-locale';\nimport {Menu, MenuItem, MenuTrigger} from '../ui/navigation/menu/menu-trigger';\nimport {useChangeLocale} from './change-locale';\nimport {useSettings} from '../core/settings/use-settings';\n\nexport function LocaleSwitcher() {\n const {locale} = useSelectedLocale();\n const changeLocale = useChangeLocale();\n const {data} = useValueLists(['localizations']);\n const {i18n} = useSettings();\n\n if (!data?.localizations || !locale || !i18n.enable) return null;\n\n return (\n <MenuTrigger\n floatingWidth=\"matchTrigger\"\n selectionMode=\"single\"\n selectedValue={locale.language}\n onSelectionChange={value => {\n const newLocale = value as string;\n if (newLocale !== locale?.language) {\n changeLocale.mutate({locale: newLocale});\n }\n }}\n >\n <Button\n disabled={changeLocale.isPending}\n className=\"capitalize\"\n startIcon={<LanguageIcon />}\n endIcon={<KeyboardArrowDownIcon />}\n >\n {locale.name}\n </Button>\n <Menu>\n {data.localizations.map(localization => (\n <MenuItem\n value={localization.language}\n key={localization.language}\n className=\"capitalize\"\n >\n {localization.name}\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LightbulbIcon = createSvgIcon(\n <path d=\"M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1-.85.6V16h-4v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z\" />\n, 'LightbulbOutlined');\n","import clsx from 'clsx';\nimport {CustomMenu} from '../../menus/custom-menu';\nimport {LocaleSwitcher} from '../../i18n/locale-switcher';\nimport {Button} from '../buttons/button';\nimport {DarkModeIcon} from '../../icons/material/DarkMode';\nimport {LightbulbIcon} from '../../icons/material/Lightbulb';\nimport {Trans} from '../../i18n/trans';\nimport {useThemeSelector} from '../themes/theme-selector-context';\nimport {useSettings} from '../../core/settings/use-settings';\n\ninterface Props {\n className?: string;\n padding?: string;\n}\n\nexport function Footer({className, padding}: Props) {\n const year = new Date().getFullYear();\n const {branding} = useSettings();\n return (\n <footer\n className={clsx(\n 'text-sm',\n padding ? padding : 'pb-28 pt-54 md:pb-54',\n className,\n )}\n >\n <Menus />\n <div className=\"items-center justify-between gap-30 text-center text-muted md:flex md:text-left\">\n <Trans\n message=\"Copyright © :year :name, All Rights Reserved\"\n values={{year, name: branding.site_name}}\n />\n <div>\n <ThemeSwitcher />\n <LocaleSwitcher />\n </div>\n </div>\n </footer>\n );\n}\n\nfunction Menus() {\n const settings = useSettings();\n const primaryMenu = settings.menus.find(m => m.positions?.includes('footer'));\n const secondaryMenu = settings.menus.find(\n m => m.positions?.includes('footer-secondary'),\n );\n\n if (!primaryMenu && !secondaryMenu) return null;\n\n return (\n <div className=\"mb-14 items-center justify-between gap-30 overflow-x-auto border-b pb-14 md:flex\">\n {primaryMenu && (\n <CustomMenu menu={primaryMenu} className=\"text-primary\" />\n )}\n {secondaryMenu && (\n <CustomMenu menu={secondaryMenu} className=\"mb:mt-0 mt-14 text-muted\" />\n )}\n </div>\n );\n}\n\nfunction ThemeSwitcher() {\n const {themes} = useSettings();\n const {selectedTheme, selectTheme} = useThemeSelector();\n if (!selectedTheme || !themes?.user_change) return null;\n\n return (\n <Button\n variant=\"text\"\n startIcon={selectedTheme.is_dark ? <DarkModeIcon /> : <LightbulbIcon />}\n onClick={() => {\n if (selectedTheme.is_dark) {\n selectTheme('light');\n } else {\n selectTheme('dark');\n }\n }}\n >\n {selectedTheme.is_dark ? (\n <Trans message=\"Light mode\" />\n ) : (\n <Trans message=\"Dark mode\" />\n )}\n </Button>\n );\n}\n","export function highlightCode(el: HTMLElement) {\n import('@common/text-editor/highlight/highlight').then(({hljs}) => {\n el.querySelectorAll('pre code').forEach(block => {\n hljs.highlightElement(block as HTMLElement);\n });\n });\n}\n","import {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {useEffect, useRef} from 'react';\nimport {highlightCode} from '@common/text-editor/highlight/highlight-code';\n\ninterface CustomPageBodyProps {\n page: CustomPage;\n}\nexport function CustomPageBody({page}: CustomPageBodyProps) {\n const bodyRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (bodyRef.current) {\n highlightCode(bodyRef.current);\n }\n }, []);\n\n return (\n <div className=\"px-16 md:px-24\">\n <div className=\"prose mx-auto my-50 dark:prose-invert\">\n <h1>{page.title}</h1>\n <div\n ref={bodyRef}\n className=\"whitespace-pre-wrap break-words\"\n dangerouslySetInnerHTML={{__html: page.body}}\n />\n </div>\n </div>\n );\n}\n","import {Helmet} from './helmet';\nimport {useBootstrapData} from '../core/bootstrap-data/bootstrap-data-context';\n\nexport function DefaultMetaTags() {\n const {\n data: {default_meta_tags},\n } = useBootstrapData();\n return <Helmet tags={default_meta_tags} />;\n}\n","import {UseQueryResult} from '@tanstack/react-query';\nimport {Helmet} from '@common/seo/helmet';\nimport {DefaultMetaTags} from '@common/seo/default-meta-tags';\nimport React from 'react';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\ninterface Props {\n query: UseQueryResult<BackendResponse>;\n}\nexport function PageMetaTags({query}: Props) {\n if (query.data?.set_seo) {\n return null;\n }\n return query.data?.seo ? (\n <Helmet tags={query.data.seo} />\n ) : (\n <DefaultMetaTags />\n );\n}\n","import {ProgressCircle} from './progress-circle';\nimport React from 'react';\nimport clsx from 'clsx';\n\ninterface FullPageLoaderProps {\n className?: string;\n screen?: boolean;\n}\nexport function FullPageLoader({className, screen}: FullPageLoaderProps) {\n return (\n <div\n className={clsx(\n 'flex items-center justify-center flex-auto',\n screen ? 'h-screen w-screen' : 'h-full w-full',\n className\n )}\n >\n <ProgressCircle isIndeterminate aria-label=\"Loading page...\" />\n </div>\n );\n}\n","export default \"__VITE_ASSET__5953daae__\"","export default \"__VITE_ASSET__096c5f85__\"","import {Trans} from '../../i18n/trans';\nimport {Button} from '../buttons/button';\nimport {Link} from 'react-router-dom';\nimport imgUrl1 from './404-1.png';\nimport imgUrl2 from './404-2.png';\n\nexport function NotFoundPage() {\n return (\n <div className=\"lg:px-96 lg:py-96 md:py-80 md:px-176 px-16 py-96 items-center flex justify-center flex-col-reverse lg:flex-row md:gap-112 gap-64\">\n <div className=\"xl:pt-96 w-full xl:w-1/2 relative pb-48 lg:pb-0\">\n <div className=\"relative\">\n <div className=\"absolute\">\n <div className=\"relative z-10\">\n <h1 className=\"my-8 text-main font-bold text-2xl\">\n <Trans message=\"Looks like you've found the doorway to the great nothing\" />\n </h1>\n <p className=\"my-16 text-main\">\n <Trans\n message=\"Sorry about that! Please visit our homepage to get where you need\n to go.\"\n />\n </p>\n <Button\n className=\"my-8\"\n elementType={Link}\n size=\"lg\"\n to=\"/\"\n variant=\"flat\"\n color=\"primary\"\n >\n <Trans message=\"Take me there!\" />\n </Button>\n </div>\n </div>\n <div className=\"dark:opacity-5\">\n <img src={imgUrl2 as any} alt=\"\" />\n </div>\n </div>\n </div>\n <div className=\"dark:opacity-80\">\n <img src={imgUrl1 as any} alt=\"\" />\n </div>\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ErrorIcon = createSvgIcon(\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\n, 'ErrorOutlined');\n","import {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {ErrorIcon} from '@common/icons/material/Error';\nimport {Trans} from '@common/i18n/trans';\n\nexport function PageErrorMessage() {\n return (\n <IllustratedMessage\n className=\"mt-40\"\n image={\n <div>\n <ErrorIcon size=\"xl\" />\n </div>\n }\n imageHeight=\"h-auto\"\n title={<Trans message=\"There was an issue loading this page\" />}\n description={<Trans message=\"Please try again later\" />}\n />\n );\n}\n","import {useEffect, useRef, useState} from 'react';\n\ninterface SpinDelayOptions {\n delay?: number;\n minDuration?: number;\n}\n\ntype State = 'IDLE' | 'DELAY' | 'DISPLAY' | 'EXPIRE';\n\nexport const defaultOptions = {\n delay: 500,\n minDuration: 200,\n};\n\nexport function useSpinDelay(\n loading: boolean,\n options?: SpinDelayOptions,\n): boolean {\n options = Object.assign({}, defaultOptions, options);\n\n const [state, setState] = useState<State>('IDLE');\n const timeout = useRef<any>(null);\n\n useEffect(() => {\n if (loading && state === 'IDLE') {\n clearTimeout(timeout.current);\n\n timeout.current = setTimeout(\n () => {\n if (!loading) {\n return setState('IDLE');\n }\n\n timeout.current = setTimeout(\n () => {\n setState('EXPIRE');\n },\n options?.minDuration,\n );\n\n setState('DISPLAY');\n },\n options?.delay,\n );\n\n setState('DELAY');\n }\n\n if (!loading && state !== 'DISPLAY') {\n clearTimeout(timeout.current);\n setState('IDLE');\n }\n }, [loading, state, options.delay, options.minDuration]);\n\n useEffect(() => {\n return () => clearTimeout(timeout.current);\n }, []);\n\n return state === 'DISPLAY' || state === 'EXPIRE';\n}\n\nexport default useSpinDelay;\n","import {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {errorStatusIs} from '@common/utils/http/error-status-is';\nimport {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\nimport {PageErrorMessage} from '@common/errors/page-error-message';\nimport React, {ReactNode} from 'react';\nimport {UseQueryResult} from '@tanstack/react-query';\nimport {Navigate} from 'react-router-dom';\nimport {useAuth} from '@common/auth/use-auth';\nimport useSpinDelay from '@common/utils/hooks/use-spin-delay';\n\ninterface Props {\n query: UseQueryResult;\n show404?: boolean;\n redirectOn404?: string;\n loaderClassName?: string;\n loaderIsScreen?: boolean;\n loader?: ReactNode;\n delayedSpinner?: boolean;\n}\nexport function PageStatus({\n query,\n show404 = true,\n loader,\n loaderClassName,\n loaderIsScreen = true,\n delayedSpinner = true,\n redirectOn404,\n}: Props) {\n const {isLoggedIn} = useAuth();\n\n const showSpinner = useSpinDelay(query.isLoading, {\n delay: 500,\n minDuration: 200,\n });\n\n if (query.isLoading) {\n if (!showSpinner && delayedSpinner) {\n return null;\n }\n return (\n loader || (\n <FullPageLoader className={loaderClassName} screen={loaderIsScreen} />\n )\n );\n }\n\n if (\n query.isError &&\n (errorStatusIs(query.error, 401) || errorStatusIs(query.error, 403)) &&\n !isLoggedIn\n ) {\n return <Navigate to=\"/login\" replace />;\n }\n\n if (show404 && query.isError && errorStatusIs(query.error, 404)) {\n if (redirectOn404) {\n return <Navigate to={redirectOn404} replace />;\n }\n return <NotFoundPage />;\n }\n\n return <PageErrorMessage />;\n}\n","import {useParams} from 'react-router-dom';\nimport {useCustomPage} from './use-custom-page';\nimport {Navbar} from '../ui/navigation/navbar/navbar';\nimport {Footer} from '../ui/footer/footer';\nimport {CustomPageBody} from '@common/custom-page/custom-page-body';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {useEffect} from 'react';\n\ninterface Props {\n slug?: string;\n}\nexport function CustomPageLayout({slug}: Props) {\n const {pageSlug} = useParams();\n const query = useCustomPage(slug || pageSlug!);\n\n useEffect(() => {\n if (query.data?.page) {\n window.scrollTo(0, 0);\n }\n }, [query]);\n\n return (\n <div className=\"flex flex-col min-h-screen bg\">\n <PageMetaTags query={query} />\n <Navbar\n menuPosition=\"custom-page-navbar\"\n className=\"flex-shrink-0 sticky top-0\"\n />\n <div className=\"flex-auto\">\n {query.data ? (\n <CustomPageBody page={query.data.page} />\n ) : (\n <PageStatus query={query} loaderClassName=\"mt-80\" />\n )}\n </div>\n <Footer className=\"mx-14 md:mx-40\" />\n </div>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {apiClient} from '../../http/query-client';\nimport {useAuth} from '../use-auth';\nimport {useBootstrapData} from '../../core/bootstrap-data/bootstrap-data-context';\nimport {useCallback} from 'react';\n\ninterface LoginResponse extends BackendResponse {\n bootstrapData: string;\n two_factor: false;\n}\ninterface TwoFactorResponse {\n two_factor: true;\n}\n\ntype Response = LoginResponse | TwoFactorResponse;\n\nexport interface LoginPayload {\n email: string;\n password: string;\n remember: boolean;\n token_name: string;\n}\n\nexport function useLogin(form: UseFormReturn<LoginPayload>) {\n const handleSuccess = useHandleLoginSuccess();\n return useMutation({\n mutationFn: login,\n onSuccess: response => {\n if (!response.two_factor) {\n handleSuccess(response);\n }\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nexport function useHandleLoginSuccess() {\n const navigate = useNavigate();\n const {getRedirectUri} = useAuth();\n const {setBootstrapData} = useBootstrapData();\n\n return useCallback(\n (response: LoginResponse) => {\n setBootstrapData(response.bootstrapData);\n navigate(getRedirectUri(), {replace: true});\n },\n [navigate, setBootstrapData, getRedirectUri],\n );\n}\n\nfunction login(payload: LoginPayload): Promise<Response> {\n return apiClient.post('auth/login', payload).then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {useHandleLoginSuccess} from '@common/auth/requests/use-login';\n\ninterface Response extends BackendResponse {\n bootstrapData: string;\n two_factor: false;\n}\n\nexport interface TwoFactorChallengePayload {\n code?: string;\n recovery_code?: string;\n}\nexport function useTwoFactorChallenge(\n form: UseFormReturn<TwoFactorChallengePayload>,\n) {\n const handleSuccess = useHandleLoginSuccess();\n return useMutation({\n mutationFn: (payload: TwoFactorChallengePayload) =>\n completeChallenge(payload),\n onSuccess: response => {\n handleSuccess(response);\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction completeChallenge(\n payload: TwoFactorChallengePayload,\n): Promise<Response> {\n return apiClient\n .post('auth/two-factor-challenge', payload)\n .then(response => response.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {FormTextField} from '../../../ui/forms/input-field/text-field/text-field';\nimport {Button} from '../../../ui/buttons/button';\nimport {Form} from '../../../ui/forms/form';\nimport {AuthLayout} from '../auth-layout/auth-layout';\nimport {Trans} from '../../../i18n/trans';\nimport {StaticPageTitle} from '../../../seo/static-page-title';\nimport {\n TwoFactorChallengePayload,\n useTwoFactorChallenge,\n} from '@common/auth/ui/two-factor/requests/use-two-factor-challenge';\nimport {useState} from 'react';\n\nexport function TwoFactorChallengePage() {\n const [usingRecoveryCode, setUsingRecoveryCode] = useState(false);\n\n const form = useForm<TwoFactorChallengePayload>();\n const completeChallenge = useTwoFactorChallenge(form);\n\n return (\n <AuthLayout>\n <StaticPageTitle>\n <Trans message=\"Two factor authentication\" />\n </StaticPageTitle>\n <Form\n form={form}\n onSubmit={payload => {\n completeChallenge.mutate(payload);\n }}\n >\n <div className=\"mb-32 text-sm\">\n <Trans message=\"Confirm access to your account by entering the authentication code provided by your authenticator application.\" />\n </div>\n <div className=\"mb-4\">\n {usingRecoveryCode ? (\n <FormTextField\n name=\"recovery_code\"\n minLength={21}\n maxLength={21}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n label={<Trans message=\"Recovery code\" />}\n autoFocus\n required\n />\n ) : (\n <FormTextField\n name=\"code\"\n minLength={6}\n maxLength={6}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n label={<Trans message=\"Code\" />}\n autoFocus\n required\n />\n )}\n </div>\n <div className=\"mb-32\">\n <Button\n variant=\"link\"\n color=\"primary\"\n size=\"sm\"\n onClick={() => setUsingRecoveryCode(!usingRecoveryCode)}\n >\n <Trans message=\"Use recovery code instead\" />\n </Button>\n </div>\n <Button\n className=\"block w-full\"\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n size=\"md\"\n disabled={completeChallenge.isPending}\n >\n <Trans message=\"Continue\" />\n </Button>\n </Form>\n </AuthLayout>\n );\n}\n","import {Link, useLocation, useSearchParams} from 'react-router-dom';\nimport {useForm} from 'react-hook-form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {Button} from '../../ui/buttons/button';\nimport {Form} from '../../ui/forms/form';\nimport {LoginPayload, useLogin} from '../requests/use-login';\nimport {FormCheckbox} from '../../ui/forms/toggle/checkbox';\nimport {LinkStyle} from '../../ui/buttons/external-link';\nimport {SocialAuthSection} from './social-auth-section';\nimport {AuthLayout} from './auth-layout/auth-layout';\nimport {Trans} from '../../i18n/trans';\nimport {StaticPageTitle} from '../../seo/static-page-title';\nimport {useContext} from 'react';\nimport {\n SiteConfigContext,\n SiteConfigContextValue,\n} from '../../core/settings/site-config-context';\nimport {useSettings} from '../../core/settings/use-settings';\n\ninterface Props {\n onTwoFactorChallenge: () => void;\n}\nexport function LoginPage({onTwoFactorChallenge}: Props) {\n const [searchParams] = useSearchParams();\n const {pathname} = useLocation();\n\n const isWorkspaceLogin = pathname.includes('workspace');\n const searchParamsEmail = searchParams.get('email') || undefined;\n\n const {branding, registration, site, social} = useSettings();\n const siteConfig = useContext(SiteConfigContext);\n\n const demoDefaults =\n site.demo && !searchParamsEmail ? getDemoFormDefaults(siteConfig) : {};\n const form = useForm<LoginPayload>({\n defaultValues: {remember: true, email: searchParamsEmail, ...demoDefaults},\n });\n const login = useLogin(form);\n\n const heading = isWorkspaceLogin ? (\n <Trans\n values={{siteName: branding?.site_name}}\n message=\"To join your team on :siteName, login to your account\"\n />\n ) : (\n <Trans message=\"Sign in to your account\" />\n );\n\n const message = !registration.disable && (\n <Trans\n values={{\n a: parts => (\n <Link className={LinkStyle} to=\"/register\">\n {parts}\n </Link>\n ),\n }}\n message=\"Don't have an account? <a>Sign up.</a>\"\n />\n );\n\n const isInvalid = !!Object.keys(form.formState.errors).length;\n\n return (\n <AuthLayout heading={heading} message={message}>\n <StaticPageTitle>\n <Trans message=\"Login\" />\n </StaticPageTitle>\n <Form\n form={form}\n onSubmit={payload => {\n login.mutate(payload, {\n onSuccess: response => {\n if (response.two_factor) {\n onTwoFactorChallenge();\n }\n },\n });\n }}\n >\n <FormTextField\n className=\"mb-32\"\n name=\"email\"\n type=\"email\"\n label={<Trans message=\"Email\" />}\n disabled={!!searchParamsEmail}\n invalid={isInvalid}\n required\n />\n <FormTextField\n className=\"mb-12\"\n name=\"password\"\n type=\"password\"\n label={<Trans message=\"Password\" />}\n invalid={isInvalid}\n labelSuffix={\n <Link className={LinkStyle} to=\"/forgot-password\" tabIndex={-1}>\n <Trans message=\"Forgot your password?\" />\n </Link>\n }\n required\n />\n <FormCheckbox name=\"remember\" className=\"mb-32 block\">\n <Trans message=\"Stay signed in for a month\" />\n </FormCheckbox>\n <Button\n className=\"block w-full\"\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n size=\"md\"\n disabled={login.isPending}\n >\n <Trans message=\"Continue\" />\n </Button>\n </Form>\n <SocialAuthSection\n dividerMessage={\n social.compact_buttons ? (\n <Trans message=\"Or sign in with\" />\n ) : (\n <Trans message=\"OR\" />\n )\n }\n />\n </AuthLayout>\n );\n}\n\nfunction getDemoFormDefaults(siteConfig: SiteConfigContextValue) {\n if (siteConfig.demo.loginPageDefaults === 'randomAccount') {\n // random number between 0 and 100, padded to 3 digits\n const number = Math.floor(Math.random() * 100) + 1;\n const paddedNumber = String(number).padStart(3, '0');\n return {\n email: `admin@demo${paddedNumber}.com`,\n password: 'admin',\n };\n } else {\n return {\n email: siteConfig.demo.email ?? 'admin@admin.com',\n password: siteConfig.demo.password ?? 'admin',\n };\n }\n}\n","import {useState} from 'react';\nimport {TwoFactorChallengePage} from '@common/auth/ui/two-factor/two-factor-challenge-page';\nimport {LoginPage} from '@common/auth/ui/login-page';\n\nexport function LoginPageWrapper() {\n const [isTwoFactor, setIsTwoFactor] = useState(false);\n if (isTwoFactor) {\n return <TwoFactorChallengePage />;\n } else {\n return <LoginPage onTwoFactorChallenge={() => setIsTwoFactor(true)} />;\n }\n}\n","import {ReactElement} from 'react';\nimport {GuestRoute} from '../auth/guards/guest-route';\nimport {RegisterPage} from '../auth/ui/register-page';\nimport {useSettings} from '../core/settings/use-settings';\nimport {CustomPageLayout} from '@common/custom-page/custom-page-layout';\nimport {LoginPageWrapper} from '@common/auth/ui/login-page-wrapper';\n\ninterface DynamicHomepageProps {\n homepageResolver?: (type?: string) => ReactElement;\n}\nexport function DynamicHomepage({homepageResolver}: DynamicHomepageProps) {\n const {homepage} = useSettings();\n\n if (homepage?.type === 'loginPage') {\n return (\n <GuestRoute>\n <LoginPageWrapper />\n </GuestRoute>\n );\n }\n\n if (homepage?.type === 'registerPage') {\n return (\n <GuestRoute>\n <RegisterPage />\n </GuestRoute>\n );\n }\n\n if (homepage?.type === 'customPage') {\n return <CustomPageLayout slug={homepage.value} />;\n }\n\n return homepageResolver?.(homepage?.type) || null;\n}\n","import {useAuth} from '../../auth/use-auth';\nimport {memo, useEffect, useId, useMemo, useRef} from 'react';\nimport lazyLoader from '../../utils/http/lazy-loader';\nimport clsx from 'clsx';\nimport {useSettings} from '../../core/settings/use-settings';\nimport dot from 'dot-object';\nimport {Settings} from '@common/core/settings/settings';\nimport {getScrollParent} from '@react-aria/utils';\n\ninterface AdHostProps {\n slot: keyof Omit<NonNullable<Settings['ads']>, 'disable'>;\n className?: string;\n}\nexport function AdHost({slot, className}: AdHostProps) {\n const settings = useSettings();\n const {isSubscribed} = useAuth();\n const adCode = useMemo(() => {\n return dot.pick(`ads.${slot}`, settings);\n }, [slot, settings]);\n\n if (settings.ads?.disable || isSubscribed || !adCode) return null;\n\n return <InvariantAd className={className} slot={slot} adCode={adCode} />;\n}\n\ninterface InvariantAdProps {\n slot: string;\n adCode: string;\n className?: string;\n}\nconst InvariantAd = memo(\n ({slot, adCode, className}: InvariantAdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n\n const id = useId();\n\n useEffect(() => {\n if (ref.current) {\n loadAdScripts(adCode, ref.current).then(() => {\n executeAdJavascript(adCode, id);\n });\n }\n return () => {\n // @ts-ignore\n delete window['google_ad_modifications'];\n };\n }, [adCode, id]);\n\n // remove height modifications added by adsense\n useEffect(() => {\n if (ref.current) {\n const scrollParent = getScrollParent(ref.current) as HTMLElement;\n if (scrollParent) {\n const observer = new MutationObserver(function () {\n scrollParent.style.height = '';\n scrollParent.style.minHeight = '';\n });\n observer.observe(scrollParent, {\n attributes: true,\n attributeFilter: ['style'],\n });\n return () => observer.disconnect();\n }\n }\n }, []);\n\n return (\n <div\n ref={ref}\n id={id}\n className={clsx(\n 'ad-host flex max-h-[600px] min-h-90 w-full max-w-full items-center justify-center overflow-hidden',\n `${slot.replace(/\\./g, '-')}-host`,\n className,\n )}\n dangerouslySetInnerHTML={{__html: getAdHtml(adCode)}}\n ></div>\n );\n },\n () => {\n // never re-render\n return false;\n },\n);\n\nfunction getAdHtml(adCode: string) {\n // strip out all script tags from ad code and leave only html\n return adCode\n ?.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\n .trim();\n}\n\n// Load any external scripts needed by ad.\nfunction loadAdScripts(adCode: string, parentEl: HTMLDivElement): Promise<any> {\n const promises = [];\n\n // load ad code script\n const pattern = /<script.*?src=['\"](.*?)['\"]/g;\n let match;\n\n while ((match = pattern.exec(adCode))) {\n if (match[1]) {\n promises.push(lazyLoader.loadAsset(match[1], {type: 'js', parentEl}));\n }\n }\n\n return Promise.all(promises);\n}\n\n// Execute ad code javascript and replace document.write if needed.\nfunction executeAdJavascript(adCode: string, id: string) {\n // find any ad code javascript that needs to be executed\n const pattern = /<script\\b[^>]*>([\\s\\S]*?)<\\/script>/g;\n let content;\n\n while ((content = pattern.exec(adCode))) {\n if (content[1]) {\n const r = `var d = document.createElement('div'); d.innerHTML = $1; document.getElementById('${id}').appendChild(d.firstChild);`;\n const toEval = content[1].replace(/document.write\\((.+?)\\);/, r);\n eval(toEval);\n }\n }\n}\n","import urlRegex from 'url-regex';\n\nexport function urlIsValid(url: string): boolean {\n return urlRegex({exact: true, strict: false}).test(url);\n}\n","import {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {LandingPageContent} from '@app/landing/landing-page-content';\nimport {Button} from '@common/ui/buttons/button';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useRef, useState} from 'react';\nimport {urlIsValid} from '@app/dashboard/links/utils/url-is-valid';\nimport {Link} from '@app/dashboard/links/link';\nimport {Trans} from '@common/i18n/trans';\nimport {flushSync} from 'react-dom';\nimport useClipboard from 'react-use-clipboard';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\nimport {useLightThemeVariables} from '@common/ui/themes/use-light-theme-variables';\n\ninterface LandingPageNewLinkFormProps {\n content: LandingPageContent;\n}\nexport function LandingPageNewLinkForm({content}: LandingPageNewLinkFormProps) {\n const {trans} = useTrans();\n const lightThemeVars = useLightThemeVariables();\n const {verify, isVerifying} = useRecaptcha('link_creation');\n const {\n links: {default_type},\n } = useSettings();\n const inputRef = useRef<HTMLInputElement>(null);\n const [longUrl, setLongUrl] = useState('');\n const [shortUrl, setShortUrl] = useState('');\n const [, copyToClipboard] = useClipboard(shortUrl, {\n successDuration: 100,\n });\n\n const createPayload: Partial<Link> = {\n long_url: longUrl,\n type: default_type || 'direct',\n };\n\n const createLink = useMutation({\n mutationFn: () => postCreateLink(createPayload),\n onSuccess: response => {\n toast.positive(trans(message('Link shortened')));\n flushSync(() => {\n setShortUrl(response.link.short_url);\n });\n inputRef.current?.select();\n },\n onError: err =>\n showHttpErrorToast(\n err,\n message('Could not shorten link. Please try again later'),\n 'long_url',\n ),\n });\n\n return (\n <form\n className=\"mt-60 w-full md:mt-80\"\n onSubmit={async e => {\n e.preventDefault();\n\n if (createLink.isPending || isVerifying) return;\n\n // Input is in \"copy\" mode, copy shortened link to clipboard on submit\n if (shortUrl) {\n flushSync(() => {\n copyToClipboard();\n setShortUrl('');\n setLongUrl('');\n });\n toast.positive(message('Copied link to clipboard'));\n return;\n }\n\n // input is in \"shorten\" mode, shorten link on submit\n if (!urlIsValid(longUrl)) {\n toast.danger(message('This url is invalid.'));\n } else {\n const isValid = await verify();\n if (isValid) {\n createLink.mutate();\n }\n }\n }}\n >\n <TextField\n inputRef={inputRef}\n background=\"bg-white\"\n inputRadius=\"rounded-full\"\n style={lightThemeVars}\n size=\"lg\"\n placeholder={trans(message(content.actions.inputText))}\n value={shortUrl || longUrl}\n onChange={e => setLongUrl(e.target.value)}\n endAppend={\n <Button\n radius=\"rounded-r-full\"\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n className=\"min-w-160\"\n >\n {shortUrl ? (\n <Trans message=\"Copy\" />\n ) : (\n <Trans message={content.actions.inputButton} />\n )}\n </Button>\n }\n />\n </form>\n );\n}\n\ninterface CreateLinkResponse extends BackendResponse {\n link: Link;\n}\nfunction postCreateLink(values: Partial<Link>): Promise<CreateLinkResponse> {\n return apiClient.post(`link`, values).then(r => r.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst endpoint = 'homepage/stats';\n\nexport interface GetLandingPageStatsResponse extends BackendResponse {\n stats: {\n links: number;\n clicks: number;\n users: number;\n };\n}\n\nexport function useLandingPageStats() {\n return useQuery({\n queryKey: [endpoint],\n queryFn: () => getLandingPageStats(),\n initialData: () => {\n if (getBootstrapData().loaders?.landingPage?.stats) {\n // @ts-ignore\n return {\n stats: getBootstrapData().loaders!.landingPage!.stats,\n };\n }\n },\n });\n}\n\nfunction getLandingPageStats(): Promise<GetLandingPageStatsResponse> {\n return apiClient.get(endpoint).then(response => response.data);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LinkIcon = createSvgIcon(\n <path d=\"M17 7h-4v2h4c1.65 0 3 1.35 3 3s-1.35 3-3 3h-4v2h4c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-6 8H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-2zm-3-4h8v2H8z\" />\n, 'LinkOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MouseIcon = createSvgIcon(\n <path d=\"M20 9c-.04-4.39-3.6-7.93-8-7.93S4.04 4.61 4 9v6c0 4.42 3.58 8 8 8s8-3.58 8-8V9zm-2 0h-5V3.16c2.81.47 4.96 2.9 5 5.84zm-7-5.84V9H6c.04-2.94 2.19-5.37 5-5.84zM18 15c0 3.31-2.69 6-6 6s-6-2.69-6-6v-4h12v4z\" />\n, 'MouseOutlined');\n","import {Fragment, memo} from 'react';\nimport {useNumberFormatter} from './use-number-formatter';\nimport {NumberFormatOptions} from '@internationalized/number';\nimport {shallowEqual} from '../utils/shallow-equal';\n\ninterface FormattedNumberProps extends NumberFormatOptions {\n value: number;\n}\nexport const FormattedNumber = memo(\n ({value, ...options}: FormattedNumberProps) => {\n const formatter = useNumberFormatter(options);\n\n if (isNaN(value)) {\n value = 0;\n }\n\n return <Fragment>{formatter.format(value)}</Fragment>;\n },\n shallowEqual\n);\n","import {Trans} from '@common/i18n/trans';\nimport {useLandingPageStats} from '@app/landing/use-landing-page-stats';\nimport {LinkIcon} from '@common/icons/material/Link';\nimport {cloneElement, ReactElement} from 'react';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {MouseIcon} from '@common/icons/material/Mouse';\nimport {PersonIcon} from '@common/icons/material/Person';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\n\nexport function LandingPageStats() {\n const {data} = useLandingPageStats();\n\n if (!data) return null;\n\n return (\n <div className=\"landing-container py-90 border-t flex gap-60 justify-between overflow-x-auto\">\n <StatLayout\n label={<Trans message=\"Total links shortened\" />}\n icon={<LinkIcon />}\n number={data.stats.links}\n />\n <StatLayout\n label={<Trans message=\"Total link clicks\" />}\n icon={<MouseIcon />}\n number={data.stats.clicks}\n />\n <StatLayout\n label={<Trans message=\"Users signed up\" />}\n icon={<PersonIcon />}\n number={data.stats.users}\n />\n </div>\n );\n}\n\ninterface StatLayoutProps {\n label: ReactElement;\n icon: ReactElement<SvgIconProps>;\n number: number;\n}\nfunction StatLayout({label, icon, number}: StatLayoutProps) {\n return (\n <div className=\"flex items-center\">\n {cloneElement(icon, {size: 'xl'})}\n <div className=\"border-l border-l-2 pl-24 ml-24\">\n <div className=\"whitespace-nowrap uppercase text-[15px]\">{label}</div>\n <div className=\"text-3xl font-medium mt-6\">\n <FormattedNumber value={number} />\n </div>\n </div>\n </div>\n );\n}\n","import clsx from 'clsx';\n\ninterface SkeletonProps {\n variant?: 'avatar' | 'text' | 'rect' | 'icon';\n animation?: 'pulsate' | 'wave' | null; // disable animation completely with null\n className?: string;\n size?: string;\n display?: string;\n radius?: string;\n}\nexport function Skeleton({\n variant = 'text',\n animation = 'wave',\n size,\n className,\n display = 'block',\n radius = 'rounded',\n}: SkeletonProps) {\n return (\n <span\n className={clsx(\n 'overflow-hidden relative bg-fg-base/4 bg-no-repeat will-change-transform skeleton',\n radius,\n skeletonSize({variant, size}),\n display,\n variant === 'text' && 'scale-y-[0.6] origin-[0_55%]',\n variant === 'avatar' && 'flex-shrink-0',\n variant === 'icon' && 'mx-8 flex-shrink-0',\n animation === 'wave' && 'skeleton-wave',\n animation === 'pulsate' && 'skeleton-pulsate',\n className\n )}\n aria-busy\n aria-live=\"polite\"\n />\n );\n}\n\ninterface SkeletonSizeProps {\n variant: SkeletonProps['variant'];\n size: SkeletonProps['size'];\n}\nfunction skeletonSize({variant, size}: SkeletonSizeProps): string | undefined {\n if (size) {\n return size;\n }\n\n switch (variant) {\n case 'avatar':\n return 'h-40 w-40';\n case 'icon':\n return 'h-24 h-24';\n case 'rect':\n return 'h-full w-full';\n default:\n return 'w-full';\n }\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {PaginatedBackendResponse} from '../../http/backend-response/pagination-response';\nimport {Product} from '../product';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst endpoint = 'billing/products';\n\nexport interface FetchProductsResponse extends BackendResponse {\n products: Product[];\n}\n\nexport function useProducts(loader?: string) {\n return useQuery<FetchProductsResponse>({\n queryKey: [endpoint],\n queryFn: () => fetchProducts(),\n initialData: () => {\n if (loader) {\n // @ts-ignore\n return getBootstrapData().loaders?.[loader];\n }\n },\n });\n}\n\nfunction fetchProducts(): Promise<FetchProductsResponse> {\n return apiClient\n .get<PaginatedBackendResponse<Product>>(endpoint)\n .then(response => {\n return {products: response.data.pagination.data};\n });\n}\n","import {Price} from '../price';\n\nexport type UpsellBillingCycle = 'monthly' | 'yearly';\n\nexport function findBestPrice(\n token: UpsellBillingCycle,\n prices: Price[]\n): Price | undefined {\n if (token === 'monthly') {\n const match = findMonthlyPrice(prices);\n if (match) return match;\n }\n\n if (token === 'yearly') {\n const match = findYearlyPrice(prices);\n if (match) return match;\n }\n\n return prices[0];\n}\n\nfunction findYearlyPrice(prices: Price[]) {\n return prices.find(price => {\n if (price.interval === 'month' && price.interval_count >= 12) {\n return price;\n }\n if (price.interval === 'year' && price.interval_count >= 1) {\n return price;\n }\n });\n}\n\nfunction findMonthlyPrice(prices: Price[]) {\n return prices.find(price => {\n if (price.interval === 'day' && price.interval_count >= 30) {\n return price;\n }\n if (price.interval === 'month' && price.interval_count >= 1) {\n return price;\n }\n });\n}\n","import {createSvgIcon} from '../../../../icons/create-svg-icon';\n\nexport const CancelFilledIcon = createSvgIcon(\n <path d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const WarningIcon = createSvgIcon(\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\n, 'WarningOutlined');\n","import {\n cloneElement,\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactElement,\n Ref,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {PopoverAnimation} from '../overlays/popover-animation';\nimport {useFloatingPosition} from '../overlays/floating-position';\nimport {createPortal} from 'react-dom';\nimport {mergeProps} from '@react-aria/utils';\nimport {OffsetOptions, Placement} from '@floating-ui/react-dom';\nimport {rootEl} from '../../core/root-el';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nconst TOOLTIP_COOLDOWN = 500;\nconst tooltips: Record<string, ((immediate?: boolean) => void) | undefined> =\n {};\nlet globalWarmedUp = false;\nlet globalWarmUpTimeout: ReturnType<typeof setTimeout> | null = null;\nlet globalCooldownTimeout: ReturnType<typeof setTimeout> | null = null;\n\nconst closeOpenTooltips = (tooltipId: string) => {\n for (const hideTooltipId in tooltips) {\n if (hideTooltipId !== tooltipId) {\n tooltips[hideTooltipId]?.(true);\n delete tooltips[hideTooltipId];\n }\n }\n};\n\ninterface Props {\n label: ReactElement<MessageDescriptor> | string;\n placement?: Placement;\n children: ReactElement;\n variant?: 'neutral' | 'positive' | 'danger';\n delay?: number;\n isDisabled?: boolean;\n offset?: OffsetOptions;\n usePortal?: boolean;\n}\nexport const Tooltip = forwardRef<HTMLElement, Props>(\n (\n {\n children,\n label,\n placement = 'top',\n offset = 10,\n variant = 'neutral',\n delay = 1500,\n isDisabled,\n usePortal = true,\n ...domProps\n },\n ref\n ) => {\n const {x, y, reference, strategy, arrowRef, arrowStyle, refs} =\n useFloatingPosition({\n placement,\n offset,\n ref,\n showArrow: true,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const tooltipId = useId();\n const closeTimeout = useRef<ReturnType<typeof setTimeout>>();\n\n const showTooltip = () => {\n clearTimeout(closeTimeout.current);\n closeTimeout.current = undefined;\n closeOpenTooltips(tooltipId);\n tooltips[tooltipId] = hideTooltip;\n globalWarmedUp = true;\n setIsOpen(true);\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n globalCooldownTimeout = null;\n }\n };\n\n const hideTooltip = useCallback(\n (immediate?: boolean) => {\n if (immediate) {\n clearTimeout(closeTimeout.current);\n closeTimeout.current = undefined;\n setIsOpen(false);\n } else if (!closeTimeout.current) {\n closeTimeout.current = setTimeout(() => {\n closeTimeout.current = undefined;\n setIsOpen(false);\n }, TOOLTIP_COOLDOWN);\n }\n\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalWarmedUp) {\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n }\n globalCooldownTimeout = setTimeout(() => {\n delete tooltips[tooltipId];\n globalCooldownTimeout = null;\n globalWarmedUp = false;\n }, TOOLTIP_COOLDOWN);\n }\n },\n [tooltipId]\n );\n\n const warmupTooltip = () => {\n closeOpenTooltips(tooltipId);\n tooltips[tooltipId] = hideTooltip;\n if (!isOpen && !globalWarmUpTimeout && !globalWarmedUp) {\n globalWarmUpTimeout = setTimeout(() => {\n globalWarmUpTimeout = null;\n globalWarmedUp = true;\n showTooltip();\n }, delay);\n } else if (!isOpen) {\n showTooltip();\n }\n };\n\n const showTooltipWithWarmup = (immediate?: boolean) => {\n if (!immediate && delay > 0 && !closeTimeout.current) {\n warmupTooltip();\n } else {\n showTooltip();\n }\n };\n\n // close on unmount\n useEffect(() => {\n return () => {\n clearTimeout(closeTimeout.current);\n const tooltip = tooltips[tooltipId];\n if (tooltip) {\n delete tooltips[tooltipId];\n }\n };\n }, [tooltipId]);\n\n // close on \"escape\" key press\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n hideTooltip(true);\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', onKeyDown, true);\n return () => {\n document.removeEventListener('keydown', onKeyDown, true);\n };\n }\n }, [isOpen, hideTooltip]);\n\n const tooltipContent = (\n <AnimatePresence>\n {isOpen && (\n <m.div\n {...PopoverAnimation}\n ref={refs.setFloating}\n id={tooltipId}\n role=\"tooltip\"\n onPointerEnter={() => {\n showTooltipWithWarmup(true);\n }}\n onPointerLeave={() => {\n hideTooltip();\n }}\n className={clsx(\n 'z-tooltip my-4 max-w-240 break-words rounded px-8 py-4 text-xs text-white shadow',\n variant === 'positive' && 'bg-positive',\n variant === 'danger' && 'bg-danger',\n variant === 'neutral' && 'bg-toast'\n )}\n style={{\n position: strategy,\n top: y ?? '',\n left: x ?? '',\n }}\n >\n <div\n ref={arrowRef as Ref<HTMLDivElement>}\n className=\"absolute h-8 w-8 rotate-45 bg-inherit\"\n style={arrowStyle}\n />\n {label}\n </m.div>\n )}\n </AnimatePresence>\n );\n\n return (\n <Fragment>\n {cloneElement(\n children,\n // pass dom props down to child element, in case tooltip is wrapped in menu trigger\n mergeProps(\n {\n 'aria-describedby': isOpen ? tooltipId : undefined,\n ref: reference,\n onPointerEnter: e => {\n if (e.pointerType === 'mouse') {\n showTooltipWithWarmup();\n }\n },\n onFocus: e => {\n if (e.target.matches(':focus-visible')) {\n showTooltipWithWarmup(true);\n }\n },\n onPointerLeave: e => {\n if (e.pointerType === 'mouse') {\n hideTooltip();\n }\n },\n onPointerDown: () => {\n hideTooltip(true);\n },\n onBlur: () => {\n hideTooltip();\n },\n 'aria-label':\n typeof label === 'string' ? label : label.props.message,\n } as HTMLAttributes<HTMLElement>,\n domProps\n )\n )}\n {usePortal\n ? rootEl && createPortal(tooltipContent, rootEl)\n : tooltipContent}\n </Fragment>\n );\n }\n);\n","import React, {\n cloneElement,\n JSXElementConstructor,\n ReactElement,\n ReactNode,\n useRef,\n} from 'react';\nimport clsx from 'clsx';\nimport {useFocusManager} from '@react-aria/focus';\nimport {ButtonBase} from '../../../buttons/button-base';\nimport {CancelFilledIcon} from './cancel-filled-icon';\nimport {WarningIcon} from '@common/icons/material/Warning';\nimport {Tooltip} from '../../../tooltip/tooltip';\nimport {To} from 'react-router-dom';\n\nexport interface ChipProps {\n onRemove?: () => void;\n disabled?: boolean;\n selectable?: boolean;\n invalid?: boolean;\n errorMessage?: ReactElement | string;\n children?: ReactNode;\n className?: string;\n adornment?: null | ReactElement<{\n size: string;\n className?: string;\n circle?: boolean;\n }>;\n radius?: string;\n color?: 'chip' | 'primary' | 'danger' | 'positive';\n size?: 'xs' | 'sm' | 'md' | 'lg';\n elementType?: 'div' | 'a' | JSXElementConstructor<any>;\n to?: To;\n onClick?: (e: React.MouseEvent) => void;\n}\nexport function Chip(props: ChipProps) {\n const {\n onRemove,\n disabled,\n invalid,\n errorMessage,\n children,\n className,\n selectable = false,\n radius = 'rounded-full',\n elementType = 'div',\n to,\n onClick,\n } = props;\n const chipRef = useRef<HTMLDivElement>(null);\n const deleteButtonRef = useRef<HTMLButtonElement>(null);\n const focusManager = useFocusManager();\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n focusManager?.focusNext({tabbable: true});\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n focusManager?.focusPrevious({tabbable: true});\n break;\n case 'Backspace':\n case 'Delete':\n if (chipRef.current === document.activeElement) {\n onRemove?.();\n }\n break;\n default:\n }\n };\n\n const handleClick: React.MouseEventHandler = e => {\n e.stopPropagation();\n if (onClick) {\n onClick(e);\n } else {\n chipRef.current!.focus();\n }\n };\n\n const sizeStyle = sizeClassNames(props);\n\n let adornment =\n invalid || errorMessage != null ? (\n <WarningIcon className=\"text-danger\" size=\"sm\" />\n ) : (\n props.adornment &&\n cloneElement(props.adornment, {\n size: sizeStyle.adornment.size,\n circle: true,\n className: clsx(props.adornment.props, sizeStyle.adornment.margin),\n })\n );\n\n if (errorMessage && adornment) {\n adornment = (\n <Tooltip label={errorMessage} variant=\"danger\">\n {adornment}\n </Tooltip>\n );\n }\n\n const Element = elementType;\n\n return (\n <Element\n tabIndex={selectable ? 0 : undefined}\n ref={chipRef}\n to={to}\n onKeyDown={selectable ? handleKeyDown : undefined}\n onClick={selectable ? handleClick : undefined}\n className={clsx(\n 'relative flex flex-shrink-0 items-center justify-center gap-10 overflow-hidden whitespace-nowrap outline-none',\n 'min-w-0 max-w-full after:pointer-events-none after:absolute after:inset-0',\n onClick && 'cursor-pointer',\n radius,\n colorClassName(props),\n sizeStyle.chip,\n !disabled &&\n selectable &&\n 'hover:after:bg-black/5 focus:after:bg-black/10',\n className,\n )}\n >\n {adornment}\n <div className=\"flex-auto overflow-hidden overflow-ellipsis\">\n {children}\n </div>\n {onRemove && (\n <ButtonBase\n ref={deleteButtonRef}\n className={clsx(\n 'text-black/30 dark:text-white/50',\n sizeStyle.closeButton,\n )}\n onClick={e => {\n e.stopPropagation();\n onRemove();\n }}\n tabIndex={-1}\n >\n <CancelFilledIcon className=\"block\" width=\"100%\" height=\"100%\" />\n </ButtonBase>\n )}\n </Element>\n );\n}\n\nfunction sizeClassNames({size, onRemove}: ChipProps) {\n switch (size) {\n case 'xs':\n return {\n adornment: {size: 'xs', margin: '-ml-3'},\n chip: clsx('pl-8 h-20 text-xs font-medium w-max', !onRemove && 'pr-8'),\n closeButton: 'mr-4 w-14 h-14',\n };\n case 'sm':\n return {\n adornment: {size: 'xs', margin: '-ml-3'},\n chip: clsx('pl-8 h-26 text-xs', !onRemove && 'pr-8'),\n closeButton: 'mr-4 w-18 h-18',\n };\n case 'lg':\n return {\n adornment: {size: 'md', margin: '-ml-12'},\n chip: clsx('pl-18 h-38 text-base', !onRemove && 'pr-18'),\n closeButton: 'mr-6 w-24 h-24',\n };\n default:\n return {\n adornment: {size: 'sm', margin: '-ml-6'},\n chip: clsx('pl-12 h-32 text-sm', !onRemove && 'pr-12'),\n closeButton: 'mr-6 w-22 h-22',\n };\n }\n}\n\nfunction colorClassName({color}: ChipProps): string {\n switch (color) {\n case 'primary':\n return `bg-primary text-on-primary`;\n case 'positive':\n return `bg-positive-lighter text-positive-darker`;\n case 'danger':\n return `bg-danger-lighter text-danger-darker`;\n default:\n return `bg-chip text-main`;\n }\n}\n","import {Fragment, memo} from 'react';\nimport {useNumberFormatter} from './use-number-formatter';\n\ninterface FormattedCurrencyProps {\n value: number;\n currency: string;\n}\nexport const FormattedCurrency = memo(\n ({value, currency}: FormattedCurrencyProps) => {\n const formatter = useNumberFormatter({\n style: 'currency',\n currency,\n currencyDisplay: 'narrowSymbol',\n });\n\n if (isNaN(value)) {\n value = 0;\n }\n\n return <Fragment>{formatter.format(value)}</Fragment>;\n }\n);\n","import {FormattedCurrency} from './formatted-currency';\nimport React from 'react';\nimport {Price} from '../billing/price';\nimport {Trans} from './trans';\nimport clsx from 'clsx';\n\ninterface FormattedPriceProps {\n price?: Omit<Price, 'id'>;\n variant?: 'slash' | 'separateLine';\n className?: string;\n priceClassName?: string;\n periodClassName?: string;\n}\nexport function FormattedPrice({\n price,\n variant = 'slash',\n className,\n priceClassName,\n periodClassName,\n}: FormattedPriceProps) {\n if (!price) return null;\n\n const translatedInterval = <Trans message={price.interval} />;\n\n return (\n <div className={clsx('flex gap-6 items-center', className)}>\n <div className={priceClassName}>\n <FormattedCurrency\n value={price.amount / (price.interval_count ?? 1)}\n currency={price.currency}\n />\n </div>\n {variant === 'slash' ? (\n <div className={periodClassName}> / {translatedInterval}</div>\n ) : (\n <div className={periodClassName}>\n <Trans message=\"per\" /> <br /> {translatedInterval}\n </div>\n )}\n </div>\n );\n}\n","import {Trans} from '../../i18n/trans';\nimport {CheckIcon} from '../../icons/material/Check';\nimport {Product} from '../product';\n\ninterface FeatureListProps {\n product: Product;\n}\n\nexport function ProductFeatureList({product}: FeatureListProps) {\n if (!product.feature_list.length) return null;\n\n return (\n <div className=\"border-t pt-24 mt-32\">\n <div className=\"text-sm mb-10 font-semibold\">\n <Trans message=\"What's included\" />\n </div>\n {product.feature_list.map(feature => (\n <div key={feature} className=\"flex items-center gap-10 text-sm py-6\">\n <CheckIcon className=\"text-positive\" size=\"sm\" />\n <Trans message={feature} />\n </div>\n ))}\n </div>\n );\n}\n","import {AnimatePresence, m} from 'framer-motion';\nimport {Fragment} from 'react';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {useProducts} from '@common/billing/pricing-table/use-products';\nimport {Product} from '@common/billing/product';\nimport {\n findBestPrice,\n UpsellBillingCycle,\n} from '@common/billing/pricing-table/find-best-price';\nimport {useAuth} from '@common/auth/use-auth';\nimport clsx from 'clsx';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedPrice} from '@common/i18n/formatted-price';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {setInLocalStorage} from '@common/utils/hooks/local-storage';\nimport {ProductFeatureList} from '@common/billing/pricing-table/product-feature-list';\n\ninterface PricingTableProps {\n selectedCycle: UpsellBillingCycle;\n className?: string;\n productLoader?: string;\n}\nexport function PricingTable({\n selectedCycle,\n className,\n productLoader,\n}: PricingTableProps) {\n const query = useProducts(productLoader);\n return (\n <div\n className={clsx(\n 'flex flex-col items-center gap-24 overflow-x-auto overflow-y-visible pb-20 md:flex-row md:justify-center',\n className\n )}\n >\n <AnimatePresence initial={false} mode=\"wait\">\n {query.data ? (\n <PlanList\n key=\"plan-list\"\n plans={query.data.products}\n selectedPeriod={selectedCycle}\n />\n ) : (\n <SkeletonLoader key=\"skeleton-loader\" />\n )}\n </AnimatePresence>\n </div>\n );\n}\n\ninterface PlanListProps {\n plans: Product[];\n selectedPeriod: UpsellBillingCycle;\n}\nfunction PlanList({plans, selectedPeriod}: PlanListProps) {\n const {isLoggedIn, isSubscribed} = useAuth();\n const filteredPlans = plans.filter(plan => !plan.hidden);\n return (\n <Fragment>\n {filteredPlans.map((plan, index) => {\n const isFirst = index === 0;\n const isLast = index === filteredPlans.length - 1;\n const price = findBestPrice(selectedPeriod, plan.prices);\n\n let upgradeRoute;\n if (!isLoggedIn) {\n upgradeRoute = `/register?redirectFrom=pricing`;\n }\n if (isSubscribed) {\n upgradeRoute = `/change-plan/${plan.id}/${price?.id}/confirm`;\n }\n if (isLoggedIn && !plan.free) {\n upgradeRoute = `/checkout/${plan.id}/${price?.id}`;\n }\n\n return (\n <m.div\n key={plan.id}\n {...opacityAnimation}\n className={clsx(\n 'w-full rounded-lg border bg-paper px-28 shadow-lg md:min-w-240 md:max-w-350',\n plan.recommended ? 'py-56' : 'py-28',\n isFirst && 'ml-auto',\n isLast && 'mr-auto'\n )}\n >\n <div className=\"mb-32\">\n <Chip\n radius=\"rounded\"\n size=\"sm\"\n className={clsx(\n 'mb-20 w-min',\n !plan.recommended && 'invisible'\n )}\n >\n <Trans message=\"Most popular\" />\n </Chip>\n <div className=\"mb-12 text-xl font-semibold\">\n <Trans message={plan.name} />\n </div>\n <div className=\"text-sm text-muted\">\n <Trans message={plan.description} />\n </div>\n </div>\n <div>\n {price ? (\n <FormattedPrice\n priceClassName=\"font-bold text-4xl\"\n periodClassName=\"text-muted text-xs\"\n variant=\"separateLine\"\n price={price}\n />\n ) : (\n <div className=\"text-4xl font-bold\">\n <Trans message=\"Free\" />\n </div>\n )}\n <div className=\"mt-60\">\n <Button\n variant=\"flat\"\n color=\"primary\"\n className=\"w-full\"\n size=\"md\"\n elementType={upgradeRoute ? Link : undefined}\n disabled={!upgradeRoute}\n onClick={() => {\n if (isLoggedIn || !price || !plan) return;\n setInLocalStorage('be.onboarding.selected', {\n productId: plan.id,\n priceId: price.id,\n });\n }}\n to={upgradeRoute}\n >\n <ActionButtonText product={plan} />\n </Button>\n </div>\n <ProductFeatureList product={plan} />\n </div>\n </m.div>\n );\n })}\n </Fragment>\n );\n}\n\ninterface ActionButtonTextProps {\n product: Product;\n}\nfunction ActionButtonText({product}: ActionButtonTextProps) {\n const {isLoggedIn} = useAuth();\n if (product.free && isLoggedIn) {\n return <Trans message=\"You're on :plan\" values={{plan: product.name}} />;\n }\n if (product.free || !isLoggedIn) {\n return <Trans message=\"Get started\" />;\n }\n return <Trans message=\"Upgrade\" />;\n}\n\nfunction SkeletonLoader() {\n return (\n <Fragment>\n <PlanSkeleton key=\"skeleton-1\" />\n <PlanSkeleton key=\"skeleton-2\" />\n <PlanSkeleton key=\"skeleton-3\" />\n </Fragment>\n );\n}\n\nfunction PlanSkeleton() {\n return (\n <m.div\n {...opacityAnimation}\n className=\"w-full rounded-lg border px-28 py-90 shadow-lg md:max-w-350\"\n >\n <Skeleton className=\"my-10\" />\n <Skeleton className=\"mb-40\" />\n <Skeleton className=\"mb-40 h-30\" />\n <Skeleton className=\"mb-40 h-40\" />\n <Skeleton className=\"mb-20\" />\n <Skeleton />\n <Skeleton />\n </m.div>\n );\n}\n","import React, {ComponentPropsWithoutRef, forwardRef} from 'react';\nimport clsx from 'clsx';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {useController} from 'react-hook-form';\nimport {AutoFocusProps, useAutoFocus} from '../../focus/use-auto-focus';\n\ntype RadioSize = 'xs' | 'sm' | 'md' | 'lg' | undefined;\n\nexport interface RadioProps\n extends AutoFocusProps,\n Omit<ComponentPropsWithoutRef<'input'>, 'size'> {\n size?: RadioSize;\n value: string;\n invalid?: boolean;\n isFirst?: boolean;\n}\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>((props, ref) => {\n const {children, autoFocus, size, invalid, isFirst, ...domProps} = props;\n\n const inputRef = useObjectRef(ref);\n useAutoFocus({autoFocus}, inputRef);\n\n const sizeClassNames = getSizeClassNames(size);\n\n return (\n <label\n className={clsx(\n 'inline-flex gap-8 select-none items-center whitespace-nowrap align-middle',\n sizeClassNames.label,\n props.disabled && 'text-disabled pointer-events-none',\n props.invalid && 'text-danger'\n )}\n >\n <input\n type=\"radio\"\n className={clsx(\n 'focus-visible:ring outline-none',\n 'rounded-full transition-button border-2 appearance-none',\n 'border-text-muted disabled:border-disabled-fg checked:border-primary checked:hover:border-primary-dark',\n 'before:bg-primary disabled:before:bg-disabled-fg before:hover:bg-primary-dark',\n 'before:h-full before:w-full before:block before:rounded-full before:scale-10 before:opacity-0 before:transition before:duration-200',\n 'checked:before:scale-[.65] checked:before:opacity-100',\n sizeClassNames.circle\n )}\n ref={inputRef}\n {...domProps}\n />\n {children && <span>{children}</span>}\n </label>\n );\n});\n\nexport function FormRadio(props: RadioProps) {\n const {\n field: {onChange, onBlur, value, ref},\n fieldState: {invalid},\n } = useController({\n name: props.name!,\n });\n\n const formProps: Partial<RadioProps> = {\n onChange,\n onBlur,\n checked: props.value === value,\n invalid: props.invalid || invalid,\n };\n\n return <Radio ref={ref} {...mergeProps(formProps, props)} />;\n}\n\nfunction getSizeClassNames(size?: RadioSize): {\n circle: string;\n label: string;\n} {\n switch (size) {\n case 'xs':\n return {circle: 'h-12 w-12', label: 'text-xs'};\n case 'sm':\n return {circle: 'h-16 w-16', label: 'text-sm'};\n case 'lg':\n return {circle: 'h-24 w-24', label: 'text-lg'};\n default:\n return {circle: 'h-20 w-20', label: 'text-base'};\n }\n}\n","import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n ReactNode,\n useId,\n} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {Orientation} from '../orientation';\nimport {RadioProps} from './radio';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\n\nexport interface RadioGroupProps {\n children: ReactNode;\n orientation?: Orientation;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n className?: string;\n label?: ReactNode;\n disabled?: boolean;\n name?: string;\n errorMessage?: ReactNode;\n description?: ReactNode;\n invalid?: boolean;\n required?: boolean;\n}\nexport const RadioGroup = forwardRef<HTMLFieldSetElement, RadioGroupProps>(\n (props, ref) => {\n const style = getInputFieldClassNames(props);\n const {\n label,\n children,\n size,\n className,\n orientation = 'horizontal',\n disabled,\n required,\n invalid,\n errorMessage,\n description,\n } = props;\n\n const labelProps = {};\n const id = useId();\n const name = props.name || id;\n\n return (\n <fieldset\n aria-describedby={description ? `${id}-description` : undefined}\n ref={ref}\n className={clsx('text-left', className)}\n >\n {label && (\n <legend className={style.label} {...labelProps}>\n {label}\n </legend>\n )}\n <div\n className={clsx(\n 'flex',\n label ? 'mt-6' : 'mt-0',\n orientation === 'vertical' ? 'flex-col gap-10' : 'flex-row gap-16'\n )}\n >\n {Children.map(children, child => {\n if (isValidElement<RadioProps>(child)) {\n return cloneElement<RadioProps>(child, {\n name,\n size,\n invalid: child.props.invalid || invalid || undefined,\n disabled: child.props.disabled || disabled,\n required: child.props.required || required,\n });\n }\n })}\n </div>\n {description && !errorMessage && (\n <div className={style.description} id={`${id}-description`}>\n {description}\n </div>\n )}\n {errorMessage && <div className={style.error}>{errorMessage}</div>}\n </fieldset>\n );\n }\n);\n\ninterface FormRadioGroupProps extends RadioGroupProps {\n name: string;\n}\nexport function FormRadioGroup({children, ...props}: FormRadioGroupProps) {\n const {\n fieldState: {error},\n } = useController({\n name: props.name!,\n });\n return (\n <RadioGroup errorMessage={error?.message} {...props}>\n {children}\n </RadioGroup>\n );\n}\n","// find the highest percentage decrease between monthly and yearly prices of specified products\nimport {Product} from '../product';\nimport {findBestPrice} from './find-best-price';\nimport {Fragment, memo} from 'react';\nimport {Trans} from '../../i18n/trans';\n\ninterface UpsellLabelProps {\n products?: Product[];\n}\nexport const UpsellLabel = memo(({products}: UpsellLabelProps) => {\n const upsellPercentage = calcHighestUpsellPercentage(products);\n\n if (upsellPercentage <= 0) {\n return null;\n }\n\n return (\n <Fragment>\n <span className=\"text-positive-darker font-medium\">\n {' '}\n (\n <Trans\n message=\"Save up to :percentage%\"\n values={{percentage: upsellPercentage}}\n />\n )\n </span>\n </Fragment>\n );\n});\n\nfunction calcHighestUpsellPercentage(products?: Product[]) {\n if (!products?.length) return 0;\n\n const decreases = products.map(product => {\n const monthly = findBestPrice('monthly', product.prices);\n const yearly = findBestPrice('yearly', product.prices);\n\n if (!monthly || !yearly) return 0;\n\n // monthly plan per year amount\n const monthlyAmount = monthly.amount * 12;\n const yearlyAmount = yearly.amount;\n\n const savingsPercentage = Math.round(\n ((monthlyAmount - yearlyAmount) / monthlyAmount) * 100\n );\n\n if (savingsPercentage > 0 && savingsPercentage <= 200) {\n return savingsPercentage;\n }\n\n return 0;\n });\n\n return Math.max(Math.max(...decreases), 0);\n}\n","import {Radio} from '../../ui/forms/radio-group/radio';\nimport {UpsellBillingCycle} from './find-best-price';\nimport {Trans} from '../../i18n/trans';\nimport {\n RadioGroup,\n RadioGroupProps,\n} from '../../ui/forms/radio-group/radio-group';\nimport {UpsellLabel} from './upsell-label';\nimport {Product} from '../product';\n\ninterface BillingCycleRadioProps extends Omit<RadioGroupProps, 'children'> {\n selectedCycle: UpsellBillingCycle;\n onChange: (value: UpsellBillingCycle) => void;\n products?: Product[];\n}\nexport function BillingCycleRadio({\n selectedCycle,\n onChange,\n products,\n ...radioGroupProps\n}: BillingCycleRadioProps) {\n return (\n <RadioGroup {...radioGroupProps}>\n <Radio\n value=\"yearly\"\n checked={selectedCycle === 'yearly'}\n onChange={e => {\n onChange(e.target.value as UpsellBillingCycle);\n }}\n >\n <Trans message=\"Annual\" />\n <UpsellLabel products={products} />\n </Radio>\n <Radio\n value=\"monthly\"\n checked={selectedCycle === 'monthly'}\n onChange={e => {\n onChange(e.target.value as UpsellBillingCycle);\n }}\n >\n <Trans message=\"Monthly\" />\n </Radio>\n </RadioGroup>\n );\n}\n","import clsx from 'clsx';\nimport {LandingPageContent} from './landing-page-content';\nimport {Navbar} from '@common/ui/navigation/navbar/navbar';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {MixedImage} from '@common/ui/images/mixed-image';\nimport {Footer} from '@common/ui/footer/footer';\nimport {Trans} from '@common/i18n/trans';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {Link} from 'react-router-dom';\nimport {createSvgIconFromTree} from '@common/icons/create-svg-icon';\nimport {MenuItemConfig} from '@common/core/settings/settings';\nimport {Fragment, useState} from 'react';\nimport {DefaultMetaTags} from '@common/seo/default-meta-tags';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {LandingPageNewLinkForm} from '@app/landing/landing-page-new-link-form';\nimport {useAuth} from '@common/auth/use-auth';\nimport {LandingPageStats} from '@app/landing/landing-page-stats';\nimport {PricingTable} from '@common/billing/pricing-table/pricing-table';\nimport {BillingCycleRadio} from '@common/billing/pricing-table/billing-cycle-radio';\nimport {UpsellBillingCycle} from '@common/billing/pricing-table/find-best-price';\nimport {useProducts} from '@common/billing/pricing-table/use-products';\n\ninterface ContentProps {\n content: LandingPageContent;\n}\nexport function LandingPage() {\n const settings = useSettings();\n const homepage = settings.homepage as {appearance: LandingPageContent};\n\n const showPricing =\n settings.links.homepage_pricing && settings.billing.enable;\n\n return (\n <Fragment>\n <DefaultMetaTags />\n <Fragment>\n <HeroHeader content={homepage.appearance} />\n <AdHost slot=\"landing\" className=\"mx-14 -mt-30 mb-14 md:mb-70\" />\n <PrimaryFeatures content={homepage.appearance} />\n <div className=\"mt-100 h-1 bg-divider\" />\n <SecondaryFeatures content={homepage.appearance} />\n {settings.links?.homepage_stats && <LandingPageStats />}\n <BottomCta content={homepage.appearance} />\n {showPricing && <PricingSection content={homepage.appearance} />}\n <Footer className=\"landing-container\" />\n </Fragment>\n </Fragment>\n );\n}\n\nfunction HeroHeader({content}: ContentProps) {\n const {hasPermission} = useAuth();\n const {\n links: {homepage_creation},\n } = useSettings();\n\n const {\n headerTitle,\n headerSubtitle,\n headerImage,\n headerImageOpacity,\n actions,\n headerOverlayColor1,\n headerOverlayColor2,\n } = content;\n let overlayBackground = undefined;\n\n if (headerOverlayColor1 && headerOverlayColor2) {\n overlayBackground = `linear-gradient(45deg, ${headerOverlayColor1} 0%, ${headerOverlayColor2} 100%)`;\n } else if (headerOverlayColor1) {\n overlayBackground = headerOverlayColor1;\n } else if (headerOverlayColor2) {\n overlayBackground = headerOverlayColor2;\n }\n\n return (\n <header className=\"relative isolate mb-14 overflow-hidden md:mb-60\">\n <img\n data-testid=\"headerImage\"\n src={headerImage}\n style={{\n opacity: headerImageOpacity,\n }}\n alt=\"\"\n width=\"2347\"\n height=\"1244\"\n decoding=\"async\"\n loading=\"lazy\"\n className=\"absolute left-1/2 top-1/2 z-20 max-w-none -translate-x-1/2 -translate-y-1/2\"\n />\n <div\n className=\"absolute z-10 h-full w-full bg-[rgb(37,99,235)]\"\n style={{background: overlayBackground}}\n />\n <div className=\"relative z-30 flex h-full flex-col\">\n <Navbar\n color=\"transparent\"\n className=\"flex-shrink-0\"\n menuPosition=\"homepage-navbar\"\n primaryButtonColor=\"paper\"\n />\n <div className=\"mx-auto flex max-w-850 flex-auto flex-col items-center justify-center px-14 py-50 text-center text-white lg:py-90\">\n {headerTitle && (\n <h1\n className=\"text-3xl font-normal md:text-5xl\"\n data-testid=\"headerTitle\"\n >\n <Trans message={headerTitle} />\n </h1>\n )}\n {headerSubtitle && (\n <div\n className=\"max-auto mt-24 max-w-640 text-lg tracking-tight md:text-xl\"\n data-testid=\"headerSubtitle\"\n >\n <Trans message={headerSubtitle} />\n </div>\n )}\n {homepage_creation && hasPermission('links.create') && (\n <LandingPageNewLinkForm content={content} />\n )}\n <div className=\"flex min-h-50 gap-20 pb-30 pt-70 empty:min-h-0 md:pb-50 md:pt-90\">\n <CtaButton\n item={actions.cta1}\n variant=\"raised\"\n color=\"primary\"\n size=\"lg\"\n radius=\"rounded-full\"\n data-testid=\"cta1\"\n className=\"min-w-180\"\n />\n <CtaButton\n item={actions.cta2}\n variant=\"text\"\n color=\"paper\"\n size=\"lg\"\n radius=\"rounded-full\"\n data-testid=\"cta2\"\n />\n </div>\n </div>\n </div>\n <div className=\"absolute bottom-0 z-20 h-[6vw] w-full translate-y-1/2 -skew-y-3 transform bg\"></div>\n </header>\n );\n}\n\ninterface CtaButtonProps extends ButtonProps {\n item?: MenuItemConfig;\n}\nfunction CtaButton({item, ...buttonProps}: CtaButtonProps) {\n if (!item?.label || !item?.action) return null;\n const Icon = item.icon ? createSvgIconFromTree(item.icon) : undefined;\n return (\n <Button\n elementType={item.type === 'route' ? Link : 'a'}\n href={item.action}\n to={item.action}\n startIcon={Icon ? <Icon /> : undefined}\n {...buttonProps}\n >\n <Trans message={item.label} />\n </Button>\n );\n}\n\nfunction PrimaryFeatures({content}: ContentProps) {\n return (\n <div\n className=\"landing-container z-20 items-stretch gap-26 md:flex\"\n id=\"primary-features\"\n >\n {content.primaryFeatures.map((feature, index) => (\n <div\n key={index}\n className=\"mb-14 flex-1 rounded-2xl px-24 py-36 text-center shadow-[0_10px_30px_rgba(0,0,0,0.08)] dark:bg-alt md:mb-0\"\n data-testid={`primary-root-${index}`}\n >\n <MixedImage\n className=\"mx-auto mb-30 h-128\"\n data-testid={`primary-image-${index}`}\n src={feature.image}\n />\n <h2\n className=\"my-16 text-lg font-medium\"\n data-testid={`primary-title-${index}`}\n >\n <Trans message={feature.title} />\n </h2>\n <div\n className=\"text-md text-[0.938rem]\"\n data-testid={`primary-subtitle-${index}`}\n >\n <Trans message={feature.subtitle} />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction SecondaryFeatures({content}: ContentProps) {\n return (\n <div className=\"relative overflow-hidden pt-100\">\n <div className=\"landing-container relative\" id=\"features\">\n {content.secondaryFeatures.map((feature, index) => {\n const isEven = index % 2 === 0;\n return (\n <div\n key={index}\n data-testid={`secondary-root-${index}`}\n className={clsx(\n 'relative z-20 mb-14 py-16 md:mb-80 md:flex',\n isEven && 'flex-row-reverse'\n )}\n >\n <img\n src={feature.image}\n className=\"mr-auto w-580 max-w-full rounded-lg shadow-[0_10px_30px_rgba(0,0,0,0.08)]\"\n data-testid={`secondary-image-${index}`}\n alt=\"\"\n />\n <div className=\"ml-30 mr-auto max-w-350 pt-30\">\n <small\n className=\"mb-16 text-xs font-medium uppercase tracking-widest text-muted\"\n data-testid={`secondary-subtitle-${index}`}\n >\n <Trans message={feature.subtitle} />\n </small>\n <h3\n className=\"py-16 text-3xl\"\n data-testid={`secondary-title-${index}`}\n >\n <Trans message={feature.title} />\n </h3>\n <div className=\"h-2 w-50 bg-black/90 dark:bg-divider\" />\n <div\n className=\"my-20 text-[0.938rem]\"\n data-testid={`secondary-description-${index}`}\n >\n <Trans message={feature.description} />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface PricingSectionProps {\n content: LandingPageContent;\n}\nfunction PricingSection({content}: PricingSectionProps) {\n const query = useProducts('landingPage');\n const [selectedCycle, setSelectedCycle] =\n useState<UpsellBillingCycle>('yearly');\n return (\n <div className=\"py-80 sm:py-128\" id=\"pricing\">\n <div className=\"mx-auto max-w-1280 px-24 lg:px-32\">\n <div className=\"md:text-center\">\n <h2\n className=\"font-display text-3xl tracking-tight sm:text-4xl\"\n data-testid=\"pricingTitle\"\n >\n <Trans message={content.pricingTitle} />\n </h2>\n <p className=\"mt-16 text-lg text-muted\" data-testid=\"pricingSubtitle\">\n <Trans message={content.pricingSubtitle} />\n </p>\n </div>\n <BillingCycleRadio\n products={query.data?.products}\n selectedCycle={selectedCycle}\n onChange={setSelectedCycle}\n className=\"my-50 flex justify-center\"\n size=\"lg\"\n />\n <PricingTable\n selectedCycle={selectedCycle}\n productLoader=\"landingPage\"\n />\n </div>\n </div>\n );\n}\n\nfunction BottomCta({content}: ContentProps) {\n return (\n <div\n className=\"relative overflow-hidden bg-[rgb(37,99,235)] py-90 text-white md:py-128\"\n data-testid=\"footerImage\"\n >\n <img\n src={content.footerImage}\n alt=\"\"\n width=\"2347\"\n height=\"1244\"\n decoding=\"async\"\n loading=\"lazy\"\n className=\"absolute left-1/2 top-1/2 max-w-none -translate-x-1/2 -translate-y-1/2\"\n />\n <div className=\"relative mx-auto max-w-1280 px-24 text-center sm:px-16 lg:px-32\">\n <div className=\"mx-auto max-w-512 text-center\">\n <h2\n className=\" font-display text-3xl tracking-tight sm:text-4xl\"\n data-testid=\"footerTitle\"\n >\n <Trans message={content.footerTitle} />\n </h2>\n {content.footerSubtitle && (\n <p\n className=\"mt-16 text-lg tracking-tight\"\n data-testid=\"footerSubtitle\"\n >\n <Trans message={content.footerSubtitle} />\n </p>\n )}\n <CtaButton\n item={content.actions.cta3}\n size=\"lg\"\n radius=\"rounded-full\"\n variant=\"outline\"\n color=\"paper\"\n className=\"mt-40 block\"\n data-testid=\"cta3\"\n />\n </div>\n </div>\n </div>\n );\n}\n","import {ReactElement} from 'react';\nimport {Navigate, Outlet} from 'react-router-dom';\nimport {useAuth} from '../use-auth';\nimport {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\n\ninterface Props {\n children?: ReactElement;\n permission?: string;\n requireLogin?: boolean;\n}\nexport function AuthRoute({children, permission, requireLogin = true}: Props) {\n const {isLoggedIn, hasPermission} = useAuth();\n if (\n (requireLogin && !isLoggedIn) ||\n (permission && !hasPermission(permission))\n ) {\n if (isLoggedIn) {\n return <NotFoundPage />;\n }\n return <Navigate to=\"/login\" replace />;\n }\n return children || <Outlet />;\n}\n","import {ReactNode} from 'react';\n\ninterface Props {\n id: string;\n title: ReactNode;\n titleSuffix?: ReactNode;\n children: ReactNode;\n actions?: ReactNode;\n}\nexport function AccountSettingsPanel({\n id,\n title,\n titleSuffix,\n children,\n actions,\n}: Props) {\n return (\n <section\n id={id}\n className=\"rounded-panel mb-24 w-full border bg-paper px-24 py-20\"\n >\n <div className=\"flex items-center gap-14 border-b pb-10\">\n <div className=\"text-lg font-light\">{title}</div>\n {titleSuffix && <div className=\"ml-auto\">{titleSuffix}</div>}\n </div>\n <div className=\"pt-24\">{children}</div>\n {actions && (\n <div className=\"mt-36 flex justify-end border-t pt-10\">{actions}</div>\n )}\n </section>\n );\n}\n","import React, {forwardRef, ReactElement, ReactNode, useState} from 'react';\nimport {FocusScope, useFocusManager} from '@react-aria/focus';\nimport {ListItemBase, ListItemBaseProps} from './list-item-base';\nimport clsx from 'clsx';\n\ntype Child = ReactElement<ListItemProps> | ReactElement<ListItemProps>[];\n\ninterface Props {\n className?: string;\n padding?: string;\n children: ReactNode;\n dataTestId?: string;\n}\n\nexport function List({children, className, padding, dataTestId}: Props) {\n return (\n <FocusScope>\n <ul\n data-testid={dataTestId}\n className={clsx(\n 'text-base outline-none sm:text-sm',\n className,\n padding ?? 'py-4',\n )}\n >\n {children}\n </ul>\n </FocusScope>\n );\n}\n\ninterface ListItemProps extends ListItemBaseProps {\n children: ReactNode;\n onSelected?: () => void;\n borderRadius?: string;\n}\nexport const ListItem = forwardRef<HTMLDivElement, ListItemProps>(\n (\n {\n children,\n onSelected,\n borderRadius = 'rounded',\n className,\n ...listItemProps\n },\n ref,\n ) => {\n const focusManager = useFocusManager();\n const isSelectable = !!onSelected;\n const [isActive, setIsActive] = useState(false);\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusManager?.focusNext();\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusManager?.focusPrevious();\n break;\n case 'Home':\n e.preventDefault();\n focusManager?.focusFirst();\n break;\n case 'End':\n e.preventDefault();\n focusManager?.focusLast();\n break;\n case 'Enter':\n case 'Space':\n e.preventDefault();\n onSelected?.();\n break;\n }\n };\n\n return (\n <li>\n <ListItemBase\n className={clsx(className, borderRadius)}\n isActive={isActive}\n isDisabled={listItemProps.isDisabled}\n {...listItemProps}\n onFocus={e => {\n setIsActive((e.target as HTMLElement).matches(':focus-visible'));\n }}\n onBlur={() => {\n setIsActive(false);\n }}\n onClick={() => {\n onSelected?.();\n }}\n ref={ref}\n role={isSelectable ? 'button' : undefined}\n onKeyDown={isSelectable ? onKeyDown : undefined}\n tabIndex={isSelectable && !listItemProps.isDisabled ? 0 : undefined}\n >\n {children}\n </ListItemBase>\n </li>\n );\n },\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LoginIcon = createSvgIcon(\n <path d=\"M11 7 9.6 8.4l2.6 2.6H2v2h10.2l-2.6 2.6L11 17l5-5-5-5zm9 12h-8v2h8c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-8v2h8v14z\" />\n, 'LoginOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LockIcon = createSvgIcon(\n <path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\" />\n, 'LockOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PhonelinkLockIcon = createSvgIcon(\n <path d=\"M19 1H9c-1.1 0-2 .9-2 2v3h2V4h10v16H9v-2H7v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm-8.2 10V9.5C10.8 8.1 9.4 7 8 7S5.2 8.1 5.2 9.5V11c-.6 0-1.2.6-1.2 1.2v3.5c0 .7.6 1.3 1.2 1.3h5.5c.7 0 1.3-.6 1.3-1.2v-3.5c0-.7-.6-1.3-1.2-1.3zm-1.3 0h-3V9.5c0-.8.7-1.3 1.5-1.3s1.5.5 1.5 1.3V11z\" />\n, 'PhonelinkLockOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ApiIcon = createSvgIcon(\n <path d=\"m14 12-2 2-2-2 2-2 2 2zm-2-6 2.12 2.12 2.5-2.5L12 1 7.38 5.62l2.5 2.5L12 6zm-6 6 2.12-2.12-2.5-2.5L1 12l4.62 4.62 2.5-2.5L6 12zm12 0-2.12 2.12 2.5 2.5L23 12l-4.62-4.62-2.5 2.5L18 12zm-6 6-2.12-2.12-2.5 2.5L12 23l4.62-4.62-2.5-2.5L12 18z\" />\n, 'ApiOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DangerousIcon = createSvgIcon(\n <path d=\"M15.73 3H8.27L3 8.27v7.46L8.27 21h7.46L21 15.73V8.27L15.73 3zM19 14.9 14.9 19H9.1L5 14.9V9.1L9.1 5h5.8L19 9.1v5.8zm-4.17-7.14L12 10.59 9.17 7.76 7.76 9.17 10.59 12l-2.83 2.83 1.41 1.41L12 13.41l2.83 2.83 1.41-1.41L13.41 12l2.83-2.83-1.41-1.41z\" />\n, 'DangerousOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DevicesIcon = createSvgIcon(\n <path d=\"M4 6h18V4H4c-1.1 0-2 .9-2 2v11H0v3h14v-3H4V6zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z\" />\n, 'DevicesOutlined');\n","import {List, ListItem} from '@common/ui/list/list';\nimport {PersonIcon} from '@common/icons/material/Person';\nimport {Trans} from '@common/i18n/trans';\nimport {LoginIcon} from '@common/icons/material/Login';\nimport {LockIcon} from '@common/icons/material/Lock';\nimport {PhonelinkLockIcon} from '@common/icons/material/PhonelinkLock';\nimport {LanguageIcon} from '@common/icons/material/Language';\nimport {ApiIcon} from '@common/icons/material/Api';\nimport {DangerousIcon} from '@common/icons/material/Dangerous';\nimport {ReactNode, useContext} from 'react';\nimport {DevicesIcon} from '@common/icons/material/Devices';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\nexport enum AccountSettingsId {\n AccountDetails = 'account-details',\n SocialLogin = 'social-login',\n Password = 'password',\n TwoFactor = 'two-factor',\n LocationAndLanguage = 'location-and-language',\n Developers = 'developers',\n DeleteAccount = 'delete-account',\n Sessions = 'sessions',\n}\n\nexport function AccountSettingsSidenav() {\n const p = AccountSettingsId;\n\n const {hasPermission} = useAuth();\n const {api, social} = useSettings();\n const {auth} = useContext(SiteConfigContext);\n\n const socialEnabled =\n social?.envato || social?.google || social?.facebook || social?.twitter;\n\n return (\n <aside className=\"sticky top-10 hidden flex-shrink-0 lg:block\">\n <List padding=\"p-0\">\n {auth.accountSettingsPanels?.map(panel => (\n <Item\n key={panel.id}\n icon={<panel.icon viewBox=\"0 0 50 50\" />}\n panel={panel.id as AccountSettingsId}\n >\n <Trans {...panel.label} />\n </Item>\n ))}\n <Item icon={<PersonIcon />} panel={p.AccountDetails}>\n <Trans message=\"Account details\" />\n </Item>\n {socialEnabled && (\n <Item icon={<LoginIcon />} panel={p.SocialLogin}>\n <Trans message=\"Social login\" />\n </Item>\n )}\n <Item icon={<LockIcon />} panel={p.Password}>\n <Trans message=\"Password\" />\n </Item>\n <Item icon={<PhonelinkLockIcon />} panel={p.TwoFactor}>\n <Trans message=\"Two factor authentication\" />\n </Item>\n <Item icon={<DevicesIcon />} panel={p.Sessions}>\n <Trans message=\"Active sessions\" />\n </Item>\n <Item icon={<LanguageIcon />} panel={p.LocationAndLanguage}>\n <Trans message=\"Location and language\" />\n </Item>\n {api?.integrated && hasPermission('api.access') ? (\n <Item icon={<ApiIcon />} panel={p.Developers}>\n <Trans message=\"Developers\" />\n </Item>\n ) : null}\n <Item icon={<DangerousIcon />} panel={p.DeleteAccount}>\n <Trans message=\"Delete account\" />\n </Item>\n </List>\n </aside>\n );\n}\n\ninterface ItemProps {\n children: ReactNode;\n icon: ReactNode;\n isLast?: boolean;\n panel: AccountSettingsId;\n}\nfunction Item({children, icon, isLast, panel}: ItemProps) {\n return (\n <ListItem\n startIcon={icon}\n className={isLast ? undefined : 'mb-10'}\n onSelected={() => {\n const panelEl = document.querySelector(`#${panel}`);\n if (panelEl) {\n panelEl.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n }\n }}\n >\n {children}\n </ListItem>\n );\n}\n","import clsx from 'clsx';\nimport {cloneElement, ReactElement} from 'react';\nimport {SocialService, useSocialLogin} from '../../requests/use-social-login';\nimport {toast} from '@common/ui/toast/toast';\nimport {Button} from '@common/ui/buttons/button';\nimport {EnvatoIcon} from '@common/icons/social/envato';\nimport {GoogleIcon} from '@common/icons/social/google';\nimport {FacebookIcon} from '@common/icons/social/facebook';\nimport {TwitterIcon} from '@common/icons/social/twitter';\nimport {User} from '../../user';\nimport {AccountSettingsPanel} from './account-settings-panel';\nimport {Trans} from '@common/i18n/trans';\nimport {message} from '@common/i18n/message';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {queryClient} from '@common/http/query-client';\nimport {AccountSettingsId} from '@common/auth/ui/account-settings/account-settings-sidenav';\n\ninterface Props {\n user: User;\n}\nexport function SocialLoginPanel({user}: Props) {\n return (\n <AccountSettingsPanel\n id={AccountSettingsId.SocialLogin}\n title={<Trans message=\"Manage social login\" />}\n >\n <SocialLoginPanelRow\n icon={\n <EnvatoIcon\n viewBox=\"0 0 50 50\"\n className=\"border-envato bg-envato text-white\"\n />\n }\n service=\"envato\"\n user={user}\n />\n <SocialLoginPanelRow\n icon={<GoogleIcon viewBox=\"0 0 48 48\" />}\n service=\"google\"\n user={user}\n />\n <SocialLoginPanelRow\n icon={<FacebookIcon className=\"text-facebook\" />}\n service=\"facebook\"\n user={user}\n />\n <SocialLoginPanelRow\n icon={<TwitterIcon className=\"text-twitter\" />}\n service=\"twitter\"\n user={user}\n />\n <div className=\"pb-6 pt-16 text-sm text-muted\">\n <Trans message=\"If you disable social logins, you'll still be able to log in using your email and password.\" />\n </div>\n </AccountSettingsPanel>\n );\n}\n\ninterface SocialLoginPanelRowProps {\n service: SocialService;\n user: User;\n className?: string;\n icon: ReactElement;\n}\n\nfunction SocialLoginPanelRow({\n service,\n user,\n className,\n icon,\n}: SocialLoginPanelRowProps) {\n const {social} = useSettings();\n const {connectSocial, disconnectSocial} = useSocialLogin();\n const username = user?.social_profiles?.find(s => s.service_name === service)\n ?.username;\n\n if (!social?.[service]?.enable) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n 'flex items-center gap-14 border-b px-10 py-20',\n className,\n )}\n >\n {cloneElement(icon, {\n size: 'xl',\n className: clsx(icon.props.className, 'border p-8 rounded'),\n })}\n <div className=\"mr-auto overflow-hidden text-ellipsis whitespace-nowrap\">\n <div className=\"overflow-hidden text-ellipsis text-sm font-bold first-letter:capitalize\">\n <Trans message=\":service account\" values={{service}} />\n </div>\n <div className=\"mt-2 text-xs\">\n {username || <Trans message=\"Disabled\" />}\n </div>\n </div>\n <Button\n disabled={disconnectSocial.isPending}\n size=\"xs\"\n variant=\"outline\"\n color={username ? 'danger' : 'primary'}\n onClick={async () => {\n if (username) {\n disconnectSocial.mutate(\n {service},\n {\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: ['users']});\n toast(\n message('Disabled :service account', {values: {service}}),\n );\n },\n },\n );\n } else {\n const e = await connectSocial(service);\n if (e?.status === 'SUCCESS') {\n queryClient.invalidateQueries({queryKey: ['users']});\n toast(message('Enabled :service account', {values: {service}}));\n }\n }\n }}\n >\n {username ? <Trans message=\"Disable\" /> : <Trans message=\"Enable\" />}\n </Button>\n </div>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {toast} from '@common/ui/toast/toast';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {User} from '@common/auth/user';\nimport {message} from '@common/i18n/message';\nimport {apiClient} from '@common/http/query-client';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n first_name?: string;\n last_name?: string;\n}\n\nexport function useUpdateAccountDetails(form: UseFormReturn<Partial<User>>) {\n return useMutation({\n mutationFn: (props: Payload) => updateAccountDetails(props),\n onSuccess: () => {\n toast(message('Updated account details'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updateAccountDetails(payload: Payload): Promise<Response> {\n return apiClient.put('users/me', payload).then(r => r.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\nimport {User} from '@common/auth/user';\nimport {message} from '@common/i18n/message';\nimport {apiClient} from '@common/http/query-client';\nimport {getAxiosErrorMessage} from '@common/utils/http/get-axios-error-message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n user: User;\n}\n\ninterface Payload {\n file?: UploadedFile;\n url?: string;\n}\n\ninterface UserProps {\n user: User;\n}\n\nfunction UploadAvatar({file, url}: Payload, user: User): Promise<Response> {\n const payload = new FormData();\n if (file) {\n payload.set('file', file.native);\n } else {\n payload.set('url', url!);\n }\n return apiClient\n .post(`users/${user.id}/avatar`, payload, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n })\n .then(r => r.data);\n}\n\nexport function useUploadAvatar({user}: UserProps) {\n return useMutation({\n mutationFn: (payload: Payload) => UploadAvatar(payload, user),\n onSuccess: () => {\n toast(message('Uploaded avatar'));\n },\n onError: err => {\n const message = getAxiosErrorMessage(err, 'file');\n if (message) {\n toast.danger(message);\n } else {\n showHttpErrorToast(err);\n }\n },\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {toast} from '../../../../ui/toast/toast';\nimport {BackendResponse} from '../../../../http/backend-response/backend-response';\nimport {User} from '../../../user';\nimport {message} from '../../../../i18n/message';\nimport {apiClient} from '../../../../http/query-client';\nimport {showHttpErrorToast} from '../../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface UserProps {\n user: User;\n}\n\nfunction removeAvatar(user: User): Promise<Response> {\n return apiClient.delete(`users/${user.id}/avatar`).then(r => r.data);\n}\n\nexport function useRemoveAvatar({user}: UserProps) {\n return useMutation({\n mutationFn: () => removeAvatar(user),\n onSuccess: () => {\n toast(message('Removed avatar'));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {UploadStrategy, UploadStrategyConfig} from './upload-strategy';\nimport {UploadedFile} from '../../uploaded-file';\nimport axios, {AxiosInstance, AxiosProgressEvent} from 'axios';\nimport {FileEntry} from '../../file-entry';\nimport {\n getFromLocalStorage,\n removeFromLocalStorage,\n setInLocalStorage,\n} from '@common/utils/hooks/local-storage';\nimport {apiClient} from '@common/http/query-client';\nimport {getAxiosErrorMessage} from '@common/utils/http/get-axios-error-message';\nimport axiosRetry from 'axios-retry';\n\nconst oneMB = 1024 * 1024;\n// chunk size that will be uploaded to s3 per request\nconst desiredChunkSize = 20 * oneMB;\n// how many urls should be pre-signed per call to backend\nconst batchSize = 10;\n// number of concurrent requests to s3 api\nconst concurrency = 5;\n\ninterface ChunkState {\n blob: Blob | File;\n done: boolean;\n etag?: string;\n partNumber: number;\n bytesUploaded: number;\n}\n\ninterface SignedUrl {\n url: string;\n partNumber: number;\n}\n\ninterface StoredUrl {\n createdAt: string;\n uploadId: string;\n fileKey: string;\n}\n\ninterface UploadedPart {\n PartNumber: number;\n ETag: string;\n Size: string;\n LastModified: string;\n}\n\nexport class S3MultipartUpload implements UploadStrategy {\n private abortController: AbortController;\n private chunks: ChunkState[] = [];\n private uploadId?: string;\n private fileKey?: string;\n private readonly chunkAxios: AxiosInstance;\n private abortedByUser = false;\n private uploadedParts?: UploadedPart[];\n\n get storageKey(): string {\n return `s3-multipart::${this.file.fingerprint}`;\n }\n\n constructor(\n private file: UploadedFile,\n private config: UploadStrategyConfig\n ) {\n this.abortController = new AbortController();\n this.chunkAxios = axios.create();\n axiosRetry(this.chunkAxios, {retries: 3});\n }\n\n async start() {\n const storedUrl = getFromLocalStorage(this.storageKey);\n if (storedUrl) {\n await this.getUploadedParts(storedUrl);\n }\n\n if (!this.uploadedParts?.length) {\n await this.createMultipartUpload();\n if (!this.uploadId) return;\n }\n\n this.prepareChunks();\n\n const result = await this.uploadParts();\n if (result === 'done') {\n const isCompleted = await this.completeMultipartUpload();\n if (!isCompleted) return;\n\n // catch any errors so below \"onError\" handler gets executed\n try {\n const response = await this.createFileEntry();\n if (response?.fileEntry) {\n this.config.onSuccess?.(response?.fileEntry, this.file);\n removeFromLocalStorage(this.storageKey);\n return;\n }\n } catch {}\n }\n\n // upload failed\n if (!this.abortController.signal.aborted) {\n this.abortController.abort();\n }\n if (!this.abortedByUser) {\n this.config.onError?.(null, this.file);\n }\n }\n\n async abort() {\n this.abortedByUser = true;\n this.abortController.abort();\n await this.abortUploadOnS3();\n }\n\n private async uploadParts(): Promise<any> {\n const pendingChunks = this.chunks.filter(c => !c.done);\n if (!pendingChunks.length) {\n return Promise.resolve('done');\n }\n\n const signedUrls = await this.batchSignUrls(\n pendingChunks.slice(0, batchSize)\n );\n if (!signedUrls) return;\n\n while (signedUrls.length) {\n const batch = signedUrls.splice(0, concurrency);\n const pendingUploads = batch.map(item => {\n return this.uploadPartToS3(item);\n });\n const result = await Promise.all(pendingUploads);\n // if not all uploads in batch completed, bail\n if (!result.every(r => r)) return;\n }\n\n return await this.uploadParts();\n }\n\n private async batchSignUrls(\n batch: ChunkState[]\n ): Promise<SignedUrl[] | undefined> {\n const response = await this.chunkAxios\n .post(\n 'api/v1/s3/multipart/batch-sign-part-urls',\n {\n partNumbers: batch.map(i => i.partNumber),\n uploadId: this.uploadId,\n key: this.fileKey,\n },\n {signal: this.abortController.signal}\n )\n .then(r => r.data as {urls: SignedUrl[]})\n .catch(err => {\n if (!this.abortController.signal.aborted) {\n this.abortController.abort();\n }\n });\n\n return response?.urls;\n }\n\n private async uploadPartToS3({\n url,\n partNumber,\n }: SignedUrl): Promise<boolean | void> {\n const chunk = this.chunks.find(c => c.partNumber === partNumber);\n if (!chunk) return;\n return this.chunkAxios\n .put(url, chunk.blob, {\n withCredentials: false,\n signal: this.abortController.signal,\n onUploadProgress: (e: AxiosProgressEvent) => {\n if (!e.event.lengthComputable) return;\n\n chunk.bytesUploaded = e.loaded;\n const totalUploaded = this.chunks.reduce(\n (n, c) => n + c.bytesUploaded,\n 0\n );\n\n this.config.onProgress?.({\n bytesUploaded: totalUploaded,\n bytesTotal: this.file.size,\n });\n },\n })\n .then(r => {\n const etag = r.headers.etag;\n if (etag) {\n chunk.done = true;\n chunk.etag = etag;\n return true;\n }\n })\n .catch(err => {\n if (!this.abortController.signal.aborted && err !== undefined) {\n this.abortController.abort();\n }\n });\n }\n\n private async createMultipartUpload(): Promise<void> {\n const response = await apiClient\n .post('s3/multipart/create', {\n filename: this.file.name,\n mime: this.file.mime,\n size: this.file.size,\n extension: this.file.extension,\n ...this.config.metadata,\n })\n .then(r => r.data as {uploadId: string; key: string})\n .catch(err => {\n if (err.code !== 'ERR_CANCELED') {\n this.config.onError?.(getAxiosErrorMessage(err), this.file);\n }\n });\n\n if (response) {\n this.uploadId = response.uploadId;\n this.fileKey = response.key;\n setInLocalStorage(this.storageKey, {\n createdAt: new Date().toISOString(),\n fileKey: this.fileKey,\n uploadId: this.uploadId,\n } as StoredUrl);\n }\n }\n\n private async getUploadedParts({fileKey, uploadId}: StoredUrl) {\n const response = await apiClient\n .post('s3/multipart/get-uploaded-parts', {\n key: fileKey,\n uploadId,\n })\n .then(r => r.data as {parts: UploadedPart[]})\n .catch(() => {\n removeFromLocalStorage(this.storageKey);\n return null;\n });\n if (response?.parts?.length) {\n this.uploadedParts = response.parts;\n this.uploadId = uploadId;\n this.fileKey = fileKey;\n }\n }\n\n private async completeMultipartUpload(): Promise<{location: string} | null> {\n return apiClient\n .post('s3/multipart/complete', {\n key: this.fileKey,\n uploadId: this.uploadId,\n parts: this.chunks.map(c => {\n return {\n ETag: c.etag,\n PartNumber: c.partNumber,\n };\n }),\n })\n .then(r => r.data)\n .catch(() => {\n this.config.onError?.(null, this.file);\n this.abortUploadOnS3();\n })\n .finally(() => {\n removeFromLocalStorage(this.storageKey);\n });\n }\n\n private async createFileEntry(): Promise<{fileEntry: FileEntry}> {\n return await apiClient\n .post('s3/entries', {\n ...this.config.metadata,\n clientMime: this.file.mime,\n clientName: this.file.name,\n filename: this.fileKey!.split('/').pop(),\n size: this.file.size,\n clientExtension: this.file.extension,\n })\n .then(r => r.data)\n .catch();\n }\n\n private prepareChunks() {\n this.chunks = [];\n // at least 5MB per request, at most 10k requests\n const minChunkSize = Math.max(5 * oneMB, Math.ceil(this.file.size / 10000));\n const chunkSize = Math.max(desiredChunkSize, minChunkSize);\n\n // Upload zero-sized files in one zero-sized chunk\n if (this.file.size === 0) {\n this.chunks.push({\n blob: this.file.native,\n done: false,\n partNumber: 1,\n bytesUploaded: 0,\n });\n } else {\n let partNumber = 1;\n for (let i = 0; i < this.file.size; i += chunkSize) {\n const end = Math.min(this.file.size, i + chunkSize);\n // check if this part was already uploaded previously\n const previouslyUploaded = this.uploadedParts?.find(\n p => p.PartNumber === partNumber\n );\n this.chunks.push({\n blob: this.file.native.slice(i, end),\n done: !!previouslyUploaded,\n partNumber,\n etag: previouslyUploaded ? previouslyUploaded.ETag : undefined,\n bytesUploaded: previouslyUploaded?.Size\n ? parseInt(previouslyUploaded?.Size)\n : 0,\n });\n partNumber++;\n }\n }\n }\n\n private abortUploadOnS3() {\n return apiClient.post('s3/multipart/abort', {\n key: this.fileKey,\n uploadId: this.uploadId,\n });\n }\n\n static async create(\n file: UploadedFile,\n config: UploadStrategyConfig\n ): Promise<S3MultipartUpload> {\n return new S3MultipartUpload(file, config);\n }\n}\n","import {Upload} from 'tus-js-client';\nimport {UploadedFile} from '../../uploaded-file';\nimport {UploadStrategy, UploadStrategyConfig} from './upload-strategy';\nimport {FileEntry} from '../../file-entry';\nimport {getAxiosErrorMessage} from '@common/utils/http/get-axios-error-message';\nimport {apiClient} from '@common/http/query-client';\nimport {getCookie} from 'react-use-cookie';\n\nexport class TusUpload implements UploadStrategy {\n constructor(private upload: Upload) {}\n\n start() {\n this.upload.start();\n }\n\n abort() {\n return this.upload.abort(true);\n }\n\n static async create(\n file: UploadedFile,\n {\n onProgress,\n onSuccess,\n onError,\n metadata,\n chunkSize,\n baseUrl,\n }: UploadStrategyConfig\n ): Promise<TusUpload> {\n const tusFingerprint = ['tus', file.fingerprint, 'drive'].join('-');\n const upload = new Upload(file.native, {\n fingerprint: () => Promise.resolve(tusFingerprint),\n removeFingerprintOnSuccess: true,\n endpoint: `${baseUrl}/api/v1/tus/upload`,\n chunkSize,\n retryDelays: [0, 3000, 5000, 10000, 20000],\n overridePatchMethod: true,\n metadata: {\n name: window.btoa(file.id),\n clientName: file.name,\n clientExtension: file.extension,\n clientMime: file.mime || '',\n clientSize: `${file.size}`,\n ...(metadata as Record<string, string>),\n },\n headers: {\n 'X-XSRF-TOKEN': getCookie('XSRF-TOKEN'),\n },\n onError: err => {\n if ('originalResponse' in err && err.originalResponse) {\n try {\n const message = JSON.parse(err.originalResponse.getBody())?.message;\n onError?.(message, file);\n } catch (e) {\n onError?.(null, file);\n }\n } else {\n onError?.(null, file);\n }\n },\n onProgress(bytesUploaded, bytesTotal) {\n onProgress?.({bytesUploaded, bytesTotal});\n },\n onSuccess: async () => {\n const uploadKey = upload.url?.split('/').pop();\n try {\n if (uploadKey) {\n const response = await createFileEntry(uploadKey);\n onSuccess?.(response.fileEntry, file);\n }\n } catch (err) {\n localStorage.removeItem(tusFingerprint);\n onError?.(getAxiosErrorMessage(err), file);\n }\n },\n });\n\n const previousUploads = await upload.findPreviousUploads();\n if (previousUploads.length) {\n upload.resumeFromPreviousUpload(previousUploads[0]);\n }\n\n return new TusUpload(upload);\n }\n}\n\nfunction createFileEntry(uploadKey: string): Promise<{fileEntry: FileEntry}> {\n return apiClient.post('tus/entries', {uploadKey}).then(r => r.data);\n}\n","export interface BackendMetadata {\n disk?: Disk;\n diskPrefix?: string;\n relativePath?: string | null;\n [key: string]: number | string | null | undefined;\n}\n\nexport enum Disk {\n public = 'public',\n uploads = 'uploads',\n}\n","import {UploadStrategy, UploadStrategyConfig} from './upload-strategy';\nimport {UploadedFile} from '../../uploaded-file';\nimport axios, {AxiosProgressEvent} from 'axios';\nimport {FileEntry} from '../../file-entry';\nimport {getAxiosErrorMessage} from '@common/utils/http/get-axios-error-message';\nimport {apiClient} from '@common/http/query-client';\n\ninterface PresignedRequest {\n url: string;\n key: string;\n acl: string;\n}\n\nexport class S3Upload implements UploadStrategy {\n private abortController: AbortController;\n private presignedRequest?: PresignedRequest;\n\n constructor(\n private file: UploadedFile,\n private config: UploadStrategyConfig\n ) {\n this.abortController = new AbortController();\n }\n\n async start() {\n this.presignedRequest = await this.presignPostUrl();\n if (!this.presignedRequest) return;\n\n const result = await this.uploadFileToS3();\n if (result !== 'uploaded') return;\n\n const response = await this.createFileEntry();\n if (response?.fileEntry) {\n this.config.onSuccess?.(response.fileEntry, this.file);\n } else if (!this.abortController.signal) {\n this.config.onError?.(null, this.file);\n }\n }\n\n abort() {\n this.abortController.abort();\n return Promise.resolve();\n }\n\n private presignPostUrl(): Promise<PresignedRequest> {\n return apiClient\n .post(\n 's3/simple/presign',\n {\n filename: this.file.name,\n mime: this.file.mime,\n disk: this.config.metadata?.disk,\n size: this.file.size,\n extension: this.file.extension,\n ...this.config.metadata,\n },\n {signal: this.abortController.signal}\n )\n .then(r => r.data)\n .catch(err => {\n if (err.code !== 'ERR_CANCELED') {\n this.config.onError?.(getAxiosErrorMessage(err), this.file);\n }\n });\n }\n\n private uploadFileToS3() {\n const {url, acl} = this.presignedRequest!;\n return axios\n .put(url, this.file.native, {\n signal: this.abortController.signal,\n withCredentials: false,\n headers: {\n 'Content-Type': this.file.mime,\n 'x-amz-acl': acl,\n },\n onUploadProgress: (e: AxiosProgressEvent) => {\n if (e.event.lengthComputable) {\n this.config.onProgress?.({\n bytesUploaded: e.loaded,\n bytesTotal: e.total || 0,\n });\n }\n },\n })\n .then(() => 'uploaded')\n .catch(err => {\n if (err.code !== 'ERR_CANCELED') {\n this.config.onError?.(getAxiosErrorMessage(err), this.file);\n }\n });\n }\n\n private async createFileEntry() {\n return await apiClient\n .post('s3/entries', {\n ...this.config.metadata,\n clientMime: this.file.mime,\n clientName: this.file.name,\n filename: this.presignedRequest!.key.split('/').pop(),\n size: this.file.size,\n clientExtension: this.file.extension,\n })\n .then(r => {\n return r.data as {fileEntry: FileEntry};\n })\n .catch(err => {\n if (err.code !== 'ERR_CANCELED') {\n this.config.onError?.(getAxiosErrorMessage(err), this.file);\n }\n });\n }\n\n static async create(\n file: UploadedFile,\n config: UploadStrategyConfig\n ): Promise<S3Upload> {\n return new S3Upload(file, config);\n }\n}\n","import {UploadedFile} from '../../uploaded-file';\nimport {UploadStrategy, UploadStrategyConfig} from './upload-strategy';\nimport {apiClient} from '@common/http/query-client';\nimport {getAxiosErrorMessage} from '@common/utils/http/get-axios-error-message';\nimport {AxiosProgressEvent} from 'axios';\n\nexport class AxiosUpload implements UploadStrategy {\n private abortController: AbortController;\n constructor(\n private file: UploadedFile,\n private config: UploadStrategyConfig,\n ) {\n this.abortController = new AbortController();\n }\n\n async start() {\n const formData = new FormData();\n const {onSuccess, onError, onProgress, metadata} = this.config;\n\n formData.set('file', this.file.native);\n formData.set('workspaceId', `12`);\n if (metadata) {\n Object.entries(metadata).forEach(([key, value]) => {\n formData.set(key, `${value}`);\n });\n }\n\n const response = await apiClient\n .post('file-entries', formData, {\n onUploadProgress: (e: AxiosProgressEvent) => {\n if (e.event.lengthComputable) {\n onProgress?.({\n bytesUploaded: e.loaded,\n bytesTotal: e.total || 0,\n });\n }\n },\n signal: this.abortController.signal,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n })\n .catch(err => {\n if (err.code !== 'ERR_CANCELED') {\n onError?.(getAxiosErrorMessage(err), this.file);\n }\n });\n\n // if upload was aborted, it will be handled and set\n // as \"aborted\" already, no need to set it as \"failed\"\n if (this.abortController.signal.aborted) {\n return;\n }\n\n if (response && response.data.fileEntry) {\n onSuccess?.(response.data.fileEntry, this.file);\n }\n }\n\n abort() {\n this.abortController.abort();\n return Promise.resolve();\n }\n\n static async create(\n file: UploadedFile,\n config: UploadStrategyConfig,\n ): Promise<AxiosUpload> {\n return new AxiosUpload(file, config);\n }\n}\n","// Adapted from https://github.com/Flet/prettier-bytes/\n// Changing 1000 bytes to 1024, so we can keep uppercase KB vs kB\n// ISC License (c) Dan Flettre https://github.com/Flet/prettier-bytes/blob/master/LICENSE\nexport function prettyBytes(num?: number, fractionDigits = 1): string {\n if (num == null || Number.isNaN(num)) return '';\n const neg = num < 0;\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n if (neg) {\n num = -num;\n }\n\n if (num < 1) {\n return `${(neg ? '-' : '') + num} B`;\n }\n\n const exponent = Math.min(\n Math.floor(Math.log(num) / Math.log(1024)),\n units.length - 1\n );\n num = Number(num / Math.pow(1024, exponent));\n const unit = units[exponent];\n\n if (num >= 10 || num % 1 === 0) {\n // Do not show decimals when the number is two-digit, or if the number has no\n // decimal component.\n return `${(neg ? '-' : '') + num.toFixed(0)} ${unit}`;\n }\n return `${(neg ? '-' : '') + num.toFixed(fractionDigits)} ${unit}`;\n}\n","import {UploadedFile} from '../uploaded-file';\nimport {message} from '../../i18n/message';\nimport {prettyBytes} from '../utils/pretty-bytes';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport match from 'mime-match';\n\nexport interface Restrictions {\n maxFileSize?: number;\n allowedFileTypes?: string[];\n blockedFileTypes?: string[];\n}\n\nexport function validateUpload(\n file: UploadedFile,\n restrictions?: Restrictions\n): MessageDescriptor | void {\n if (!restrictions) return;\n\n const {maxFileSize, allowedFileTypes, blockedFileTypes} = restrictions;\n\n if (maxFileSize && file.size != null && file.size > maxFileSize) {\n return message('`:file` exceeds maximum allowed size of :size', {\n values: {file: file.name, size: prettyBytes(maxFileSize)},\n });\n }\n\n if (allowedFileTypes?.length) {\n if (!fileMatchesTypes(file, allowedFileTypes)) {\n return message('This file type is not allowed');\n }\n }\n\n if (blockedFileTypes?.length) {\n if (fileMatchesTypes(file, blockedFileTypes)) {\n return message('This file type is not allowed');\n }\n }\n}\n\nfunction fileMatchesTypes(file: UploadedFile, types: string[]): boolean {\n return (\n types\n // support multiple file types in a string (video/mp4,audio/mp3,image/png)\n .map(type => type.split(','))\n .flat()\n .some(type => {\n // check if this is a mime-type\n if (type.includes('/')) {\n if (!file.mime) return false;\n return match(file.mime.replace(/;.*?$/, ''), type);\n }\n\n // otherwise this is likely an extension\n const extension = type.replace('.', '').toLowerCase();\n if (extension && file.extension) {\n return file.extension.toLowerCase() === extension;\n }\n return false;\n })\n );\n}\n","export class ProgressTimeout {\n public aliveTimer: any;\n public isDone = false;\n public timeout = 30000;\n public timeoutHandler: (() => void) | null = null;\n\n progress() {\n // Some browsers fire another progress event when the upload is\n // cancelled, so we have to ignore progress after the timer was\n // told to stop.\n if (this.isDone || !this.timeoutHandler) return;\n\n if (this.timeout > 0) {\n clearTimeout(this.aliveTimer);\n this.aliveTimer = setTimeout(this.timeoutHandler, this.timeout);\n }\n }\n\n done() {\n if (!this.isDone) {\n clearTimeout(this.aliveTimer);\n this.aliveTimer = null;\n this.isDone = true;\n }\n }\n}\n","import {UploadStrategy, UploadStrategyConfig} from './strategy/upload-strategy';\nimport {UploadedFile} from '../uploaded-file';\nimport {Disk} from '../types/backend-metadata';\nimport {S3MultipartUpload} from './strategy/s3-multipart-upload';\nimport {S3Upload} from './strategy/s3-upload';\nimport {TusUpload} from './strategy/tus-upload';\nimport {AxiosUpload} from './strategy/axios-upload';\nimport {FileUpload, FileUploadState} from './file-upload-store';\nimport {validateUpload} from './validate-upload';\nimport {getBootstrapData} from '../../core/bootstrap-data/use-backend-bootstrap-data';\nimport {toast} from '../../ui/toast/toast';\nimport {ProgressTimeout} from './progress-timeout';\nimport {message} from '../../i18n/message';\n\nexport async function startUploading(\n upload: FileUpload,\n state: FileUploadState\n): Promise<UploadStrategy | null> {\n const settings = getBootstrapData().settings;\n const options = upload.options;\n const file = upload.file;\n\n // validate file, if validation fails, error the upload and bail\n if (options?.restrictions) {\n const errorMessage = validateUpload(file, options.restrictions);\n if (errorMessage) {\n state.updateFileUpload(file.id, {\n errorMessage,\n status: 'failed',\n request: undefined,\n timer: undefined,\n });\n\n if (options.showToastOnRestrictionFail) {\n toast.danger(errorMessage);\n }\n\n state.runQueue();\n return null;\n }\n }\n\n // prepare config for file upload strategy\n const timer = new ProgressTimeout();\n const config: UploadStrategyConfig = {\n metadata: {\n ...options?.metadata,\n relativePath: file.relativePath,\n disk: options?.metadata?.disk || Disk.uploads,\n parentId: options?.metadata?.parentId || '',\n },\n chunkSize: settings.uploads.chunk_size,\n baseUrl: settings.base_url,\n onError: errorMessage => {\n state.updateFileUpload(file.id, {\n errorMessage,\n status: 'failed',\n });\n state.runQueue();\n timer.done();\n options?.onError?.(errorMessage, file);\n },\n onSuccess: entry => {\n state.updateFileUpload(file.id, {\n status: 'completed',\n entry,\n });\n state.runQueue();\n timer.done();\n options?.onSuccess?.(entry, file);\n },\n onProgress: ({bytesUploaded, bytesTotal}) => {\n const percentage = (bytesUploaded / bytesTotal) * 100;\n state.updateFileUpload(file.id, {\n percentage,\n bytesUploaded,\n });\n timer.progress();\n options?.onProgress?.({bytesUploaded, bytesTotal});\n },\n };\n\n // choose and create upload strategy, based on file size and settings\n const strategy = chooseUploadStrategy(file, config);\n const request = await strategy.create(file, config);\n\n // add handler for when upload times out (no progress for 30+ seconds)\n timer.timeoutHandler = () => {\n request.abort();\n state.updateFileUpload(file.id, {\n status: 'failed',\n errorMessage: message('Upload timed out'),\n });\n state.runQueue();\n };\n\n state.updateFileUpload(file.id, {\n status: 'inProgress',\n request,\n });\n request.start();\n\n return request;\n}\n\nconst OneMB = 1024 * 1024;\nconst FourMB = 4 * OneMB;\nconst HundredMB = 100 * OneMB;\n\nconst chooseUploadStrategy = (\n file: UploadedFile,\n config: UploadStrategyConfig\n) => {\n const settings = getBootstrapData().settings;\n const disk = config.metadata?.disk || Disk.uploads;\n const driver =\n disk === Disk.uploads\n ? settings.uploads.uploads_driver\n : settings.uploads.public_driver;\n\n if (driver?.endsWith('s3') && settings.uploads.s3_direct_upload) {\n return file.size >= HundredMB ? S3MultipartUpload : S3Upload;\n } else {\n // 4MB = Axios, otherwise Tus\n return file.size >= FourMB && !settings.uploads.disable_tus\n ? TusUpload\n : AxiosUpload;\n }\n};\n","export function extensionFromFilename(fullFileName: string): string {\n const re = /(?:\\.([^.]+))?$/;\n return re.exec(fullFileName)?.[1] || '';\n}\n","import {extensionFromFilename} from './extension-from-filename';\n\nexport function getFileMime(file: File): string {\n const extensionsToMime: Record<string, string> = {\n md: 'text/markdown',\n markdown: 'text/markdown',\n mp4: 'video/mp4',\n mp3: 'audio/mp3',\n svg: 'image/svg+xml',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n yaml: 'text/yaml',\n yml: 'text/yaml',\n };\n\n const fileExtension = file.name ? extensionFromFilename(file.name) : null;\n\n // check if mime type is set in the file object\n if (file.type) {\n return file.type;\n }\n\n // see if we can map extension to a mime type\n if (fileExtension && fileExtension in extensionsToMime) {\n return extensionsToMime[fileExtension];\n }\n\n return 'application/octet-stream';\n}\n","import {getFileMime} from './utils/get-file-mime';\nimport {extensionFromFilename} from './utils/extension-from-filename';\nimport {nanoid} from 'nanoid';\nimport {getActiveWorkspaceId} from '../workspace/active-workspace-id';\n\nexport class UploadedFile {\n id: string;\n fingerprint: string;\n name: string;\n relativePath = '';\n size: number;\n mime = '';\n extension = '';\n native: File;\n lastModified: number;\n\n private cachedData?: string;\n get data(): Promise<string> {\n return new Promise(resolve => {\n if (this.cachedData) {\n resolve(this.cachedData);\n }\n const reader = new FileReader();\n\n reader.addEventListener('load', () => {\n this.cachedData = reader.result as string;\n resolve(this.cachedData);\n });\n\n if (this.extension === 'json') {\n reader.readAsText(this.native);\n } else {\n reader.readAsDataURL(this.native);\n }\n });\n }\n\n constructor(file: File, relativePath?: string | null) {\n this.id = nanoid();\n this.name = file.name;\n this.size = file.size;\n this.mime = getFileMime(file);\n this.lastModified = file.lastModified;\n this.extension = extensionFromFilename(file.name) || 'bin';\n this.native = file;\n relativePath = relativePath || file.webkitRelativePath || '';\n\n // remove leading slashes\n relativePath = relativePath.replace(/^\\/+/g, '');\n\n // only include relative path if file is actually in a folder and not just /file.txt\n if (relativePath && relativePath.split('/').length > 1) {\n this.relativePath = relativePath;\n }\n\n this.fingerprint = generateId({\n name: this.name,\n size: this.size,\n mime: this.mime,\n lastModified: this.lastModified,\n });\n }\n}\n\ninterface FileMeta {\n name?: string;\n mime?: string | null;\n size?: number | string;\n lastModified?: number;\n relativePath?: string;\n}\nfunction generateId({name, mime, size, relativePath, lastModified}: FileMeta) {\n let id = 'be';\n if (typeof name === 'string') {\n id += `-${encodeFilename(name.toLowerCase())}`;\n }\n\n if (mime) {\n id += `-${mime}`;\n }\n\n if (typeof relativePath === 'string') {\n id += `-${encodeFilename(relativePath.toLowerCase())}`;\n }\n\n if (size !== undefined) {\n id += `-${size}`;\n }\n if (lastModified !== undefined) {\n id += `-${lastModified}`;\n }\n\n id += `${getActiveWorkspaceId()}`;\n\n // add version number, so it can be incremented easily to allow uploading same file multiple times\n return `${id}-v1`;\n}\n\nfunction encodeCharacter(character: string) {\n return character.charCodeAt(0).toString(32);\n}\n\nfunction encodeFilename(name: string) {\n let suffix = '';\n return (\n name.replace(/[^A-Z0-9]/gi, character => {\n suffix += `-${encodeCharacter(character)}`;\n return '/';\n }) + suffix\n );\n}\n","import {UploadedFile} from '../uploaded-file';\nimport {UploadStrategyConfig} from './strategy/upload-strategy';\nimport {FileUpload} from './file-upload-store';\n\nexport function createUpload(\n file: UploadedFile | File,\n options?: UploadStrategyConfig\n): FileUpload {\n const uploadedFile =\n file instanceof UploadedFile ? file : new UploadedFile(file);\n return {\n file: uploadedFile,\n percentage: 0,\n bytesUploaded: 0,\n status: 'pending',\n options: options || {},\n };\n}\n","import {create} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport {Draft, enableMapSet} from 'immer';\nimport {UploadedFile} from '../uploaded-file';\nimport {UploadStrategy, UploadStrategyConfig} from './strategy/upload-strategy';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {FileEntry} from '../file-entry';\nimport {S3MultipartUpload} from './strategy/s3-multipart-upload';\nimport {Settings} from '../../core/settings/settings';\nimport {TusUpload} from './strategy/tus-upload';\nimport {ProgressTimeout} from './progress-timeout';\nimport {startUploading} from './start-uploading';\nimport {createUpload} from './create-file-upload';\n\nenableMapSet();\n\nexport interface FileUpload {\n file: UploadedFile;\n percentage: number;\n bytesUploaded: number;\n status: 'pending' | 'inProgress' | 'aborted' | 'failed' | 'completed';\n errorMessage?: string | MessageDescriptor | null;\n entry?: FileEntry;\n request?: UploadStrategy;\n timer?: ProgressTimeout;\n options: UploadStrategyConfig;\n meta?: unknown;\n}\n\nexport interface FileUploadState {\n concurrency: number;\n fileUploads: Map<string, FileUpload>;\n // uploads with pending and inProgress status\n activeUploadsCount: number;\n completedUploadsCount: number;\n uploadMultiple: (\n files: (File | UploadedFile)[] | FileList,\n options?: Omit<\n UploadStrategyConfig,\n // progress would be called for each upload simultaneously\n 'onProgress' | 'showToastOnRestrictionFail'\n >\n ) => string[];\n uploadSingle: (\n file: File | UploadedFile,\n options?: UploadStrategyConfig\n ) => string;\n clearInactive: () => void;\n abortUpload: (id: string) => void;\n updateFileUpload: (id: string, state: Partial<FileUpload>) => void;\n getUpload: (id: string) => FileUpload | undefined;\n runQueue: () => void;\n}\n\ninterface StoreProps {\n settings: Settings;\n}\nexport const createFileUploadStore = ({settings}: StoreProps) =>\n create<FileUploadState>()(\n immer((set, get) => {\n return {\n concurrency: 3,\n fileUploads: new Map<string, FileUpload>(),\n activeUploadsCount: 0,\n completedUploadsCount: 0,\n\n getUpload: uploadId => {\n return get().fileUploads.get(uploadId);\n },\n\n clearInactive: () => {\n set(state => {\n state.fileUploads.forEach((upload, key) => {\n if (upload.status !== 'inProgress') {\n state.fileUploads.delete(key);\n }\n });\n });\n get().runQueue();\n },\n\n abortUpload: id => {\n const upload = get().fileUploads.get(id);\n if (upload) {\n upload.request?.abort();\n get().updateFileUpload(id, {status: 'aborted', percentage: 0});\n get().runQueue();\n }\n },\n\n updateFileUpload: (id, newUploadState) => {\n set(state => {\n const fileUpload = state.fileUploads.get(id);\n if (fileUpload) {\n state.fileUploads.set(id, {\n ...fileUpload,\n ...newUploadState,\n });\n\n // only need to update inProgress count if status of the uploads in queue change\n if ('status' in newUploadState) {\n updateTotals(state);\n }\n }\n });\n },\n\n uploadSingle: (file, userOptions) => {\n const upload = createUpload(file, userOptions);\n const fileUploads = new Map(get().fileUploads);\n fileUploads.set(upload.file.id, upload);\n\n set(state => {\n updateTotals(state);\n state.fileUploads = fileUploads;\n });\n\n get().runQueue();\n\n return upload.file.id;\n },\n\n uploadMultiple: (files, options) => {\n // create file upload items from specified files\n const uploads = new Map<string, FileUpload>(get().fileUploads);\n [...files].forEach(file => {\n const upload = createUpload(file, options);\n uploads.set(upload.file.id, upload);\n });\n\n // set state only once, there might be thousands of files, don't want to trigger a rerender for each one\n set(state => {\n updateTotals(state);\n state.fileUploads = uploads;\n });\n\n get().runQueue();\n return [...uploads.keys()];\n },\n\n runQueue: async () => {\n const uploads = [...get().fileUploads.values()];\n const activeUploads = uploads.filter(u => u.status === 'inProgress');\n\n let concurrency = get().concurrency;\n if (\n activeUploads.filter(\n activeUpload =>\n // only upload one file from folder at a time to avoid creating duplicate folders\n activeUpload.file.relativePath ||\n // only allow one s3 multipart upload at a time, it will already upload multiple parts in parallel\n activeUpload.request instanceof S3MultipartUpload ||\n // only allow one tus upload if file is larger than chunk size, tus will have parallel uploads already in that case\n (activeUpload.request instanceof TusUpload &&\n settings.uploads.chunk_size &&\n activeUpload.file.size > settings.uploads.chunk_size)\n ).length\n ) {\n concurrency = 1;\n }\n\n if (activeUploads.length < concurrency) {\n //const pendingUploads = uploads.filter(u => u.status === 'pending');\n //const next = pendingUploads.find(a => !!a.request);\n const next = uploads.find(u => u.status === 'pending');\n if (next) {\n await startUploading(next, get());\n }\n }\n },\n };\n })\n );\n\nconst updateTotals = (state: Draft<FileUploadState>) => {\n state.completedUploadsCount = [...state.fileUploads.values()].filter(\n u => u.status === 'completed'\n ).length;\n state.activeUploadsCount = [...state.fileUploads.values()].filter(\n u => u.status === 'inProgress' || u.status === 'pending'\n ).length;\n};\n","import {StoreApi, useStore} from 'zustand';\nimport {createContext, ReactNode, useContext, useState} from 'react';\nimport {createFileUploadStore, FileUploadState} from './file-upload-store';\nimport {useSettings} from '../../core/settings/use-settings';\n\nconst FileUploadContext = createContext<StoreApi<FileUploadState>>(null!);\n\ntype ExtractState<S> = S extends {\n getState: () => infer T;\n}\n ? T\n : never;\n\ntype UseFileUploadStore = {\n (): ExtractState<StoreApi<FileUploadState>>;\n <U>(\n selector: (state: ExtractState<StoreApi<FileUploadState>>) => U,\n equalityFn?: (a: U, b: U) => boolean\n ): U;\n};\n\n// @ts-ignore\nexport const useFileUploadStore: UseFileUploadStore = (\n selector,\n equalityFn\n) => {\n const store = useContext(FileUploadContext);\n return useStore(store, selector, equalityFn);\n};\n\ninterface FileUploadProviderProps {\n children: ReactNode;\n}\nexport function FileUploadProvider({children}: FileUploadProviderProps) {\n const settings = useSettings();\n\n //lazily create store object only once\n const [store] = useState(() => {\n return createFileUploadStore({settings});\n });\n\n return (\n <FileUploadContext.Provider value={store as StoreApi<FileUploadState>}>\n {children}\n </FileUploadContext.Provider>\n );\n}\n","import {UploadInputConfig} from '../types/upload-input-config';\n\nexport function createUploadInput(\n config: UploadInputConfig = {}\n): HTMLInputElement {\n const old = document.querySelector('#hidden-file-upload-input');\n if (old) old.remove();\n\n const input = document.createElement('input');\n input.type = 'file';\n input.multiple = config.multiple ?? false;\n input.classList.add('hidden');\n input.style.display = 'none';\n input.style.visibility = 'hidden';\n input.id = 'hidden-file-upload-input';\n\n input.accept = buildUploadInputAccept(config);\n\n if (config.directory) {\n input.webkitdirectory = true;\n }\n\n document.body.appendChild(input);\n\n return input;\n}\n\nexport interface UploadAccentProps {\n extensions?: string[];\n types?: string[];\n}\nexport function buildUploadInputAccept({\n extensions = [],\n types = [],\n}: UploadAccentProps): string {\n const accept = [];\n if (extensions?.length) {\n extensions = extensions.map(e => {\n return e.startsWith('.') ? e : `.${e}`;\n });\n accept.push(extensions.join(','));\n }\n\n if (types?.length) {\n accept.push(types.join(','));\n }\n\n return accept.join(',');\n}\n","import {UploadInputConfig} from '../types/upload-input-config';\nimport {UploadedFile} from '../uploaded-file';\nimport {createUploadInput} from './create-upload-input';\n\n/**\n * Open browser dialog for uploading files and\n * resolve promise with uploaded files.\n */\nexport function openUploadWindow(\n config: UploadInputConfig = {}\n): Promise<UploadedFile[]> {\n return new Promise(resolve => {\n const input = createUploadInput(config);\n\n input.onchange = e => {\n const fileList = (e.target as HTMLInputElement).files;\n if (!fileList) {\n return resolve([]);\n }\n\n const uploads = Array.from(fileList)\n .filter(f => f.name !== '.DS_Store')\n .map(file => new UploadedFile(file));\n resolve(uploads);\n input.remove();\n };\n\n document.body.appendChild(input);\n input.click();\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient} from '../../http/query-client';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n entryIds?: number[];\n deleteForever?: boolean;\n paths?: string[];\n}\n\nfunction deleteFileEntries(payload: Payload): Promise<Response> {\n return apiClient.post('file-entries/delete', payload).then(r => r.data);\n}\n\nexport function useDeleteFileEntries() {\n return useMutation({\n mutationFn: (props: Payload) => deleteFileEntries(props),\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useCallback, useRef} from 'react';\nimport {useFileUploadStore} from './file-upload-provider';\nimport {UploadedFile} from '../uploaded-file';\nimport {UploadStrategyConfig} from './strategy/upload-strategy';\nimport {openUploadWindow} from '../utils/open-upload-window';\nimport {useDeleteFileEntries} from '@common/uploads/requests/delete-file-entries';\n\ninterface DeleteEntryProps {\n onSuccess: () => void;\n entryPath?: string;\n}\n\nexport function useActiveUpload() {\n const deleteFileEntries = useDeleteFileEntries();\n\n // use ref for setting ID to avoid extra renders, zustand selector\n // will pick up changed selector on first progress event\n const uploadIdRef = useRef<string>();\n\n const uploadSingle = useFileUploadStore(s => s.uploadSingle);\n const _abortUpload = useFileUploadStore(s => s.abortUpload);\n const updateFileUpload = useFileUploadStore(s => s.updateFileUpload);\n const activeUpload = useFileUploadStore(s =>\n uploadIdRef.current ? s.fileUploads.get(uploadIdRef.current) : null,\n );\n\n const uploadFile = useCallback(\n (file: File | UploadedFile, config?: UploadStrategyConfig) => {\n uploadIdRef.current = uploadSingle(file, config);\n },\n [uploadSingle],\n );\n\n const selectAndUploadFile = useCallback(\n async (config?: UploadStrategyConfig) => {\n const files = await openUploadWindow({\n types: config?.restrictions?.allowedFileTypes,\n });\n uploadFile(files[0], config);\n return files[0];\n },\n [uploadFile],\n );\n\n const deleteEntry = useCallback(\n ({onSuccess, entryPath}: DeleteEntryProps) => {\n const handleSuccess = () => {\n if (activeUpload) {\n updateFileUpload(activeUpload.file.id, {\n ...activeUpload,\n entry: undefined,\n });\n }\n onSuccess();\n };\n\n if (!entryPath && !activeUpload?.entry?.id) {\n handleSuccess();\n return;\n }\n\n deleteFileEntries.mutate(\n {\n paths: entryPath ? [entryPath] : undefined,\n entryIds: activeUpload?.entry?.id\n ? [activeUpload?.entry?.id]\n : undefined,\n deleteForever: true,\n },\n {onSuccess: handleSuccess},\n );\n },\n [deleteFileEntries, activeUpload, updateFileUpload],\n );\n\n const abortUpload = useCallback(() => {\n if (activeUpload) {\n _abortUpload(activeUpload.file.id);\n }\n }, [activeUpload, _abortUpload]);\n\n return {\n uploadFile,\n selectAndUploadFile,\n percentage: activeUpload?.percentage || 0,\n uploadStatus: activeUpload?.status,\n entry: activeUpload?.entry,\n deleteEntry,\n isDeletingEntry: deleteFileEntries.isPending,\n activeUpload,\n abortUpload,\n };\n}\n","export interface UploadInputConfig {\n types?: (UploadInputType | string)[];\n extensions?: string[];\n multiple?: boolean;\n directory?: boolean;\n}\n\nexport enum UploadInputType {\n image = 'image/*',\n audio = 'audio/*',\n text = 'text/*',\n json = 'application/json',\n video = 'video/mp4,video/mpeg,video/x-m4v,video/*',\n}\n","import React, {CSSProperties, ReactNode, useId} from 'react';\nimport clsx from 'clsx';\nimport {InputSize} from '../forms/input-field/input-size';\nimport {getInputFieldClassNames} from '../forms/input-field/get-input-field-class-names';\nimport {useNumberFormatter} from '../../i18n/use-number-formatter';\nimport {clamp} from '../../utils/number/clamp';\n\nexport interface ProgressBarBaseProps {\n value?: number;\n minValue?: number;\n maxValue?: number;\n className?: string;\n showValueLabel?: boolean;\n size?: 'xs' | 'sm' | 'md';\n labelPosition?: 'top' | 'bottom';\n isIndeterminate?: boolean;\n label?: ReactNode;\n formatOptions?: Intl.NumberFormatOptions;\n role?: string;\n radius?: string;\n trackColor?: string;\n trackHeight?: string;\n progressColor?: string;\n}\n\nexport function ProgressBarBase(props: ProgressBarBaseProps) {\n let {\n value = 0,\n minValue = 0,\n maxValue = 100,\n size = 'md',\n label,\n showValueLabel = !!label,\n isIndeterminate = false,\n labelPosition = 'top',\n className,\n role,\n formatOptions = {\n style: 'percent',\n },\n radius = 'rounded',\n trackColor = 'bg-primary-light',\n progressColor = 'bg-primary',\n trackHeight = getSize(size),\n } = props;\n\n const id = useId();\n\n value = clamp(value, minValue, maxValue);\n\n const percentage = (value - minValue) / (maxValue - minValue);\n const formatter = useNumberFormatter(formatOptions);\n\n let valueLabel = '';\n if (!isIndeterminate && showValueLabel) {\n const valueToFormat =\n formatOptions.style === 'percent' ? percentage : value;\n valueLabel = formatter.format(valueToFormat);\n }\n\n const barStyle: CSSProperties = {};\n if (!isIndeterminate) {\n barStyle.width = `${Math.round(percentage * 100)}%`;\n }\n\n const style = getInputFieldClassNames({size});\n\n const labelEl = (label || valueLabel) && (\n <div className={clsx('flex gap-10 justify-between my-4', style.label)}>\n {label && <span id={id}>{label}</span>}\n {valueLabel && <div>{valueLabel}</div>}\n </div>\n );\n\n return (\n <div\n aria-valuenow={isIndeterminate ? undefined : value}\n aria-valuemin={minValue}\n aria-valuemax={maxValue}\n aria-valuetext={isIndeterminate ? undefined : (valueLabel as string)}\n aria-labelledby={label ? id : undefined}\n role={role || 'progressbar'}\n className={clsx(className, 'min-w-42')}\n >\n {labelPosition === 'top' && labelEl}\n <div className={`${trackHeight} ${radius} ${trackColor} overflow-hidden`}>\n <div\n className={clsx(\n progressColor,\n 'fill h-full transition-width duration-200 rounded-l',\n isIndeterminate && 'progress-bar-indeterminate-animate'\n )}\n style={barStyle}\n />\n </div>\n {labelPosition === 'bottom' && labelEl}\n </div>\n );\n}\n\nfunction getSize(size: InputSize) {\n switch (size) {\n case 'sm':\n return 'h-6';\n case 'xs':\n return 'h-4';\n default:\n return 'h-8';\n }\n}\n","import React from 'react';\nimport {ProgressBarBase, ProgressBarBaseProps} from './progress-bar-base';\n\ninterface Props extends ProgressBarBaseProps {\n isIndeterminate?: boolean;\n}\n\nexport function ProgressBar(props: Props) {\n return <ProgressBarBase {...props} />;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddAPhotoIcon = createSvgIcon(\n <path d=\"M21 6h-3.17L16 4h-6v2h5.12l1.83 2H21v12H5v-9H3v9c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zM8 14c0 2.76 2.24 5 5 5s5-2.24 5-5-2.24-5-5-5-5 2.24-5 5zm5-3c1.65 0 3 1.35 3 3s-1.35 3-3 3-3-1.35-3-3 1.35-3 3-3zM5 6h3V4H5V1H3v3H0v2h3v3h2z\" />\n, 'AddAPhotoOutlined');\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const AvatarPlaceholderIcon = createSvgIcon(\n <path d=\"M24,12 C28.418278,12 32,15.581722 32,20 L32,22 C32,26.418278 28.418278,30 24,30 C19.581722,30 16,26.418278 16,22 L16,20 C16,15.581722 19.581722,12 24,12 Z M24,32 C33.8734019,32 42.1092023,38.8710577 44,48 L4,48 C5.89079771,38.8710577 14.1265981,32 24,32 Z\"></path>\n);\n","import React, {\n cloneElement,\n ComponentPropsWithRef,\n Fragment,\n JSXElementConstructor,\n ReactElement,\n ReactNode,\n useCallback,\n useId,\n useRef,\n} from 'react';\nimport clsx from 'clsx';\nimport {Button} from '../buttons/button';\nimport {Trans} from '../../i18n/trans';\nimport {useActiveUpload} from '../../uploads/uploader/use-active-upload';\nimport {UploadInputType} from '../../uploads/types/upload-input-config';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport {ProgressBar} from '../progress/progress-bar';\nimport {Disk} from '../../uploads/types/backend-metadata';\nimport {toast} from '@common/ui/toast/toast';\nimport {Field} from '@common/ui/forms/input-field/field';\nimport {\n getInputFieldClassNames,\n InputFieldStyle,\n} from '@common/ui/forms/input-field/get-input-field-class-names';\nimport {FileEntry} from '@common/uploads/file-entry';\nimport {useAutoFocus} from '@common/ui/focus/use-auto-focus';\nimport {UploadStrategyConfig} from '@common/uploads/uploader/strategy/upload-strategy';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {AddAPhotoIcon} from '@common/icons/material/AddAPhoto';\nimport {AvatarPlaceholderIcon} from '@common/auth/ui/account-settings/avatar/avatar-placeholder-icon';\nimport {ButtonBaseProps} from '@common/ui/buttons/button-base';\n\nconst TwoMB = 2 * 1024 * 1024;\n\ninterface ImageSelectorProps {\n className?: string;\n label?: ReactNode;\n description?: ReactNode;\n invalid?: boolean;\n errorMessage?: ReactNode;\n required?: boolean;\n disabled?: boolean;\n value?: string;\n onChange?: (newValue: string) => void;\n defaultValue?: string;\n diskPrefix: string;\n showRemoveButton?: boolean;\n showEditButtonOnHover?: boolean;\n autoFocus?: boolean;\n variant?: 'input' | 'square' | 'avatar';\n placeholderIcon?: ReactElement<SvgIconProps>;\n previewSize?: string;\n previewRadius?: string;\n stretchPreview?: boolean;\n}\nexport function ImageSelector({\n className,\n label,\n description,\n value,\n onChange,\n defaultValue,\n diskPrefix,\n showRemoveButton,\n showEditButtonOnHover = false,\n invalid,\n errorMessage,\n required,\n autoFocus,\n variant = 'input',\n previewSize = 'h-80',\n placeholderIcon,\n stretchPreview = false,\n previewRadius,\n disabled,\n}: ImageSelectorProps) {\n const {\n uploadFile,\n entry,\n uploadStatus,\n deleteEntry,\n isDeletingEntry,\n percentage,\n } = useActiveUpload();\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n useAutoFocus({autoFocus}, inputRef);\n\n const fieldId = useId();\n const labelId = label ? `${fieldId}-label` : undefined;\n const descriptionId = description ? `${fieldId}-description` : undefined;\n\n const imageUrl = value || entry?.url;\n\n const uploadOptions: UploadStrategyConfig = {\n showToastOnRestrictionFail: true,\n restrictions: {\n allowedFileTypes: [UploadInputType.image],\n maxFileSize: TwoMB,\n },\n metadata: {\n diskPrefix,\n disk: Disk.public,\n },\n onSuccess: (entry: FileEntry) => {\n onChange?.(entry.url);\n },\n onError: message => {\n if (message) {\n toast.danger(message);\n }\n },\n };\n\n const inputFieldClassNames = getInputFieldClassNames({\n description,\n descriptionPosition: 'top',\n invalid,\n });\n\n let VariantElement: JSXElementConstructor<VariantProps>;\n if (variant === 'avatar') {\n VariantElement = AvatarVariant;\n } else if (variant === 'square') {\n VariantElement = SquareVariant;\n } else {\n VariantElement = InputVariant;\n }\n\n const removeButton = showRemoveButton ? (\n <Button\n variant=\"link\"\n color=\"danger\"\n size=\"xs\"\n disabled={isDeletingEntry || !imageUrl || disabled}\n onClick={() => {\n deleteEntry({\n onSuccess: () => onChange?.(''),\n });\n }}\n >\n <Trans message=\"Remove image\" />\n </Button>\n ) : null;\n\n const useDefaultButton =\n defaultValue != null && value !== defaultValue ? (\n <Button\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n disabled={disabled}\n onClick={() => {\n onChange?.(defaultValue);\n }}\n >\n <Trans message=\"Use default\" />\n </Button>\n ) : null;\n\n const handleUpload = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n return (\n <div className={clsx('text-sm', className)}>\n {label && (\n <div id={labelId} className={inputFieldClassNames.label}>\n {label}\n </div>\n )}\n {description && (\n <div className={inputFieldClassNames.description}>{description}</div>\n )}\n <div aria-labelledby={labelId} aria-describedby={descriptionId}>\n <Field\n fieldClassNames={inputFieldClassNames}\n errorMessage={errorMessage}\n invalid={invalid}\n >\n <VariantElement\n inputFieldClassNames={inputFieldClassNames}\n placeholderIcon={placeholderIcon}\n previewSize={previewSize}\n isLoading={uploadStatus === 'inProgress'}\n imageUrl={imageUrl}\n removeButton={removeButton}\n useDefaultButton={useDefaultButton}\n showEditButtonOnHover={showEditButtonOnHover}\n stretchPreview={stretchPreview}\n previewRadius={previewRadius}\n handleUpload={handleUpload}\n disabled={disabled}\n >\n <input\n ref={inputRef}\n aria-labelledby={labelId}\n aria-describedby={descriptionId}\n // if file is already uploaded (from form or via props) set\n // required to false, otherwise farm validation will always fail\n required={imageUrl ? false : required}\n accept={UploadInputType.image}\n type=\"file\"\n disabled={uploadStatus === 'inProgress'}\n className=\"sr-only\"\n onChange={e => {\n if (e.target.files?.length) {\n uploadFile(e.target.files[0], uploadOptions);\n }\n }}\n />\n </VariantElement>\n {uploadStatus === 'inProgress' && (\n <ProgressBar\n className=\"absolute left-0 right-0 top-0\"\n size=\"xs\"\n value={percentage}\n />\n )}\n </Field>\n </div>\n </div>\n );\n}\n\ninterface VariantProps {\n children: ReactElement<ComponentPropsWithRef<'input'>>;\n inputFieldClassNames: InputFieldStyle;\n previewSize?: ImageSelectorProps['previewSize'];\n placeholderIcon?: ImageSelectorProps['placeholderIcon'];\n isLoading?: boolean;\n imageUrl?: string;\n removeButton?: ReactElement<ButtonBaseProps> | null;\n useDefaultButton?: ReactElement<ButtonBaseProps> | null;\n showEditButtonOnHover?: boolean;\n stretchPreview?: boolean;\n previewRadius?: string;\n handleUpload: () => void;\n disabled?: boolean;\n}\nfunction InputVariant({\n children,\n inputFieldClassNames,\n imageUrl,\n previewSize,\n stretchPreview,\n isLoading,\n handleUpload,\n removeButton,\n useDefaultButton,\n disabled,\n}: VariantProps) {\n if (imageUrl) {\n return (\n <Fragment>\n <div\n className={`${previewSize} relative mb-10 overflow-hidden rounded border bg-fg-base/8 p-6`}\n >\n <img\n className={clsx(\n 'mx-auto h-full rounded',\n stretchPreview ? 'object-cover' : 'object-contain',\n )}\n onClick={() => handleUpload()}\n src={imageUrl}\n alt=\"\"\n />\n {children}\n </div>\n <Button\n onClick={() => handleUpload()}\n disabled={isLoading || disabled}\n className=\"mr-10\"\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n >\n <Trans message=\"Replace\" />\n </Button>\n {removeButton && cloneElement(removeButton, {variant: 'outline'})}\n {useDefaultButton &&\n cloneElement(useDefaultButton, {variant: 'outline'})}\n </Fragment>\n );\n }\n return cloneElement(children, {\n className: clsx(\n inputFieldClassNames.input,\n 'py-8',\n 'file:bg-primary file:text-on-primary file:border-none file:rounded file:text-sm file:font-semibold file:px-10 file:h-24 file:mr-10',\n ),\n });\n}\n\nfunction SquareVariant({\n children,\n placeholderIcon,\n previewSize,\n imageUrl,\n stretchPreview,\n handleUpload,\n removeButton,\n useDefaultButton,\n previewRadius = 'rounded',\n showEditButtonOnHover = false,\n disabled,\n}: VariantProps) {\n return (\n <div>\n <div\n className={clsx(\n previewSize,\n previewRadius,\n !imageUrl && 'border',\n 'group z-20 flex flex-col items-center justify-center gap-14 bg-fg-base/8 bg-center bg-no-repeat',\n stretchPreview ? 'bg-cover' : 'bg-contain p-6',\n )}\n style={imageUrl ? {backgroundImage: `url(${imageUrl})`} : undefined}\n onClick={() => handleUpload()}\n >\n {placeholderIcon &&\n !imageUrl &&\n cloneElement(placeholderIcon, {size: 'lg'})}\n <Button\n variant=\"raised\"\n color=\"white\"\n size=\"xs\"\n className={clsx(\n showEditButtonOnHover && 'invisible group-hover:visible',\n )}\n disabled={disabled}\n >\n {imageUrl ? (\n <Trans message=\"Replace image\" />\n ) : (\n <Trans message=\"Upload image\" />\n )}\n </Button>\n </div>\n {children}\n {(removeButton || useDefaultButton) && (\n <div className=\"mt-8\">\n {removeButton && cloneElement(removeButton, {variant: 'link'})}\n {useDefaultButton &&\n cloneElement(useDefaultButton, {variant: 'link'})}\n </div>\n )}\n </div>\n );\n}\n\nfunction AvatarVariant({\n children,\n placeholderIcon,\n previewSize,\n isLoading,\n imageUrl,\n removeButton,\n useDefaultButton,\n handleUpload,\n previewRadius = 'rounded-full',\n disabled,\n}: VariantProps) {\n if (!placeholderIcon) {\n placeholderIcon = (\n <AvatarPlaceholderIcon\n viewBox=\"0 0 48 48\"\n className={clsx(\n 'h-full w-full bg-primary-light/40 text-primary/40',\n previewRadius,\n )}\n />\n );\n }\n return (\n <div>\n <div\n className={clsx('relative', previewSize)}\n onClick={() => handleUpload()}\n >\n {imageUrl ? (\n <img\n src={imageUrl}\n className={clsx('h-full w-full object-cover', previewRadius)}\n alt=\"\"\n />\n ) : (\n placeholderIcon\n )}\n <div className=\"absolute -bottom-6 -right-6 rounded-full bg-paper shadow-xl\">\n <IconButton\n disabled={isLoading || disabled}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n color=\"primary\"\n radius=\"rounded-full\"\n >\n <AddAPhotoIcon />\n </IconButton>\n </div>\n </div>\n {children}\n {(removeButton || useDefaultButton) && (\n <div className=\"mt-14\">\n {removeButton && cloneElement(removeButton, {variant: 'link'})}\n {useDefaultButton &&\n cloneElement(useDefaultButton, {variant: 'link'})}\n </div>\n )}\n </div>\n );\n}\n\ninterface FormImageSelectorProps extends ImageSelectorProps {\n name: string;\n}\nexport function FormImageSelector(props: FormImageSelectorProps) {\n const {\n field: {onChange, value = null},\n fieldState: {error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<ImageSelectorProps> = {\n onChange,\n value,\n invalid: error != null,\n errorMessage: error ? <Trans message=\"Please select an image.\" /> : null,\n };\n\n return <ImageSelector {...mergeProps(formProps, props)} />;\n}\n","import {useForm} from 'react-hook-form';\nimport {useId} from 'react';\nimport {User} from '../../../user';\nimport {AccountSettingsPanel} from '../account-settings-panel';\nimport {Button} from '@common/ui/buttons/button';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {useUpdateAccountDetails} from './update-account-details';\nimport {Trans} from '@common/i18n/trans';\nimport {useUploadAvatar} from '../avatar/upload-avatar';\nimport {useRemoveAvatar} from '../avatar/remove-avatar';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {AccountSettingsId} from '@common/auth/ui/account-settings/account-settings-sidenav';\n\ninterface Props {\n user: User;\n}\nexport function BasicInfoPanel({user}: Props) {\n const uploadAvatar = useUploadAvatar({user});\n const removeAvatar = useRemoveAvatar({user});\n const formId = useId();\n const form = useForm<Partial<Omit<User, 'subscriptions'>>>({\n defaultValues: {\n first_name: user.first_name || '',\n last_name: user.last_name || '',\n avatar: user.avatar,\n },\n });\n const updateDetails = useUpdateAccountDetails(form);\n\n return (\n <AccountSettingsPanel\n id={AccountSettingsId.AccountDetails}\n title={<Trans message=\"Update name and profile image\" />}\n actions={\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n form={formId}\n disabled={updateDetails.isPending || !form.formState.isValid}\n >\n <Trans message=\"Save\" />\n </Button>\n }\n >\n <Form\n form={form}\n className=\"flex flex-col flex-col-reverse md:flex-row items-center gap-40 md:gap-80\"\n onSubmit={newDetails => {\n updateDetails.mutate(newDetails);\n }}\n id={formId}\n >\n <div className=\"flex-auto w-full\">\n <FormTextField\n className=\"mb-24\"\n name=\"first_name\"\n label={<Trans message=\"First name\" />}\n />\n <FormTextField\n name=\"last_name\"\n label={<Trans message=\"Last name\" />}\n />\n </div>\n <FileUploadProvider>\n <FormImageSelector\n className=\"md:mr-80\"\n variant=\"avatar\"\n previewSize=\"w-90 h-90\"\n showRemoveButton\n name=\"avatar\"\n diskPrefix=\"avatars\"\n label={<Trans message=\"Profile image\" />}\n onChange={url => {\n if (url) {\n uploadAvatar.mutate({url});\n } else {\n removeAvatar.mutate();\n }\n }}\n />\n </FileUploadProvider>\n </Form>\n </AccountSettingsPanel>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {message} from '@common/i18n/message';\nimport {apiClient} from '@common/http/query-client';\n\ninterface Response extends BackendResponse {}\n\nexport interface UpdatePasswordPayload {\n current_password: string;\n password: string;\n password_confirmation: string;\n}\n\nexport function useUpdatePassword(form: UseFormReturn<UpdatePasswordPayload>) {\n return useMutation({\n mutationFn: (props: UpdatePasswordPayload) => updatePassword(props),\n onSuccess: () => {\n toast(message('Password changed'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction updatePassword(payload: UpdatePasswordPayload): Promise<Response> {\n return apiClient.put('auth/user/password', payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {useId} from 'react';\nimport {Form} from '@common/ui/forms/form';\nimport {AccountSettingsPanel} from '@common/auth/ui/account-settings/account-settings-panel';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {UpdatePasswordPayload, useUpdatePassword} from './use-update-password';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {AccountSettingsId} from '@common/auth/ui/account-settings/account-settings-sidenav';\n\nexport function ChangePasswordPanel() {\n const form = useForm<UpdatePasswordPayload>();\n const formId = useId();\n const updatePassword = useUpdatePassword(form);\n return (\n <AccountSettingsPanel\n id={AccountSettingsId.Password}\n title={<Trans message=\"Update password\" />}\n actions={\n <Button\n type=\"submit\"\n form={formId}\n variant=\"flat\"\n color=\"primary\"\n disabled={!form.formState.isValid || updatePassword.isPending}\n >\n <Trans message=\"Update password\" />\n </Button>\n }\n >\n <Form\n form={form}\n id={formId}\n onSubmit={newValues => {\n updatePassword.mutate(newValues, {\n onSuccess: () => {\n form.reset();\n },\n });\n }}\n >\n <FormTextField\n className=\"mb-24\"\n name=\"current_password\"\n label={<Trans message=\"Current password\" />}\n type=\"password\"\n autoComplete=\"current-password\"\n required\n />\n <FormTextField\n className=\"mb-24\"\n name=\"password\"\n label={<Trans message=\"New password\" />}\n type=\"password\"\n autoComplete=\"new-password\"\n required\n />\n <FormTextField\n name=\"password_confirmation\"\n label={<Trans message=\"Confirm password\" />}\n type=\"password\"\n autoComplete=\"new-password\"\n required\n />\n </Form>\n </AccountSettingsPanel>\n );\n}\n","import React, {ReactElement, useEffect, useRef, useState} from 'react';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useListboxContext} from '@common/ui/forms/listbox/listbox-context';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\n\ninterface Props {\n isLoading?: boolean;\n icon?: ReactElement<SvgIconProps>;\n}\nexport function ComboboxEndAdornment({isLoading, icon}: Props) {\n const timeout = useRef<any>(null);\n const {trans} = useTrans();\n const [showLoading, setShowLoading] = useState(false);\n\n const {\n state: {isOpen, inputValue},\n } = useListboxContext();\n\n const lastInputValue = useRef(inputValue);\n useEffect(() => {\n if (isLoading && !showLoading) {\n if (timeout.current === null) {\n timeout.current = setTimeout(() => {\n setShowLoading(true);\n }, 500);\n }\n\n // If user is typing, clear the timer and restart since it is a new request\n if (inputValue !== lastInputValue.current) {\n clearTimeout(timeout.current);\n timeout.current = setTimeout(() => {\n setShowLoading(true);\n }, 500);\n }\n } else if (!isLoading) {\n // If loading is no longer happening, clear any timers and hide the loading circle\n setShowLoading(false);\n clearTimeout(timeout.current);\n timeout.current = null;\n }\n\n lastInputValue.current = inputValue;\n }, [isLoading, showLoading, inputValue]);\n\n // loading circle should only be displayed if menu is open, if menuTrigger is \"manual\", or first time load (to stop circle from showing up when user selects an option)\n const showLoadingIndicator = showLoading && (isOpen || isLoading);\n\n if (showLoadingIndicator) {\n return (\n <ProgressCircle\n aria-label={trans({message: 'Loading'})}\n size=\"sm\"\n isIndeterminate\n />\n );\n }\n\n return icon || <KeyboardArrowDownIcon />;\n}\n","import React, {ReactElement, Ref} from 'react';\nimport {BaseFieldPropsWithDom} from '../input-field/base-field-props';\nimport {Item} from '../listbox/item';\nimport {useListbox} from '../listbox/use-listbox';\nimport {IconButton} from '../../buttons/icon-button';\nimport {TextField} from '../input-field/text-field/text-field';\nimport {Listbox} from '../listbox/listbox';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {useListboxKeyboardNavigation} from '@common/ui/forms/listbox/use-listbox-keyboard-navigation';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {ListBoxChildren, ListboxProps} from '../listbox/types';\nimport {Popover} from '../../overlays/popover';\nimport {ComboboxEndAdornment} from '@common/ui/forms/combobox/combobox-end-adornment';\n\nexport {Item as Option};\n\nexport type ComboboxProps<T extends object> = Omit<\n BaseFieldPropsWithDom<HTMLInputElement>,\n 'endAdornment'\n> &\n ListBoxChildren<T> &\n ListboxProps & {\n selectionMode?: 'single' | 'none';\n isAsync?: boolean;\n isLoading?: boolean;\n openMenuOnFocus?: boolean;\n endAdornmentIcon?: ReactElement<SvgIconProps>;\n useOptionLabelAsInputValue?: boolean;\n hideEndAdornment?: boolean;\n onEndAdornmentClick?: () => void;\n prependListbox?: boolean;\n listboxClassName?: string;\n };\n\nfunction ComboBox<T extends object>(\n props: ComboboxProps<T> & {selectionMode: 'single'},\n ref: Ref<HTMLInputElement>,\n) {\n const {\n children,\n items,\n isAsync,\n isLoading,\n openMenuOnFocus = true,\n endAdornmentIcon,\n onItemSelected,\n maxItems,\n clearInputOnItemSelection,\n inputValue: userInputValue,\n selectedValue,\n onSelectionChange,\n allowCustomValue = false,\n onInputValueChange,\n defaultInputValue,\n selectionMode = 'single',\n useOptionLabelAsInputValue,\n showEmptyMessage,\n floatingMaxHeight,\n hideEndAdornment = false,\n blurReferenceOnItemSelection,\n isOpen: propsIsOpen,\n onOpenChange: propsOnOpenChange,\n prependListbox,\n listboxClassName,\n onEndAdornmentClick,\n autoFocusFirstItem = true,\n ...textFieldProps\n } = props;\n\n const listbox = useListbox(\n {\n ...props,\n floatingMaxHeight,\n blurReferenceOnItemSelection,\n selectionMode,\n role: 'listbox',\n virtualFocus: true,\n clearSelectionOnInputClear: true,\n },\n ref,\n );\n\n const {\n reference,\n listboxId,\n onInputChange,\n state: {\n isOpen,\n setIsOpen,\n inputValue,\n setInputValue,\n selectValues,\n selectedValues,\n setActiveCollection,\n },\n collection,\n } = listbox;\n\n const textLabel = selectedValues[0]\n ? collection.get(selectedValues[0])?.textLabel\n : undefined;\n\n const {handleListboxSearchFieldKeydown} =\n useListboxKeyboardNavigation(listbox);\n\n const handleFocusAndClick = createEventHandler(\n (e: React.FocusEvent<HTMLInputElement>) => {\n if (openMenuOnFocus && !isOpen) {\n setIsOpen(true);\n }\n e.target.select();\n },\n );\n\n return (\n <Listbox\n prepend={prependListbox}\n className={listboxClassName}\n listbox={listbox}\n mobileOverlay={Popover}\n isLoading={isLoading}\n onPointerDown={e => {\n // prevent focus from leaving input when scrolling listbox via mouse\n e.preventDefault();\n }}\n >\n <TextField\n inputRef={reference}\n {...textFieldProps}\n endAdornment={\n !hideEndAdornment ? (\n <IconButton\n size=\"md\"\n tabIndex={-1}\n disabled={textFieldProps.disabled}\n className=\"pointer-events-auto\"\n onPointerDown={e => {\n e.preventDefault();\n e.stopPropagation();\n if (onEndAdornmentClick) {\n onEndAdornmentClick();\n } else {\n setActiveCollection('all');\n setIsOpen(!isOpen);\n }\n }}\n >\n <ComboboxEndAdornment\n isLoading={isLoading}\n icon={endAdornmentIcon}\n />\n </IconButton>\n ) : null\n }\n aria-expanded={isOpen ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n aria-controls={isOpen ? listboxId : undefined}\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n onChange={onInputChange}\n value={useOptionLabelAsInputValue && textLabel ? textLabel : inputValue}\n onBlur={e => {\n if (allowCustomValue) {\n selectValues(e.target.value);\n } else if (!clearInputOnItemSelection) {\n const val = selectedValues[0];\n setInputValue(selectValues.length && val != null ? `${val}` : '');\n }\n }}\n onFocus={handleFocusAndClick}\n onClick={handleFocusAndClick}\n onKeyDown={e => handleListboxSearchFieldKeydown(e)}\n />\n </Listbox>\n );\n}\n\nconst ComboBoxForwardRef = React.forwardRef(ComboBox) as <T extends object>(\n props: ComboboxProps<T> & {ref?: Ref<HTMLInputElement>},\n) => ReactElement;\nexport {ComboBoxForwardRef as ComboBox};\n","import React, {ReactElement, Ref, RefObject} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {Field} from '../input-field/field';\nimport {BaseFieldPropsWithDom} from '../input-field/base-field-props';\nimport {useListbox} from '../listbox/use-listbox';\nimport {useField} from '../input-field/use-field';\nimport {Item} from '../listbox/item';\nimport {Section} from '../listbox/section';\nimport {Listbox} from '../listbox/listbox';\nimport {Trans} from '@common/i18n/trans';\nimport {useListboxKeyboardNavigation} from '../listbox/use-listbox-keyboard-navigation';\nimport {useTypeSelect} from '../listbox/use-type-select';\nimport {ListBoxChildren, ListboxProps} from '../listbox/types';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {ComboboxEndAdornment} from '@common/ui/forms/combobox/combobox-end-adornment';\n\nexport type SelectProps<T extends object> = Omit<\n BaseFieldPropsWithDom<HTMLButtonElement>,\n 'value'\n> &\n ListboxProps &\n ListBoxChildren<T> & {\n hideCaret?: boolean;\n selectionMode: 'single';\n minWidth?: string;\n searchPlaceholder?: string;\n showSearchField?: boolean;\n valueClassName?: string;\n };\nfunction Select<T extends object>(\n props: SelectProps<T>,\n ref: Ref<HTMLButtonElement>,\n) {\n const isMobile = useIsMobileMediaQuery();\n const {\n hideCaret,\n placeholder = <Trans message=\"Select an option...\" />,\n selectedValue,\n onItemSelected,\n onOpenChange,\n onInputValueChange,\n onSelectionChange,\n selectionMode,\n minWidth = 'min-w-128',\n children,\n searchPlaceholder,\n showEmptyMessage,\n showSearchField,\n defaultInputValue,\n inputValue: userInputValue,\n isLoading,\n isAsync,\n valueClassName,\n floatingWidth = isMobile ? 'auto' : 'matchTrigger',\n ...inputFieldProps\n } = props;\n\n const listbox = useListbox(\n {\n ...props,\n clearInputOnItemSelection: true,\n showEmptyMessage: showEmptyMessage || showSearchField,\n floatingWidth,\n selectionMode: 'single',\n role: 'listbox',\n virtualFocus: showSearchField,\n },\n ref,\n );\n const {\n state: {\n selectedValues,\n isOpen,\n setIsOpen,\n activeIndex,\n setSelectedIndex,\n inputValue,\n setInputValue,\n },\n collections,\n focusItem,\n listboxId,\n reference,\n refs,\n listContent,\n onInputChange,\n } = listbox;\n\n const {fieldProps, inputProps} = useField({\n ...inputFieldProps,\n focusRef: refs.reference as RefObject<HTMLButtonElement>,\n });\n\n const selectedOption = collections.collection.get(selectedValues[0]);\n const content = selectedOption ? (\n <span className=\"flex items-center gap-10\">\n {selectedOption.element.props.startIcon}\n <span\n className={clsx(\n 'overflow-hidden overflow-ellipsis whitespace-nowrap',\n valueClassName,\n )}\n >\n {selectedOption.element.props.children}\n </span>\n </span>\n ) : (\n <span className=\"italic\">{placeholder}</span>\n );\n\n const fieldClassNames = getInputFieldClassNames({\n ...props,\n endAdornment: true,\n });\n\n const {\n handleTriggerKeyDown,\n handleListboxKeyboardNavigation,\n handleListboxSearchFieldKeydown,\n } = useListboxKeyboardNavigation(listbox);\n\n const {findMatchingItem} = useTypeSelect();\n\n // focus matching item when user types, if dropdown is open\n const handleListboxTypeSelect = (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n const i = findMatchingItem(e, listContent, activeIndex);\n if (i != null) {\n focusItem('increment', i);\n }\n };\n\n // select matching item when user types, if dropdown is closed\n const handleTriggerTypeSelect = (e: React.KeyboardEvent) => {\n if (isOpen) return undefined;\n const i = findMatchingItem(e, listContent, activeIndex);\n if (i != null) {\n setSelectedIndex(i);\n }\n };\n\n return (\n <Listbox\n listbox={listbox}\n onKeyDownCapture={!showSearchField ? handleListboxTypeSelect : undefined}\n onKeyDown={handleListboxKeyboardNavigation}\n onClose={showSearchField ? () => setInputValue('') : undefined}\n isLoading={isLoading}\n searchField={\n showSearchField && (\n <TextField\n size={props.size === 'xs' || props.size === 'sm' ? 'xs' : 'sm'}\n placeholder={searchPlaceholder}\n startAdornment={<SearchIcon />}\n className=\"flex-shrink-0 px-8 pb-8 pt-4\"\n autoFocus\n aria-expanded={isOpen ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n aria-controls={isOpen ? listboxId : undefined}\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n value={inputValue}\n onChange={onInputChange}\n onKeyDown={e => {\n handleListboxSearchFieldKeydown(e);\n }}\n />\n )\n }\n >\n <Field\n fieldClassNames={fieldClassNames}\n {...fieldProps}\n endAdornment={\n !hideCaret && <ComboboxEndAdornment isLoading={isLoading} />\n }\n >\n <button\n {...inputProps}\n type=\"button\"\n data-selected-value={selectedOption?.value}\n aria-expanded={isOpen ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n aria-controls={isOpen ? listboxId : undefined}\n ref={reference}\n onKeyDown={handleTriggerKeyDown}\n onKeyDownCapture={\n !showSearchField ? handleTriggerTypeSelect : undefined\n }\n disabled={inputFieldProps.disabled}\n onClick={() => {\n setIsOpen(!isOpen);\n }}\n className={clsx(\n fieldClassNames.input,\n !fieldProps.unstyled && minWidth,\n )}\n >\n {content}\n </button>\n </Field>\n </Listbox>\n );\n}\n\nconst SelectForwardRef = React.forwardRef(Select) as <T extends object>(\n props: SelectProps<T> & {ref?: Ref<HTMLButtonElement>},\n) => ReactElement;\nexport {SelectForwardRef as Select};\n\nexport type FormSelectProps<T extends object> = SelectProps<T> & {\n name: string;\n};\nexport function FormSelect<T extends object>({\n children,\n ...props\n}: FormSelectProps<T>) {\n const {\n field: {onChange, onBlur, value = null, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<SelectProps<T>> = {\n onSelectionChange: onChange,\n onBlur,\n selectedValue: value,\n invalid,\n errorMessage: error?.message,\n name: props.name,\n };\n\n // make sure error message is not overridden by undefined or null\n const errorMessage = props.errorMessage || error?.message;\n return (\n <SelectForwardRef\n ref={ref}\n {...mergeProps(formProps, props, {errorMessage})}\n >\n {children}\n </SelectForwardRef>\n );\n}\n\nexport {Item as Option};\nexport {Section as OptionGroup};\n","import {\n FormSelect,\n OptionGroup,\n SelectProps,\n} from '@common/ui/forms/select/select';\nimport {message} from '@common/i18n/message';\nimport {Option} from '@common/ui/forms/combobox/combobox';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {Timezone} from '@common/http/value-lists';\nimport {InputSize} from '@common/ui/forms/input-field/input-size';\nimport {ReactNode} from 'react';\n\ninterface Props extends Omit<SelectProps<any>, 'selectionMode' | 'children'> {\n name: string;\n timezones: Record<string, Timezone[]>;\n size?: InputSize;\n label?: ReactNode;\n}\nexport function TimezoneSelect({\n name,\n size,\n timezones,\n label,\n ...selectProps\n}: Props) {\n const {trans} = useTrans();\n return (\n <FormSelect\n selectionMode=\"single\"\n name={name}\n size={size}\n label={label}\n showSearchField\n searchPlaceholder={trans(message('Search timezones'))}\n {...selectProps}\n >\n {Object.entries(timezones).map(([sectionName, sectionItems]) => (\n <OptionGroup label={sectionName} key={sectionName}>\n {sectionItems.map(timezone => (\n <Option key={timezone.value} value={timezone.value}>\n {timezone.text}\n </Option>\n ))}\n </OptionGroup>\n ))}\n </FormSelect>\n );\n}\n","import {useForm} from 'react-hook-form';\nimport {useId} from 'react';\nimport {Form} from '@common/ui/forms/form';\nimport {AccountSettingsPanel} from './account-settings-panel';\nimport {useUpdateAccountDetails} from './basic-info-panel/update-account-details';\nimport {Button} from '@common/ui/buttons/button';\nimport {User} from '../../user';\nimport {useValueLists} from '@common/http/value-lists';\nimport {Option} from '../../../ui/forms/combobox/combobox';\nimport {FormSelect} from '../../../ui/forms/select/select';\nimport {useChangeLocale} from '@common/i18n/change-locale';\nimport {Trans} from '@common/i18n/trans';\nimport {getLocalTimeZone} from '@internationalized/date';\nimport {AccountSettingsId} from '@common/auth/ui/account-settings/account-settings-sidenav';\nimport {message} from '@common/i18n/message';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {TimezoneSelect} from '@common/auth/ui/account-settings/timezone-select';\n\ninterface Props {\n user: User;\n}\nexport function LocalizationPanel({user}: Props) {\n const formId = useId();\n const {trans} = useTrans();\n const form = useForm<Partial<User>>({\n defaultValues: {\n language: user.language || '',\n country: user.country || '',\n timezone: user.timezone || getLocalTimeZone(),\n },\n });\n const updateDetails = useUpdateAccountDetails(form);\n const changeLocale = useChangeLocale();\n const {data} = useValueLists(['timezones', 'countries', 'localizations']);\n\n const countries = data?.countries || [];\n const localizations = data?.localizations || [];\n const timezones = data?.timezones || {};\n\n return (\n <AccountSettingsPanel\n id={AccountSettingsId.LocationAndLanguage}\n title={<Trans message=\"Date, time and language\" />}\n actions={\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n form={formId}\n disabled={updateDetails.isPending || !form.formState.isValid}\n >\n <Trans message=\"Save\" />\n </Button>\n }\n >\n <Form\n form={form}\n onSubmit={newDetails => {\n updateDetails.mutate(newDetails);\n changeLocale.mutate({locale: newDetails.language});\n }}\n id={formId}\n >\n <FormSelect\n className=\"mb-24\"\n selectionMode=\"single\"\n name=\"language\"\n label={<Trans message=\"Language\" />}\n >\n {localizations.map(localization => (\n <Option key={localization.language} value={localization.language}>\n {localization.name}\n </Option>\n ))}\n </FormSelect>\n <FormSelect\n className=\"mb-24\"\n selectionMode=\"single\"\n name=\"country\"\n label={<Trans message=\"Country\" />}\n showSearchField\n searchPlaceholder={trans(message('Search countries'))}\n >\n {countries.map(country => (\n <Option key={country.code} value={country.code}>\n {country.name}\n </Option>\n ))}\n </FormSelect>\n <TimezoneSelect\n label={<Trans message=\"Timezone\" />}\n name=\"timezone\"\n timezones={timezones}\n />\n </Form>\n </AccountSettingsPanel>\n );\n}\n","import {DateFormatter} from '@internationalized/date';\nimport {useMemo, useRef} from 'react';\nimport {useSelectedLocale} from './selected-locale';\nimport {shallowEqual} from '../utils/shallow-equal';\n\nexport function useDateFormatter(\n options?: Intl.DateTimeFormatOptions\n): DateFormatter {\n // Reuse last options object if it is shallowly equal, which allows the useMemo result to also be reused.\n const lastOptions = useRef<Intl.DateTimeFormatOptions | undefined | null>(\n null\n );\n if (\n options &&\n lastOptions.current &&\n shallowEqual(options as any, lastOptions.current)\n ) {\n options = lastOptions.current;\n }\n\n lastOptions.current = options;\n\n const {localeCode} = useSelectedLocale();\n return useMemo(\n () => new DateFormatter(localeCode, options),\n [localeCode, options]\n );\n}\n","import {DateValue, parseAbsoluteToLocal} from '@internationalized/date';\nimport {Fragment, memo} from 'react';\nimport {useDateFormatter} from './use-date-formatter';\nimport {shallowEqual} from '../utils/shallow-equal';\nimport {useSettings} from '../core/settings/use-settings';\nimport {useUserTimezone} from './use-user-timezone';\n\nexport const DateFormatPresets: Record<\n 'numeric' | 'short' | 'long',\n Intl.DateTimeFormatOptions\n> = {\n numeric: {year: 'numeric', month: '2-digit', day: '2-digit'},\n short: {year: 'numeric', month: 'short', day: '2-digit'},\n long: {month: 'long', day: '2-digit', year: 'numeric'},\n};\n\ninterface FormattedDateProps {\n date?: string | DateValue | Date;\n options?: Intl.DateTimeFormatOptions;\n preset?: keyof typeof DateFormatPresets;\n}\nexport const FormattedDate = memo(\n ({date, options, preset}: FormattedDateProps) => {\n const {dates} = useSettings();\n const timezone = useUserTimezone();\n const formatter = useDateFormatter(\n options ||\n (DateFormatPresets as Record<string, Intl.DateTimeFormatOptions>)[\n preset || dates?.format\n ]\n );\n\n if (!date) {\n return null;\n }\n\n // make sure date with invalid format does not blow up the app\n try {\n if (typeof date === 'string') {\n date = parseAbsoluteToLocal(date).toDate();\n } else if ('toDate' in date) {\n date = date.toDate(timezone);\n }\n } catch (e) {\n return null;\n }\n\n return <Fragment>{formatter.format(date as Date)}</Fragment>;\n },\n shallowEqual\n);\n","import React, {ReactNode} from 'react';\nimport {Button} from '../../buttons/button';\nimport {ErrorOutlineIcon} from '@common/icons/material/ErrorOutline';\nimport {DialogFooter} from './dialog-footer';\nimport {useDialogContext} from './dialog-context';\nimport {Dialog} from './dialog';\nimport {DialogHeader} from './dialog-header';\nimport {DialogBody} from './dialog-body';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props {\n className?: string;\n title: ReactNode;\n body: ReactNode;\n confirm: ReactNode;\n isDanger?: boolean;\n isLoading?: boolean;\n onConfirm?: () => void;\n}\nexport function ConfirmationDialog({\n className,\n title,\n body,\n confirm,\n isDanger,\n isLoading,\n onConfirm,\n}: Props) {\n const {close} = useDialogContext();\n return (\n <Dialog className={className} size=\"sm\" role=\"alertdialog\">\n <DialogHeader\n color={isDanger ? 'text-danger' : null}\n leftAdornment={<ErrorOutlineIcon className=\"icon-sm\" />}\n >\n {title}\n </DialogHeader>\n <DialogBody>{body}</DialogBody>\n <DialogFooter>\n <Button\n variant=\"text\"\n onClick={() => {\n close(false);\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n disabled={isLoading}\n variant=\"flat\"\n color={isDanger ? 'danger' : 'primary'}\n onClick={() => {\n onConfirm?.();\n // if callback is passed in, caller is responsible for closing the dialog\n if (!onConfirm) {\n close(true);\n }\n }}\n >\n {confirm}\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../../../http/backend-response/backend-response';\nimport {toast} from '../../../../ui/toast/toast';\nimport {message} from '../../../../i18n/message';\nimport {apiClient} from '../../../../http/query-client';\nimport {showHttpErrorToast} from '../../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Props {\n id: number;\n}\n\nfunction deleteAccessToken({id}: Props): Promise<Response> {\n return apiClient.delete(`access-tokens/${id}`).then(r => r.data);\n}\n\nexport function useDeleteAccessToken() {\n return useMutation({\n mutationFn: (props: Props) => deleteAccessToken(props),\n onSuccess: () => {\n toast(message('Token deleted'));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../../../http/backend-response/backend-response';\nimport {toast} from '../../../../ui/toast/toast';\nimport {AccessToken} from '../../../access-token';\nimport {onFormQueryError} from '../../../../errors/on-form-query-error';\nimport {message} from '../../../../i18n/message';\nimport {apiClient} from '../../../../http/query-client';\n\ninterface Response extends BackendResponse {\n token: AccessToken;\n plainTextToken: string;\n}\n\nexport interface CreateAccessTokenPayload {\n tokenName: string;\n}\n\nfunction createAccessToken(\n payload: CreateAccessTokenPayload,\n): Promise<Response> {\n return apiClient.post(`access-tokens`, payload).then(r => r.data);\n}\n\nexport function useCreateAccessToken(\n form: UseFormReturn<CreateAccessTokenPayload>,\n) {\n return useMutation({\n mutationFn: (props: CreateAccessTokenPayload) => createAccessToken(props),\n onSuccess: () => {\n toast(message('Token create'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n","import {useForm} from 'react-hook-form';\nimport {useState} from 'react';\nimport useClipboard from 'react-use-clipboard';\nimport {Dialog} from '../../../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../../../ui/overlays/dialog/dialog-body';\nimport {Form} from '../../../../ui/forms/form';\nimport {\n FormTextField,\n TextField,\n} from '../../../../ui/forms/input-field/text-field/text-field';\nimport {useDialogContext} from '../../../../ui/overlays/dialog/dialog-context';\nimport {DialogFooter} from '../../../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../../../ui/buttons/button';\nimport {\n CreateAccessTokenPayload,\n useCreateAccessToken,\n} from './create-new-token';\nimport {ErrorIcon} from '../../../../icons/material/Error';\nimport {Trans} from '../../../../i18n/trans';\nimport {queryClient} from '@common/http/query-client';\n\nexport function CreateNewTokenDialog() {\n const form = useForm<CreateAccessTokenPayload>();\n const {formId, close} = useDialogContext();\n const createToken = useCreateAccessToken(form);\n\n const [plainTextToken, setPlainTextToken] = useState<string>();\n\n const formNode = (\n <Form\n form={form}\n id={formId}\n onSubmit={values => {\n createToken.mutate(values, {\n onSuccess: response => {\n setPlainTextToken(response.plainTextToken);\n queryClient.invalidateQueries({queryKey: ['users']});\n },\n });\n }}\n >\n <FormTextField\n name=\"tokenName\"\n label={<Trans message=\"Token name\" />}\n required\n autoFocus\n />\n </Form>\n );\n\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Create new token\" />\n </DialogHeader>\n <DialogBody>\n {plainTextToken ? (\n <PlainTextPreview plainTextToken={plainTextToken} />\n ) : (\n formNode\n )}\n </DialogBody>\n <DialogFooter>\n <Button variant=\"text\" onClick={close}>\n <Trans message=\"Done\" />\n </Button>\n {!plainTextToken && (\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n form={formId}\n disabled={createToken.isPending}\n >\n <Trans message=\"Create\" />\n </Button>\n )}\n </DialogFooter>\n </Dialog>\n );\n}\n\ninterface PlainTextPreviewProps {\n plainTextToken: string;\n}\nfunction PlainTextPreview({plainTextToken}: PlainTextPreviewProps) {\n const [isCopied, copyToClipboard] = useClipboard(plainTextToken || '', {\n successDuration: 1000,\n });\n\n return (\n <>\n <TextField\n readOnly\n value={plainTextToken}\n autoFocus\n onClick={e => {\n e.currentTarget.focus();\n e.currentTarget.select();\n }}\n endAppend={\n <Button variant=\"flat\" color=\"primary\" onClick={copyToClipboard}>\n {isCopied ? <Trans message=\"Copied!\" /> : <Trans message=\"Copy\" />}\n </Button>\n }\n />\n <div className=\"flex items-center gap-10 mt-14 text-sm\">\n <ErrorIcon size=\"sm\" className=\"text-danger\" />\n <Trans message=\"Make sure to store the token in a safe place. After this dialog is closed, token will not be viewable anymore.\" />\n </div>\n </>\n );\n}\n","export default \"__VITE_ASSET__4046b921__\"","import {Link} from 'react-router-dom';\nimport clsx from 'clsx';\nimport {AccountSettingsPanel} from '../account-settings-panel';\nimport {User} from '../../../user';\nimport {IllustratedMessage} from '../../../../ui/images/illustrated-message';\nimport {SvgImage} from '../../../../ui/images/svg-image/svg-image';\nimport {Button} from '../../../../ui/buttons/button';\nimport {FormattedDate} from '../../../../i18n/formatted-date';\nimport {AccessToken} from '../../../access-token';\nimport {DialogTrigger} from '../../../../ui/overlays/dialog/dialog-trigger';\nimport {ConfirmationDialog} from '../../../../ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteAccessToken} from './delete-access-token';\nimport {CreateNewTokenDialog} from './create-new-token-dialog';\nimport {LinkStyle} from '../../../../ui/buttons/external-link';\nimport {useAuth} from '../../../use-auth';\nimport {Trans} from '../../../../i18n/trans';\nimport secureFilesSvg from './secure-files.svg';\nimport {useSettings} from '../../../../core/settings/use-settings';\nimport {queryClient} from '@common/http/query-client';\nimport {AccountSettingsId} from '@common/auth/ui/account-settings/account-settings-sidenav';\n\ninterface Props {\n user: User;\n}\nexport function AccessTokenPanel({user}: Props) {\n const tokens = user.tokens || [];\n const {hasPermission} = useAuth();\n const {api} = useSettings();\n if (!api?.integrated || !hasPermission('api.access')) return null;\n return (\n <AccountSettingsPanel\n id={AccountSettingsId.Developers}\n title={<Trans message=\"API access tokens\" />}\n titleSuffix={\n <Link className={LinkStyle} to=\"/api-docs\" target=\"_blank\">\n <Trans message=\"Documentation\" />\n </Link>\n }\n actions={<CreateNewTokenButton />}\n >\n {!tokens.length ? (\n <IllustratedMessage\n className=\"py-40\"\n image={<SvgImage src={secureFilesSvg} />}\n title={<Trans message=\"You have no personal access tokens yet\" />}\n />\n ) : (\n tokens.map((token, index) => (\n <TokenLine\n token={token}\n key={token.id}\n isLast={index === tokens.length - 1}\n />\n ))\n )}\n </AccountSettingsPanel>\n );\n}\n\ninterface TokenLineProps {\n token: AccessToken;\n isLast: boolean;\n}\nfunction TokenLine({token, isLast}: TokenLineProps) {\n return (\n <div\n className={clsx(\n 'flex items-center gap-24',\n !isLast && 'mb-12 pb-12 border-b',\n )}\n >\n <div className=\"text-sm\">\n <div className=\"font-semibold\">\n <Trans message=\"Name\" />\n </div>\n <div>{token.name}</div>\n <div className=\"font-semibold mt-10\">\n <Trans message=\"Last used\" />\n </div>\n <div>\n {token.last_used_at ? (\n <FormattedDate date={token.last_used_at} />\n ) : (\n <Trans message=\"Never\" />\n )}\n </div>\n </div>\n <DeleteTokenButton token={token} />\n </div>\n );\n}\n\nfunction CreateNewTokenButton() {\n return (\n <DialogTrigger type=\"modal\">\n <Button variant=\"flat\" color=\"primary\">\n <Trans message=\"Create token\" />\n </Button>\n <CreateNewTokenDialog />\n </DialogTrigger>\n );\n}\n\ninterface DeleteTokenButtonProps {\n token: AccessToken;\n}\nfunction DeleteTokenButton({token}: DeleteTokenButtonProps) {\n const deleteToken = useDeleteAccessToken();\n return (\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n deleteToken.mutate(\n {id: token.id},\n {\n onSuccess: () =>\n queryClient.invalidateQueries({queryKey: ['users']}),\n },\n );\n }\n }}\n >\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"danger\"\n className=\"flex-shrink-0 ml-auto\"\n >\n <Trans message=\"Delete\" />\n </Button>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete token?\" />}\n body={\n <Trans message=\"This token will be deleted immediately and permanently. Once deleted, it can no longer be used to make API requests.\" />\n }\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../../../http/backend-response/backend-response';\nimport {useLogout} from '../../../requests/logout';\nimport {toast} from '../../../../ui/toast/toast';\nimport {useAuth} from '../../../use-auth';\nimport {apiClient} from '../../../../http/query-client';\nimport {showHttpErrorToast} from '../../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nfunction deleteAccount(userId: number): Promise<Response> {\n return apiClient\n .delete(`users/${userId}`, {params: {deleteCurrentUser: true}})\n .then(r => r.data);\n}\n\nexport function useDeleteAccount() {\n const {user} = useAuth();\n const logout = useLogout();\n return useMutation({\n mutationFn: () => deleteAccount(user!.id),\n onSuccess: () => {\n toast('Account deleted');\n logout.mutate();\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {AccountSettingsPanel} from '../account-settings-panel';\nimport {Button} from '@common/ui/buttons/button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteAccount} from './delete-account';\nimport {Trans} from '@common/i18n/trans';\nimport {AccountSettingsId} from '@common/auth/ui/account-settings/account-settings-sidenav';\n\nexport function DangerZonePanel() {\n const deleteAccount = useDeleteAccount();\n\n return (\n <AccountSettingsPanel\n id={AccountSettingsId.DeleteAccount}\n title={<Trans message=\"Danger zone\" />}\n >\n <DialogTrigger\n type=\"modal\"\n onClose={isConfirmed => {\n if (isConfirmed) {\n deleteAccount.mutate();\n }\n }}\n >\n <Button variant=\"flat\" color=\"danger\">\n <Trans message=\"Delete account\" />\n </Button>\n <ConfirmationDialog\n isDanger\n title={<Trans message=\"Delete account?\" />}\n body={\n <Trans message=\"Your account will be deleted immediately and permanently. Once deleted, accounts can not be restored.\" />\n }\n confirm={<Trans message=\"Delete\" />}\n />\n </DialogTrigger>\n </AccountSettingsPanel>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport function useEnableTwoFactor() {\n return useMutation({\n mutationFn: enable,\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction enable(): Promise<Response> {\n return apiClient\n .post('auth/user/two-factor-authentication')\n .then(response => response.data);\n}\n","import {Fragment, ReactNode} from 'react';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props {\n title: ReactNode;\n subtitle?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children?: ReactNode;\n}\nexport function TwoFactorStepperLayout({\n title,\n subtitle,\n description,\n actions,\n children,\n}: Props) {\n if (!subtitle) {\n subtitle = (\n <Trans message=\"When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone's Google Authenticator application.\" />\n );\n }\n return (\n <Fragment>\n <div className=\"text-base font-medium mb-16\">{title}</div>\n <div className=\"text-sm mb-24\">{subtitle}</div>\n <p className=\"text-sm font-medium my-16\">{description}</p>\n {children}\n <div className=\"flex items-center gap-12\">{actions}</div>\n </Fragment>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient, queryClient} from '@common/http/query-client';\n\ninterface Response extends BackendResponse {\n confirmed: boolean;\n}\n\nexport function usePasswordConfirmationStatus() {\n return useQuery({\n queryKey: ['password-confirmation-status'],\n queryFn: () => fetchStatus(),\n });\n}\n\nfunction fetchStatus(): Promise<Response> {\n return apiClient\n .get('auth/user/confirmed-password-status', {params: {seconds: 9000}})\n .then(response => response.data);\n}\n\nexport function setPasswordConfirmationStatus(confirmed: boolean) {\n queryClient.setQueryData(['password-confirmation-status'], {confirmed});\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\n\ninterface Response extends BackendResponse {}\n\nexport interface ConfirmPasswordPayload {\n password: string;\n}\n\nexport function useConfirmPassword(\n form: UseFormReturn<ConfirmPasswordPayload>,\n) {\n return useMutation({\n mutationFn: (payload: ConfirmPasswordPayload) => confirm(payload),\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction confirm(payload: ConfirmPasswordPayload): Promise<Response> {\n return apiClient\n .post('auth/user/confirm-password', payload)\n .then(response => response.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {\n ConfirmPasswordPayload,\n useConfirmPassword,\n} from '@common/auth/ui/confirm-password/requests/use-confirm-password';\nimport {useForm} from 'react-hook-form';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\n\nexport function ConfirmPasswordDialog() {\n const {close, formId} = useDialogContext();\n const form = useForm<ConfirmPasswordPayload>();\n const confirmPassword = useConfirmPassword(form);\n return (\n <Dialog>\n <DialogHeader>\n <Trans message=\"Confirm password\" />\n </DialogHeader>\n <DialogBody>\n <p className=\"text-sm mb-16\">\n <Trans message=\"For your security, please confirm your password to continue.\" />\n </p>\n <Form\n id={formId}\n form={form}\n onSubmit={values =>\n confirmPassword.mutate(values, {\n onSuccess: () => close(values.password),\n })\n }\n >\n <FormTextField\n name=\"password\"\n label={<Trans message=\"Password\" />}\n type=\"password\"\n required\n autoFocus\n />\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button onClick={() => close()}>\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n form={formId}\n disabled={confirmPassword.isPending}\n >\n <Trans message=\"Confirm\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {\n setPasswordConfirmationStatus,\n usePasswordConfirmationStatus,\n} from '@common/auth/ui/confirm-password/requests/use-password-confirmation-status';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\nimport {ConfirmPasswordDialog} from '@common/auth/ui/confirm-password/confirm-password-dialog';\nimport {useCallback, useRef} from 'react';\n\ninterface Props {\n needsPassword?: boolean;\n}\nexport function usePasswordConfirmedAction({needsPassword}: Props = {}) {\n const {data, isLoading} = usePasswordConfirmationStatus();\n const passwordRef = useRef<string>();\n\n const withConfirmedPassword = useCallback(\n async (action: (password?: string) => void) => {\n if (data?.confirmed && (passwordRef.current || !needsPassword)) {\n action(passwordRef.current);\n } else {\n const password = await openDialog(ConfirmPasswordDialog);\n if (password) {\n passwordRef.current = password;\n setPasswordConfirmationStatus(true);\n action(passwordRef.current);\n }\n }\n },\n [data?.confirmed, needsPassword]\n );\n\n return {\n isLoading,\n withConfirmedPassword,\n };\n}\n","import {useEnableTwoFactor} from '@common/auth/ui/two-factor/requests/use-enable-two-factor';\nimport {TwoFactorStepperLayout} from '@common/auth/ui/two-factor/stepper/two-factor-stepper-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {usePasswordConfirmedAction} from '@common/auth/ui/confirm-password/use-password-confirmed-action';\n\ninterface Props {\n onEnabled: () => void;\n}\nexport function TwoFactorDisabledStep({onEnabled}: Props) {\n const enableTwoFactor = useEnableTwoFactor();\n const {withConfirmedPassword, isLoading: confirmPasswordIsLoading} =\n usePasswordConfirmedAction();\n const isLoading = enableTwoFactor.isPending || confirmPasswordIsLoading;\n\n return (\n <TwoFactorStepperLayout\n title={\n <Trans message=\"You have not enabled two factor authentication.\" />\n }\n actions={\n <Button\n variant=\"flat\"\n color=\"primary\"\n disabled={isLoading}\n onClick={() => {\n withConfirmedPassword(() => {\n enableTwoFactor.mutate(undefined, {\n onSuccess: onEnabled,\n });\n });\n }}\n >\n <Trans message=\"Enable\" />\n </Button>\n }\n />\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\n\ninterface Response extends BackendResponse {\n svg: string;\n secret: string;\n}\n\nexport function useTwoFactorQrCode() {\n return useQuery({\n queryKey: ['two-factor-qr-code'],\n queryFn: () => fetchCode(),\n });\n}\n\nfunction fetchCode(): Promise<Response> {\n return apiClient\n .get('auth/user/two-factor/qr-code')\n .then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\n\ninterface Response extends BackendResponse {}\n\nexport interface ConfirmTwoFactorPayload {\n code: string;\n}\n\nexport function useConfirmTwoFactor(\n form: UseFormReturn<ConfirmTwoFactorPayload>,\n) {\n return useMutation({\n mutationFn: (payload: ConfirmTwoFactorPayload) => confirm(payload),\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction confirm(payload: ConfirmTwoFactorPayload): Promise<Response> {\n return apiClient\n .post('auth/user/confirmed-two-factor-authentication', payload)\n .then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport function useDisableTwoFactor() {\n return useMutation({\n mutationFn: disable,\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction disable(): Promise<Response> {\n return apiClient\n .delete('auth/user/two-factor-authentication')\n .then(response => response.data);\n}\n","import {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {ReactNode} from 'react';\nimport {useTwoFactorQrCode} from '@common/auth/ui/two-factor/requests/use-two-factor-qr-code';\nimport {useForm} from 'react-hook-form';\nimport {\n ConfirmTwoFactorPayload,\n useConfirmTwoFactor,\n} from '@common/auth/ui/two-factor/requests/use-confirm-two-factor';\nimport {TwoFactorStepperLayout} from '@common/auth/ui/two-factor/stepper/two-factor-stepper-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {Form} from '@common/ui/forms/form';\nimport {queryClient} from '@common/http/query-client';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {useDisableTwoFactor} from '@common/auth/ui/two-factor/requests/use-disable-two-factor';\nimport {usePasswordConfirmedAction} from '@common/auth/ui/confirm-password/use-password-confirmed-action';\nimport {Button} from '@common/ui/buttons/button';\n\ninterface Props {\n onCancel: () => void;\n onConfirmed: () => void;\n}\nexport function TwoFactorConfirmationStep(props: Props) {\n const {data} = useTwoFactorQrCode();\n\n return (\n <TwoFactorStepperLayout\n title={<Trans message=\"Finish enabling two factor authentication.\" />}\n description={\n <Trans message=\"To finish enabling two factor authentication, scan the following QR code using your phone's authenticator application or enter the setup key and provide the generated OTP code.\" />\n }\n >\n <AnimatePresence initial={false}>\n {!data ? (\n <QrCodeLayout\n animationKey=\"svg-skeleton\"\n svg={<Skeleton variant=\"rect\" size=\"w-full h-full\" />}\n secret={<Skeleton variant=\"text\" className=\"max-w-224\" />}\n />\n ) : (\n <QrCodeLayout\n animationKey=\"real-svg\"\n svg={<div dangerouslySetInnerHTML={{__html: data.svg}} />}\n secret={\n <Trans message=\"Setup key: :key\" values={{key: data.secret}} />\n }\n />\n )}\n </AnimatePresence>\n <CodeForm {...props} />\n </TwoFactorStepperLayout>\n );\n}\n\nfunction CodeForm({onCancel, onConfirmed}: Props) {\n const form = useForm<ConfirmTwoFactorPayload>();\n const confirmTwoFactor = useConfirmTwoFactor(form);\n const disableTwoFactor = useDisableTwoFactor();\n const {withConfirmedPassword, isLoading: confirmPasswordIsLoading} =\n usePasswordConfirmedAction();\n const isLoading =\n confirmTwoFactor.isPending ||\n disableTwoFactor.isPending ||\n confirmPasswordIsLoading;\n\n return (\n <Form\n form={form}\n onSubmit={values =>\n withConfirmedPassword(() => {\n confirmTwoFactor.mutate(values, {\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: ['users']});\n onConfirmed();\n },\n });\n })\n }\n >\n <FormTextField\n required\n name=\"code\"\n label={<Trans message=\"Code\" />}\n autoFocus\n />\n <div className=\"flex items-center gap-12 mt-24\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={isLoading}\n onClick={() => {\n withConfirmedPassword(() => {\n disableTwoFactor.mutate(undefined, {onSuccess: onCancel});\n });\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={isLoading}\n >\n <Trans message=\"Confirm\" />\n </Button>\n </div>\n </Form>\n );\n}\n\ninterface QrCodeLayoutProps {\n animationKey: string;\n svg: ReactNode;\n secret: ReactNode;\n}\nfunction QrCodeLayout({animationKey, svg, secret}: QrCodeLayoutProps) {\n return (\n <m.div key={animationKey} {...opacityAnimation}>\n <div className=\"w-192 h-192 mb-16\">{svg}</div>\n <div className=\"text-sm font-medium mb-16\">{secret}</div>\n </m.div>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport function useRegenerateTwoFactorCodes() {\n return useMutation({\n mutationFn: () => regenerate(),\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction regenerate(): Promise<Response> {\n return apiClient\n .post('auth/user/two-factor-recovery-codes')\n .then(response => response.data);\n}\n","import {User} from '@common/auth/user';\nimport {useDisableTwoFactor} from '@common/auth/ui/two-factor/requests/use-disable-two-factor';\nimport {useRegenerateTwoFactorCodes} from '@common/auth/ui/two-factor/requests/use-regenerate-two-factor-codes';\nimport {Fragment} from 'react';\nimport {queryClient} from '@common/http/query-client';\nimport {Trans} from '@common/i18n/trans';\nimport {TwoFactorStepperLayout} from '@common/auth/ui/two-factor/stepper/two-factor-stepper-layout';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {usePasswordConfirmedAction} from '@common/auth/ui/confirm-password/use-password-confirmed-action';\nimport {Button} from '@common/ui/buttons/button';\n\ninterface Props {\n user: User;\n onDisabled: () => void;\n}\nexport function TwoFactorEnabledStep({user, onDisabled}: Props) {\n const disableTwoFactor = useDisableTwoFactor();\n const regenerateCodes = useRegenerateTwoFactorCodes();\n const {withConfirmedPassword, isLoading: confirmPasswordIsLoading} =\n usePasswordConfirmedAction();\n const isLoading =\n disableTwoFactor.isPending ||\n regenerateCodes.isPending ||\n confirmPasswordIsLoading;\n\n const actions = (\n <Fragment>\n <Button\n type=\"button\"\n onClick={() =>\n withConfirmedPassword(() => {\n regenerateCodes.mutate(undefined, {\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: ['users']});\n },\n });\n })\n }\n variant=\"outline\"\n disabled={isLoading}\n className=\"mr-12\"\n >\n <Trans message=\"Regenerate recovery codes\" />\n </Button>\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"danger\"\n disabled={isLoading}\n onClick={() => {\n withConfirmedPassword(() => {\n disableTwoFactor.mutate(undefined, {\n onSuccess: () => {\n toast(message('Two factor authentication has been disabled.'));\n onDisabled();\n },\n });\n });\n }}\n >\n <Trans message=\"Disable\" />\n </Button>\n </Fragment>\n );\n\n return (\n <TwoFactorStepperLayout\n title={<Trans message=\"You have enabled two factor authentication.\" />}\n description={\n <Trans message=\"Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.\" />\n }\n actions={actions}\n >\n <div className=\"bg-alt p-14 font-mono text-sm mb-16 rounded\">\n {user.two_factor_recovery_codes?.map(code => (\n <div className=\"mb-4\" key={code}>\n {code}\n </div>\n ))}\n </div>\n </TwoFactorStepperLayout>\n );\n}\n","import {useState} from 'react';\nimport {User} from '@common/auth/user';\nimport {TwoFactorDisabledStep} from '@common/auth/ui/two-factor/stepper/two-factor-disabled-step';\nimport {TwoFactorConfirmationStep} from '@common/auth/ui/two-factor/stepper/two-factor-confirmation-step';\nimport {TwoFactorEnabledStep} from '@common/auth/ui/two-factor/stepper/two-factor-enabled-step';\n\nenum Status {\n Disabled,\n WaitingForConfirmation,\n Enabled,\n}\n\ninterface Props {\n user: User;\n}\nexport function TwoFactorStepper({user}: Props) {\n const [status, setStatus] = useState<Status>(getStatus(user));\n switch (status) {\n case Status.Disabled:\n return (\n <TwoFactorDisabledStep\n onEnabled={() => setStatus(Status.WaitingForConfirmation)}\n />\n );\n case Status.WaitingForConfirmation:\n return (\n <TwoFactorConfirmationStep\n onCancel={() => {\n setStatus(Status.Disabled);\n }}\n onConfirmed={() => {\n setStatus(Status.Enabled);\n }}\n />\n );\n case Status.Enabled:\n return (\n <TwoFactorEnabledStep\n user={user}\n onDisabled={() => setStatus(Status.Disabled)}\n />\n );\n }\n}\n\nfunction getStatus(user: User): Status {\n if (user.two_factor_confirmed_at) {\n return Status.Enabled;\n } else if (user.two_factor_recovery_codes) {\n return Status.WaitingForConfirmation;\n }\n return Status.Disabled;\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\nexport interface ActiveSession {\n id: string;\n platform?: string;\n device_type?: 'mobile' | 'tablet' | 'desktop';\n browser?: string;\n country?: string;\n city?: string;\n ip_address?: string;\n token?: string;\n is_current_device: boolean;\n last_active: string;\n created_at: string;\n}\n\ninterface Response extends BackendResponse {\n sessions: ActiveSession[];\n}\n\nexport function useUserSessions() {\n return useQuery({\n queryKey: ['user-sessions'],\n queryFn: () => fetchUserSessions(),\n });\n}\n\nfunction fetchUserSessions() {\n return apiClient\n .get<Response>(`user-sessions`)\n .then(response => response.data);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ComputerIcon = createSvgIcon(\n <path d=\"M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H0v2h24v-2h-4zM4 6h16v10H4V6z\" />\n, 'ComputerOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SmartphoneIcon = createSvgIcon(\n <path d=\"M17 1.01 7 1c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z\" />\n, 'SmartphoneOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TabletIcon = createSvgIcon(\n <path d=\"M21 4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 1.99-.9 1.99-2L23 6c0-1.1-.9-2-2-2zm-2 14H5V6h14v12z\" />\n, 'TabletOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n password: string;\n}\n\nexport function useLogoutOtherSessions() {\n return useMutation({\n mutationFn: (payload: Payload) => logoutOther(payload),\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction logoutOther(payload: Payload): Promise<Response> {\n return apiClient\n .post('user-sessions/logout-other', payload)\n .then(response => response.data);\n}\n","import {User} from '../../../user';\nimport {AccountSettingsPanel} from '../account-settings-panel';\nimport {Trans} from '@common/i18n/trans';\nimport {AccountSettingsId} from '@common/auth/ui/account-settings/account-settings-sidenav';\nimport {\n ActiveSession,\n useUserSessions,\n} from '@common/auth/ui/account-settings/sessions-panel/requests/use-user-sessions';\nimport {ComputerIcon} from '@common/icons/material/Computer';\nimport {SmartphoneIcon} from '@common/icons/material/Smartphone';\nimport {TabletIcon} from '@common/icons/material/Tablet';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {Fragment, ReactNode} from 'react';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {useLogoutOtherSessions} from '@common/auth/ui/account-settings/sessions-panel/requests/use-logout-other-sessions';\nimport {usePasswordConfirmedAction} from '@common/auth/ui/confirm-password/use-password-confirmed-action';\nimport {Button} from '@common/ui/buttons/button';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Props {\n user: User;\n}\nexport function SessionsPanel({user}: Props) {\n const {data, isLoading} = useUserSessions();\n const logoutOther = useLogoutOtherSessions();\n const {withConfirmedPassword, isLoading: checkingPasswordStatus} =\n usePasswordConfirmedAction({needsPassword: true});\n\n const sessionList = (\n <div className=\"max-h-400 overflow-y-auto\">\n {data?.sessions?.map(session => (\n <SessionItem key={session.id} session={session} />\n ))}\n </div>\n );\n\n return (\n <AccountSettingsPanel\n id={AccountSettingsId.Sessions}\n title={<Trans message=\"Active sessions\" />}\n >\n <p className=\"text-sm\">\n <Trans message=\"If necessary, you may log out of all of your other browser sessions across all of your devices. Your recent sessions are listed below. If you feel your account has been compromised, you should also update your password.\" />\n </p>\n <div className=\"my-30\">\n {isLoading ? (\n <div className=\"min-h-60\">\n <ProgressCircle isIndeterminate />\n </div>\n ) : (\n sessionList\n )}\n </div>\n <Button\n variant=\"outline\"\n color=\"primary\"\n disabled={checkingPasswordStatus || logoutOther.isPending}\n onClick={() => {\n withConfirmedPassword(password => {\n logoutOther.mutate(\n {password: password!},\n {\n onSuccess: () => {\n toast(message('Logged out other sessions.'));\n },\n },\n );\n });\n }}\n >\n <Trans message=\"Logout other sessions\" />\n </Button>\n </AccountSettingsPanel>\n );\n}\n\ninterface SessionItemProps {\n session: ActiveSession;\n}\nfunction SessionItem({session}: SessionItemProps) {\n return (\n <div className=\"flex items-start gap-14 text-sm mb-14\">\n <div className=\"flex-shrink-0 text-muted\">\n <DeviceIcon device={session.device_type} size=\"lg\" />\n </div>\n <div className=\"flex-auto\">\n <div>\n <ValueOrUnknown>{session.platform}</ValueOrUnknown> -{' '}\n <ValueOrUnknown>{session.browser}</ValueOrUnknown>\n </div>\n <div className=\"text-xs my-4\">\n {session.city}, {session.country}\n </div>\n <div className=\"text-xs\">\n <IpAddress session={session} /> - <LastActive session={session} />\n </div>\n </div>\n </div>\n );\n}\n\ninterface DeviceIconProps {\n device: ActiveSession['device_type'];\n size: SvgIconProps['size'];\n}\nfunction DeviceIcon({device, size}: DeviceIconProps) {\n switch (device) {\n case 'mobile':\n return <SmartphoneIcon size={size} />;\n case 'tablet':\n return <TabletIcon size={size} />;\n default:\n return <ComputerIcon size={size} />;\n }\n}\n\ninterface LastActiveProps {\n session: ActiveSession;\n}\nfunction LastActive({session}: LastActiveProps) {\n if (session.is_current_device) {\n return (\n <span className=\"text-positive\">\n <Trans message=\"This device\" />\n </span>\n );\n }\n\n return <FormattedRelativeTime date={session.last_active} />;\n}\n\ninterface IpAddressProps {\n session: ActiveSession;\n}\nfunction IpAddress({session}: IpAddressProps) {\n if (session.ip_address) {\n return <span>{session.ip_address}</span>;\n } else if (session.token) {\n return <Trans message=\"API Token\" />;\n }\n return <Trans message=\"Unknown IP\" />;\n}\n\ninterface ValueOrUnknownProps {\n children: ReactNode;\n}\nfunction ValueOrUnknown({children}: ValueOrUnknownProps) {\n return children ? (\n <Fragment>{children}</Fragment>\n ) : (\n <Trans message=\"Unknown\" />\n );\n}\n","import {Navbar} from '@common/ui/navigation/navbar/navbar';\nimport {useUser} from '../use-user';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {SocialLoginPanel} from './social-login-panel';\nimport {BasicInfoPanel} from './basic-info-panel/basic-info-panel';\nimport {ChangePasswordPanel} from './change-password-panel/change-password-panel';\nimport {LocalizationPanel} from './localization-panel';\nimport {AccessTokenPanel} from './access-token-panel/access-token-panel';\nimport {DangerZonePanel} from './danger-zone-panel/danger-zone-panel';\nimport {Trans} from '@common/i18n/trans';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {AccountSettingsPanel} from '@common/auth/ui/account-settings/account-settings-panel';\nimport {TwoFactorStepper} from '@common/auth/ui/two-factor/stepper/two-factor-auth-stepper';\nimport {\n AccountSettingsId,\n AccountSettingsSidenav,\n} from '@common/auth/ui/account-settings/account-settings-sidenav';\nimport {SessionsPanel} from '@common/auth/ui/account-settings/sessions-panel/sessions-panel';\nimport {useContext} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\nexport function AccountSettingsPage() {\n const {auth} = useContext(SiteConfigContext);\n const {data, isLoading} = useUser('me', {\n with: ['roles', 'social_profiles', 'tokens'],\n });\n return (\n <div className=\"min-h-screen bg-alt\">\n <StaticPageTitle>\n <Trans message=\"Account Settings\" />\n </StaticPageTitle>\n <Navbar menuPosition=\"account-settings-page\" />\n <div>\n <div className=\"container mx-auto my-24 px-24\">\n <h1 className=\"text-3xl\">\n <Trans message=\"Account settings\" />\n </h1>\n <div className=\"mb-40 text-base text-muted\">\n <Trans message=\"View and update your account details, profile and more.\" />\n </div>\n {isLoading || !data ? (\n <ProgressCircle\n className=\"my-80\"\n aria-label=\"Loading user..\"\n isIndeterminate\n />\n ) : (\n <div className=\"flex items-start gap-24\">\n <AccountSettingsSidenav />\n <main className=\"flex-auto\">\n {auth.accountSettingsPanels?.map(panel => (\n <panel.component key={panel.id} user={data.user} />\n ))}\n <BasicInfoPanel user={data.user} />\n <SocialLoginPanel user={data.user} />\n <ChangePasswordPanel />\n <AccountSettingsPanel\n id={AccountSettingsId.TwoFactor}\n title={<Trans message=\"Two factor authentication\" />}\n >\n <div className=\"max-w-580\">\n <TwoFactorStepper user={data.user} />\n </div>\n </AccountSettingsPanel>\n <SessionsPanel user={data.user} />\n <LocalizationPanel user={data.user} />\n <AccessTokenPanel user={data.user} />\n <DangerZonePanel />\n </main>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {toast} from '../../ui/toast/toast';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {apiClient} from '../../http/query-client';\n\ninterface Response extends BackendResponse {\n message: string;\n}\n\nexport interface SendPasswordResetEmailPayload {\n email: string;\n}\n\nexport function useSendPasswordResetEmail(\n form: UseFormReturn<SendPasswordResetEmailPayload>,\n) {\n const navigate = useNavigate();\n return useMutation({\n mutationFn: sendResetPasswordEmail,\n onSuccess: response => {\n toast(response.message);\n navigate('/login');\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction sendResetPasswordEmail(\n payload: SendPasswordResetEmailPayload,\n): Promise<Response> {\n return apiClient\n .post('auth/forgot-password', payload)\n .then(response => response.data);\n}\n","import {Link, useSearchParams} from 'react-router-dom';\nimport {useForm} from 'react-hook-form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {Button} from '../../ui/buttons/button';\nimport {Form} from '../../ui/forms/form';\nimport {LinkStyle} from '../../ui/buttons/external-link';\nimport {AuthLayout} from './auth-layout/auth-layout';\nimport {\n SendPasswordResetEmailPayload,\n useSendPasswordResetEmail,\n} from '../requests/send-reset-password-email';\nimport {Trans} from '../../i18n/trans';\nimport {StaticPageTitle} from '../../seo/static-page-title';\nimport {useSettings} from '../../core/settings/use-settings';\n\nexport function ForgotPasswordPage() {\n const {registration} = useSettings();\n\n const [searchParams] = useSearchParams();\n const searchParamsEmail = searchParams.get('email') || undefined;\n\n const form = useForm<SendPasswordResetEmailPayload>({\n defaultValues: {email: searchParamsEmail},\n });\n const sendEmail = useSendPasswordResetEmail(form);\n\n const message = !registration.disable && (\n <Trans\n values={{\n a: parts => (\n <Link className={LinkStyle} to=\"/register\">\n {parts}\n </Link>\n ),\n }}\n message=\"Don't have an account? <a>Sign up.</a>\"\n />\n );\n\n return (\n <AuthLayout message={message}>\n <StaticPageTitle>\n <Trans message=\"Forgot Password\" />\n </StaticPageTitle>\n <Form\n form={form}\n onSubmit={payload => {\n sendEmail.mutate(payload);\n }}\n >\n <div className=\"mb-32 text-sm\">\n <Trans message=\"Enter your email address below and we will send you a link to reset or create your password.\" />\n </div>\n <FormTextField\n disabled={!!searchParamsEmail}\n className=\"mb-32\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n label={<Trans message=\"Email\" />}\n required\n />\n <Button\n className=\"block w-full\"\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n size=\"md\"\n disabled={sendEmail.isPending}\n >\n <Trans message=\"Continue\" />\n </Button>\n </Form>\n </AuthLayout>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {toast} from '../../ui/toast/toast';\nimport {message} from '../../i18n/message';\nimport {useNavigate} from '../../utils/hooks/use-navigate';\nimport {apiClient} from '../../http/query-client';\n\ninterface Response extends BackendResponse {\n bootstrapData: string;\n}\n\nexport interface ResetPasswordPayload {\n email: string;\n password: string;\n password_confirmation: string;\n token: string;\n}\n\nfunction reset(payload: ResetPasswordPayload): Promise<Response> {\n return apiClient\n .post('auth/reset-password', payload)\n .then(response => response.data);\n}\n\nexport function useResetPassword(form: UseFormReturn<ResetPasswordPayload>) {\n const navigate = useNavigate();\n return useMutation({\n mutationFn: reset,\n onSuccess: () => {\n navigate('/login', {replace: true});\n toast(message('Your password has been reset!'));\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n","import {Link, useParams} from 'react-router-dom';\nimport {useForm} from 'react-hook-form';\nimport {FormTextField} from '../../ui/forms/input-field/text-field/text-field';\nimport {Button} from '../../ui/buttons/button';\nimport {Form} from '../../ui/forms/form';\nimport {LinkStyle} from '../../ui/buttons/external-link';\nimport {AuthLayout} from './auth-layout/auth-layout';\nimport {\n ResetPasswordPayload,\n useResetPassword,\n} from '../requests/reset-password';\nimport {Trans} from '../../i18n/trans';\nimport {StaticPageTitle} from '../../seo/static-page-title';\n\nexport function ResetPasswordPage() {\n const {token} = useParams();\n const form = useForm<ResetPasswordPayload>({defaultValues: {token}});\n const resetPassword = useResetPassword(form);\n\n const heading = <Trans message=\"Reset your account password\" />;\n\n const message = (\n <Trans\n values={{\n a: parts => (\n <Link className={LinkStyle} to=\"/register\">\n {parts}\n </Link>\n ),\n }}\n message=\"Don't have an account? <a>Sign up.</a>\"\n />\n );\n\n return (\n <AuthLayout heading={heading} message={message}>\n <StaticPageTitle>\n <Trans message=\"Reset Password\" />\n </StaticPageTitle>\n <Form\n form={form}\n onSubmit={payload => {\n resetPassword.mutate(payload);\n }}\n >\n <FormTextField\n className=\"mb-32\"\n name=\"email\"\n type=\"email\"\n label={<Trans message=\"Email\" />}\n required\n />\n <FormTextField\n className=\"mb-32\"\n name=\"password\"\n type=\"password\"\n label={<Trans message=\"New password\" />}\n required\n />\n <FormTextField\n className=\"mb-32\"\n name=\"password_confirmation\"\n type=\"password\"\n label={<Trans message=\"Confirm password\" />}\n required\n />\n <Button\n className=\"block w-full\"\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n size=\"md\"\n disabled={resetPassword.isPending}\n >\n <Trans message=\"Reset password\" />\n </Button>\n </Form>\n </AuthLayout>\n );\n}\n","import {RegisterPage} from './ui/register-page';\nimport {AuthRoute} from './guards/auth-route';\nimport {AccountSettingsPage} from './ui/account-settings/account-settings-page';\nimport {GuestRoute} from './guards/guest-route';\nimport {ForgotPasswordPage} from './ui/forgot-password-page';\nimport {ResetPasswordPage} from './ui/reset-password-page';\nimport React, {Fragment} from 'react';\nimport {Route} from 'react-router-dom';\nimport {LoginPageWrapper} from '@common/auth/ui/login-page-wrapper';\n\nexport const AuthRoutes = (\n <Fragment>\n <Route path=\"/register\" element={<RegisterPage />} />\n <Route\n path=\"/account-settings\"\n element={\n <AuthRoute>\n <AccountSettingsPage />\n </AuthRoute>\n }\n />\n <Route\n path=\"login\"\n element={\n <GuestRoute>\n <LoginPageWrapper />\n </GuestRoute>\n }\n />\n <Route\n path=\"/workspace/join/register\"\n element={\n <GuestRoute>\n <RegisterPage />\n </GuestRoute>\n }\n />\n <Route\n path=\"/workspace/join/login\"\n element={\n <GuestRoute>\n <LoginPageWrapper />\n </GuestRoute>\n }\n />\n <Route\n path=\"forgot-password\"\n element={\n <GuestRoute>\n <ForgotPasswordPage />\n </GuestRoute>\n }\n />\n <Route\n path=\"/password/reset/:token\"\n element={\n <GuestRoute>\n <ResetPasswordPage />\n </GuestRoute>\n }\n />\n </Fragment>\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ForumIcon = createSvgIcon(\n <path d=\"M15 4v7H5.17L4 12.17V4h11m1-2H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm5 4h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1z\" />\n, 'ForumOutlined');\n","import {useProducts} from './use-products';\nimport {Button} from '../../ui/buttons/button';\nimport {Trans} from '../../i18n/trans';\nimport {ForumIcon} from '../../icons/material/Forum';\nimport {Navbar} from '../../ui/navigation/navbar/navbar';\nimport {Link} from 'react-router-dom';\nimport {Footer} from '../../ui/footer/footer';\nimport {Fragment, useState} from 'react';\nimport {UpsellBillingCycle} from './find-best-price';\nimport {BillingCycleRadio} from './billing-cycle-radio';\nimport {StaticPageTitle} from '../../seo/static-page-title';\nimport {PricingTable} from '@common/billing/pricing-table/pricing-table';\n\nexport function PricingPage() {\n const query = useProducts('pricingPage');\n const [selectedCycle, setSelectedCycle] =\n useState<UpsellBillingCycle>('yearly');\n\n return (\n <Fragment>\n <StaticPageTitle>\n <Trans message=\"Pricing\" />\n </StaticPageTitle>\n <Navbar\n color=\"bg\"\n darkModeColor=\"transparent\"\n border=\"border-b\"\n menuPosition=\"pricing-table-page\"\n />\n <div className=\"container mx-auto px-24\">\n <h1 className=\"mb-30 mt-30 text-center text-3xl font-normal md:mt-60 md:text-4xl md:font-medium\">\n <Trans message=\"Choose the right plan for you\" />\n </h1>\n\n <BillingCycleRadio\n products={query.data?.products}\n selectedCycle={selectedCycle}\n onChange={setSelectedCycle}\n className=\"mb-40 flex justify-center md:mb-70\"\n size=\"lg\"\n />\n\n <PricingTable\n selectedCycle={selectedCycle}\n productLoader=\"pricingPage\"\n />\n <ContactSection />\n </div>\n <Footer className=\"container mx-auto flex-shrink-0 px-24\" />\n </Fragment>\n );\n}\n\nfunction ContactSection() {\n return (\n <div className=\"my-20 p-24 text-center md:my-80\">\n <ForumIcon size=\"xl\" className=\"text-muted\" />\n <div className=\"my-8 md:text-lg\">\n <Trans message=\"Do you have any questions about PRO accounts?\" />\n </div>\n <div className=\"mb-24 mt-20 text-sm md:mt-0 md:text-base\">\n <Trans message=\"Our support team will be happy to assist you.\" />\n </div>\n <Button variant=\"flat\" color=\"primary\" elementType={Link} to=\"/contact\">\n <Trans message=\"Contact us\" />\n </Button>\n </div>\n );\n}\n","import {Route} from 'react-router-dom';\nimport {PricingPage} from './pricing-table/pricing-page';\nimport React, {Fragment} from 'react';\nimport {FullPageLoader} from '../ui/progress/full-page-loader';\n\nconst BillingPageRoutes = React.lazy(\n () => import('./billing-page/billing-page-routes')\n);\n\nconst CheckoutRoutes = React.lazy(() => import('./checkout/checkout-routes'));\n\nexport const BillingRoutes = (\n <Fragment>\n <Route path=\"/pricing\" element={<PricingPage />} />\n <Route\n path=\"checkout/*\"\n element={\n <React.Suspense fallback={<FullPageLoader screen />}>\n <CheckoutRoutes />\n </React.Suspense>\n }\n />\n <Route\n path=\"billing/*\"\n element={\n <React.Suspense fallback={<FullPageLoader screen />}>\n <BillingPageRoutes />\n </React.Suspense>\n }\n />\n </Fragment>\n);\n","import {NotificationList} from './notification-list';\nimport {useUserNotifications} from './dialog/requests/user-notifications';\nimport {ProgressCircle} from '../ui/progress/progress-circle';\nimport {NotificationEmptyStateMessage} from './empty-state/notification-empty-state-message';\nimport {Navbar} from '../ui/navigation/navbar/navbar';\nimport {Trans} from '../i18n/trans';\nimport {useMarkNotificationsAsRead} from './requests/use-mark-notifications-as-read';\nimport {useAuth} from '../auth/use-auth';\nimport {Button} from '../ui/buttons/button';\nimport {DoneAllIcon} from '../icons/material/DoneAll';\nimport {StaticPageTitle} from '../seo/static-page-title';\nimport {Fragment} from 'react';\nimport {Footer} from '@common/ui/footer/footer';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Link} from 'react-router-dom';\nimport {SettingsIcon} from '@common/icons/material/Settings';\nimport {useSettings} from '@common/core/settings/use-settings';\n\nexport function NotificationsPage() {\n const {user} = useAuth();\n const {data, isLoading} = useUserNotifications({perPage: 30});\n const hasUnread = !!user?.unread_notifications_count;\n const markAsRead = useMarkNotificationsAsRead();\n const {notif} = useSettings();\n\n const handleMarkAsRead = () => {\n if (!data) return;\n markAsRead.mutate({\n markAllAsUnread: true,\n });\n };\n\n const markAsReadButton = (\n <Button\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n startIcon={<DoneAllIcon />}\n onClick={handleMarkAsRead}\n disabled={markAsRead.isPending || isLoading}\n className=\"ml-auto\"\n >\n <Trans message=\"Mark all as read\" />\n </Button>\n );\n\n return (\n <Fragment>\n <StaticPageTitle>\n <Trans message=\"Notifications\" />\n </StaticPageTitle>\n <Navbar menuPosition=\"notifications-page\" />\n <div className=\"container mx-auto min-h-[1000px] p-16 md:p-24\">\n <div className=\"mb-30 flex items-center gap-24\">\n <h1 className=\"text-3xl\">\n <Trans message=\"Notifications\" />\n </h1>\n {hasUnread && markAsReadButton}\n {notif.subs.integrated && (\n <IconButton\n className=\"ml-auto text-muted\"\n elementType={Link}\n to=\"/notifications/settings\"\n target=\"_blank\"\n >\n <SettingsIcon />\n </IconButton>\n )}\n </div>\n <PageContent />\n </div>\n <Footer className=\"container mx-auto mt-48 p-16 md:p-24\" />\n </Fragment>\n );\n}\n\nfunction PageContent() {\n const {data, isLoading} = useUserNotifications({perPage: 30});\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-10\">\n <ProgressCircle aria-label=\"Loading notifications...\" isIndeterminate />\n </div>\n );\n }\n if (!data?.pagination.data.length) {\n return <NotificationEmptyStateMessage />;\n }\n return (\n <NotificationList\n className=\"rounded border\"\n notifications={data.pagination.data}\n />\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {\n NotificationSubscription,\n NotificationSubscriptionGroup,\n} from '@common/notifications/subscriptions/notification-subscription';\nimport {apiClient} from '@common/http/query-client';\n\nexport interface FetchNotificationSubscriptionsResponse\n extends BackendResponse {\n available_channels: string[];\n subscriptions: NotificationSubscriptionGroup[];\n user_selections: NotificationSubscription[];\n}\n\nfunction fetchNotificationSubscriptions(): Promise<FetchNotificationSubscriptionsResponse> {\n return apiClient\n .get('notifications/me/subscriptions')\n .then(response => response.data);\n}\n\nexport function useNotificationSubscriptions() {\n return useQuery({\n queryKey: ['notification-subscriptions'],\n queryFn: () => fetchNotificationSubscriptions(),\n staleTime: Infinity,\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../../http/backend-response/backend-response';\nimport {toast} from '../../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../../http/query-client';\nimport {message} from '../../../i18n/message';\nimport {showHttpErrorToast} from '../../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n //\n}\n\ntype UpdateNotificationSettingsPayload = {\n notif_id: string;\n channels: Record<string, boolean>;\n}[];\n\nfunction UpdateNotificationSettings(\n payload: UpdateNotificationSettingsPayload,\n): Promise<Response> {\n return apiClient\n .put('notifications/me/subscriptions', {selections: payload})\n .then(r => r.data);\n}\n\nexport function useUpdateNotificationSettings() {\n return useMutation({\n mutationFn: (payload: UpdateNotificationSettingsPayload) =>\n UpdateNotificationSettings(payload),\n onSuccess: () => {\n toast(message('Updated preferences'));\n queryClient.invalidateQueries({queryKey: ['notification-subscriptions']});\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useEffect, useState} from 'react';\nimport {produce} from 'immer';\nimport {useNotificationSubscriptions} from './requests/notification-subscriptions';\nimport {Navbar} from '../../ui/navigation/navbar/navbar';\nimport {ProgressCircle} from '../../ui/progress/progress-circle';\nimport {Checkbox} from '../../ui/forms/toggle/checkbox';\nimport {useUpdateNotificationSettings} from './requests/update-notification-settings';\nimport {Button} from '../../ui/buttons/button';\nimport {NotificationSubscriptionGroup} from './notification-subscription';\nimport {toast} from '../../ui/toast/toast';\nimport {Trans} from '../../i18n/trans';\nimport {message} from '../../i18n/message';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {Navigate} from 'react-router-dom';\n\ntype Selection = Record<string, ChannelSelection>;\n\n// {email: true, mobile: true, browser: false}\ntype ChannelSelection = Record<string, boolean>;\n\nexport function NotificationSettingsPage() {\n const {notif} = useSettings();\n const updateSettings = useUpdateNotificationSettings();\n const {data, isFetched} = useNotificationSubscriptions();\n const [selection, setSelection] = useState<Selection>();\n\n useEffect(() => {\n if (data && !selection) {\n const initialSelection: Selection = {};\n const initialValue: ChannelSelection = {};\n data.available_channels.forEach(channel => {\n initialValue[channel] = false;\n });\n\n data.subscriptions.forEach(group => {\n group.subscriptions.forEach(subscription => {\n const backendValue = data.user_selections.find(\n s => s.notif_id === subscription.notif_id,\n );\n initialSelection[subscription.notif_id] = backendValue?.channels || {\n ...initialValue,\n };\n });\n });\n setSelection(initialSelection);\n }\n }, [data, selection]);\n\n if (!notif.subs.integrated || (data && data.subscriptions.length === 0)) {\n return <Navigate to=\"/\" replace />;\n }\n\n return (\n <div className=\"min-h-screen bg-alt\">\n <Navbar menuPosition=\"notifications-page\" />\n {!isFetched || !data || !selection ? (\n <div className=\"container mx-auto my-100 flex justify-center\">\n <ProgressCircle\n size=\"md\"\n isIndeterminate\n aria-label=\"Loading subscriptions...\"\n />\n </div>\n ) : (\n <div className=\"container mx-auto my-20 px-10 md:my-40 md:px-20\">\n <div className=\"rounded border bg-paper px-20 pb-30 pt-20\">\n {data.subscriptions.map(group => (\n <div key={group.group_name} className=\"mb-10 text-sm\">\n <GroupRow\n key={group.group_name}\n group={group}\n allChannels={data?.available_channels}\n selection={selection}\n setSelection={setSelection}\n />\n {group.subscriptions.map(subscription => (\n <SubscriptionRow\n key={subscription.notif_id}\n subscription={subscription}\n selection={selection}\n setSelection={setSelection}\n allChannels={data?.available_channels}\n />\n ))}\n </div>\n ))}\n <Button\n className=\"ml-10 mt-20\"\n variant=\"flat\"\n color=\"primary\"\n disabled={updateSettings.isPending}\n onClick={() => {\n updateSettings.mutate(\n Object.entries(selection).map(([notifId, channels]) => {\n return {notif_id: notifId, channels};\n }),\n );\n }}\n >\n <Trans message=\"Update preferences\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\ninterface GroupRowProps {\n group: NotificationSubscriptionGroup;\n allChannels: string[];\n selection: Selection;\n setSelection: (value: Selection) => void;\n}\nfunction GroupRow({\n group,\n allChannels,\n selection,\n setSelection,\n}: GroupRowProps) {\n const toggleAll = (channelName: string, value: boolean) => {\n const nextState = produce(selection, draftState => {\n Object.keys(selection).forEach(notifId => {\n draftState[notifId][channelName] = value;\n });\n });\n setSelection(nextState);\n };\n\n const checkboxes = (\n <div className=\"ml-auto flex items-center gap-40 max-md:hidden\">\n {allChannels.map(channelName => {\n const allSelected = Object.values(selection).every(s => s[channelName]);\n const someSelected =\n !allSelected && Object.values(selection).some(s => s[channelName]);\n return (\n <Checkbox\n key={channelName}\n orientation=\"vertical\"\n isIndeterminate={someSelected}\n checked={allSelected}\n onChange={async e => {\n if (channelName === 'browser') {\n const granted = await requestBrowserPermission();\n toggleAll(channelName, !granted ? false : !allSelected);\n } else {\n toggleAll(channelName, !allSelected);\n }\n }}\n >\n <Trans message={channelName} />\n </Checkbox>\n );\n })}\n </div>\n );\n\n return (\n <div className=\"flex items-center border-b p-10\">\n <div className=\"font-medium\">\n <Trans message={group.group_name} />\n </div>\n {checkboxes}\n </div>\n );\n}\n\ninterface SubscriptionRowProps {\n subscription: {name: string; notif_id: string};\n allChannels: string[];\n selection: Selection;\n setSelection: (value: Selection) => void;\n}\nfunction SubscriptionRow({\n subscription,\n allChannels,\n selection,\n setSelection,\n}: SubscriptionRowProps) {\n const notifId = subscription.notif_id;\n\n const toggleChannel = (channelName: string, value: boolean) => {\n const nextState = produce(selection, draftState => {\n draftState[subscription.notif_id][channelName] = value;\n });\n setSelection(nextState);\n };\n\n return (\n <div className=\"items-center border-b py-10 pl-8 pr-10 md:flex md:pl-20\">\n <div className=\"pb-14 font-semibold md:pb-0 md:font-normal\">\n <Trans message={subscription.name} />\n </div>\n <div className=\"ml-auto flex items-center gap-40\">\n {allChannels.map(channelName => (\n <Checkbox\n key={channelName}\n orientation=\"vertical\"\n checked={selection[notifId][channelName]}\n onChange={async e => {\n const newValue = !selection[notifId][channelName];\n if (channelName === 'browser') {\n const granted = await requestBrowserPermission();\n toggleChannel(channelName, !granted ? false : newValue);\n } else {\n toggleChannel(channelName, newValue);\n }\n }}\n aria-label={channelName}\n >\n <div className=\"md:invisible md:h-0\">\n <Trans message={channelName} />\n </div>\n </Checkbox>\n ))}\n </div>\n </div>\n );\n}\n\nfunction requestBrowserPermission(): Promise<boolean> {\n if (Notification.permission === 'granted') {\n return Promise.resolve(true);\n }\n if (Notification.permission === 'denied') {\n toast.danger(\n message(\n 'Notifications blocked. Please enable them for this site from browser settings.',\n ),\n );\n return Promise.resolve(false);\n }\n return Notification.requestPermission().then(permission => {\n return permission === 'granted';\n });\n}\n","import React, {Fragment} from 'react';\nimport {Route} from 'react-router-dom';\nimport {AuthRoute} from '../auth/guards/auth-route';\nimport {NotificationsPage} from './notifications-page';\nimport {NotificationSettingsPage} from './subscriptions/notification-settings-page';\nimport {ActiveWorkspaceProvider} from '../workspace/active-workspace-id-context';\n\nexport const NotificationRoutes = (\n <Fragment>\n <Route\n path=\"/notifications\"\n element={\n <AuthRoute>\n <ActiveWorkspaceProvider>\n <NotificationsPage />\n </ActiveWorkspaceProvider>\n </AuthRoute>\n }\n />\n <Route\n path=\"/notifications/settings\"\n element={\n <AuthRoute>\n <NotificationSettingsPage />\n </AuthRoute>\n }\n />\n </Fragment>\n);\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '../http/query-client';\nimport {useTrans} from '../i18n/use-trans';\nimport {BackendResponse} from '../http/backend-response/backend-response';\nimport {toast} from '../ui/toast/toast';\nimport {message} from '../i18n/message';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '../errors/on-form-query-error';\nimport {useNavigate} from '../utils/hooks/use-navigate';\n\ninterface Response extends BackendResponse {}\n\nexport interface ContactPagePayload {\n name: string;\n email: string;\n message: string;\n}\n\nexport function useSubmitContactForm(form: UseFormReturn<ContactPagePayload>) {\n const {trans} = useTrans();\n const navigate = useNavigate();\n\n return useMutation({\n mutationFn: (props: ContactPagePayload) => submitContactForm(props),\n onSuccess: () => {\n toast(trans(message('Your message has been submitted.')));\n navigate('/');\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction submitContactForm(payload: ContactPagePayload): Promise<Response> {\n return apiClient.post('contact-page', payload).then(r => r.data);\n}\n","import {Trans} from '../i18n/trans';\nimport {Navbar} from '../ui/navigation/navbar/navbar';\nimport {Form} from '../ui/forms/form';\nimport {useForm} from 'react-hook-form';\nimport {\n ContactPagePayload,\n useSubmitContactForm,\n} from './use-submit-contact-form';\nimport {FormTextField} from '../ui/forms/input-field/text-field/text-field';\nimport {Button} from '../ui/buttons/button';\nimport {useRecaptcha} from '../recaptcha/use-recaptcha';\nimport {StaticPageTitle} from '../seo/static-page-title';\nimport {Footer} from '@common/ui/footer/footer';\n\nexport function ContactUsPage() {\n const form = useForm<ContactPagePayload>();\n const submitForm = useSubmitContactForm(form);\n const {verify, isVerifying} = useRecaptcha('contact');\n\n return (\n <div className=\"flex flex-col bg-alt min-h-screen\">\n <StaticPageTitle>\n <Trans message=\"Contact us\" />\n </StaticPageTitle>\n <Navbar\n className=\"flex-shrink-0 sticky top-0\"\n menuPosition=\"contact-us-page\"\n />\n <div className=\"container p-24 md:p-40 mx-auto flex-auto flex items-center justify-center\">\n <div className=\"border rounded bg-paper p-24 max-w-620\">\n <h1 className=\"text-2xl\">\n <Trans message=\"Contact us\" />\n </h1>\n <p className=\"text-sm mt-4 mb-30\">\n <Trans message=\"Please use the form below to send us a message and we'll get back to you as soon as possible.\" />\n </p>\n <Form\n form={form}\n onSubmit={async value => {\n const isValid = await verify();\n if (isValid) {\n submitForm.mutate(value);\n }\n }}\n >\n <FormTextField\n label={<Trans message=\"Name\" />}\n name=\"name\"\n required\n className=\"mb-20\"\n />\n <FormTextField\n label={<Trans message=\"Email\" />}\n name=\"email\"\n required\n type=\"email\"\n className=\"mb-20\"\n />\n <FormTextField\n label={<Trans message=\"Message\" />}\n name=\"message\"\n required\n inputElementType=\"textarea\"\n className=\"mb-20\"\n rows={8}\n />\n <Button\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n disabled={submitForm.isPending || isVerifying}\n >\n <Trans message=\"Send\" />\n </Button>\n </Form>\n </div>\n </div>\n <Footer className=\"container mx-auto px-24 flex-shrink-0\" />\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ShareIcon = createSvgIcon(\n <path d=\"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92c0-1.61-1.31-2.92-2.92-2.92zM18 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM6 13c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm12 7.02c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\" />\n, 'ShareOutlined');\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CopyLinkIcon = createSvgIcon(\n <path d=\"M 4 2 C 2.895 2 2 2.895 2 4 L 2 18 L 4 18 L 4 4 L 18 4 L 18 2 L 4 2 z M 8 6 C 6.895 6 6 6.895 6 8 L 6 20 C 6 21.105 6.895 22 8 22 L 20 22 C 21.105 22 22 21.105 22 20 L 22 8 C 22 6.895 21.105 6 20 6 L 8 6 z M 8 8 L 20 8 L 20 20 L 8 20 L 8 8 z M 16 9.0058594 C 15.230215 9.0058594 14.460443 9.2973698 13.878906 9.8789062 L 12.607422 11.150391 L 14.021484 12.564453 L 12.556641 14.029297 L 11.142578 12.615234 L 9.8789062 13.878906 C 8.7158332 15.041979 8.7158332 16.958021 9.8789062 18.121094 C 10.460397 18.702585 11.234094 19 12 19 C 12.765906 19 13.539603 18.702585 14.121094 18.121094 L 15.384766 16.857422 L 13.970703 15.443359 L 15.457031 13.957031 L 14.042969 12.542969 L 15.292969 11.292969 C 15.691896 10.894042 16.308104 10.894042 16.707031 11.292969 C 17.105958 11.691896 17.105958 12.308104 16.707031 12.707031 L 15.464844 13.949219 L 16.878906 15.363281 L 18.121094 14.121094 C 19.284167 12.958021 19.284167 11.041979 18.121094 9.8789062 C 17.539557 9.2973698 16.769785 9.0058594 16 9.0058594 z M 12.542969 14.042969 L 13.957031 15.457031 L 12.707031 16.707031 C 12.506522 16.90754 12.258094 17 12 17 C 11.741906 17 11.493478 16.90754 11.292969 16.707031 C 10.894042 16.308104 10.894042 15.691896 11.292969 15.292969 L 12.542969 14.042969 z\"></path>\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const QrCode2Icon = createSvgIcon(\n <path d=\"M15 21h-2v-2h2v2zm-2-7h-2v5h2v-5zm8-2h-2v4h2v-4zm-2-2h-2v2h2v-2zM7 12H5v2h2v-2zm-2-2H3v2h2v-2zm7-5h2V3h-2v2zm-7.5-.5v3h3v-3h-3zM9 9H3V3h6v6zm-4.5 7.5v3h3v-3h-3zM9 21H3v-6h6v6zm7.5-16.5v3h3v-3h-3zM21 9h-6V3h6v6zm-2 10v-3h-4v2h2v3h4v-2h-2zm-2-7h-4v2h4v-2zm-4-2H7v2h2v2h2v-2h2v-2zm1-1V7h-2V5h-2v4h4zM6.75 5.25h-1.5v1.5h1.5v-1.5zm0 12h-1.5v1.5h1.5v-1.5zm12-12h-1.5v1.5h1.5v-1.5z\" />\n, 'QrCode2Outlined');\n","export type ShareableNetworks =\n | 'facebook'\n | 'twitter'\n | 'pinterest'\n | 'tumblr'\n | 'blogger'\n | 'mail';\n\nexport function shareLinkSocially(\n network: ShareableNetworks,\n link: string,\n name?: string,\n image?: string\n) {\n const url = generateShareUrl(network, link, name, image);\n\n if (network === 'mail') {\n window.location.href = url;\n } else {\n openNewWindow(url);\n }\n}\n\nfunction openNewWindow(url: string) {\n const width = 575,\n height = 400,\n left = (window.innerWidth - width) / 2,\n top = (window.innerHeight - height) / 2,\n opts =\n 'status=1, scrollbars=1' +\n ',width=' +\n width +\n ',height=' +\n height +\n ',top=' +\n top +\n ',left=' +\n left;\n\n window.open(url, 'share', opts);\n}\n\nfunction generateShareUrl(\n type: ShareableNetworks,\n link: string,\n name?: string,\n image?: string\n): string {\n switch (type) {\n case 'facebook':\n return 'https://www.facebook.com/sharer/sharer.php?u=' + link;\n case 'twitter':\n return `https://twitter.com/intent/tweet?text=${name}&url=${link}`;\n case 'pinterest':\n return (\n 'https://pinterest.com/pin/create/button/?url=' +\n link +\n '&media=' +\n image\n );\n case 'tumblr':\n const base =\n 'https://www.tumblr.com/widgets/share/tool?shareSource=legacy&canonicalUrl=&posttype=photo&title=&caption=';\n return base + name + '&content=' + image + '&url=' + link;\n case 'blogger':\n return (\n 'https://www.blogger.com/blog_this.pyra?t&u=' + link + '&n=' + name\n );\n case 'mail':\n return `mailto:?subject=Check out this link.&body=${link}`;\n }\n}\n","import {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {ShareIcon} from '@common/icons/material/Share';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from '@app/dashboard/links/link';\nimport {CopyLinkIcon} from '@app/dashboard/links/sharing/copy-link-icon';\nimport {QrCode2Icon} from '@common/icons/material/QrCode2';\nimport {FacebookIcon} from '@common/icons/social/facebook';\nimport {TwitterIcon} from '@common/icons/social/twitter';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport useClipboard from 'react-use-clipboard';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {shareLinkSocially} from '@common/utils/urls/share-link-socially';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {Button} from '@common/ui/buttons/button';\nimport {IconButton} from '@common/ui/buttons/icon-button';\n\ninterface ShareLinkButtonProps {\n link: Link | LinkGroup | Biolink;\n variant?: 'icon' | 'text';\n className?: string;\n}\nexport function ShareLinkButton({\n link,\n className,\n variant = 'icon',\n}: ShareLinkButtonProps) {\n const {base_url} = useSettings();\n const {trans} = useTrans();\n\n let url: string;\n if ('short_url' in link && link.short_url) {\n url = link.short_url;\n } else {\n url = `${base_url}/${link.hash}`;\n }\n const [, setUrlCopied] = useClipboard(url);\n const [, setQrCopied] = useClipboard(`${url}/qr`);\n\n const trigger =\n variant === 'text' ? (\n <Button className={className} startIcon={<ShareIcon />} variant=\"text\">\n <Trans message=\"Share\" />\n </Button>\n ) : (\n <IconButton className={className}>\n <ShareIcon />\n </IconButton>\n );\n\n return (\n <MenuTrigger>\n <Tooltip label={<Trans message=\"Share\" />}>{trigger}</Tooltip>\n <Menu>\n <Item\n value=\"clipboard\"\n startIcon={<CopyLinkIcon />}\n onSelected={() => {\n setUrlCopied();\n toast.positive(message('Copied link to clipboard'));\n }}\n >\n <Trans message=\"Copy to clipboard\" />\n </Item>\n <Item\n value=\"qr\"\n startIcon={<QrCode2Icon />}\n onClick={() => {\n setQrCopied();\n toast.positive(message('Copied QR code link to clipboard'));\n }}\n >\n <Trans message=\"Copy QR code\" />\n </Item>\n <Item\n value=\"facebook\"\n startIcon={<FacebookIcon />}\n onClick={() => {\n shareLinkSocially(\n 'facebook',\n url,\n trans(message('Check out this link'))\n );\n }}\n >\n <Trans message=\"Share to facebook\" />\n </Item>\n <Item\n value=\"twitter\"\n startIcon={<TwitterIcon />}\n onClick={() => {\n shareLinkSocially(\n 'twitter',\n url,\n trans(message('Check out this link'))\n );\n }}\n >\n <Trans message=\"Share to twitter\" />\n </Item>\n </Menu>\n </MenuTrigger>\n );\n}\n","import {Link} from '@app/dashboard/links/link';\n\nexport function buildLongUrlWithUtm(link: Link): string {\n const url = new URL(link.long_url);\n if (link.utm) {\n new URLSearchParams(link.utm).forEach((key, value) => {\n url.searchParams.append(key, value);\n });\n }\n return url.toString();\n}\n","import {Link} from '@app/dashboard/links/link';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useCallback, useEffect, useRef, useState} from 'react';\nimport {buildLongUrlWithUtm} from '@app/dashboard/links/utils/build-long-url-with-utm';\nimport {Trans} from '@common/i18n/trans';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\n\ninterface RedirectCountdownButtonProps extends ButtonProps {\n link: Link;\n}\nexport function RedirectCountdownButton({\n link,\n ...buttonProps\n}: RedirectCountdownButtonProps) {\n const {\n links: {redirect_time = 0}, // in seconds\n } = useSettings();\n\n const intervalRef = useRef<any>(null);\n const countDownRef = useRef(redirect_time);\n const [countdown, setCountdown] = useState(countDownRef.current);\n\n const redirectToLongUrl = useCallback(() => {\n window.location.href = buildLongUrlWithUtm(link);\n }, [link]);\n\n useEffect(() => {\n if (!redirect_time) {\n return;\n }\n\n intervalRef.current = setInterval(() => {\n countDownRef.current--;\n if (countDownRef.current <= 0 && intervalRef.current) {\n clearInterval(intervalRef.current);\n redirectToLongUrl();\n }\n setCountdown(countDownRef.current);\n }, 1000);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [redirect_time, setCountdown, redirectToLongUrl]);\n\n const buttonText =\n countdown > 0 ? (\n <Trans message=\"Redirect in :seconds\" values={{seconds: countdown}} />\n ) : (\n <Trans message=\"Go to link\" />\n );\n\n return (\n <Button\n {...buttonProps}\n className=\"min-w-128\"\n onClick={() => {\n if (countdown <= 0) {\n redirectToLongUrl();\n }\n }}\n >\n {buttonText}\n </Button>\n );\n}\n","import {Link} from '@app/dashboard/links/link';\nimport {Navbar} from '@common/ui/navigation/navbar/navbar';\nimport {CustomPageBody} from '@common/custom-page/custom-page-body';\nimport {Footer} from '@common/ui/footer/footer';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {RedirectCountdownButton} from '@app/short-links/renderers/redirect-countdown-button';\n\ninterface LinkPageRendererProps {\n link: Link;\n}\nexport function LinkPageRenderer({link}: LinkPageRendererProps) {\n const page = link.custom_page!;\n const {hideNavbar, hideFooter} = page.meta || {};\n return (\n <div className=\"flex flex-col min-h-screen\">\n {!hideNavbar && <LinkPageNavbar link={link} />}\n <AdHost slot=\"link_page\" className=\"mt-70 mb-20pa\" />\n <div className=\"flex-auto\">\n <CustomPageBody page={page} />\n </div>\n {!hideFooter && <Footer className=\"mx-14 md:mx-40\" />}\n </div>\n );\n}\n\ninterface LinkPageNavbarProps {\n link: Link;\n}\nfunction LinkPageNavbar({link}: LinkPageNavbarProps) {\n return (\n <Navbar\n menuPosition=\"link-page-navbar\"\n className=\"flex-shrink-0 sticky top-0\"\n rightChildren={<ShareLinkButton link={link} />}\n >\n <RedirectCountdownButton variant=\"flat\" color=\"paper\" link={link} />\n </Navbar>\n );\n}\n","import {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport clsx from 'clsx';\nimport {Button} from '@common/ui/buttons/button';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\n\ntype Overlay = LinkOverlay | CrupdateLinkOverlayPayload;\n\ninterface LinkOverlayProps {\n overlay: Overlay;\n}\nexport function FloatingLinkOverlay({overlay}: LinkOverlayProps) {\n const colors = overlay.colors || {};\n return (\n <div\n style={{\n backgroundColor: colors['bg-color'],\n backgroundImage: colors['bg-image'] ? `url(${colors['bg-image']})` : '',\n color: colors['text-color'],\n }}\n className={clsx(\n 'absolute max-w-[calc(100%-14px)] p-16 overflow-hidden shadow-lg bg-cover bg text-main',\n getOverlayPositionClass(overlay),\n getOverlayThemeClass(overlay.theme)\n )}\n >\n {overlay.label && (\n <div\n className={clsx(\n 'absolute w-84 h-[88px]',\n overlay.theme === 'pill' ? 'top-4 right-4' : '-top-4 -right-4'\n )}\n >\n <div\n className=\"relative -left-4 top-14 w-[120px] rotate-45 text-sm py-4 text-center shadow\"\n style={{\n background: colors['label-bg-color'],\n color: colors['label-color'],\n }}\n >\n {overlay.label}\n </div>\n </div>\n )}\n {overlay.message && (\n <div\n className={clsx(\n 'text-sm',\n overlay.theme === 'full-width' ? 'mb-14' : 'my-14'\n )}\n >\n {overlay.message}\n </div>\n )}\n {overlay.btn_text && (\n <Button\n size=\"sm\"\n style={{\n borderColor: colors['btn-bg-color'],\n background: colors['btn-bg-color'],\n color: colors['btn-text-color'],\n }}\n variant=\"flat\"\n color=\"primary\"\n elementType=\"a\"\n href={overlay.btn_link}\n tabIndex={0}\n >\n {overlay.btn_text}\n </Button>\n )}\n </div>\n );\n}\n\nfunction getOverlayPositionClass(overlay: Overlay) {\n // full width overlay can only be top or bottom\n if (overlay.theme === 'full-width') {\n return overlay.position.startsWith('top')\n ? 'top-14 left-14'\n : 'bottom-14 left-14';\n }\n\n switch (overlay.position) {\n case 'top-left':\n return 'top-14 left-14';\n case 'top-right':\n return 'top-14 right-14';\n case 'bottom-left':\n return 'bottom-14 left-14';\n case 'bottom-right':\n return 'bottom-14 right-14';\n }\n}\n\nfunction getOverlayThemeClass(theme: LinkOverlay['theme']) {\n const defaultWidth = 'w-350';\n switch (theme) {\n case 'default':\n return `rounded p-16 ${defaultWidth}`;\n case 'rounded':\n return `rounded-lg p-16 ${defaultWidth}`;\n case 'pill':\n return `rounded-full px-30 pb-24 pt-14 ${defaultWidth}`;\n case 'full-width':\n return 'rounded w-full flex items-center justify-center flex-col';\n }\n}\n","import {Link} from '@app/dashboard/links/link';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {FloatingLinkOverlay} from '@app/short-links/floating-link-overlay';\n\ninterface LinkPageRendererProps {\n link: Link;\n}\nexport function LinkOverlayRenderer({link}: LinkPageRendererProps) {\n return (\n <div className=\"flex flex-col h-screen relative\">\n <AdHost slot=\"frame\" className=\"my-20\" />\n {link.overlay && <FloatingLinkOverlay overlay={link.overlay} />}\n <iframe src={link.long_url} className=\"flex-auto\" />\n </div>\n );\n}\n","import {Link} from '@app/dashboard/links/link';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {Navbar} from '@common/ui/navigation/navbar/navbar';\n\ninterface LinkPageRendererProps {\n link: Link;\n}\nexport function LinkIframeRenderer({link}: LinkPageRendererProps) {\n return (\n <div className=\"flex flex-col h-screen relative\">\n <Navbar\n menuPosition=\"link-page-navbar\"\n className=\"flex-shrink-0 sticky top-0\"\n rightChildren={<ShareLinkButton link={link} />}\n />\n <AdHost slot=\"frame\" className=\"my-20\" />\n <iframe src={link.long_url} className=\"flex-auto\" />\n </div>\n );\n}\n","import {Trans} from '@common/i18n/trans';\nimport {Link} from '@app/dashboard/links/link';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {Navbar} from '@common/ui/navigation/navbar/navbar';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {Footer} from '@common/ui/footer/footer';\nimport {RedirectCountdownButton} from '@app/short-links/renderers/redirect-countdown-button';\nimport {Button} from '@common/ui/buttons/button';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {Link as RouterLink} from 'react-router-dom';\n\ninterface LinkPageRendererProps {\n link: Link;\n}\nexport function LinkSplashRenderer({link}: LinkPageRendererProps) {\n const {base_url} = useSettings();\n return (\n <div className=\"flex flex-col w-full h-screen bg-alt\">\n <Navbar\n menuPosition=\"link-page-navbar\"\n rightChildren={<ShareLinkButton link={link} />}\n />\n <div className=\"container flex-auto flex flex-col items-center justify-center mx-auto px-24\">\n <AdHost slot=\"splash_top\" className=\"mt-20 mb-60 flex-shrink-0\" />\n <div className=\"border rounded md:flex gap-24 p-20 bg-paper flex-shrink-0\">\n <img\n src={`${base_url}/${link.hash}/img`}\n alt=\"\"\n className=\"flex-shrink-0 border w-320 h-240 rounded max-w-full object-contain\"\n />\n <div>\n <h1 className=\"text-2xl mt-24 md:mt-0 mb-24\">\n <Trans message=\"You are about to be redirected to another page.\" />\n </h1>\n <div>\n <RedirectCountdownButton\n variant=\"flat\"\n color=\"primary\"\n link={link}\n />\n <Button className=\"ml-10\" elementType={RouterLink} to=\"/\">\n <Trans message=\"Go back\" />\n </Button>\n </div>\n <div className=\"text-sm text-muted border-t mt-24 pt-24\">\n <Trans message=\"You are about to be redirected to another page. We are not responsible for the content of that page or the consequences it may have on you.\" />\n </div>\n </div>\n </div>\n <AdHost slot=\"splash_bottom\" className=\"mt-60 mb-20 flex-shrink-0\" />\n </div>\n <Footer className=\"px-24\" />\n </div>\n );\n}\n","export function removeProtocol(url: string) {\n if (!url) return url;\n return url.replace(/(^\\w+:|^)\\/\\//, '');\n}\n","import {isAbsoluteUrl} from '../utils/urls/is-absolute-url';\nimport memoize from 'nano-memoize';\nimport clsx from 'clsx';\n\ninterface RemoteFaviconProps {\n url: string;\n className?: string;\n size?: string;\n alt?: string;\n}\nexport function RemoteFavicon({\n url,\n className,\n size = 'w-16 h-16',\n alt,\n}: RemoteFaviconProps) {\n if (!url) {\n return null;\n }\n\n const src = getFaviconSrc(url);\n\n return (\n <img\n className={clsx(size, className)}\n src={getFaviconSrc(url)}\n alt={alt || `${src} favicon`}\n />\n );\n}\n\nconst getFaviconSrc = memoize((url: string): string => {\n if (url.includes('youtube')) {\n return 'https://www.youtube.com/s/desktop/ca54e1bd/img/favicon.ico';\n }\n\n // relative url to current site\n if (!isAbsoluteUrl(url)) {\n url = `${window.location.protocol}//${window.location.host}`;\n }\n const domain = new URL(url).origin;\n return 'https://www.google.com/s2/favicons?domain=' + domain;\n});\n","import {Link} from '../link';\nimport {LinkGroup} from '../../link-groups/link-group';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport useClipboard from 'react-use-clipboard';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CopyLinkIcon} from './copy-link-icon';\nimport {Button} from '@common/ui/buttons/button';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {ComponentProps} from 'react';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\n\ninterface LinkClipboardButtonProps\n extends Omit<ComponentProps<typeof Button>, 'variant'> {\n link: Link | LinkGroup;\n variant: 'icon' | 'text';\n}\nexport function LinkClipboardButton({\n link,\n variant,\n ...domProps\n}: LinkClipboardButtonProps) {\n const {base_url} = useSettings();\n let url: string;\n if ('short_url' in link && link.short_url) {\n url = link.short_url;\n } else {\n url = `${base_url}/${link.hash}`;\n }\n const [, setCopied] = useClipboard(url);\n\n if (variant === 'text') {\n return (\n <ButtonBase\n {...domProps}\n onClick={() => {\n setCopied();\n toast.positive(message('Copied to clipboard'));\n }}\n >\n {removeProtocol(url)}\n </ButtonBase>\n );\n }\n\n return (\n <Tooltip label={<Trans message=\"Copy to clipboard\" />}>\n <IconButton\n {...domProps}\n onClick={() => {\n setCopied();\n toast.positive(message('Copied to clipboard'));\n }}\n >\n <CopyLinkIcon />\n </IconButton>\n </Tooltip>\n );\n}\n","import React, {ReactNode, useEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {UseInfiniteQueryResult} from '@tanstack/react-query/src/types';\nimport {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\n\nexport interface InfiniteScrollSentinelProps {\n loaderMarginTop?: string;\n children?: ReactNode;\n loadMoreExtraContent?: ReactNode;\n query: UseInfiniteQueryResult;\n style?: React.CSSProperties;\n className?: string;\n variant?: 'infiniteScroll' | 'loadMore';\n size?: 'sm' | 'md';\n}\nexport function InfiniteScrollSentinel({\n query: {isInitialLoading, fetchNextPage, isFetchingNextPage, hasNextPage},\n children,\n loaderMarginTop = 'mt-24',\n style,\n className,\n variant: _variant = 'infiniteScroll',\n loadMoreExtraContent,\n size = 'md',\n}: InfiniteScrollSentinelProps) {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const isLoading = isFetchingNextPage || isInitialLoading;\n const [loadMoreClickCount, setLoadMoreClickCount] = useState(0);\n const innerVariant =\n _variant === 'loadMore' && loadMoreClickCount < 3\n ? 'loadMore'\n : 'infiniteScroll';\n\n useEffect(() => {\n const sentinelEl = sentinelRef.current;\n if (!sentinelEl || innerVariant === 'loadMore') return;\n const observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting && hasNextPage && !isLoading) {\n fetchNextPage();\n }\n });\n observer.observe(sentinelEl);\n return () => {\n observer.unobserve(sentinelEl);\n };\n }, [fetchNextPage, hasNextPage, isLoading, innerVariant]);\n\n let content: ReactNode;\n\n if (children) {\n // children might already be wrapped in AnimatePresence, so only wrap default loader with it\n content = isFetchingNextPage ? children : null;\n } else if (innerVariant === 'loadMore') {\n content = !isInitialLoading && hasNextPage && (\n <div className={clsx('flex items-center gap-8', loaderMarginTop)}>\n {loadMoreExtraContent}\n <Button\n size={size === 'md' ? 'sm' : 'xs'}\n className={clsx(\n size === 'sm' ? 'min-h-24 min-w-96' : 'min-h-36 min-w-112'\n )}\n variant=\"outline\"\n color=\"primary\"\n onClick={() => {\n fetchNextPage();\n setLoadMoreClickCount(loadMoreClickCount + 1);\n }}\n disabled={isLoading}\n >\n {loadMoreClickCount >= 2 && !isFetchingNextPage ? (\n <Trans message=\"Load all\" />\n ) : (\n <Trans message=\"Show more\" />\n )}\n </Button>\n </div>\n );\n } else {\n content = (\n <AnimatePresence>\n {isFetchingNextPage && (\n <m.div\n className={clsx('flex justify-center w-full', loaderMarginTop)}\n {...opacityAnimation}\n >\n <ProgressCircle size={size} isIndeterminate aria-label=\"loading\" />\n </m.div>\n )}\n </AnimatePresence>\n );\n }\n\n return (\n <div\n style={style}\n className={clsx('w-full', className, hasNextPage && 'min-h-36')}\n role=\"presentation\"\n >\n <div ref={sentinelRef} aria-hidden />\n {content}\n </div>\n );\n}\n","export default \"__VITE_ASSET__740d6972__\"","import {BackendResponse} from './backend-response';\n\nexport interface LengthAwarePaginationResponse<T> {\n data: T[];\n from: number;\n to: number;\n total: number;\n per_page: number;\n current_page: number;\n last_page: number;\n next_page: number;\n prev_page: number;\n}\n\nexport interface SimplePaginationResponse<T> {\n data: T[];\n from: number;\n to: number;\n per_page: number;\n current_page: number;\n}\n\ninterface CursorPaginationResponse<T> {\n data: T[];\n next_cursor: string | null;\n per_page: number;\n prev_cursor: string | null;\n}\n\nexport type PaginationResponse<T> =\n | LengthAwarePaginationResponse<T>\n | SimplePaginationResponse<T>\n | CursorPaginationResponse<T>;\n\nexport const EMPTY_PAGINATION_RESPONSE = {\n pagination: {data: [], from: 0, to: 0, per_page: 15, current_page: 1},\n};\n\nexport interface PaginatedBackendResponse<T> extends BackendResponse {\n pagination: PaginationResponse<T>;\n}\n\nexport function hasNextPage(pagination: PaginationResponse<unknown>): boolean {\n if ('next_cursor' in pagination) {\n return pagination.next_cursor != null;\n }\n\n if ('last_page' in pagination) {\n return pagination.current_page < pagination.last_page;\n }\n\n return (\n pagination.data.length > 0 && pagination.data.length >= pagination.per_page\n );\n}\n","import {\n hashKey,\n InfiniteData,\n keepPreviousData,\n useInfiniteQuery,\n UseInfiniteQueryResult,\n} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {\n hasNextPage,\n PaginationResponse,\n} from '@common/http/backend-response/pagination-response';\nimport {useMemo, useRef, useState} from 'react';\nimport {SortDescriptor} from '@common/ui/tables/types/sort-descriptor';\nimport {GetDatatableDataParams} from '@common/datatable/requests/paginated-resources';\nimport {QueryKey} from '@tanstack/query-core/src/types';\n\nexport type UseInfiniteDataResult<\n T,\n E extends object = object,\n> = UseInfiniteQueryResult<InfiniteData<PaginationResponse<T> & E>> & {\n items: T[];\n totalItems: number | null;\n // initial load is done and no results were returned from backend\n noResults: boolean;\n // true when changing filters or sorting, not on initial load, background fetch or infinite load\n isReloading: boolean;\n sortDescriptor: SortDescriptor;\n setSortDescriptor: (sortDescriptor: SortDescriptor) => void;\n searchQuery: string;\n setSearchQuery: (searchQuery: string) => void;\n};\n\nfunction buildQueryKey(\n {\n queryKey,\n defaultOrderDir,\n defaultOrderBy,\n queryParams,\n }: UseInfiniteDataProps<any>,\n sortDescriptor: SortDescriptor,\n searchQuery: string = '',\n) {\n // make sure to always set default order dir and col so query keys are consistent\n if (!sortDescriptor.orderBy) {\n sortDescriptor.orderBy = defaultOrderBy;\n }\n if (!sortDescriptor.orderDir) {\n sortDescriptor.orderDir = defaultOrderDir;\n }\n return [...queryKey, sortDescriptor, searchQuery, queryParams];\n}\n\ninterface Response<T> extends BackendResponse {\n pagination: PaginationResponse<T>;\n}\n\nexport interface UseInfiniteDataProps<T> {\n initialPage?: PaginationResponse<T> | null;\n queryKey: QueryKey;\n queryParams?: Record<string, string | number | null>;\n endpoint: string;\n defaultOrderBy?: SortDescriptor['orderBy'];\n defaultOrderDir?: SortDescriptor['orderDir'];\n // whether user can sort items manually (table header, dropdown, etc)\n willSortOrFilter?: boolean;\n // ordering is not available with cursor pagination\n paginate?: 'simple' | 'lengthAware' | 'cursor';\n transformResponse?: (response: Response<T>) => Response<T>;\n}\nexport function useInfiniteData<T, E extends object = {}>(\n props: UseInfiniteDataProps<T>,\n): UseInfiniteDataResult<T, E> {\n const {\n initialPage,\n endpoint,\n defaultOrderBy,\n defaultOrderDir,\n queryParams,\n paginate,\n transformResponse,\n willSortOrFilter = false,\n } = props;\n const [searchQuery, setSearchQuery] = useState('');\n const [sortDescriptor, setSortDescriptor] = useState<SortDescriptor>({\n orderBy: defaultOrderBy,\n orderDir: defaultOrderDir,\n });\n\n const queryKey = buildQueryKey(props, sortDescriptor, searchQuery);\n const initialQueryKey = useRef(hashKey(queryKey)).current;\n\n const query = useInfiniteQuery({\n placeholderData: willSortOrFilter ? keepPreviousData : undefined,\n queryKey,\n queryFn: ({pageParam, signal}) => {\n const params: GetDatatableDataParams = {\n ...queryParams,\n perPage: initialPage?.per_page || queryParams?.perPage,\n query: searchQuery,\n paginate,\n ...sortDescriptor,\n };\n if (paginate === 'cursor') {\n params.cursor = pageParam;\n } else {\n params.page = pageParam || 1;\n }\n return fetchData<T>(endpoint, params, transformResponse, signal);\n },\n initialPageParam: paginate === 'cursor' ? '' : 1,\n getNextPageParam: lastResponse => {\n if (!hasNextPage(lastResponse.pagination)) {\n return null;\n }\n if ('next_cursor' in lastResponse.pagination) {\n return lastResponse.pagination.next_cursor;\n }\n return lastResponse.pagination.current_page + 1;\n },\n initialData: () => {\n // initial data will be for initial query key only, remove\n // initial data if query key changes, so query is reset\n if (!initialPage || hashKey(queryKey) !== initialQueryKey) {\n return undefined;\n }\n\n return {\n pageParams: [undefined, 1],\n pages: [{pagination: initialPage}],\n };\n },\n });\n\n const items = useMemo(() => {\n return query.data?.pages.flatMap(p => p.pagination.data) || [];\n }, [query.data?.pages]);\n\n const firstPage = query.data?.pages[0].pagination;\n const totalItems =\n firstPage && 'total' in firstPage && firstPage.total\n ? firstPage.total\n : null;\n\n return {\n ...query,\n items,\n totalItems,\n noResults: query.data?.pages?.[0].pagination.data.length === 0,\n // can't use \"isRefetching\", it's true for some reason when changing sorting or filters\n isReloading:\n query.isFetching && !query.isFetchingNextPage && query.isPlaceholderData,\n sortDescriptor,\n setSortDescriptor,\n searchQuery,\n setSearchQuery,\n } as UseInfiniteDataResult<T, E>;\n}\n\nasync function fetchData<T>(\n endpoint: string,\n params: GetDatatableDataParams,\n transformResponse?: UseInfiniteDataProps<T>['transformResponse'],\n signal?: AbortSignal,\n): Promise<Response<T>> {\n if (params.query) {\n await new Promise(resolve => setTimeout(resolve, 300));\n }\n return apiClient\n .get(endpoint, {params, signal: params.query ? signal : undefined})\n .then(r => {\n if (transformResponse) {\n return transformResponse(r.data);\n }\n return r.data;\n });\n}\n","import {Navbar} from '@common/ui/navigation/navbar/navbar';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport clsx from 'clsx';\nimport {LinkClipboardButton} from '@app/dashboard/links/sharing/link-clipboard-button';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {Link} from '@app/dashboard/links/link';\nimport {Fragment, ReactElement} from 'react';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport shareLink from '@app/dashboard/links/share-link.svg';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {Trans} from '@common/i18n/trans';\nimport {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\n\ninterface LinkGroupRendererProps {\n linkGroup: LinkGroup;\n}\nexport function LinkGroupRenderer({linkGroup}: LinkGroupRendererProps) {\n const query = useInfiniteData<Link>({\n willSortOrFilter: true,\n queryKey: ['link-group', linkGroup.id, 'links'],\n endpoint: `link-group/${linkGroup.id}/links`,\n paginate: 'simple',\n });\n\n let content: ReactElement;\n\n if (query.isLoading) {\n content = <Skeletons key=\"skeletons\" />;\n } else if (query.noResults) {\n content = (\n <IllustratedMessage\n className=\"mt-80\"\n image={<SvgImage src={shareLink} />}\n title={<Trans message=\"Nothing to show\" />}\n description={<Trans message=\"This group does not have any links yet\" />}\n key=\"illustration\"\n />\n );\n } else {\n content = <LinkList key=\"linkList\" data={query.items} />;\n }\n\n return (\n <div className=\"bg-alt flex flex-col min-h-screen\">\n <Navbar\n menuPosition=\"link-page-navbar\"\n className=\"sticky top-0 flex-shrink-0\"\n />\n <div className=\"container mx-auto px-24 py-40 flex-auto\">\n <h1 className=\"text-3xl mb-40\">{linkGroup.name}</h1>\n <div>\n <AnimatePresence initial={false} mode=\"wait\">\n {content}\n </AnimatePresence>\n <InfiniteScrollSentinel query={query} />\n </div>\n </div>\n </div>\n );\n}\n\ninterface LinkListProps {\n data?: Link[];\n}\nfunction LinkList({data}: LinkListProps) {\n return (\n <Fragment>\n {data?.map(link => (\n <m.div\n {...opacityAnimation}\n key={link.id}\n className=\"p-20 shadow rounded-lg mb-20 bg-paper\"\n >\n <div className=\"flex items-center gap-8\">\n <RemoteFavicon url={link.long_url} />\n <a\n target=\"_blank\"\n href={link.long_url}\n className={clsx(LinkStyle, 'font-medium')}\n rel=\"noreferrer\"\n >\n {removeProtocol(link.long_url)}\n </a>\n </div>\n <LinkClipboardButton\n link={link}\n variant=\"text\"\n className=\"text-sm hover:underline\"\n />\n {link.description && (\n <div className=\"text-muted text-sm mt-14\">{link.description}</div>\n )}\n </m.div>\n ))}\n </Fragment>\n );\n}\n\nfunction Skeletons() {\n const skeletons = Array.from(Array(10).keys());\n return (\n <m.div {...opacityAnimation} key=\"skeleton\">\n {skeletons.map(skeleton => (\n <m.div className=\"p-20 shadow rounded-lg mb-20 bg-paper\" key={skeleton}>\n <Skeleton className=\"text-sm mb-14\" />\n <Skeleton className=\"text-xs\" />\n <Skeleton className=\"text-xs\" />\n </m.div>\n ))}\n </m.div>\n );\n}\n","import {SelectedBackground} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/selected-background';\nimport {CSSProperties} from 'react';\nimport {ImageBackground} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-backgrounds';\n\nexport function cssPropsFromBgConfig(\n bgConfig?: Partial<SelectedBackground>\n): CSSProperties | undefined {\n if (bgConfig) {\n const config = bgConfig as ImageBackground;\n return {\n backgroundImage: config.backgroundImage,\n backgroundColor: config.backgroundColor,\n backgroundAttachment: config.backgroundAttachment,\n backgroundSize: config.backgroundSize,\n backgroundRepeat: config.backgroundRepeat,\n backgroundPosition: config.backgroundPosition,\n color: config.color,\n };\n }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ImageIcon = createSvgIcon(\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86-3 3.87L9 13.14 6 17h12l-3.86-5.14z\" />\n, 'ImageOutlined');\n","import {ImageWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/image-widget/image-widget-dialog';\nimport {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport clsx from 'clsx';\nimport {ImageIcon} from '@common/icons/material/Image';\n\nexport function ImageWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<ImageWidget>) {\n const image = widget.config.url ? (\n <img\n className={clsx('object-cover', getImageClassName({widget, variant}))}\n src={widget.config.url}\n alt=\"\"\n />\n ) : (\n <div\n className={clsx(\n getImageClassName({widget, variant}),\n 'flex items-center justify-center'\n )}\n >\n <ImageIcon\n size={variant === 'editor' ? 'sm' : 'lg'}\n className=\"text-muted\"\n />\n </div>\n );\n\n if (widget.config.destinationUrl) {\n return <a href={widget.config.destinationUrl}>{image}</a>;\n }\n return image;\n}\n\nfunction getImageClassName({\n widget,\n variant,\n}: WidgetRendererProps<ImageWidget>) {\n const type = widget.config.type;\n if (variant === 'editor') {\n return `w-20 h-20 ${type === 'avatar' ? 'rounded-full' : 'rounded'}`;\n } else if (type === 'avatar') {\n return 'w-96 h-96 rounded-full mx-auto';\n }\n return 'w-full h-full rounded block';\n}\n","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport clsx from 'clsx';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\n\ninterface VideoEmbedWidgetRenderer {\n variant: WidgetRendererProps['variant'];\n embedUrl: string;\n}\nexport function VideoEmbedWidgetRenderer({\n variant,\n embedUrl,\n}: VideoEmbedWidgetRenderer) {\n if (!embedUrl) return null;\n\n if (variant === 'editor') {\n return (\n <div className=\"flex items-center gap-8\">\n <RemoteFavicon url={embedUrl} />\n <a\n href={embedUrl}\n target=\"_blank\"\n className=\"text-muted text-sm hover:underline\"\n rel=\"noreferrer\"\n >\n {embedUrl}\n </a>\n </div>\n );\n }\n return (\n <iframe\n className={clsx('aspect-video w-full rounded shadow-lg')}\n loading=\"lazy\"\n src={embedUrl}\n allow=\"autoplay; encrypted-media; picture-in-picture\"\n allowFullScreen\n />\n );\n}\n","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport {YoutubeWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/youtube-widget/youtube-widget-dialog';\nimport getVideoId from 'get-video-id';\nimport {VideoEmbedWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/video-embed-widget-renderer';\n\nexport function YoutubeWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<YoutubeWidget>) {\n if (!widget.config.url) return null;\n\n const {id} = getVideoId(widget.config.url);\n const embedUrl = `https://www.youtube.com/embed/${id}`;\n return <VideoEmbedWidgetRenderer variant={variant} embedUrl={embedUrl} />;\n}\n","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport {TextWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/text-widget/text-widget-dialog';\n\nexport function TextWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<TextWidget>) {\n if (!widget.config.title && !widget.config.description) return null;\n\n if (variant === 'editor') {\n return (\n <div className=\"text-sm text-muted whitespace-nowrap overflow-hidden\">\n <div>{widget.config.title}</div>\n <div className=\"overflow-hidden overflow-ellipsis\">\n {widget.config.description}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"text-center mb-30\">\n <div className=\"text-base font-medium\">{widget.config.title}</div>\n <div className=\"text-sm mt-8\">{widget.config.description}</div>\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const EmailIcon = createSvgIcon(\n <path d=\"M22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6zm-2 0-8 5-8-5h16zm0 12H4V8l8 5 8-5v10z\" />\n, 'EmailOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const InstagramIcon = createSvgIcon(\n <path d=\"M12 0C8.74 0 8.333.015 7.053.072 5.775.132 4.905.333 4.14.63c-.789.306-1.459.717-2.126 1.384S.935 3.35.63 4.14C.333 4.905.131 5.775.072 7.053.012 8.333 0 8.74 0 12s.015 3.667.072 4.947c.06 1.277.261 2.148.558 2.913.306.788.717 1.459 1.384 2.126.667.666 1.336 1.079 2.126 1.384.766.296 1.636.499 2.913.558C8.333 23.988 8.74 24 12 24s3.667-.015 4.947-.072c1.277-.06 2.148-.262 2.913-.558.788-.306 1.459-.718 2.126-1.384.666-.667 1.079-1.335 1.384-2.126.296-.765.499-1.636.558-2.913.06-1.28.072-1.687.072-4.947s-.015-3.667-.072-4.947c-.06-1.277-.262-2.149-.558-2.913-.306-.789-.718-1.459-1.384-2.126C21.319 1.347 20.651.935 19.86.63c-.765-.297-1.636-.499-2.913-.558C15.667.012 15.26 0 12 0zm0 2.16c3.203 0 3.585.016 4.85.071 1.17.055 1.805.249 2.227.415.562.217.96.477 1.382.896.419.42.679.819.896 1.381.164.422.36 1.057.413 2.227.057 1.266.07 1.646.07 4.85s-.015 3.585-.074 4.85c-.061 1.17-.256 1.805-.421 2.227-.224.562-.479.96-.899 1.382-.419.419-.824.679-1.38.896-.42.164-1.065.36-2.235.413-1.274.057-1.649.07-4.859.07-3.211 0-3.586-.015-4.859-.074-1.171-.061-1.816-.256-2.236-.421-.569-.224-.96-.479-1.379-.899-.421-.419-.69-.824-.9-1.38-.165-.42-.359-1.065-.42-2.235-.045-1.26-.061-1.649-.061-4.844 0-3.196.016-3.586.061-4.861.061-1.17.255-1.814.42-2.234.21-.57.479-.96.9-1.381.419-.419.81-.689 1.379-.898.42-.166 1.051-.361 2.221-.421 1.275-.045 1.65-.06 4.859-.06l.045.03zm0 3.678c-3.405 0-6.162 2.76-6.162 6.162 0 3.405 2.76 6.162 6.162 6.162 3.405 0 6.162-2.76 6.162-6.162 0-3.405-2.76-6.162-6.162-6.162zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm7.846-10.405c0 .795-.646 1.44-1.44 1.44-.795 0-1.44-.646-1.44-1.44 0-.794.646-1.439 1.44-1.439.793-.001 1.44.645 1.44 1.439z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TiktokIcon = createSvgIcon(\n <path d=\"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const YoutubeIcon = createSvgIcon(\n <path d=\"M 5.6796875 2 L 7.1582031 7.34375 L 7.1582031 9.90625 L 8.4394531 9.90625 L 8.4394531 7.34375 L 9.9375 2 L 8.6464844 2 L 8.109375 4.4316406 C 7.958375 5.1416406 7.8623594 5.6462656 7.8183594 5.9472656 L 7.7792969 5.9472656 C 7.7162969 5.5262656 7.6202813 5.017875 7.4882812 4.421875 L 6.9707031 2 L 5.6796875 2 z M 11.431641 4.0175781 C 10.997641 4.0175781 10.647859 4.1023906 10.380859 4.2753906 C 10.113859 4.4473906 9.9170156 4.7226094 9.7910156 5.0996094 C 9.6660156 5.4766094 9.6035156 5.9756563 9.6035156 6.5976562 L 9.6035156 7.4375 C 9.6035156 8.0525 9.6575781 8.5450156 9.7675781 8.9160156 C 9.8775781 9.2870156 10.063219 9.5603281 10.324219 9.7363281 C 10.585219 9.9123281 10.944344 10 11.402344 10 C 11.848344 10 12.202891 9.9132344 12.462891 9.7402344 C 12.722891 9.5672344 12.911344 9.295875 13.027344 8.921875 C 13.143344 8.547875 13.201172 8.0535 13.201172 7.4375 L 13.201172 6.5976562 C 13.201172 5.9766562 13.142437 5.4794687 13.023438 5.1054688 C 12.904438 4.7324687 12.715031 4.45725 12.457031 4.28125 C 12.199031 4.10525 11.858641 4.0175781 11.431641 4.0175781 z M 13.878906 4.1308594 L 13.878906 8.4453125 C 13.878906 8.9793125 13.968391 9.3720469 14.150391 9.6230469 C 14.332391 9.8740469 14.615047 10 14.998047 10 C 15.550047 10 15.966187 9.7332188 16.242188 9.1992188 L 16.269531 9.1992188 L 16.382812 9.90625 L 17.400391 9.90625 L 17.400391 4.1308594 L 16.101562 4.1308594 L 16.101562 8.71875 C 16.051563 8.82575 15.975094 8.9134219 15.871094 8.9824219 C 15.767094 9.0524219 15.659875 9.0859375 15.546875 9.0859375 C 15.414875 9.0859375 15.320672 9.031875 15.263672 8.921875 C 15.206672 8.811875 15.177734 8.6271406 15.177734 8.3691406 L 15.177734 4.1308594 L 13.878906 4.1308594 z M 11.402344 4.9121094 C 11.584344 4.9121094 11.713156 5.0072187 11.785156 5.1992188 C 11.857156 5.3902187 11.892578 5.694375 11.892578 6.109375 L 11.892578 7.9082031 C 11.892578 8.3352031 11.857156 8.6440312 11.785156 8.8320312 C 11.713156 9.0200312 11.585297 9.1142344 11.404297 9.1152344 C 11.222297 9.1152344 11.096344 9.0200313 11.027344 8.8320312 C 10.957344 8.6440313 10.923828 8.3352031 10.923828 7.9082031 L 10.923828 6.109375 C 10.923828 5.695375 10.95925 5.3912188 11.03125 5.1992188 C 11.10325 5.0082187 11.226344 4.9121094 11.402344 4.9121094 z M 5 11 C 3.9 11 3 11.9 3 13 L 3 20 C 3 21.1 3.9 22 5 22 L 19 22 C 20.1 22 21 21.1 21 20 L 21 13 C 21 11.9 20.1 11 19 11 L 5 11 z M 12.048828 13 L 13.105469 13 L 13.105469 15.568359 L 13.113281 15.568359 C 13.208281 15.382359 13.344531 15.233141 13.519531 15.119141 C 13.694531 15.005141 13.883938 14.949219 14.085938 14.949219 C 14.345937 14.949219 14.549266 15.01825 14.697266 15.15625 C 14.845266 15.29425 14.953531 15.517219 15.019531 15.824219 C 15.085531 16.132219 15.117187 16.559469 15.117188 17.105469 L 15.117188 17.876953 L 15.119141 17.876953 C 15.119141 18.603953 15.030469 19.136516 14.855469 19.478516 C 14.680469 19.820516 14.408109 19.992188 14.037109 19.992188 C 13.830109 19.992188 13.642656 19.944609 13.472656 19.849609 C 13.302656 19.754609 13.174844 19.623984 13.089844 19.458984 L 13.066406 19.458984 L 12.955078 19.919922 L 12.048828 19.919922 L 12.048828 13 z M 5.4863281 13.246094 L 8.7382812 13.246094 L 8.7382812 14.130859 L 7.6484375 14.130859 L 7.6484375 19.919922 L 6.5761719 19.919922 L 6.5761719 14.130859 L 5.4863281 14.130859 L 5.4863281 13.246094 z M 17.097656 14.951172 C 17.473656 14.951172 17.762844 15.020203 17.964844 15.158203 C 18.165844 15.296203 18.307625 15.511734 18.390625 15.802734 C 18.472625 16.094734 18.513672 16.497719 18.513672 17.011719 L 18.513672 17.847656 L 16.677734 17.847656 L 16.677734 18.095703 C 16.677734 18.408703 16.686078 18.642828 16.705078 18.798828 C 16.724078 18.954828 16.762312 19.069625 16.820312 19.140625 C 16.878312 19.212625 16.967844 19.248047 17.089844 19.248047 C 17.253844 19.248047 17.366734 19.183641 17.427734 19.056641 C 17.488734 18.929641 17.522344 18.718875 17.527344 18.421875 L 18.474609 18.476562 C 18.479609 18.518563 18.482422 18.578344 18.482422 18.652344 C 18.482422 19.103344 18.358328 19.440109 18.111328 19.662109 C 17.864328 19.885109 17.517406 19.996094 17.066406 19.996094 C 16.525406 19.996094 16.145734 19.825328 15.927734 19.486328 C 15.709734 19.147328 15.601562 18.623109 15.601562 17.912109 L 15.601562 17.060547 C 15.601562 16.328547 15.714453 15.794031 15.939453 15.457031 C 16.164453 15.120031 16.551656 14.951172 17.097656 14.951172 z M 8.4101562 15.044922 L 9.5097656 15.044922 L 9.5097656 18.625 C 9.5097656 18.842 9.5340312 18.997844 9.5820312 19.089844 C 9.6300313 19.182844 9.7083125 19.228516 9.8203125 19.228516 C 9.9153125 19.228516 10.008703 19.199625 10.095703 19.140625 C 10.183703 19.082625 10.246062 19.007969 10.289062 18.917969 L 10.289062 15.044922 L 11.388672 15.044922 L 11.388672 19.919922 L 11.386719 19.919922 L 10.527344 19.919922 L 10.433594 19.322266 L 10.408203 19.322266 C 10.174203 19.774266 9.8244219 20 9.3574219 20 C 9.0334219 20 8.7965781 19.893641 8.6425781 19.681641 C 8.4885781 19.469641 8.4101563 19.1375 8.4101562 18.6875 L 8.4101562 15.044922 z M 17.074219 15.693359 C 16.957219 15.693359 16.870453 15.728875 16.814453 15.796875 C 16.758453 15.865875 16.721125 15.978766 16.703125 16.134766 C 16.684125 16.290766 16.675781 16.527703 16.675781 16.845703 L 16.675781 17.195312 L 17.478516 17.195312 L 17.478516 16.845703 C 17.478516 16.532703 17.468266 16.296766 17.447266 16.134766 C 17.427266 15.972766 17.388031 15.858969 17.332031 15.792969 C 17.276031 15.726969 17.191219 15.693359 17.074219 15.693359 z M 13.591797 15.728516 C 13.485797 15.728516 13.388828 15.770469 13.298828 15.855469 C 13.208828 15.940469 13.144422 16.049641 13.107422 16.181641 L 13.107422 18.949219 C 13.155422 19.034219 13.217922 19.097625 13.294922 19.140625 C 13.371922 19.182625 13.453922 19.205078 13.544922 19.205078 C 13.661922 19.205078 13.753266 19.163125 13.822266 19.078125 C 13.891266 18.993125 13.941703 18.850437 13.970703 18.648438 C 13.999703 18.447437 14.013672 18.1675 14.013672 17.8125 L 14.013672 17.185547 C 14.013672 16.803547 14.002516 16.509734 13.978516 16.302734 C 13.954516 16.095734 13.911562 15.946375 13.851562 15.859375 C 13.790563 15.772375 13.703797 15.728516 13.591797 15.728516 z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SoundcloudIcon = createSvgIcon(\n <path d=\"M1.175 12.225c-.051 0-.094.046-.101.1l-.233 2.154.233 2.105c.007.058.05.098.101.098.05 0 .09-.04.099-.098l.255-2.105-.27-2.154c0-.057-.045-.1-.09-.1m-.899.828c-.06 0-.091.037-.104.094L0 14.479l.165 1.308c0 .055.045.094.09.094s.089-.045.104-.104l.21-1.319-.21-1.334c0-.061-.044-.09-.09-.09m1.83-1.229c-.061 0-.12.045-.12.104l-.21 2.563.225 2.458c0 .06.045.12.119.12.061 0 .105-.061.121-.12l.254-2.474-.254-2.548c-.016-.06-.061-.12-.121-.12m.945-.089c-.075 0-.135.06-.15.135l-.193 2.64.21 2.544c.016.077.075.138.149.138.075 0 .135-.061.15-.15l.24-2.532-.24-2.623c0-.075-.06-.135-.135-.135l-.031-.017zm1.155.36c-.005-.09-.075-.149-.159-.149-.09 0-.158.06-.164.149l-.217 2.43.2 2.563c0 .09.075.157.159.157.074 0 .148-.068.148-.158l.227-2.563-.227-2.444.033.015zm.809-1.709c-.101 0-.18.09-.18.181l-.21 3.957.187 2.563c0 .09.08.164.18.164.094 0 .174-.09.18-.18l.209-2.563-.209-3.972c-.008-.104-.088-.18-.18-.18m.959-.914c-.105 0-.195.09-.203.194l-.18 4.872.165 2.548c0 .12.09.209.195.209.104 0 .194-.089.21-.209l.193-2.548-.192-4.856c-.016-.12-.105-.21-.21-.21m.989-.449c-.121 0-.211.089-.225.209l-.165 5.275.165 2.52c.014.119.104.225.225.225.119 0 .225-.105.225-.225l.195-2.52-.196-5.275c0-.12-.105-.225-.225-.225m1.245.045c0-.135-.105-.24-.24-.24-.119 0-.24.105-.24.24l-.149 5.441.149 2.503c.016.135.121.24.256.24s.24-.105.24-.24l.164-2.503-.164-5.456-.016.015zm.749-.134c-.135 0-.255.119-.255.254l-.15 5.322.15 2.473c0 .15.12.255.255.255s.255-.12.255-.27l.15-2.474-.165-5.307c0-.148-.12-.27-.271-.27m1.005.166c-.164 0-.284.135-.284.285l-.103 5.143.135 2.474c0 .149.119.277.284.277.149 0 .271-.12.284-.285l.121-2.443-.135-5.112c-.012-.164-.135-.285-.285-.285m1.184-.945c-.045-.029-.105-.044-.165-.044s-.119.015-.165.044c-.09.054-.149.15-.149.255v.061l-.104 6.048.115 2.449v.008c.008.06.03.135.074.18.058.061.142.104.234.104.08 0 .158-.044.209-.09.058-.06.091-.135.091-.225l.015-.24.117-2.203-.135-6.086c0-.104-.061-.193-.135-.239l-.002-.022zm1.006-.547c-.045-.045-.09-.061-.15-.061-.074 0-.149.016-.209.061-.075.061-.119.15-.119.24v.029l-.137 6.609.076 1.215.061 1.185c0 .164.148.314.328.314.181 0 .33-.15.33-.329l.15-2.414-.15-6.637c0-.12-.074-.221-.165-.277m8.934 3.777c-.405 0-.795.086-1.139.232-.24-2.654-2.46-4.736-5.188-4.736-.659 0-1.305.135-1.889.359-.225.09-.27.18-.285.359v9.368c.016.18.15.33.33.345h8.185C22.681 17.218 24 15.914 24 14.28s-1.319-2.952-2.938-2.952\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const BandcampIcon = createSvgIcon(\n <path d=\"M0 18.75l7.437-13.5H24l-7.438 13.5H0z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LinkedinIcon = createSvgIcon(\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const WhatsappIcon = createSvgIcon(\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TelegramIcon = createSvgIcon(\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TwitchIcon = createSvgIcon(\n <path d=\"M11.571 4.714h1.715v5.143H11.57zm4.715 0H18v5.143h-1.714zM6 0L1.714 4.286v15.428h5.143V24l4.286-4.286h3.428L22.286 12V0zm14.571 11.143l-3.428 3.428h-3.429l-3 3v-3H6.857V1.714h13.714Z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PatreonIcon = createSvgIcon(\n <path d=\"M0 .48v23.04h4.22V.48zm15.385 0c-4.764 0-8.641 3.88-8.641 8.65 0 4.755 3.877 8.623 8.641 8.623 4.75 0 8.615-3.868 8.615-8.623C24 4.36 20.136.48 15.385.48z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PinterestIcon = createSvgIcon(\n <path d=\"M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SpotifyIcon = createSvgIcon(\n <path d=\"M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AmazonIcon = createSvgIcon(\n <path d=\"M.045 18.02c.072-.116.187-.124.348-.022 3.636 2.11 7.594 3.166 11.87 3.166 2.852 0 5.668-.533 8.447-1.595l.315-.14c.138-.06.234-.1.293-.13.226-.088.39-.046.525.13.12.174.09.336-.12.48-.256.19-.6.41-1.006.654-1.244.743-2.64 1.316-4.185 1.726a17.617 17.617 0 01-10.951-.577 17.88 17.88 0 01-5.43-3.35c-.1-.074-.151-.15-.151-.22 0-.047.021-.09.051-.13zm6.565-6.218c0-1.005.247-1.863.743-2.577.495-.71 1.17-1.25 2.04-1.615.796-.335 1.756-.575 2.912-.72.39-.046 1.033-.103 1.92-.174v-.37c0-.93-.105-1.558-.3-1.875-.302-.43-.78-.65-1.44-.65h-.182c-.48.046-.896.196-1.246.46-.35.27-.575.63-.675 1.096-.06.3-.206.465-.435.51l-2.52-.315c-.248-.06-.372-.18-.372-.39 0-.046.007-.09.022-.15.247-1.29.855-2.25 1.82-2.88.976-.616 2.1-.975 3.39-1.05h.54c1.65 0 2.957.434 3.888 1.29.135.15.27.3.405.48.12.165.224.314.283.45.075.134.15.33.195.57.06.254.105.42.135.51.03.104.062.3.076.615.01.313.02.493.02.553v5.28c0 .376.06.72.165 1.036.105.313.21.54.315.674l.51.674c.09.136.136.256.136.36 0 .12-.06.226-.18.314-1.2 1.05-1.86 1.62-1.963 1.71-.165.135-.375.15-.63.045a6.062 6.062 0 01-.526-.496l-.31-.347a9.391 9.391 0 01-.317-.42l-.3-.435c-.81.886-1.603 1.44-2.4 1.665-.494.15-1.093.227-1.83.227-1.11 0-2.04-.343-2.76-1.034-.72-.69-1.08-1.665-1.08-2.94l-.05-.076zm3.753-.438c0 .566.14 1.02.425 1.364.285.34.675.512 1.155.512.045 0 .106-.007.195-.02.09-.016.134-.023.166-.023.614-.16 1.08-.553 1.424-1.178.165-.28.285-.58.36-.91.09-.32.12-.59.135-.8.015-.195.015-.54.015-1.005v-.54c-.84 0-1.484.06-1.92.18-1.275.36-1.92 1.17-1.92 2.43l-.035-.02zm9.162 7.027c.03-.06.075-.11.132-.17.362-.243.714-.41 1.05-.5a8.094 8.094 0 011.612-.24c.14-.012.28 0 .41.03.65.06 1.05.168 1.172.33.063.09.099.228.099.39v.15c0 .51-.149 1.11-.424 1.8-.278.69-.664 1.248-1.156 1.68-.073.06-.14.09-.197.09-.03 0-.06 0-.09-.012-.09-.044-.107-.12-.064-.24.54-1.26.806-2.143.806-2.64 0-.15-.03-.27-.087-.344-.145-.166-.55-.257-1.224-.257-.243 0-.533.016-.87.046-.363.045-.7.09-1 .135-.09 0-.148-.014-.18-.044-.03-.03-.036-.047-.02-.077 0-.017.006-.03.02-.063v-.06z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SnapchatIcon = createSvgIcon(\n <path d=\"M12.206.793c.99 0 4.347.276 5.93 3.821.529 1.193.403 3.219.299 4.847l-.003.06c-.012.18-.022.345-.03.51.075.045.203.09.401.09.3-.016.659-.12 1.033-.301.165-.088.344-.104.464-.104.182 0 .359.029.509.09.45.149.734.479.734.838.015.449-.39.839-1.213 1.168-.089.029-.209.075-.344.119-.45.135-1.139.36-1.333.81-.09.224-.061.524.12.868l.015.015c.06.136 1.526 3.475 4.791 4.014.255.044.435.27.42.509 0 .075-.015.149-.045.225-.24.569-1.273.988-3.146 1.271-.059.091-.12.375-.164.57-.029.179-.074.36-.134.553-.076.271-.27.405-.555.405h-.03c-.135 0-.313-.031-.538-.074-.36-.075-.765-.135-1.273-.135-.3 0-.599.015-.913.074-.6.104-1.123.464-1.723.884-.853.599-1.826 1.288-3.294 1.288-.06 0-.119-.015-.18-.015h-.149c-1.468 0-2.427-.675-3.279-1.288-.599-.42-1.107-.779-1.707-.884-.314-.045-.629-.074-.928-.074-.54 0-.958.089-1.272.149-.211.043-.391.074-.54.074-.374 0-.523-.224-.583-.42-.061-.192-.09-.389-.135-.567-.046-.181-.105-.494-.166-.57-1.918-.222-2.95-.642-3.189-1.226-.031-.063-.052-.15-.055-.225-.015-.243.165-.465.42-.509 3.264-.54 4.73-3.879 4.791-4.02l.016-.029c.18-.345.224-.645.119-.869-.195-.434-.884-.658-1.332-.809-.121-.029-.24-.074-.346-.119-1.107-.435-1.257-.93-1.197-1.273.09-.479.674-.793 1.168-.793.146 0 .27.029.383.074.42.194.789.3 1.104.3.234 0 .384-.06.465-.105l-.046-.569c-.098-1.626-.225-3.651.307-4.837C7.392 1.077 10.739.807 11.727.807l.419-.015h.06z\" />\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AppleIcon = createSvgIcon(\n <path d=\"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701\" />\n);\n","import {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\nimport {EmailIcon} from '@common/icons/material/Email';\nimport {JSXElementConstructor} from 'react';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {FacebookIcon} from '@common/icons/social/facebook';\nimport {TwitterIcon} from '@common/icons/social/twitter';\nimport {InstagramIcon} from '@common/icons/social/instagram';\nimport {TiktokIcon} from '@common/icons/social/tiktok';\nimport {YoutubeIcon} from '@common/icons/social/youtube';\nimport {SoundcloudIcon} from '@common/icons/social/soundcloud';\nimport {BandcampIcon} from '@common/icons/social/bandcamp';\nimport {LinkedinIcon} from '@common/icons/social/linkedin';\nimport {WhatsappIcon} from '@common/icons/social/whatsapp';\nimport {TelegramIcon} from '@common/icons/social/telegram';\nimport {TwitchIcon} from '@common/icons/social/twitch';\nimport {PatreonIcon} from '@common/icons/social/patreon';\nimport {PinterestIcon} from '@common/icons/social/pinterest';\nimport {SpotifyIcon} from '@common/icons/social/spotify';\nimport {AmazonIcon} from '@common/icons/social/amazon';\nimport {SnapchatIcon} from '@common/icons/social/snapchat';\nimport {AppleIcon} from '@common/icons/social/apple';\n\nexport interface SocialsListItem {\n name: MessageDescriptor;\n placeholder: string;\n icon: JSXElementConstructor<SvgIconProps>;\n inputType?: string;\n pattern?: string;\n}\n\nexport enum SocialsType {\n Mail = 'mail',\n Facebook = 'facebook',\n Twitter = 'twitter',\n Instagram = 'instagram',\n Tiktok = 'tiktok',\n Youtube = 'youtube',\n Soundcloud = 'soundcloud',\n Bandcamp = 'bandcamp',\n LinkedIn = 'linkedin',\n Whatsapp = 'whatsapp',\n Telegram = 'telegram',\n Twitch = 'twitch',\n Patreon = 'patreon',\n Pinterest = 'pinterest',\n Spotify = 'spotify',\n Amazon = 'amazon',\n Snapchat = 'snapchat',\n Apple = 'apple',\n}\n\nexport const SocialsList: Record<SocialsType, SocialsListItem> = {\n [SocialsType.Mail]: {\n name: message('Email'),\n placeholder: 'your@email.com',\n inputType: 'email',\n icon: EmailIcon,\n },\n [SocialsType.Facebook]: {\n name: message('Facebook url'),\n placeholder: 'https://facebook.com/username',\n pattern: 'https://(www.)?facebook.com/[a-zA-Z0-9._%-]+$',\n inputType: 'url',\n icon: FacebookIcon,\n },\n [SocialsType.Twitter]: {\n name: message('Twitter handle'),\n placeholder: '@yourtwitterhandle',\n pattern: '^@[A-Za-z0-9_]{1,15}$',\n icon: TwitterIcon,\n },\n [SocialsType.Instagram]: {\n name: message('Instagram username'),\n placeholder: '@instagramusername',\n pattern: '^@[a-zA-Z0-9._%-]+$',\n icon: InstagramIcon,\n },\n [SocialsType.Tiktok]: {\n name: message('TikTok username'),\n placeholder: '@tiktokusername',\n pattern: '^@[a-zA-Z0-9._%-]+$',\n icon: TiktokIcon,\n },\n [SocialsType.Youtube]: {\n name: message('Youtube channel url'),\n placeholder: 'https://youtube.com/channel/youtubechannelurl',\n inputType: 'url',\n pattern: 'https://(www.)?youtube.com/channel/[a-zA-Z0-9._%-]+$',\n icon: YoutubeIcon,\n },\n [SocialsType.Soundcloud]: {\n name: message('SoundCloud url'),\n placeholder: 'https://soundcloud.com/username',\n inputType: 'url',\n pattern: 'https://(www.)?soundcloud.com/[a-zA-Z0-9._%-]+$',\n icon: SoundcloudIcon,\n },\n [SocialsType.Bandcamp]: {\n name: message('Bandcamp url'),\n placeholder: 'https://you.bandcamp.com',\n inputType: 'url',\n pattern: 'https://(www.)?[a-zA-Z0-9._%-]+.bandcamp.com$',\n icon: BandcampIcon,\n },\n [SocialsType.LinkedIn]: {\n name: message('LinkedIn url'),\n placeholder: 'https://linkedin.com/in/username',\n inputType: 'url',\n pattern: 'https://(www.)?linkedin.com/[a-zA-Z0-9._%-]+/[a-zA-Z0-9._%-]+$',\n icon: LinkedinIcon,\n },\n [SocialsType.Whatsapp]: {\n name: message('WhatsApp'),\n placeholder: '+00000000000',\n pattern: '^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\\\s\\\\./0-9]*$',\n icon: WhatsappIcon,\n },\n [SocialsType.Telegram]: {\n name: message('Telegram url'),\n placeholder: 'https://t.me',\n inputType: 'url',\n pattern: 'https://(www.)?t.me/[a-zA-Z0-9._%-]+$',\n icon: TelegramIcon,\n },\n [SocialsType.Twitch]: {\n name: message('Twitch url'),\n placeholder: 'https://twitch.tv/username',\n inputType: 'url',\n pattern: 'https://(www.)?twitch.tv/[a-zA-Z0-9._%-]+$',\n icon: TwitchIcon,\n },\n [SocialsType.Patreon]: {\n name: message('Patreon url'),\n placeholder: 'https://patreon.com/username',\n inputType: 'url',\n pattern: 'https://(www.)?patreon.com/[a-zA-Z0-9._%-]+$',\n icon: PatreonIcon,\n },\n [SocialsType.Pinterest]: {\n name: message('Pinterest url'),\n placeholder: 'https://pinterest.com',\n inputType: 'url',\n pattern: 'https://(www.)?pinterest.com/.+',\n icon: PinterestIcon,\n },\n [SocialsType.Spotify]: {\n name: message('Spotify artist url'),\n placeholder: 'https://open.spotify.com/artist/artistname',\n inputType: 'url',\n pattern: 'https://(www.)?open.spotify.com/artist/[a-zA-Z0-9._%-]+$',\n icon: SpotifyIcon,\n },\n [SocialsType.Amazon]: {\n name: message('Amazon shop url'),\n placeholder: 'https://amazon.com/shop/yourshopname',\n inputType: 'url',\n pattern: 'https://(www.)?amazon.com/shop/[a-zA-Z0-9._%-]+$',\n icon: AmazonIcon,\n },\n [SocialsType.Snapchat]: {\n name: message('Snapchat url'),\n placeholder: 'https://www.snapchat.com/add/yourusername',\n inputType: 'url',\n pattern: 'https://(www.)?snapchat.com/add/[a-zA-Z0-9_--%]+$',\n icon: SnapchatIcon,\n },\n [SocialsType.Apple]: {\n name: message('Apple music url'),\n placeholder: 'https://music.apple.com/us/album/youralbum',\n inputType: 'url',\n pattern: 'https://(www.)?music.apple.com/.+',\n icon: AppleIcon,\n },\n};\n","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport {\n SocialsList,\n SocialsType,\n} from '@app/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-list';\nimport {isAbsoluteUrl} from '@common/utils/urls/is-absolute-url';\nimport {SocialsWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-widget-dialog';\nimport clsx from 'clsx';\nimport {IconButton} from '@common/ui/buttons/icon-button';\n\nexport function SocialsWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<SocialsWidget>) {\n return (\n <div\n className={clsx(\n 'flex flex-wrap items-center gap-y-8',\n variant === 'editor'\n ? 'gap-x-14 mt-4 text-muted'\n : 'gap-x-2 mt-20 mb-26 justify-center'\n )}\n >\n {Object.entries(widget.config).map(([type, uri]) => {\n const Icon = SocialsList[type as SocialsType].icon;\n if (!Icon) return null;\n\n if (variant === 'editor') {\n return <Icon key={type} />;\n }\n\n return (\n <IconButton\n className=\"flex-shrink-0\"\n elementType=\"a\"\n href={buildUrl(type as SocialsType, uri)}\n key={type}\n >\n <Icon />\n </IconButton>\n );\n })}\n </div>\n );\n}\n\nfunction buildUrl(socialsType: SocialsType, uri: string): string {\n if (!uri || isAbsoluteUrl(uri)) {\n return uri;\n }\n // only remove @ from the begging of string (Twitter and Instagram handle for example)\n if (socialsType === SocialsType.Twitter) {\n return `https://twitter.com/${uri.replace('@', '')}`;\n } else if (socialsType === SocialsType.Instagram) {\n return `https://instagram.com/${uri.replace('@', '')}`;\n } else if (socialsType === SocialsType.Tiktok) {\n return `https://tiktok.com/${uri}`;\n } else if (socialsType === SocialsType.Mail) {\n return `mailto:${uri}`;\n } else if (socialsType === SocialsType.Whatsapp) {\n return `https://api.whatsapp.com/send?phone=${uri}`;\n }\n return uri;\n}\n","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport {TwitchWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/twitch-widget/twitch-widget-dialog';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {VideoEmbedWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/video-embed-widget-renderer';\n\nexport function TwitchWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<TwitchWidget>) {\n const {base_url} = useSettings();\n if (!widget.config.url) return null;\n\n const embedUrl = getTwitchEmbedUrl(widget.config.url, base_url);\n return <VideoEmbedWidgetRenderer variant={variant} embedUrl={embedUrl} />;\n}\n\nfunction getTwitchEmbedUrl(twitchUrl: string, siteUrl: string) {\n siteUrl = removeProtocol(siteUrl);\n let embedUrl: string;\n const channelOrClipId = new URL(twitchUrl).pathname.split('/').pop()?.trim();\n if (twitchUrl.includes('clip')) {\n embedUrl = `https://clips.twitch.tv/embed?clip=${channelOrClipId}`;\n } else {\n embedUrl = `https://player.twitch.tv/?channel=${channelOrClipId}`;\n }\n return `${embedUrl}&parent=${siteUrl}`;\n}\n","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport {SoundcloudWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/soundcloud-widget/soundcloud-widget-dialog';\nimport {VideoEmbedWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/video-embed-widget-renderer';\n\nexport function SoundcloudWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<SoundcloudWidget>) {\n if (!widget.config.url) return null;\n return (\n <VideoEmbedWidgetRenderer\n variant={variant}\n embedUrl={widget.config.embedUrl}\n />\n );\n}\n","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport getVideoId from 'get-video-id';\nimport {VimeoWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/vimeo-widget/vimeo-widget-dialog';\nimport {VideoEmbedWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/video-embed-widget-renderer';\n\nexport function VimeoWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<VimeoWidget>) {\n if (!widget.config.url) return null;\n\n const {id} = getVideoId(widget.config.url);\n const embedUrl = `https://player.vimeo.com/video/${id}`;\n return <VideoEmbedWidgetRenderer variant={variant} embedUrl={embedUrl} />;\n}\n","/**\n * URL-decode, also replaces `+` (plus) chars with ` ` (space).\n *\n * @param {String} str\n * @api private\n */\nexport function decode (str: string): string {\n return decodeURIComponent(str).replace(/\\+/g, ' ');\n}\n\n/**\n * URL-encode, also turn ` ` (space) chars into `+` (plus).\n *\n * @param {String} str\n * @api private\n */\nexport function encode (str: string): string {\n return escape(str.replace(/ /g, '+'));\n}\n","export default abstract class SpotifyUri {\n public uri: string\n public abstract toURL (): string\n public abstract toURI (): string\n\n constructor (uri: string) {\n this.uri = uri\n }\n\n public static is (v: any): v is SpotifyUri {\n return Boolean(typeof v === 'object' && typeof v.uri === 'string')\n }\n\n public toEmbedURL (): string {\n return `https://embed.spotify.com/?uri=${this.toURI()}`\n }\n\n public toOpenURL (): string {\n return `https://open.spotify.com${this.toURL()}`\n }\n\n public toPlayURL (): string {\n return `https://play.spotify.com${this.toURL()}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class Local extends SpotifyUri {\n public type = 'local'\n public artist: string\n public album: string\n public track: string\n public seconds: number\n\n constructor (\n uri: string,\n artist: string,\n album: string,\n track: string,\n seconds: number\n ) {\n super(uri)\n this.artist = artist\n this.album = album\n this.track = track\n this.seconds = seconds\n }\n\n public static is (v: any): v is Local {\n return Boolean(typeof v === 'object' && v.type === 'local')\n }\n\n public toURI (): string {\n return `spotify:local:${encode(this.artist)}:${encode(this.album)}:${encode(this.track)}:${this.seconds}`\n }\n\n public toURL (): string {\n return `/local/${encode(this.artist)}/${encode(this.album)}/${encode(this.track)}/${this.seconds}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class Search extends SpotifyUri {\n public type = 'search'\n public query: string\n\n constructor (uri: string, query: string) {\n super(uri)\n this.query = query\n }\n\n public static is (v: any): v is Search {\n return Boolean(typeof v === 'object' && v.type === 'search')\n }\n\n public toURI (): string {\n return `spotify:search:${encode(this.query)}`\n }\n\n public toURL (): string {\n return `/search/${encode(this.query)}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class Playlist extends SpotifyUri {\n public type = 'playlist'\n public id: string\n public user?: string\n\n constructor (uri: string, id: string, user?: string) {\n super(uri)\n this.id = id\n if (typeof user === 'string') {\n this.user = user\n }\n }\n\n public static is (v: any): v is Playlist {\n return Boolean(typeof v === 'object' && v.type === 'playlist')\n }\n\n public toURI (): string {\n if (this.user !== undefined) {\n if (this.id === 'starred') {\n return `spotify:user:${encode(this.user)}:${encode(this.id)}`\n }\n return `spotify:user:${encode(this.user)}:playlist:${encode(this.id)}`\n }\n return `spotify:playlist:${encode(this.id)}`\n }\n\n public toURL (): string {\n if (this.user !== undefined) {\n if (this.id === 'starred') {\n return `/user/${encode(this.user)}/${encode(this.id)}`\n }\n return `/user/${encode(this.user)}/playlist/${encode(this.id)}`\n }\n return `/playlist/${encode(this.id)}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class Artist extends SpotifyUri {\n public type = 'artist'\n public id: string\n\n constructor (uri: string, id: string) {\n super(uri)\n this.id = id\n }\n\n public static is (v: any): v is Artist {\n return Boolean(typeof v === 'object' && v.type === 'artist')\n }\n\n public toURI (): string {\n return `spotify:${this.type}:${encode(this.id)}`\n }\n\n public toURL (): string {\n return `/${this.type}/${encode(this.id)}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class Album extends SpotifyUri {\n public type = 'album'\n public id: string\n\n constructor (uri: string, id: string) {\n super(uri)\n this.id = id\n }\n\n public static is (v: any): v is Album {\n return Boolean(typeof v === 'object' && v.type === 'album')\n }\n\n public toURI (): string {\n return `spotify:${this.type}:${encode(this.id)}`\n }\n\n public toURL (): string {\n return `/${this.type}/${encode(this.id)}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class Track extends SpotifyUri {\n public type = 'track'\n public id: string\n\n constructor (uri: string, id: string) {\n super(uri)\n this.id = id\n }\n\n public static is (v: any): v is Track {\n return Boolean(typeof v === 'object' && v.type === 'track')\n }\n\n public toURI (): string {\n return `spotify:${this.type}:${encode(this.id)}`\n }\n\n public toURL (): string {\n return `/${this.type}/${encode(this.id)}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class Episode extends SpotifyUri {\n public type = 'episode'\n public id: string\n\n constructor (uri: string, id: string) {\n super(uri)\n this.id = id\n }\n\n public static is (v: any): v is Episode {\n return Boolean(typeof v === 'object' && v.type === 'episode')\n }\n\n public toURI (): string {\n return `spotify:${this.type}:${encode(this.id)}`\n }\n\n public toURL (): string {\n return `/${this.type}/${encode(this.id)}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class Show extends SpotifyUri {\n public type = 'show'\n public id: string\n\n constructor (uri: string, id: string) {\n super(uri)\n this.id = id\n }\n\n public static is (v: any): v is Show {\n return Boolean(typeof v === 'object' && v.type === 'show')\n }\n\n public toURI (): string {\n return `spotify:${this.type}:${encode(this.id)}`\n }\n\n public toURL (): string {\n return `/${this.type}/${encode(this.id)}`\n }\n}\n","import { encode } from './util'\nimport SpotifyUri from './spotify-uri'\n\nexport default class User extends SpotifyUri {\n public type = 'user'\n public user: string\n\n constructor (uri: string, user: string) {\n super(uri)\n this.user = user\n }\n\n public static is (v: any): v is User {\n return Boolean(typeof v === 'object' && v.type === 'user')\n }\n\n public toURI (): string {\n return `spotify:${this.type}:${encode(this.user)}`\n }\n\n public toURL (): string {\n return `/${this.type}/${encode(this.user)}`\n }\n}\n","import Local from './local';\nimport Search from './search';\nimport Playlist from './playlist';\nimport Artist from './artist';\nimport Album from './album';\nimport Track from './track';\nimport Episode from './episode';\nimport Show from './show';\nimport User from './user';\nimport SpotifyUri from './spotify-uri';\nimport {decode} from './util';\nimport {ParsedSpotifyUri} from '.';\n\nexport default function parse(input: string | SpotifyUri): ParsedSpotifyUri {\n const uri = SpotifyUri.is(input) ? input.uri : input;\n const {protocol, hostname, pathname = '/', searchParams} = new URL(uri);\n\n if (hostname === 'embed.spotify.com') {\n const parsedQs = Object.fromEntries(searchParams);\n if (typeof parsedQs.uri !== 'string') {\n throw new Error('fo');\n }\n return parse(parsedQs.uri);\n }\n\n if (protocol === 'spotify:') {\n const parts = uri.split(':');\n return parseParts(uri, parts);\n }\n\n if (pathname === null) {\n throw new TypeError('No pathname');\n }\n\n // `http:` or `https:`\n const parts = pathname.split('/');\n return parseParts(uri, parts);\n}\n\nfunction parseParts(uri: string, parts: string[]): ParsedSpotifyUri {\n const len = parts.length;\n if (parts[1] === 'embed') {\n parts = parts.slice(1);\n }\n if (parts[1] === 'search') {\n return new Search(uri, decode(parts.slice(2).join(':')));\n }\n if (len >= 3 && parts[1] === 'local') {\n return new Local(\n uri,\n decode(parts[2]),\n decode(parts[3]),\n decode(parts[4]),\n +parts[5]\n );\n }\n if (len === 3 && parts[1] === 'playlist') {\n return new Playlist(uri, decode(parts[2]));\n }\n if (len === 3 && parts[1] === 'user') {\n return new User(uri, decode(parts[2]));\n }\n if (len >= 5) {\n return new Playlist(uri, decode(parts[4]), decode(parts[2]));\n }\n if (len >= 4 && parts[3] === 'starred') {\n return new Playlist(uri, 'starred', decode(parts[2]));\n }\n if (parts[1] === 'artist') {\n return new Artist(uri, parts[2]);\n }\n if (parts[1] === 'album') {\n return new Album(uri, parts[2]);\n }\n if (parts[1] === 'track') {\n return new Track(uri, parts[2]);\n }\n if (parts[1] === 'episode') {\n return new Episode(uri, parts[2]);\n }\n if (parts[1] === 'show') {\n return new Show(uri, parts[2]);\n }\n if (parts[1] === 'playlist') {\n return new Playlist(uri, parts[2]);\n }\n throw new TypeError(`Could not determine type for: ${uri}`);\n}\n","import parse from './parse'\nimport Search from './search'\nimport Local from './local'\nimport Playlist from './playlist'\nimport Artist from './artist'\nimport Album from './album'\nimport Track from './track'\nimport User from './user'\nimport Episode from './episode'\nimport SpotifyUri from './spotify-uri'\n\nexport type ParsedSpotifyUri =\n | Search\n | Episode\n | Local\n | Playlist\n | Track\n | Artist\n | Album\n | User\n\nexport { parse, Search, Episode, Local, Playlist, Track, Artist, Album, User }\n\nexport function formatURI (input: string | SpotifyUri): string {\n const uri: SpotifyUri = typeof input === 'string' ? parse(input) : input\n return uri.toURI()\n}\n\nexport function formatEmbedURL (input: string | SpotifyUri): string {\n const uri: SpotifyUri = typeof input === 'string' ? parse(input) : input\n return uri.toEmbedURL()\n}\n\nexport function formatOpenURL (input: string | SpotifyUri): string {\n const uri: SpotifyUri = typeof input === 'string' ? parse(input) : input\n return uri.toOpenURL()\n}\n\nexport function formatPlayURL (input: string | SpotifyUri): string {\n const uri: SpotifyUri = typeof input === 'string' ? parse(input) : input\n return uri.toPlayURL()\n}\n","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport clsx from 'clsx';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {formatEmbedURL} from '@app/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri';\nimport {SpotifyWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-widget-dialog';\n\nexport function SpotifyWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<SpotifyWidget>) {\n if (!widget.config.url) return null;\n\n if (variant === 'editor') {\n return (\n <div className=\"flex items-center gap-8\">\n <RemoteFavicon url={widget.config.url} />\n <a\n href={widget.config.url}\n target=\"_blank\"\n className=\"text-muted text-sm hover:underline whitespace-nowrap overflow-hidden overflow-ellipsis max-w-[80%]\"\n rel=\"noreferrer\"\n >\n {widget.config.url}\n </a>\n </div>\n );\n }\n\n const embedURL = formatEmbedURL(widget.config.url);\n return (\n <iframe\n className={clsx(\n 'w-full rounded shadow-lg',\n getEmbedHeight(widget.config.type)\n )}\n loading=\"lazy\"\n src={embedURL}\n allow=\"autoplay; encrypted-media; picture-in-picture\"\n allowFullScreen\n />\n );\n}\n\nfunction getEmbedHeight(type?: string) {\n switch (type) {\n case 'track':\n return 'h-80';\n default:\n return 'h-[152px]';\n }\n}\n","export default \"__VITE_ASSET__f0d358f2__\"","import {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {TiktokWidget} from '@app/dashboard/biolink/biolink-editor/content/widgets/tiktok-widget/tiktok-widget-dialog';\nimport tiktokImage from './tiktok.png';\nimport {useEffect} from 'react';\nimport lazyLoader from '@common/utils/http/lazy-loader';\n\nexport function TiktokWidgetRenderer({\n widget,\n variant,\n}: WidgetRendererProps<TiktokWidget>) {\n useEffect(() => {\n lazyLoader.loadAsset('https://www.tiktok.com/embed.js', {type: 'js'});\n }, []);\n\n if (!widget.config.url) return null;\n\n if (variant === 'editor') {\n return (\n <div className=\"flex items-center gap-8\">\n <RemoteFavicon url={widget.config.url} />\n <a\n href={widget.config.url}\n target=\"_blank\"\n className=\"text-muted text-sm hover:underline whitespace-nowrap overflow-hidden overflow-ellipsis max-w-[80%]\"\n rel=\"noreferrer\"\n >\n {widget.config.url}\n </a>\n </div>\n );\n }\n\n const embedURL = new URL(widget.config.url).pathname.split('/').pop()?.trim();\n return (\n <blockquote data-video-id={embedURL} className=\"tiktok-embed\">\n <img src={tiktokImage} alt=\"\" />\n </blockquote>\n );\n}\n","export enum WidgetType {\n Image = 'image',\n Text = 'text',\n Socials = 'socials',\n Youtube = 'youtube',\n Soundcloud = 'soundcloud',\n Vimeo = 'video',\n Spotify = 'spotify',\n Twitch = 'twitch',\n Tiktok = 'tiktok',\n}\n","import {JSXElementConstructor} from 'react';\nimport {ImageWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/image-widget/image-widget-renderer';\nimport {WidgetRendererProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-renderer-props';\nimport {YoutubeWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/youtube-widget/youtube-widget-renderer';\nimport {TextWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/text-widget/text-widget-renderer';\nimport {SocialsWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-widget-renderer';\nimport {TwitchWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/twitch-widget/twitch-widget-renderer';\nimport {SoundcloudWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/soundcloud-widget/soundcloud-widget-renderer';\nimport {VimeoWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/vimeo-widget/vimeo-widget-renderer';\nimport {SpotifyWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-widget-renderer';\nimport {TiktokWidgetRenderer} from '@app/dashboard/biolink/biolink-editor/content/widgets/tiktok-widget/tiktok-widget-renderer';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-type';\n\nexport const WidgetRenderers: Record<\n WidgetType,\n JSXElementConstructor<WidgetRendererProps<any>>\n> = {\n [WidgetType.Image]: ImageWidgetRenderer,\n [WidgetType.Text]: TextWidgetRenderer,\n [WidgetType.Socials]: SocialsWidgetRenderer,\n [WidgetType.Youtube]: YoutubeWidgetRenderer,\n [WidgetType.Soundcloud]: SoundcloudWidgetRenderer,\n [WidgetType.Vimeo]: VimeoWidgetRenderer,\n [WidgetType.Spotify]: SpotifyWidgetRenderer,\n [WidgetType.Twitch]: TwitchWidgetRenderer,\n [WidgetType.Tiktok]: TiktokWidgetRenderer,\n};\n","import {parseColor} from '@react-stately/color';\n\nexport function getColorBrightness(value: string) {\n const parsed = parseColor(value).toFormat('rgb');\n //http://www.w3.org/TR/AERT#color-contrast\n const red = parsed.getChannelValue('red');\n const green = parsed.getChannelValue('green');\n const blue = parsed.getChannelValue('blue');\n return (red * 299 + green * 587 + blue * 114) / 1000;\n}\n","import {Button} from '@common/ui/buttons/button';\nimport type {\n Biolink,\n BiolinkAppearance,\n BiolinkBtnConfig,\n BiolinkLink,\n} from '@app/dashboard/biolink/biolink';\nimport {ReactElement, useEffect} from 'react';\nimport clsx from 'clsx';\nimport {loadFonts} from '@common/ui/font-picker/load-fonts';\nimport {cssPropsFromBgConfig} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/css-props-from-bg-config';\nimport {WidgetRenderers} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-renderers';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {Link} from 'react-router-dom';\nimport {getColorBrightness} from '@common/ui/themes/utils/get-color-brightness';\nimport {useIsDarkMode} from '@common/ui/themes/use-is-dark-mode';\n\ninterface BiolinkLayoutProps {\n biolink: Biolink;\n appearance?: BiolinkAppearance | null;\n className?: string;\n enableLinkAnimations?: boolean;\n showAds?: boolean;\n}\nexport function BiolinkLayout({\n biolink,\n className,\n appearance,\n enableLinkAnimations,\n showAds,\n}: BiolinkLayoutProps) {\n appearance = appearance || biolink.appearance?.config;\n\n useEffect(() => {\n const id = 'biolink-fonts';\n if (appearance?.fontConfig) {\n loadFonts([appearance?.fontConfig], {id});\n }\n }, [appearance?.fontConfig]);\n\n useEffect(() => {\n const hasAnimations = biolink.content.some(\n item => item.model_type === 'link' && item.animation\n );\n if (enableLinkAnimations && hasAnimations) {\n import(\n '@app/dashboard/biolink/biolink-editor/content/link-content-item/animate.min.css'\n );\n }\n }, [enableLinkAnimations, biolink.content]);\n\n return (\n <div\n className=\"h-screen overflow-y-auto\"\n style={{\n ...cssPropsFromBgConfig(appearance?.bgConfig),\n fontFamily: appearance?.fontConfig?.family,\n }}\n >\n <div\n className={clsx('flex flex-col px-12 py-34 w-full h-full', className)}\n >\n <div className=\"flex-auto\">\n {showAds && <AdHost slot=\"biolink_top\" className=\"mb-60\" />}\n {biolink.content.map(item => {\n if (!item.active) {\n return null;\n }\n\n const key = `${item.model_type}-${item.id}`;\n let renderedItem: ReactElement;\n if (item.model_type === 'link') {\n renderedItem = <LinkButton appearance={appearance} link={item} />;\n } else {\n const Widget = WidgetRenderers[item.type];\n renderedItem = <Widget widget={item} variant=\"biolinkPage\" />;\n }\n\n return (\n <div className=\"mb-14 w-full\" key={key}>\n {renderedItem}\n </div>\n );\n })}\n </div>\n <Branding appearance={appearance} />\n </div>\n </div>\n );\n}\n\ninterface LinkButtonProps {\n link: BiolinkLink;\n appearance?: BiolinkAppearance | null;\n}\nfunction LinkButton({link, appearance}: LinkButtonProps) {\n const variant: BiolinkBtnConfig['variant'] =\n appearance?.btnConfig?.variant ?? 'flat';\n const radius: BiolinkBtnConfig['radius'] =\n appearance?.btnConfig?.radius ?? 'rounded';\n const shadow: BiolinkBtnConfig['shadow'] =\n appearance?.btnConfig?.shadow ?? undefined;\n const buttonColor: BiolinkBtnConfig['color'] =\n appearance?.btnConfig?.color ?? 'primary';\n const buttonTextColor = appearance?.btnConfig?.textColor ?? undefined;\n\n const isCustomBgColor = buttonColor !== 'primary' && buttonColor !== 'paper';\n\n return (\n <Button\n className={clsx(\n 'w-full min-h-54 break-words hyphens-auto',\n link.animation && `animate__animated animate__${link.animation}`\n )}\n variant={variant}\n radius={radius}\n color={!isCustomBgColor ? buttonColor : null}\n startIcon={\n link.image ? (\n <img\n className=\"w-24 h-24 object-cover rounded\"\n src={link.image}\n alt=\"\"\n />\n ) : undefined\n }\n whitespace=\"whitespace-normal\"\n elementType=\"a\"\n href={link.short_url}\n target=\"_blank\"\n style={{\n boxShadow: shadow,\n backgroundColor: isCustomBgColor ? buttonColor : undefined,\n borderColor: isCustomBgColor ? buttonColor : undefined,\n color: buttonTextColor,\n }}\n >\n {link.name}\n </Button>\n );\n}\n\ninterface BrandingProps {\n appearance?: BiolinkAppearance | null;\n}\nfunction Branding({appearance}: BrandingProps) {\n const {branding, biolink} = useSettings();\n let src = biolink?.branding_img;\n const {trans} = useTrans();\n let isDarkMode = useIsDarkMode();\n\n if (appearance?.hideBranding) {\n return null;\n }\n\n if (appearance?.bgConfig?.color) {\n isDarkMode = getColorBrightness(appearance?.bgConfig?.color) > 100;\n }\n\n if (!src) {\n src = isDarkMode ? branding.logo_light : branding.logo_dark;\n }\n\n return (\n <div className=\"flex-shrink-0\">\n <Link to=\"/\">\n <img\n className=\"w-auto h-24 mx-auto\"\n src={src}\n alt={trans(\n message(':site logo', {values: {site: branding.site_name}})\n )}\n />\n </Link>\n </div>\n );\n}\n","import {Biolink} from '@app/dashboard/biolink/biolink';\nimport {BiolinkLayout} from '@app/short-links/renderers/biolink-renderer/biolink-layout';\n\ninterface BiolinkRendererProps {\n biolink: Biolink;\n}\nexport function BiolinkRenderer({biolink}: BiolinkRendererProps) {\n return (\n <BiolinkLayout\n biolink={biolink}\n enableLinkAnimations\n showAds\n className=\"max-w-680 mx-auto\"\n />\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Link} from '@app/dashboard/links/link';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\n\ninterface Response extends BackendResponse {\n matches: boolean;\n}\n\nexport interface CheckLinkPasswordPayload {\n password: string;\n}\n\nexport function useCheckLinkPassword(\n linkeable: Link | LinkGroup | Biolink,\n form: UseFormReturn<CheckLinkPasswordPayload>,\n) {\n return useMutation({\n mutationFn: (payload: CheckLinkPasswordPayload) =>\n checkPassword(linkeable, payload),\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction checkPassword(\n linkeable: Link | LinkGroup | Biolink,\n payload: CheckLinkPasswordPayload,\n): Promise<Response> {\n return apiClient\n .post('links/check-password', {\n ...payload,\n linkeableType: linkeable.model_type,\n linkeableId: linkeable.id,\n })\n .then(r => r.data);\n}\n","import secureFilesSvg from '@common/auth/ui/account-settings/access-token-panel/secure-files.svg';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {Trans} from '@common/i18n/trans';\nimport {\n CheckLinkPasswordPayload,\n useCheckLinkPassword,\n} from '@app/short-links/requests/use-check-link-password';\nimport {Link} from '@app/dashboard/links/link';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\n\ninterface PasswordPageProps {\n linkeable: Link | LinkGroup | Biolink;\n onPasswordValid: () => void;\n}\nexport function PasswordPage({linkeable, onPasswordValid}: PasswordPageProps) {\n const {trans} = useTrans();\n const fieldLabel = trans({message: 'Password'});\n const form = useForm<CheckLinkPasswordPayload>();\n const checkPassword = useCheckLinkPassword(linkeable, form);\n\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-alt\">\n <div className=\"m-14 flex max-w-[560px] flex-col items-center gap-40 rounded border bg p-24 md:flex-row md:gap-14\">\n <div className=\"h-132 w-[165px]\">\n <SvgImage src={secureFilesSvg} />\n </div>\n <Form\n form={form}\n onSubmit={values => {\n checkPassword.mutate(values, {onSuccess: onPasswordValid});\n }}\n >\n <span className=\"text-sm\">\n {linkeable.model_type === 'biolink' ? (\n <Trans message=\"The biolink you are trying to access is password protected.\" />\n ) : (\n <Trans message=\"The link you are trying to access is password protected.\" />\n )}\n </span>\n <FormTextField\n name=\"password\"\n autoFocus\n placeholder={fieldLabel}\n aria-label={fieldLabel}\n className=\"mb-20 mt-10\"\n type=\"password\"\n required\n />\n <div className=\"text-right\">\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n className=\"w-full md:w-auto\"\n disabled={checkPassword.isPending}\n >\n <Trans message=\"Enter\" />\n </Button>\n </div>\n </Form>\n </div>\n </div>\n );\n}\n","import {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\nimport {Link} from '@app/dashboard/links/link';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {LinkPageRenderer} from '@app/short-links/renderers/link-page-renderer';\nimport {useState} from 'react';\nimport {LinkOverlayRenderer} from '@app/short-links/renderers/link-overlay-renderer';\nimport {LinkIframeRenderer} from '@app/short-links/renderers/link-iframe-renderer';\nimport {LinkSplashRenderer} from '@app/short-links/renderers/link-splash-renderer';\nimport {LinkGroupRenderer} from '@app/short-links/renderers/link-group-renderer';\nimport {BiolinkRenderer} from '@app/short-links/renderers/biolink-renderer/biolink-renderer';\nimport {PasswordPage} from '@app/short-links/password-page';\n\ntype Linkeable = Link | LinkGroup | Biolink;\n\ninterface Props {\n linkeable: Linkeable;\n}\nexport function LinkeableRenderer({linkeable}: Props) {\n const [passwordValid, setPasswordValid] = useState(!linkeable.has_password);\n if (linkeable.has_password && !passwordValid) {\n return (\n <PasswordPage\n linkeable={linkeable}\n onPasswordValid={() => setPasswordValid(true)}\n />\n );\n }\n\n return getLinkeableRenderer(linkeable);\n}\n\nfunction getLinkeableRenderer(linkeable: Linkeable) {\n switch (linkeable.model_type) {\n case 'link':\n return getLinkRenderer(linkeable as Link);\n case 'linkGroup':\n return <LinkGroupRenderer linkGroup={linkeable} />;\n case 'biolink':\n return <BiolinkRenderer biolink={linkeable} />;\n default:\n return <NotFoundPage />;\n }\n}\n\nfunction getLinkRenderer(link: Link) {\n switch (link.type) {\n case 'frame':\n return <LinkIframeRenderer link={link} />;\n case 'overlay':\n return <LinkOverlayRenderer link={link} />;\n case 'splash':\n return <LinkSplashRenderer link={link} />;\n case 'page':\n return <LinkPageRenderer link={link} />;\n case 'direct':\n window.location.replace(link.long_url);\n return null;\n default:\n return <NotFoundPage />;\n }\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {useAuth} from '@common/auth/use-auth';\nimport {Route, Routes, useLocation} from 'react-router-dom';\nimport {ToastContainer} from '@common/ui/toast/toast-container';\nimport {EmailVerificationPage} from '@common/auth/ui/email-verification-page/email-verification-page';\nimport {DialogStoreOutlet} from '@common/ui/overlays/store/dialog-store-outlet';\nimport {AppearanceListener} from '@common/admin/appearance/commands/appearance-listener';\nimport {CookieNotice} from '@common/ui/cookie-notice/cookie-notice';\nimport {DynamicHomepage} from '@common/ui/dynamic-homepage';\nimport {GuestRoute} from '@common/auth/guards/guest-route';\nimport {LandingPage} from '@app/landing/landing-page';\nimport React, {Fragment} from 'react';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {ActiveWorkspaceProvider} from '@common/workspace/active-workspace-id-context';\nimport {AuthRoute} from '@common/auth/guards/auth-route';\nimport {AuthRoutes} from '@common/auth/auth-routes';\nimport {BillingRoutes} from '@common/billing/billing-routes';\nimport {NotificationRoutes} from '@common/notifications/notification-routes';\nimport {ContactUsPage} from '@common/contact/contact-us-page';\nimport {CustomPageLayout} from '@common/custom-page/custom-page-layout';\nimport {LinkeableRenderer} from '@app/short-links/linkeable-renderer';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\n\nconst AdminRoutes = React.lazy(() => import('@common/admin/admin-routes'));\nconst SwaggerApiDocs = React.lazy(\n () => import('@common/swagger/swagger-api-docs-page')\n);\nconst DashboardRoutes = React.lazy(\n () => import('./dashboard/dashboard-routes')\n);\n\nexport function AppRoutes() {\n const {billing, notifications, require_email_confirmation, api} =\n useSettings();\n const {user, hasPermission} = useAuth();\n\n // if we have linkeable data returned from backend and paths match, render linkeable page\n const {pathname} = useLocation();\n const linkeableData = getBootstrapData().loaders?.linkeablePage;\n const path = pathname.replace(/^\\/|\\/$/g, '');\n if (linkeableData && path === linkeableData.path) {\n return (\n <Fragment>\n <CookieNotice />\n <ToastContainer />\n <LinkeableRenderer linkeable={linkeableData.linkeable} />\n <DialogStoreOutlet />\n </Fragment>\n );\n }\n\n if (user != null && require_email_confirmation && !user.email_verified_at) {\n return (\n <Fragment>\n <ToastContainer />\n <Routes>\n <Route path=\"*\" element={<EmailVerificationPage />} />\n </Routes>\n <DialogStoreOutlet />\n </Fragment>\n );\n }\n\n return (\n <Fragment>\n <AppearanceListener />\n <CookieNotice />\n <ToastContainer />\n <Routes>\n <Route\n path=\"/\"\n element={\n <DynamicHomepage\n homepageResolver={() => (\n <GuestRoute>\n <LandingPage />\n </GuestRoute>\n )}\n />\n }\n />\n <Route\n path=\"/dashboard/*\"\n element={\n <React.Suspense fallback={<FullPageLoader screen />}>\n <ActiveWorkspaceProvider>\n <DashboardRoutes />\n </ActiveWorkspaceProvider>\n </React.Suspense>\n }\n />\n <Route\n path=\"/admin/*\"\n element={\n <AuthRoute permission=\"admin.access\">\n <React.Suspense fallback={<FullPageLoader screen />}>\n <AdminRoutes />\n </React.Suspense>\n </AuthRoute>\n }\n />\n {AuthRoutes}\n {billing.enable && BillingRoutes}\n {notifications.integrated && NotificationRoutes}\n {api?.integrated && hasPermission('api.access') && (\n <Route\n path=\"api-docs\"\n element={\n <React.Suspense fallback={<FullPageLoader screen />}>\n <SwaggerApiDocs />\n </React.Suspense>\n }\n />\n )}\n <Route path=\"contact\" element={<ContactUsPage />} />\n <Route path=\"pages/:pageSlug\" element={<CustomPageLayout />} />\n <Route path=\"*\" element={<NotFoundPage />} />\n </Routes>\n <DialogStoreOutlet />\n </Fragment>\n );\n}\n","import {renderToPipeableStream} from 'react-dom/server';\nimport {BootstrapData} from '@common/core/bootstrap-data/bootstrap-data';\nimport process from 'process';\nimport {\n createServer as createHttpServer,\n IncomingMessage,\n ServerResponse,\n} from 'http';\nimport {setBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {StaticRouter} from 'react-router-dom/server';\nimport {CommonProvider} from '@common/core/common-provider';\nimport {AppRoutes} from '@app/app-routes';\nimport {queryClient} from '@common/http/query-client';\n\nlet port = 13714;\nprocess.argv.forEach(value => {\n if (value.startsWith('port=')) {\n port = parseInt(value.substring('port='.length));\n }\n});\n\ninterface Data {\n bootstrapData: BootstrapData;\n url: string;\n}\n\nconst readableToString: (\n readable: IncomingMessage,\n) => Promise<string> = readable => {\n return new Promise((resolve, reject) => {\n let data = '';\n readable.on('data', chunk => (data += chunk));\n readable.on('end', () => resolve(data));\n readable.on('error', err => reject(err));\n });\n};\n\nconst getPayload = async (request: IncomingMessage) => {\n const payload = await readableToString(request);\n return payload ? JSON.parse(payload) : {};\n};\n\ncreateHttpServer(async (request, response) => {\n if (request.url === '/render') {\n return render(request, response);\n } else {\n return handleOtherRoutes(request, response);\n }\n}).listen(port, () => console.log('SSR server started.'));\n\nasync function render(request: IncomingMessage, response: ServerResponse) {\n const data = (await getPayload(request)) as Data;\n\n setBootstrapData(data.bootstrapData);\n\n const {pipe, abort} = renderToPipeableStream(\n <StaticRouter location={data.url}>\n <CommonProvider>\n <AppRoutes />\n </CommonProvider>\n </StaticRouter>,\n {\n onAllReady() {\n response.setHeader('content-type', 'text/html');\n pipe(response);\n // clear query client to avoid memory leaks and to avoid data from being shared between requests\n queryClient.clear();\n response.end();\n },\n },\n );\n\n // abort after 2 seconds, if rendering takes longer than that\n setTimeout(() => {\n abort();\n }, 2000);\n}\n\nasync function handleOtherRoutes(\n request: IncomingMessage,\n response: ServerResponse,\n) {\n if (request.url === '/screenshot') {\n takeScreenshot(request, response);\n } else if (request.url === '/health') {\n writeJsonResponse(response, {status: 'OK', timestamp: Date.now()});\n } else if (request.url === '/shutdown') {\n response.end();\n process.exit();\n } else {\n writeJsonResponse(response, {status: 'NOT_FOUND', timestamp: Date.now()});\n }\n}\n\nfunction writeJsonResponse(response: ServerResponse, data: object) {\n try {\n response.writeHead(200, {\n 'Content-Type': 'application/json',\n });\n response.write(JSON.stringify(data));\n } catch (e) {\n console.error(e);\n }\n\n response.end();\n}\n\nasync function getDataFromRedis() {\n //@ts-ignore\n const {Redis} = await import('ioredis');\n const redis = new Redis();\n return redis.get('bemusic_database_bootstrap_data');\n}\n\nasync function takeScreenshot(\n request: IncomingMessage,\n response: ServerResponse,\n) {\n try {\n const payload = await getPayload(request);\n // @ts-ignore\n const puppeteer = await import('puppeteer');\n const browser = await puppeteer.launch({\n executablePath: '/snap/bin/chromium',\n headless: 'new',\n defaultViewport: {\n width: 800,\n height: 600,\n },\n });\n const page = await browser.newPage();\n await page.goto(payload.url);\n const image = await page.screenshot({\n type: 'jpeg',\n optimizeForSpeed: true,\n quality: 40,\n encoding: 'binary',\n });\n await browser.close();\n\n response.writeHead(200, {\n 'Content-Type': 'image/jpeg',\n });\n response.write(image);\n response.end();\n } catch (e) {\n console.error(e);\n }\n\n // abort after 3 seconds, if rendering takes longer than that\n setTimeout(() => {\n response.end();\n }, 3000);\n}\n\nconsole.log(`Starting SSR server on port ${port}...`);\n"],"names":["id","method","queryKey","size","getSizeClassName","message","match","content","Fragment","toast","mergeBootstrapData","r","useRouterNavigate","joinWorkspace","deleteInvite","_a","percentage","setBootstrapData","resendEmail","logout","offset","offsetMiddleware","items","Item","useNavigate","itemClassName","enable","getPadding","connect","disable","register","endpoint","MenuItem","changeLocale","m","completeChallenge","login","adCode","pattern","sizeStyle","sizeClassNames","AccountSettingsId","getCookie","Disk","concurrency","deleteFileEntries","UploadInputType","entry","removeAvatar","updatePassword","OptionGroup","Option","confirm","deleteAccount","logoutOther","link","RouterLink","hasNextPage","SocialsType","parts","WidgetType","checkPassword","process","createHttpServer"],"mappings":"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"}
Back to Directory
File Manager