Viewing File: /home/markqprx/iniasli.pro/ssr/assets/dashboard-routes-d9f67ead.mjs.map

{"version":3,"file":"dashboard-routes-d9f67ead.mjs","sources":["../../../common/resources/client/ui/layout/dashboard-layout-context.ts","../../../common/resources/client/utils/hooks/use-block-body-overflow.ts","../../../common/resources/client/ui/layout/dashboard-layout.tsx","../../../common/resources/client/ui/layout/dashboard-content.tsx","../../../common/resources/client/ui/layout/dashboard-sidenav.tsx","../../../common/resources/client/icons/material/MenuOpen.tsx","../../../common/resources/client/ui/layout/dashboard-navbar.tsx","../../../common/resources/client/datatable/filters/backend-filter.ts","../../../common/resources/client/utils/date/start-of-day.ts","../../../common/resources/client/utils/date/end-of-day.ts","../../../common/resources/client/i18n/get-user-timezone.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets.ts","../../../common/resources/client/icons/material/DateRange.tsx","../../../common/resources/client/ui/forms/input-field/input.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/date-picker-field.tsx","../../../common/resources/client/ui/forms/input-field/date/utils.ts","../../../common/resources/client/ui/forms/input-field/date/use-base-date-picker-state.ts","../../../common/resources/client/i18n/use-current-date-time.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/use-date-range-picker-state.ts","../../../common/resources/client/icons/material/ArrowRightAlt.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/utils/adjust-segment.ts","../../../common/resources/client/ui/forms/input-field/date/segments/utils/set-segment.ts","../../../common/resources/client/ui/forms/input-field/date/segments/utils/page-step.ts","../../../common/resources/client/ui/forms/input-field/date/segments/editable-date-segment.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/literal-segment.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/utils/get-segment-limits.ts","../../../common/resources/client/ui/forms/input-field/date/segments/date-segment-list.tsx","../../../common/resources/client/icons/material/KeyboardArrowLeft.tsx","../../../common/resources/client/icons/material/KeyboardArrowRight.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar-cell.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar-month.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar.tsx","../../../common/resources/client/i18n/formatted-date-time-range.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-preset-list.tsx","../../../common/resources/client/utils/hooks/is-tablet-media-query.ts","../../../common/resources/client/ui/forms/toggle/switch.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-preset-list.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-dialog.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/date-range-picker.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/form-date-range-picker.tsx","../../../common/resources/client/datatable/filters/timestamp-filters.ts","../../../common/resources/client/datatable/filters/backend-filters-url-key.ts","../../../common/resources/client/datatable/filters/utils/decode-backend-filters.ts","../../../common/resources/client/datatable/filters/utils/encode-backend-filters.ts","../../../common/resources/client/datatable/filters/backend-filter-url-params.ts","../../../common/resources/client/datatable/requests/paginated-resources.ts","../../../common/resources/client/datatable/page/data-table-context.ts","../../../common/resources/client/utils/keybinds/is-ctrl-key-pressed.ts","../../../common/resources/client/ui/tables/navigate-grid.ts","../../../common/resources/client/ui/tables/table-context.ts","../../../common/resources/client/ui/tables/style/use-table-cell-style.ts","../../../common/resources/client/ui/tables/table-cell.tsx","../../../common/resources/client/ui/interactions/use-pointer-events.ts","../../../common/resources/client/utils/keybinds/is-ctrl-or-shift-pressed.ts","../../../common/resources/client/ui/tables/style/use-table-row-style.ts","../../../common/resources/client/ui/tables/table-row.tsx","../../../common/resources/client/ui/tables/checkbox-column-config.tsx","../../../common/resources/client/icons/material/ArrowDownward.tsx","../../../common/resources/client/ui/tables/header-cell.tsx","../../../common/resources/client/ui/tables/table-header-row.tsx","../../../common/resources/client/ui/tables/table.tsx","../../../common/resources/client/datatable/data-table-pagination-footer.tsx","../../../common/resources/client/icons/material/FilterAlt.tsx","../../../common/resources/client/ui/accordion/accordtion-animation.ts","../../../common/resources/client/ui/accordion/accordion.tsx","../../../common/resources/client/datatable/filters/panels/select-filter-panel.tsx","../../../common/resources/client/datatable/filters/panels/date-range-filter-panel.tsx","../../../common/resources/client/ui/images/avatar.tsx","../../../common/resources/client/users/queries/use-normalized-models.ts","../../../common/resources/client/users/queries/use-normalized-model.ts","../../../common/resources/client/ui/forms/normalized-model-field.tsx","../../../common/resources/client/datatable/filters/panels/normalized-model-filter-panel.tsx","../../../common/resources/client/datatable/filters/filter-operator-names.ts","../../../common/resources/client/datatable/filters/panels/input-filter-panel.tsx","../../../common/resources/client/datatable/filters/panels/boolean-filter-panel.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/chip-list.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/string-to-chip-value.ts","../../../common/resources/client/ui/forms/input-field/chip-field/chip-field.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/form-chip-field.tsx","../../../common/resources/client/datatable/filters/panels/chip-field-filter-panel.tsx","../../../common/resources/client/datatable/filters/add-filter-dialog.tsx","../../../common/resources/client/datatable/filters/add-filter-button.tsx","../../../common/resources/client/datatable/data-table-header.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-trigger-button.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-item-dialog-trigger.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-control.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list.tsx","../../../common/resources/client/datatable/selected-state-datatable-header.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-skeleton.tsx","../../../common/resources/client/datatable/data-table.tsx","../../../common/resources/client/datatable/page/data-table-page.tsx","../../../common/resources/client/datatable/requests/delete-selected-rows.ts","../../../common/resources/client/datatable/page/delete-selected-items-action.tsx","../../../common/resources/client/datatable/page/data-table-emty-state-message.tsx","../../../common/resources/client/icons/material/Add.tsx","../../../common/resources/client/datatable/data-table-add-item-button.tsx","../../../common/resources/client/icons/material/FileDownload.tsx","../../../common/resources/client/datatable/requests/use-export-csv.ts","../../../common/resources/client/uploads/utils/download-file-from-url.ts","../../../common/resources/client/datatable/csv-export/csv-export-info-dialog.tsx","../../../common/resources/client/datatable/csv-export/data-table-export-csv-button.tsx","../../../common/resources/client/datatable/column-templates/name-with-avatar.tsx","../../../common/resources/client/ui/forms/input-field/date/date-picker/use-date-picker-state.ts","../../../common/resources/client/ui/forms/input-field/date/date-picker/date-picker.tsx","../../../common/resources/client/utils/array/chunk-array.ts","../../../common/resources/client/admin/appearance/sections/themes/color-icon.tsx","../../../common/resources/client/ui/color-picker/color-swatch.tsx","../../../common/resources/client/ui/color-picker/color-presets.ts","../../../common/resources/client/ui/color-picker/color-picker.tsx","../../../common/resources/client/ui/color-picker/color-picker-dialog.tsx","../../../common/resources/client/icons/material/DragIndicator.tsx","../../../common/resources/client/icons/material/Delete.tsx","../../../common/resources/client/ui/interactions/dnd/drag-state.ts","../../../common/resources/client/ui/interactions/interactable-event.ts","../../../common/resources/client/ui/interactions/active-interaction.ts","../../../common/resources/client/ui/interactions/utils/dom-rect-to-obj.ts","../../../common/resources/client/ui/interactions/dnd/update-rects.ts","../../../common/resources/client/ui/interactions/dnd/use-draggable.ts","../../../common/resources/client/ui/interactions/dnd/read-files-from-data-transfer.ts","../../../common/resources/client/utils/array/async-iterable-to-array.ts","../../../common/resources/client/ui/interactions/dnd/use-droppable.ts","../../../common/resources/client/utils/array/move-item-in-array.ts","../../../common/resources/client/utils/array/move-item-in-new-array.ts","../../../common/resources/client/ui/interactions/dnd/use-sortable.ts","../../../common/resources/client/ace-editor/ace-dialog.tsx","../../../common/resources/client/admin/custom-pages/articles.svg","../../../common/resources/client/auth/user.ts","../../../common/resources/client/admin/custom-pages/custom-page-datatable-filters.tsx","../../../common/resources/client/ui/themes/utils/theme-value-to-hex.ts","../../../common/resources/client/icons/material/Tune.tsx","../../../common/resources/client/icons/material/MoreVert.tsx","../../../common/resources/client/ui/tabs/tabs-context.tsx","../../../common/resources/client/ui/tabs/tabs.tsx","../../../common/resources/client/ui/tabs/tab-line.tsx","../../../common/resources/client/ui/tabs/tab-list.tsx","../../../common/resources/client/ui/tabs/tab.tsx","../../../common/resources/client/ui/tabs/tab-panels.tsx","../../../common/resources/client/ui/section-helper.tsx","../../../common/resources/client/utils/hooks/sticky-sentinel.ts","../../../common/resources/client/utils/string/slugify-string.ts","../../../common/resources/client/icons/material/UnfoldMore.tsx","../../../common/resources/client/workspace/requests/create-workspace.ts","../../../common/resources/client/workspace/new-workspace-dialog.tsx","../../../common/resources/client/workspace/requests/workspace-with-members.ts","../../../common/resources/client/icons/material/Group.tsx","../../../common/resources/client/workspace/requests/invite-members.ts","../../../common/resources/client/workspace/requests/resend-invite.ts","../../../common/resources/client/utils/string/is-email.ts","../../../common/resources/client/workspace/requests/change-role.ts","../../../common/resources/client/workspace/requests/remove-member.ts","../../../common/resources/client/workspace/leave-workspace-confirmation.tsx","../../../common/resources/client/workspace/workspace-members-dialog.tsx","../../../common/resources/client/icons/material/PersonAdd.tsx","../../../common/resources/client/workspace/requests/update-workspace.ts","../../../common/resources/client/workspace/rename-workspace-dialog.tsx","../../../common/resources/client/workspace/requests/delete-workspace.ts","../../../common/resources/client/workspace/workspace-selector.tsx","../../../resources/client/dashboard/layout/sidenav/use-link-summary.ts","../../../common/resources/client/ui/progress/meter.tsx","../../../common/resources/client/icons/material/Info.tsx","../../../resources/client/dashboard/layout/sidenav/resource-usage-list.tsx","../../../resources/client/dashboard/layout/sidenav/usage-details-trigger.tsx","../../../resources/client/dashboard/layout/sidenav/usage-meter.tsx","../../../resources/client/dashboard/layout/sidenav/upgrade-button.tsx","../../../resources/client/dashboard/layout/sidenav/belink-dashboard-sidenav.tsx","../../../resources/client/dashboard/layout/belink-dasbboard-layout.tsx","../../../common/resources/client/admin/analytics/report-date-selector.tsx","../../../common/resources/client/charts/chart-layout.tsx","../../../common/resources/client/charts/chart-loading-indicator.tsx","../../../common/resources/client/charts/base-chart.tsx","../../../common/resources/client/charts/data/format-report-data.ts","../../../common/resources/client/charts/chart-colors.tsx","../../../common/resources/client/charts/line-chart.tsx","../../../common/resources/client/charts/polar-area-chart.tsx","../../../resources/client/dashboard/reports/referrer-chart.tsx","../../../common/resources/client/admin/analytics/geo-chart/use-google-geo-chart.ts","../../../common/resources/client/icons/material/ArrowBack.tsx","../../../common/resources/client/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon.tsx","../../../common/resources/client/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger.tsx","../../../common/resources/client/i18n/formatted-country-name.tsx","../../../common/resources/client/admin/analytics/geo-chart/geo-chart.tsx","../../../common/resources/client/charts/bar-chart.tsx","../../../resources/client/dashboard/reports/clicks/use-clicks-report.ts","../../../resources/client/dashboard/reports/clicks/clicks-report-charts.tsx","../../../resources/client/dashboard/reports/clicks/clicks-report-page-layout.tsx","../../../resources/client/dashboard/all-clicks-report-page.tsx","../../../resources/client/dashboard/links/links-datatable-page/links-datatable-filters.ts","../../../resources/client/dashboard/links/requests/use-link-form-value-lists.ts","../../../resources/client/dashboard/links/forms/link-type-field.tsx","../../../resources/client/dashboard/upgrade/upgrade.svg","../../../resources/client/dashboard/upgrade/upgrade-dialog.tsx","../../../resources/client/dashboard/upgrade/feature-locked-dialog.tsx","../../../resources/client/dashboard/upgrade/no-permission-button.tsx","../../../resources/client/dashboard/links/forms/link-form-section.tsx","../../../resources/client/dashboard/upgrade/use-link-feature-status.ts","../../../resources/client/dashboard/links/forms/link-restriction-fields.tsx","../../../common/resources/client/icons/material/SwapVert.tsx","../../../resources/client/dashboard/links/forms/link-retargeting-fields.tsx","../../../common/resources/client/icons/material/Public.tsx","../../../resources/client/dashboard/links/forms/link-seo-fields.tsx","../../../common/resources/client/icons/material/AccountTree.tsx","../../../resources/client/dashboard/links/forms/link-utm-fields.tsx","../../../common/resources/client/custom-domains/use-default-custom-domain-host.ts","../../../resources/client/dashboard/links/forms/link-domain-select.tsx","../../../resources/client/dashboard/links/forms/link-settings-form.tsx","../../../common/resources/client/ui/slug-editor.tsx","../../../resources/client/dashboard/links/forms/alias-field.tsx","../../../resources/client/dashboard/links/forms/crupdate-link-form.tsx","../../../resources/client/dashboard/links/utils/build-linkeable-default-form-values.ts","../../../resources/client/dashboard/links/utils/build-linkeable-payload.ts","../../../resources/client/dashboard/links/requests/build-link-payload.ts","../../../resources/client/dashboard/links/requests/use-create-link.ts","../../../resources/client/dashboard/links/dialogs/create-link-dialog.tsx","../../../resources/client/dashboard/links/requests/use-update-link.ts","../../../resources/client/dashboard/links/dialogs/update-link-dialog.tsx","../../../resources/client/dashboard/links/link-image.tsx","../../../resources/client/dashboard/upgrade/over-quota-dialog.tsx","../../../resources/client/dashboard/upgrade/permission-aware-button.tsx","../../../common/resources/client/icons/material/BarChart.tsx","../../../resources/client/dashboard/links/links-datatable-page/links-datatable-columns.tsx","../../../common/resources/client/icons/material/AddLink.tsx","../../../common/resources/client/datatable/csv-export/export-csv-icon.tsx","../../../resources/client/dashboard/links/requests/use-create-multiple-links.ts","../../../resources/client/dashboard/links/dialogs/create-multiple-links-dialog.tsx","../../../resources/client/dashboard/links/links-datatable-page/links-datatable-page.tsx","../../../common/resources/client/icons/material/MoveDown.tsx","../../../resources/client/dashboard/link-groups/link-group-links-datatable-page/requests/use-move-links-to-group.ts","../../../resources/client/dashboard/link-groups/link-group-links-datatable-page/move-links-to-group-dialog.tsx","../../../resources/client/dashboard/link-groups/link-group-links-datatable-page/link-group-links-datatable-page.tsx","../../../common/resources/client/icons/material/ListAlt.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/crupdate/crupdate-link-group-form.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/requests/use-update-link-group.ts","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/crupdate/update-link-group-dialog.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/link-groups-datatable-columns.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/link-groups-datatable-filters.ts","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/requests/use-create-link-group.ts","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/crupdate/create-link-group-dialog.tsx","../../../resources/client/dashboard/link-groups/link-groups-datatable-page/link-groups-datatable-page.tsx","../../../resources/client/dashboard/link-groups/link-group-links-datatable-page/requests/use-link-group.ts","../../../resources/client/dashboard/link-groups/link-group-clicks-report-page.tsx","../../../resources/client/dashboard/layout/sidenav/use-link.ts","../../../resources/client/dashboard/links/link-clicks-report-page.tsx","../../../common/resources/client/custom-domains/datatable/world.svg","../../../common/resources/client/custom-domains/datatable/domains-empty-state-message.tsx","../../../common/resources/client/datatable/column-templates/boolean-indicator.tsx","../../../common/resources/client/custom-domains/datatable/requests/use-delete-domain.ts","../../../common/resources/client/custom-domains/datatable/delete-domain-button.tsx","../../../common/resources/client/custom-domains/datatable/domains-datatable-columns.tsx","../../../common/resources/client/custom-domains/datatable/domains-datatable-filters.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/is-subdomain.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/domain-progress-indicator.tsx","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/info-step.tsx","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/host-step.tsx","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/connect-domain-step.tsx","../../../common/resources/client/custom-domains/datatable/requests/use-validate-domain-dns.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/validation-failed-step.tsx","../../../common/resources/client/custom-domains/datatable/requests/use-authorize-domain-connect.ts","../../../common/resources/client/custom-domains/datatable/requests/use-connect-domain.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/use-connect-domain-stepper.ts","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/finalize-step.tsx","../../../common/resources/client/custom-domains/datatable/connect-domain-dialog/connect-domain-dialog.tsx","../../../resources/client/dashboard/custom-domains/domains-datatable-page.tsx","../../../resources/client/dashboard/tracking-pixels/supported-tracking-pixels.ts","../../../common/resources/client/icons/material/HelpOutline.tsx","../../../resources/client/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form.tsx","../../../resources/client/dashboard/tracking-pixels/requests/use-update-pixel.ts","../../../resources/client/dashboard/tracking-pixels/crupdate-dialog/update-pixel-dialog.tsx","../../../resources/client/dashboard/tracking-pixels/tracking-pixels-datatable-columns.tsx","../../../resources/client/dashboard/tracking-pixels/location-tracking.svg","../../../resources/client/dashboard/tracking-pixels/tracking-pixels-datatable-filters.ts","../../../resources/client/dashboard/tracking-pixels/requests/use-create-pixel.ts","../../../resources/client/dashboard/tracking-pixels/crupdate-dialog/create-pixel-dialog.tsx","../../../resources/client/dashboard/tracking-pixels/tracking-pixels-datatable-page.tsx","../../../resources/client/dashboard/link-pages/requests/use-update-link-page-options.ts","../../../resources/client/dashboard/link-pages/link-page-options-trigger.tsx","../../../resources/client/dashboard/link-pages/link-pages-datatable-columns.tsx","../../../resources/client/dashboard/link-pages/link-pages-datatable-page.tsx","../../../resources/client/dashboard/link-overlays/preferences-popup.svg","../../../resources/client/dashboard/link-overlays/link-overlays-datatable-columns.tsx","../../../resources/client/dashboard/link-overlays/crupdate/link-overlay-constants.ts","../../../resources/client/dashboard/link-overlays/link-overlays-datatable-filters.ts","../../../resources/client/dashboard/link-overlays/link-overlays-datatable-page.tsx","../../../resources/client/dashboard/link-overlays/requests/use-create-link-overlay.ts","../../../resources/client/dashboard/link-overlays/crupdate/overlay-website-background.tsx","../../../resources/client/dashboard/link-overlays/crupdate/crupdate-link-overlay-form.tsx","../../../resources/client/dashboard/link-overlays/crupdate/create-link-overlay-page.tsx","../../../resources/client/dashboard/link-overlays/requests/use-link-overlay.ts","../../../resources/client/dashboard/link-overlays/requests/use-update-link-overlay.ts","../../../resources/client/dashboard/link-overlays/crupdate/update-link-overlay-page.tsx","../../../resources/client/dashboard/biolink/biolinks-datatable-page/marketing.svg","../../../resources/client/dashboard/biolink/biolinks-datatable-page/biolinks-datatable-columns.tsx","../../../resources/client/dashboard/biolink/biolinks-datatable-page/biolinks-datatable-filters.ts","../../../resources/client/dashboard/biolink/biolinks-datatable-page/requests/use-create-biolink.ts","../../../resources/client/dashboard/biolink/biolinks-datatable-page/crupdate/create-biolink-dialog.tsx","../../../resources/client/dashboard/biolink/biolinks-datatable-page/biolinks-datatable-page.tsx","../../../resources/client/dashboard/biolink/biolinks-datatable-page/requests/use-biolink.ts","../../../resources/client/dashboard/biolink/biolink-clicks-report-page.tsx","../../../common/resources/client/icons/material/Widgets.tsx","../../../common/resources/client/icons/material/Animation.tsx","../../../common/resources/client/icons/material/Shortcut.tsx","../../../common/resources/client/icons/material/MoreTime.tsx","../../../resources/client/dashboard/biolink/biolink-editor/biolink-editor-store.ts","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-editor-biolink.ts","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-schedule-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/leap-link-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-thumbnail-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-animation-list.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-animation-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-detach-biolink-content-item.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/detach-content-item-button.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-sort-biolink-content.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/biolink-content-item-layout.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/link-content-item/link-content-item.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-update-biolink.ts","../../../resources/client/dashboard/biolink/biolink-editor/biolink-settings-form.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-crupdate-biolink-widget.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/image-widget/image-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/image.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/text.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/socials.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/youtube.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/soundcloud.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/vimeo.jpeg","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/spotify.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/twitch.svg","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/widget-images/tiktok.png","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/youtube-widget/youtube-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/text-widget/text-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/twitch-widget/twitch-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/soundcloud-widget/soundcloud-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/vimeo-widget/vimeo-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/tiktok-widget/tiktok-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-list.ts","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/select-widget-dialog.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-selector/new-widget-dialog-container.tsx","../../../common/resources/client/icons/material/ArrowUpward.tsx","../../../resources/client/dashboard/biolink/biolink-editor/content/widgets/widget-content-item.tsx","../../../resources/client/dashboard/biolink/biolink-editor/live-preview.tsx","../../../common/resources/client/icons/material/FormatColorFill.tsx","../../../common/resources/client/icons/material/Gradient.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector-button.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/color-backgrounds.ts","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/color-background-tab.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/gradient-backgrounds.ts","../../../common/resources/client/icons/material/ArrowForward.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/gradient-background-tab.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Angled-Focus.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Circular-Focus.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Farseeing-Eyeball.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Canyon-Funnel.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Looney-Loops.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Hurricane-Aperture.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Icy-Explosion.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Protruding-Squares.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Alternating-Triangles.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Monstera-Patch.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Confetti-Doodles.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Threads-Ahead.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Launch-Day.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Sprinkle.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Circuit-Board.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/nuclear-focalpoint.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/svg-bgs/Snow.svg","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/image-backgrounds.ts","../../../common/resources/client/icons/material/Upload.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/image-background-tab/background-position-selector.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/image-background-tab/image-background-tab.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/header-classnames.ts","../../../resources/client/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/button-style-selector.tsx","../../../common/resources/client/ui/font-selector/font.svg","../../../common/resources/client/ui/font-selector/font-selector-filters.tsx","../../../common/resources/client/i18n/use-filter.ts","../../../common/resources/client/ui/font-picker/browser-safe-fonts.ts","../../../common/resources/client/ui/font-selector/font-selector-state.ts","../../../common/resources/client/ui/font-selector/font-selector-pagination.tsx","../../../common/resources/client/ui/font-selector/font-selector.tsx","../../../resources/client/dashboard/biolink/biolink-editor/requests/use-save-biolink-appearance.ts","../../../resources/client/dashboard/biolink/biolink-editor/appearance/color-input.tsx","../../../resources/client/dashboard/biolink/biolink-editor/appearance/biolink-appearance-editor.tsx","../../../resources/client/dashboard/biolink/biolink-editor/biolink-editor-page.tsx","../../../common/resources/client/article-editor/article-editor-title.tsx","../../../common/resources/client/icons/material/Undo.tsx","../../../common/resources/client/icons/material/Redo.tsx","../../../common/resources/client/text-editor/menubar/history-buttons.tsx","../../../common/resources/client/icons/material/Code.tsx","../../../common/resources/client/text-editor/menubar/mode-button.tsx","../../../common/resources/client/text-editor/menubar/divider.tsx","../../../common/resources/client/icons/material/FormatBold.tsx","../../../common/resources/client/icons/material/FormatItalic.tsx","../../../common/resources/client/icons/material/FormatUnderlined.tsx","../../../common/resources/client/text-editor/menubar/font-style-buttons.tsx","../../../common/resources/client/icons/material/FormatListBulleted.tsx","../../../common/resources/client/icons/material/FormatListNumbered.tsx","../../../common/resources/client/text-editor/menubar/list-buttons.tsx","../../../common/resources/client/text-editor/insert-link-into-text-editor.ts","../../../common/resources/client/text-editor/menubar/link-button.tsx","../../../common/resources/client/text-editor/menubar/image-button.tsx","../../../common/resources/client/icons/material/FormatClear.tsx","../../../common/resources/client/text-editor/menubar/clear-format-button.tsx","../../../common/resources/client/icons/material/HorizontalRule.tsx","../../../common/resources/client/icons/material/PriorityHigh.tsx","../../../common/resources/client/icons/material/Note.tsx","../../../common/resources/client/icons/material/SmartDisplay.tsx","../../../common/resources/client/text-editor/menubar/insert-menu-trigger.tsx","../../../common/resources/client/ui/keyboard/keyboard.tsx","../../../common/resources/client/text-editor/menubar/format-menu-trigger.tsx","../../../common/resources/client/icons/material/FormatColorText.tsx","../../../common/resources/client/text-editor/menubar/color-buttons.tsx","../../../common/resources/client/icons/material/FormatAlignLeft.tsx","../../../common/resources/client/icons/material/FormatAlignCenter.tsx","../../../common/resources/client/icons/material/FormatAlignRight.tsx","../../../common/resources/client/icons/material/FormatAlignJustify.tsx","../../../common/resources/client/text-editor/menubar/align-buttons.tsx","../../../common/resources/client/icons/material/FormatIndentDecrease.tsx","../../../common/resources/client/icons/material/FormatIndentIncrease.tsx","../../../common/resources/client/text-editor/menubar/indent-buttons.tsx","../../../common/resources/client/text-editor/menubar/code-block-menu-trigger.tsx","../../../common/resources/client/icons/material/UnfoldLess.tsx","../../../common/resources/client/article-editor/article-body-editor-menubar.tsx","../../../common/resources/client/article-editor/article-editor-sticky-header.tsx","../../../resources/client/dashboard/link-pages/requests/use-create-link-page.ts","../../../resources/client/dashboard/link-pages/create-link-page.tsx","../../../resources/client/dashboard/link-pages/requests/use-link-page.ts","../../../resources/client/dashboard/link-pages/requests/use-update-link-page.ts","../../../resources/client/dashboard/link-pages/edit-link-page.tsx","../../../resources/client/dashboard/dashboard-routes.tsx"],"sourcesContent":["import {createContext} from 'react';\n\nexport type DashboardSidenavStatus = 'open' | 'closed' | 'compact';\n\nexport interface DashboardContextValue {\n  leftSidenavStatus: DashboardSidenavStatus;\n  setLeftSidenavStatus: (status: DashboardSidenavStatus) => void;\n  rightSidenavStatus: DashboardSidenavStatus;\n  setRightSidenavStatus: (status: DashboardSidenavStatus) => void;\n  isMobileMode: boolean | null;\n  leftSidenavCanBeCompact?: boolean;\n  name: string;\n}\n\nexport const DashboardLayoutContext = createContext<DashboardContextValue>(\n  null!\n);\n","import {useEffect} from 'react';\n\nexport function useBlockBodyOverflow(disable: boolean = false) {\n  useEffect(() => {\n    if (disable) {\n      document.documentElement.classList.remove('no-page-overflow');\n    } else {\n      document.documentElement.classList.add('no-page-overflow');\n    }\n    return () => {\n      document.documentElement.classList.remove('no-page-overflow');\n    };\n  }, [disable]);\n}\n","import {ComponentPropsWithoutRef, useCallback, useMemo} from 'react';\nimport {\n  DashboardLayoutContext,\n  DashboardSidenavStatus,\n} from './dashboard-layout-context';\nimport {Underlay} from '../overlays/underlay';\nimport {AnimatePresence} from 'framer-motion';\nimport {useControlledState} from '@react-stately/utils';\nimport {useMediaQuery} from '../../utils/hooks/use-media-query';\nimport {\n  getFromLocalStorage,\n  setInLocalStorage,\n} from '../../utils/hooks/local-storage';\nimport {useBlockBodyOverflow} from '../../utils/hooks/use-block-body-overflow';\nimport clsx from 'clsx';\n\ninterface DashboardLayoutProps extends ComponentPropsWithoutRef<'div'> {\n  name: string;\n  leftSidenavCanBeCompact?: boolean;\n  leftSidenavStatus?: DashboardSidenavStatus;\n  onLeftSidenavChange?: (status: DashboardSidenavStatus) => void;\n  rightSidenavStatus?: DashboardSidenavStatus;\n  initialRightSidenavStatus?: DashboardSidenavStatus;\n  onRightSidenavChange?: (status: DashboardSidenavStatus) => void;\n  height?: string;\n  gridClassName?: string;\n  blockBodyOverflow?: boolean;\n}\nexport function DashboardLayout({\n  children,\n  leftSidenavStatus: leftSidenav,\n  onLeftSidenavChange,\n  rightSidenavStatus: rightSidenav,\n  initialRightSidenavStatus,\n  onRightSidenavChange,\n  name,\n  leftSidenavCanBeCompact,\n  height = 'h-screen',\n  className,\n  gridClassName = 'dashboard-grid',\n  blockBodyOverflow = true,\n  ...domProps\n}: DashboardLayoutProps) {\n  useBlockBodyOverflow(!blockBodyOverflow);\n  const isMobile = useMediaQuery('(max-width: 1024px)');\n\n  const isCompactModeInitially = useMemo(() => {\n    return !name ? false : getFromLocalStorage(`${name}.sidenav.compact`);\n  }, [name]);\n  const defaultLeftSidenavStatus = isCompactModeInitially ? 'compact' : 'open';\n  const [leftSidenavStatus, setLeftSidenavStatus] = useControlledState(\n    leftSidenav,\n    isMobile ? 'closed' : defaultLeftSidenavStatus,\n    onLeftSidenavChange,\n  );\n\n  const rightSidenavStatusDefault = useMemo(() => {\n    if (isMobile) {\n      return 'closed';\n    }\n    if (initialRightSidenavStatus != null) {\n      return initialRightSidenavStatus;\n    }\n    const userSelected = getFromLocalStorage(\n      `${name}.sidenav.right.position`,\n      'open',\n    );\n    if (userSelected != null) {\n      return userSelected;\n    }\n    return initialRightSidenavStatus || 'closed';\n  }, [isMobile, name, initialRightSidenavStatus]);\n  const [rightSidenavStatus, _setRightSidenavStatus] = useControlledState(\n    rightSidenav,\n    rightSidenavStatusDefault,\n    onRightSidenavChange,\n  );\n  const setRightSidenavStatus = useCallback(\n    (status: DashboardSidenavStatus) => {\n      _setRightSidenavStatus(status);\n      setInLocalStorage(`${name}.sidenav.right.position`, status);\n    },\n    [_setRightSidenavStatus, name],\n  );\n\n  const shouldShowUnderlay =\n    isMobile && (leftSidenavStatus === 'open' || rightSidenavStatus === 'open');\n\n  return (\n    <DashboardLayoutContext.Provider\n      value={{\n        leftSidenavStatus,\n        setLeftSidenavStatus,\n        rightSidenavStatus,\n        setRightSidenavStatus,\n        leftSidenavCanBeCompact,\n        name,\n        isMobileMode: isMobile,\n      }}\n    >\n      <div\n        {...domProps}\n        className={clsx('relative isolate', gridClassName, className, height)}\n      >\n        {children}\n        <AnimatePresence>\n          {shouldShowUnderlay && (\n            <Underlay\n              position=\"fixed\"\n              key=\"dashboard-underlay\"\n              onClick={() => {\n                setLeftSidenavStatus('closed');\n                setRightSidenavStatus('closed');\n              }}\n            />\n          )}\n        </AnimatePresence>\n      </div>\n    </DashboardLayoutContext.Provider>\n  );\n}\n","import {cloneElement, ReactElement} from 'react';\nimport clsx from 'clsx';\n\ninterface DashboardContentProps {\n  children: ReactElement<{className: string}>;\n  isScrollable?: boolean;\n}\nexport function DashboardContent({\n  children,\n  isScrollable = true,\n}: DashboardContentProps) {\n  return cloneElement(children, {\n    className: clsx(\n      children.props.className,\n      isScrollable && 'overflow-y-auto stable-scrollbar',\n      'dashboard-grid-content'\n    ),\n  });\n}\n","import clsx from 'clsx';\nimport {m} from 'framer-motion';\nimport {cloneElement, ReactElement, useContext} from 'react';\nimport {DashboardLayoutContext} from './dashboard-layout-context';\n\nexport interface DashboardSidenavChildrenProps {\n  className?: string;\n  isCompactMode?: boolean;\n}\n\nexport interface SidenavProps {\n  className?: string;\n  children: ReactElement<DashboardSidenavChildrenProps>;\n  position?: 'left' | 'right';\n  size?: 'sm' | 'md' | 'lg' | string;\n  mode?: 'overlay';\n  // absolute will place sidenav between navbar/footer, fixed will overlay it over nav/footer.\n  overlayPosition?: 'absolute' | 'fixed';\n  display?: 'flex' | 'block';\n  overflow?: string;\n  forceClosed?: boolean;\n}\nexport function DashboardSidenav({\n  className,\n  position,\n  children,\n  size = 'md',\n  mode,\n  overlayPosition = 'fixed',\n  display = 'flex',\n  overflow = 'overflow-hidden',\n  forceClosed = false,\n}: SidenavProps) {\n  const {\n    isMobileMode,\n    leftSidenavStatus,\n    setLeftSidenavStatus,\n    rightSidenavStatus,\n    setRightSidenavStatus,\n  } = useContext(DashboardLayoutContext);\n  const status = position === 'left' ? leftSidenavStatus : rightSidenavStatus;\n  const isOverlayMode = isMobileMode || mode === 'overlay';\n\n  const variants = {\n    open: {display, width: null as any},\n    compact: {\n      display,\n      width: null as any,\n    },\n    closed: {\n      width: 0,\n      transitionEnd: {\n        display: 'none',\n      },\n    },\n  };\n\n  const sizeClassName = getSize(status === 'compact' ? 'compact' : size);\n\n  return (\n    <m.div\n      variants={variants}\n      initial={false}\n      animate={forceClosed ? 'closed' : status}\n      transition={{type: 'tween', duration: 0.15}}\n      onClick={e => {\n        // close sidenav when user clicks a link or button on mobile\n        const target = e.target as HTMLElement;\n        if (isMobileMode && (target.closest('button') || target.closest('a'))) {\n          setLeftSidenavStatus('closed');\n          setRightSidenavStatus('closed');\n        }\n      }}\n      className={clsx(\n        className,\n        position === 'left'\n          ? 'dashboard-grid-sidenav-left'\n          : 'dashboard-grid-sidenav-right',\n        'will-change-[width]',\n        overflow,\n        sizeClassName,\n        isOverlayMode && `${overlayPosition} bottom-0 top-0 z-20 shadow-2xl`,\n        isOverlayMode && position === 'left' && 'left-0',\n        isOverlayMode && position === 'right' && 'right-0',\n      )}\n    >\n      {cloneElement<DashboardSidenavChildrenProps>(children, {\n        className: clsx(\n          children.props.className,\n          'w-full h-full',\n          status === 'compact' && 'compact-scrollbar',\n        ),\n        isCompactMode: status === 'compact',\n      })}\n    </m.div>\n  );\n}\n\nfunction getSize(size: SidenavProps['size'] | 'compact'): string {\n  switch (size) {\n    case 'compact':\n      return 'w-80';\n    case 'sm':\n      return 'w-224';\n    case 'md':\n      return 'w-240';\n    case 'lg':\n      return 'w-288';\n    default:\n      return size || '';\n  }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MenuOpenIcon = createSvgIcon(\n  <path d=\"M3 18h13v-2H3v2zm0-5h10v-2H3v2zm0-7v2h13V6H3zm18 9.59L17.42 12 21 8.41 19.59 7l-5 5 5 5L21 15.59z\" />\n, 'MenuOpenOutlined');\n","import {Navbar, NavbarProps} from '../navigation/navbar/navbar';\nimport {IconButton} from '../buttons/icon-button';\nimport React, {useContext} from 'react';\nimport clsx from 'clsx';\nimport {DashboardLayoutContext} from './dashboard-layout-context';\nimport {setInLocalStorage} from '../../utils/hooks/local-storage';\nimport {MenuOpenIcon} from '@common/icons/material/MenuOpen';\n\nexport interface DashboardNavbarProps\n  extends Omit<NavbarProps, 'toggleButton'> {\n  hideToggleButton?: boolean;\n}\nexport function DashboardNavbar({\n  children,\n  className,\n  hideToggleButton,\n  ...props\n}: DashboardNavbarProps) {\n  const {\n    isMobileMode,\n    leftSidenavStatus,\n    setLeftSidenavStatus,\n    name,\n    leftSidenavCanBeCompact,\n  } = useContext(DashboardLayoutContext);\n\n  const shouldToggleCompactMode = leftSidenavCanBeCompact && !isMobileMode;\n  const shouldShowToggle =\n    !hideToggleButton && (isMobileMode || leftSidenavCanBeCompact);\n\n  const handleToggle = () => {\n    setLeftSidenavStatus(leftSidenavStatus === 'open' ? 'closed' : 'open');\n  };\n\n  const handleCompactModeToggle = () => {\n    const newStatus = leftSidenavStatus === 'compact' ? 'open' : 'compact';\n    setInLocalStorage(`${name}.sidenav.compact`, newStatus === 'compact');\n    setLeftSidenavStatus(newStatus);\n  };\n\n  return (\n    <Navbar\n      className={clsx('dashboard-grid-navbar', className)}\n      border=\"border-b\"\n      size=\"sm\"\n      toggleButton={\n        shouldShowToggle ? (\n          <IconButton\n            size=\"md\"\n            onClick={() => {\n              if (shouldToggleCompactMode) {\n                handleCompactModeToggle();\n              } else {\n                handleToggle();\n              }\n            }}\n          >\n            <MenuOpenIcon />\n          </IconButton>\n        ) : undefined\n      }\n      {...props}\n    >\n      {children}\n    </Navbar>\n  );\n}\n","import {ComponentType} from 'react';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {ChipValue} from '@common/ui/forms/input-field/chip-field/chip-field';\nimport {AbsoluteDateRange} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {DateValue} from '@internationalized/date';\nimport {FilterListControlProps} from '@common/datatable/filters/filter-list/filter-list-control';\n\nexport interface FilterSelectControl {\n  type: FilterControlType.Select;\n  options: {label: MessageDescriptor; key: string | number; value: any}[];\n  defaultValue?: string | number | boolean;\n  placeholder?: MessageDescriptor;\n  searchPlaceholder?: MessageDescriptor;\n  showSearchField?: boolean;\n}\n\nexport interface FilterNumberInputControl {\n  type: FilterControlType.Input;\n  placeholder?: MessageDescriptor;\n  inputType: 'number';\n  minValue?: number;\n  maxValue?: number;\n  defaultValue: number;\n}\n\nexport interface FilterTextInputControl {\n  type: FilterControlType.Input;\n  placeholder?: MessageDescriptor;\n  inputType: 'string';\n  minLength?: number;\n  maxLength?: number;\n  defaultValue: string;\n}\n\nexport interface FilterSelectModelControl {\n  type: FilterControlType.SelectModel;\n  model: string;\n  defaultValue?: NormalizedModel;\n}\n\nexport interface FilterChipFieldControl {\n  type: FilterControlType.ChipField;\n  options: FilterSelectControl['options'];\n  placeholder?: MessageDescriptor;\n  defaultValue: ChipValue[];\n}\n\nexport interface FilterBooleanToggleControl {\n  type: FilterControlType.BooleanToggle;\n  // value can be something other than boolean, toggling will either send that value or nothing\n  defaultValue: string | number | boolean | null;\n}\n\nexport interface DatePickerFilterControl {\n  type: FilterControlType.DateRangePicker;\n  defaultValue: AbsoluteDateRange;\n  min?: DateValue;\n  max?: DateValue;\n}\n\nexport interface CustomFilterControl {\n  type: FilterControlType.Custom;\n  panel: ComponentType<{filter: BackendFilter<CustomFilterControl>}>;\n  listItem: ComponentType<FilterListControlProps<number, CustomFilterControl>>;\n  defaultValue?: any;\n}\n\nexport type FilterControl =\n  | FilterSelectControl\n  | FilterNumberInputControl\n  | FilterTextInputControl\n  | FilterSelectModelControl\n  | FilterChipFieldControl\n  | DatePickerFilterControl\n  | FilterBooleanToggleControl\n  | CustomFilterControl;\n\nexport interface BackendFilter<T = FilterControl> {\n  key: string;\n  label: MessageDescriptor;\n  description?: MessageDescriptor;\n  control: T;\n  defaultOperator: FilterOperator;\n  operators?: FilterOperator[];\n  extraFilters?: {key: string; operator: FilterOperator; value: any}[];\n}\n\nexport enum FilterControlType {\n  Select = 'select',\n  DateRangePicker = 'dateRangePicker',\n  SelectModel = 'selectModel',\n  Input = 'input',\n  BooleanToggle = 'booleanToggle',\n  ChipField = 'chipField',\n  Custom = 'custom',\n}\n\nexport enum FilterOperator {\n  eq = '=',\n  ne = '!=',\n  gt = '>',\n  gte = '>=',\n  lt = '<',\n  lte = '<=',\n  has = 'has',\n  hasAll = 'hasAll',\n  doesntHave = 'doesntHave',\n  between = 'between',\n}\n\nexport const ALL_PRIMITIVE_OPERATORS = [\n  FilterOperator.eq,\n  FilterOperator.ne,\n  FilterOperator.gt,\n  FilterOperator.gte,\n  FilterOperator.lt,\n  FilterOperator.lte,\n];\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function startOfDay(date: ZonedDateTime): ZonedDateTime {\n  return date.set({hour: 0, minute: 0, second: 0, millisecond: 0});\n}\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function endOfDay(date: ZonedDateTime): ZonedDateTime {\n  return date.set({\n    hour: 24 - 1,\n    minute: 60 - 1,\n    second: 60 - 1,\n    millisecond: 1000 - 1,\n  });\n}\n","import {getBootstrapData} from '../core/bootstrap-data/use-backend-bootstrap-data';\nimport {getLocalTimeZone} from '@internationalized/date';\n\nexport function getUserTimezone(): string {\n  const defaultTimezone = getBootstrapData()?.settings.dates.default_timezone;\n  const preferredTimezone =\n    getBootstrapData()?.user?.timezone || defaultTimezone || 'auto';\n\n  if (!preferredTimezone || preferredTimezone === 'auto') {\n    return getLocalTimeZone();\n  }\n  return preferredTimezone;\n}\n","import {DateRangeValue} from '../date-range-value';\nimport {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {\n  endOfMonth,\n  endOfWeek,\n  endOfYear,\n  now,\n  startOfMonth,\n  startOfWeek,\n  startOfYear,\n} from '@internationalized/date';\nimport {startOfDay} from '@common/utils/date/start-of-day';\nimport {endOfDay} from '@common/utils/date/end-of-day';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {getUserTimezone} from '@common/i18n/get-user-timezone';\n\nconst Now = startOfDay(now(getUserTimezone()));\nconst locale = getBootstrapData()?.i18n?.language || 'en';\n\nexport interface DateRangePreset {\n  key: number;\n  label: MessageDescriptor;\n  getRangeValue: () => DateRangeValue;\n}\n\nexport const DateRangePresets: DateRangePreset[] = [\n  {\n    key: 0,\n    label: message('Today'),\n    getRangeValue: () => ({\n      preset: 0,\n      start: Now,\n      end: endOfDay(Now),\n    }),\n  },\n  {\n    key: 1,\n    label: message('Yesterday'),\n    getRangeValue: () => ({\n      preset: 1,\n      start: Now.subtract({days: 1}),\n      end: endOfDay(Now).subtract({days: 1}),\n    }),\n  },\n  {\n    key: 2,\n    label: message('This week'),\n    getRangeValue: () => ({\n      preset: 2,\n      start: startOfWeek(Now, locale),\n      end: endOfWeek(endOfDay(Now), locale),\n    }),\n  },\n  {\n    key: 3,\n    label: message('Last week'),\n    getRangeValue: () => {\n      const start = startOfWeek(Now, locale).subtract({days: 7});\n      return {\n        preset: 3,\n        start,\n        end: start.add({days: 6}),\n      };\n    },\n  },\n  {\n    key: 4,\n    label: message('Last 7 days'),\n    getRangeValue: () => ({\n      preset: 4,\n      start: Now.subtract({days: 7}),\n      end: endOfDay(Now),\n    }),\n  },\n  {\n    key: 6,\n    label: message('Last 30 days'),\n    getRangeValue: () => ({\n      preset: 6,\n      start: Now.subtract({days: 30}),\n      end: endOfDay(Now),\n    }),\n  },\n  {\n    key: 7,\n    label: message('Last 3 months'),\n    getRangeValue: () => ({\n      preset: 7,\n      start: Now.subtract({months: 3}),\n      end: endOfDay(Now),\n    }),\n  },\n  {\n    key: 8,\n    label: message('Last 12 months'),\n    getRangeValue: () => ({\n      preset: 8,\n      start: Now.subtract({months: 12}),\n      end: endOfDay(Now),\n    }),\n  },\n  {\n    key: 9,\n    label: message('This month'),\n    getRangeValue: () => ({\n      preset: 9,\n      start: startOfMonth(Now),\n      end: endOfMonth(endOfDay(Now)),\n    }),\n  },\n  {\n    key: 10,\n    label: message('This year'),\n    getRangeValue: () => ({\n      preset: 10,\n      start: startOfYear(Now),\n      end: endOfYear(endOfDay(Now)),\n    }),\n  },\n  {\n    key: 11,\n    label: message('Last year'),\n    getRangeValue: () => ({\n      preset: 11,\n      start: startOfYear(Now).subtract({years: 1}),\n      end: endOfYear(endOfDay(Now)).subtract({years: 1}),\n    }),\n  },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DateRangeIcon = createSvgIcon(\n  <path d=\"M7 11h2v2H7v-2zm14-5v14c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2l.01-14c0-1.1.88-2 1.99-2h1V2h2v2h8V2h2v2h1c1.1 0 2 .9 2 2zM5 8h14V6H5v2zm14 12V10H5v10h14zm-4-7h2v-2h-2v2zm-4 0h2v-2h-2v2z\" />\n, 'DateRangeOutlined');\n","import {FocusScope} from '@react-aria/focus';\nimport React, {ComponentPropsWithoutRef, CSSProperties, ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface InputProps {\n  className?: string;\n  children: ReactNode;\n  autoFocus?: boolean;\n  disabled?: boolean;\n  style?: CSSProperties;\n  inputProps?: ComponentPropsWithoutRef<'div'>;\n  wrapperProps?: ComponentPropsWithoutRef<'div'>;\n  onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport const Input = React.forwardRef<HTMLDivElement, InputProps>(\n  (props, ref) => {\n    const {\n      children,\n      inputProps,\n      wrapperProps,\n      className,\n      autoFocus,\n      style,\n      onClick,\n    } = props;\n\n    return (\n      <div {...wrapperProps} onClick={onClick}>\n        <div\n          {...inputProps}\n          role=\"group\"\n          className={clsx(\n            className,\n            'flex items-center focus-within:ring focus-within:ring-primary/focus focus-within:border-primary/60'\n          )}\n          ref={ref}\n          style={style}\n        >\n          <FocusScope autoFocus={autoFocus}>{children}</FocusScope>\n        </div>\n      </div>\n    );\n  }\n);\n","import React, {ComponentPropsWithoutRef, FocusEventHandler, Ref} from 'react';\nimport clsx from 'clsx';\nimport {createFocusManager} from '@react-aria/focus';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {getInputFieldClassNames} from '../../get-input-field-class-names';\nimport {Field, FieldProps} from '../../field';\nimport {Input} from '../../input';\nimport {useField} from '../../use-field';\n\nexport interface DatePickerFieldProps\n  extends Omit<FieldProps, 'fieldClassNames'> {\n  inputRef?: Ref<HTMLDivElement>;\n  onBlur?: FocusEventHandler;\n  showCalendarFooter?: boolean;\n}\nexport const DatePickerField = React.forwardRef<\n  HTMLDivElement,\n  DatePickerFieldProps\n>(({inputRef, wrapperProps, children, onBlur, ...other}, ref) => {\n  const fieldClassNames = getInputFieldClassNames(other);\n  const objRef = useObjectRef(ref);\n\n  const {fieldProps, inputProps} = useField({\n    ...other,\n    focusRef: objRef,\n    labelElementType: 'span',\n  });\n\n  fieldClassNames.wrapper = clsx(\n    fieldClassNames.wrapper,\n    other.disabled && 'pointer-events-none',\n  );\n\n  return (\n    <Field\n      wrapperProps={mergeProps<ComponentPropsWithoutRef<'div'>[]>(\n        wrapperProps!,\n        {\n          onBlur: e => {\n            if (!objRef.current.contains(e.relatedTarget)) {\n              onBlur?.(e);\n            }\n          },\n          onClick: () => {\n            // focus first segment when clicking on label or somewhere else in the field, but no directly on segment\n            const focusManager = createFocusManager(objRef);\n            focusManager?.focusFirst();\n          },\n        },\n      )}\n      fieldClassNames={fieldClassNames}\n      ref={objRef}\n      {...fieldProps}\n    >\n      <Input\n        inputProps={inputProps}\n        className={clsx(fieldClassNames.input, 'gap-10')}\n        ref={inputRef}\n      >\n        {children}\n      </Input>\n    </Field>\n  );\n});\n","import {CalendarDate, DateValue} from '@internationalized/date';\n\nexport function getDefaultGranularity(date: DateValue) {\n  if (date instanceof CalendarDate) {\n    return 'day';\n  }\n  return 'minute';\n}\n\nexport function dateIsInvalid(\n  date: CalendarDate,\n  min?: DateValue,\n  max?: DateValue\n) {\n  return (\n    (min != null && date.compare(min) < 0) ||\n    (max != null && date.compare(max) > 0)\n  );\n}\n","import {useState} from 'react';\nimport {DateValue, toZoned, ZonedDateTime} from '@internationalized/date';\nimport {getDefaultGranularity} from './utils';\nimport type {DatePickerValueProps} from './date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-picker/date-range-value';\nimport {useUserTimezone} from '@common/i18n/use-user-timezone';\n\nexport function useBaseDatePickerState(\n  selectedDate: DateValue,\n  props:\n    | DatePickerValueProps<ZonedDateTime>\n    | DatePickerValueProps<Partial<DateRangeValue>, DateRangeValue>\n) {\n  const timezone = useUserTimezone();\n  const [calendarIsOpen, setCalendarIsOpen] = useState(false);\n  const closeDialogOnSelection = props.closeDialogOnSelection ?? true;\n\n  const granularity = props.granularity || getDefaultGranularity(selectedDate);\n  const min = props.min ? toZoned(props.min, timezone) : undefined;\n  const max = props.max ? toZoned(props.max, timezone) : undefined;\n\n  return {\n    timezone,\n    granularity,\n    min,\n    max,\n    calendarIsOpen,\n    setCalendarIsOpen,\n    closeDialogOnSelection,\n  };\n}\n","import {useMemo} from 'react';\nimport {now} from '@internationalized/date';\nimport {useUserTimezone} from './use-user-timezone';\n\nexport function useCurrentDateTime() {\n  const timezone = useUserTimezone();\n  return useMemo(() => {\n    return now(timezone);\n  }, [timezone]);\n}\n","import {useControlledState} from '@react-stately/utils';\nimport {HTMLAttributes, useCallback, useState} from 'react';\nimport {\n  CalendarDate,\n  DateValue,\n  endOfMonth,\n  isSameDay,\n  isSameMonth,\n  maxDate,\n  minDate,\n  startOfMonth,\n  toCalendarDate,\n  toZoned,\n  ZonedDateTime,\n} from '@internationalized/date';\nimport {\n  BaseDatePickerState,\n  DatePickerValueProps,\n} from '../date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-value';\nimport {useBaseDatePickerState} from '../use-base-date-picker-state';\nimport {startOfDay} from '@common/utils/date/start-of-day';\nimport {endOfDay} from '@common/utils/date/end-of-day';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\n\nexport interface IsPlaceholderValue {\n  start: boolean;\n  end: boolean;\n}\n\nexport type DateRangePickerState = BaseDatePickerState<\n  DateRangeValue,\n  IsPlaceholderValue\n>;\n\nexport function useDateRangePickerState(\n  props: DatePickerValueProps<Partial<DateRangeValue>, DateRangeValue>,\n): DateRangePickerState {\n  const now = useCurrentDateTime();\n  const [isPlaceholder, setIsPlaceholder] = useState<IsPlaceholderValue>({\n    start: (!props.value || !props.value.start) && !props.defaultValue?.start,\n    end: (!props.value || !props.value.end) && !props.defaultValue?.end,\n  });\n\n  // if user clears the date, we will want to still keep an\n  // instance internally, but return null via \"onChange\" callback\n  const setStateValue = props.onChange;\n  const [internalValue, setInternalValue] = useControlledState(\n    props.value ? completeRange(props.value, now) : undefined,\n    !props.value ? completeRange(props.defaultValue, now) : undefined,\n    value => {\n      setIsPlaceholder({start: false, end: false});\n      setStateValue?.(value);\n    },\n  );\n\n  const {\n    min,\n    max,\n    granularity,\n    timezone,\n    calendarIsOpen,\n    setCalendarIsOpen,\n    closeDialogOnSelection,\n  } = useBaseDatePickerState(internalValue.start, props);\n\n  const clear = useCallback(() => {\n    setIsPlaceholder({start: true, end: true});\n    setInternalValue(completeRange(null, now));\n    setStateValue?.(null);\n    setCalendarIsOpen(false);\n  }, [now, setInternalValue, setStateValue, setCalendarIsOpen]);\n\n  const [anchorDate, setAnchorDate] = useState<CalendarDate | null>(null);\n  const [isHighlighting, setIsHighlighting] = useState(false);\n  const [highlightedRange, setHighlightedRange] =\n    useState<DateRangeValue>(internalValue);\n  const [calendarDates, setCalendarDates] = useState<CalendarDate[]>(() => {\n    return rangeToCalendarDates(internalValue, max);\n  });\n\n  const constrainRange = useCallback(\n    (range: DateRangeValue): DateRangeValue => {\n      let start = range.start;\n      let end = range.end;\n\n      // make sure start date is after min date and before max date/range end\n      if (min) {\n        start = maxDate(start, min);\n      }\n      const startMax = max ? minDate(max, end) : end;\n      start = minDate(start, startMax);\n\n      // make sure end date is after min date/range start and before max date\n      const endMin = min ? maxDate(min, start) : start;\n      end = maxDate(end, endMin);\n\n      if (max) {\n        end = minDate(end, max);\n      }\n\n      return {start: toZoned(start, timezone), end: toZoned(end, timezone)};\n    },\n    [min, max, timezone],\n  );\n\n  const setSelectedValue = useCallback(\n    (newRange: DateRangeValue) => {\n      const value = {\n        ...constrainRange(newRange),\n        preset: newRange.preset,\n      };\n      setInternalValue(value);\n      setHighlightedRange(value);\n      setCalendarDates(rangeToCalendarDates(value, max));\n      setIsPlaceholder({start: false, end: false});\n    },\n    [setInternalValue, constrainRange, max],\n  );\n\n  const dayIsActive = useCallback(\n    (day: CalendarDate) => {\n      return (\n        (!isPlaceholder.start && isSameDay(day, highlightedRange.start)) ||\n        (!isPlaceholder.end && isSameDay(day, highlightedRange.end))\n      );\n    },\n    [highlightedRange, isPlaceholder],\n  );\n\n  const dayIsHighlighted = useCallback(\n    (day: CalendarDate) => {\n      return (\n        (isHighlighting || (!isPlaceholder.start && !isPlaceholder.end)) &&\n        day.compare(highlightedRange.start) >= 0 &&\n        day.compare(highlightedRange.end) <= 0\n      );\n    },\n    [highlightedRange, isPlaceholder, isHighlighting],\n  );\n\n  const dayIsRangeStart = useCallback(\n    (day: CalendarDate) => isSameDay(day, highlightedRange.start),\n    [highlightedRange],\n  );\n\n  const dayIsRangeEnd = useCallback(\n    (day: CalendarDate) => isSameDay(day, highlightedRange.end),\n    [highlightedRange],\n  );\n\n  const getCellProps = useCallback(\n    (date: CalendarDate, isSameMonth: boolean): HTMLAttributes<HTMLElement> => {\n      return {\n        onPointerEnter: () => {\n          if (isHighlighting && isSameMonth) {\n            setHighlightedRange(\n              makeRange({start: anchorDate!, end: date, timezone}),\n            );\n          }\n        },\n        onClick: () => {\n          if (!isHighlighting) {\n            setIsHighlighting(true);\n            setAnchorDate(date);\n            setHighlightedRange(makeRange({start: date, end: date, timezone}));\n          } else {\n            const finalRange = makeRange({\n              start: anchorDate!,\n              end: date,\n              timezone,\n            });\n            // cast to start and end of day after making range, because \"makeRange\"\n            // will flip start and end dates, if they are out of order\n            finalRange.start = startOfDay(finalRange.start);\n            finalRange.end = endOfDay(finalRange.end);\n            setIsHighlighting(false);\n            setAnchorDate(null);\n            setSelectedValue?.(finalRange);\n            if (closeDialogOnSelection) {\n              setCalendarIsOpen?.(false);\n            }\n          }\n        },\n      };\n    },\n    [\n      anchorDate,\n      isHighlighting,\n      setSelectedValue,\n      setCalendarIsOpen,\n      closeDialogOnSelection,\n      timezone,\n    ],\n  );\n\n  return {\n    selectedValue: internalValue,\n    setSelectedValue,\n    calendarIsOpen,\n    setCalendarIsOpen,\n    dayIsActive,\n    dayIsHighlighted,\n    dayIsRangeStart,\n    dayIsRangeEnd,\n    getCellProps,\n    calendarDates,\n    setIsPlaceholder,\n    isPlaceholder,\n    clear,\n    setCalendarDates,\n    min,\n    max,\n    granularity,\n    timezone,\n    closeDialogOnSelection,\n  };\n}\n\nfunction rangeToCalendarDates(\n  range: DateRangeValue,\n  max?: DateValue,\n): CalendarDate[] {\n  let start = toCalendarDate(startOfMonth(range.start));\n  let end = toCalendarDate(endOfMonth(range.end));\n\n  // make sure we don't show the same month twice\n  if (isSameMonth(start, end)) {\n    end = endOfMonth(end.add({months: 1}));\n  }\n\n  // if next month is disabled, show previous instead\n  if (max && end.compare(max) > 0) {\n    end = start;\n    start = startOfMonth(start.subtract({months: 1}));\n  }\n  return [start, end];\n}\n\ninterface MakeRangeProps {\n  start: DateValue;\n  end: DateValue;\n  timezone: string;\n}\nfunction makeRange(props: MakeRangeProps): DateRangeValue {\n  const start = toZoned(props.start, props.timezone);\n  const end = toZoned(props.end, props.timezone);\n  if (start.compare(end) > 0) {\n    return {start: end, end: start};\n  }\n  return {start, end};\n}\n\nfunction completeRange(\n  range: Partial<DateRangeValue> | null | undefined,\n  now: ZonedDateTime,\n): DateRangeValue {\n  if (range?.start && range?.end) {\n    return range as DateRangeValue;\n  } else if (!range?.start && range?.end) {\n    range.start = range.end.subtract({months: 1});\n    return range as DateRangeValue;\n  } else if (!range?.end && range?.start) {\n    range.end = range.start.add({months: 1});\n    return range as DateRangeValue;\n  }\n  return {start: now, end: now.add({months: 1})};\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowRightAltIcon = createSvgIcon(\n  <path d=\"M16.01 11H4v2h12.01v3L20 12l-3.99-4v3z\" />\n, 'ArrowRightAltOutlined');\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function adjustSegment(\n  value: ZonedDateTime,\n  part: string,\n  amount: number,\n  options: Intl.ResolvedDateTimeFormatOptions\n) {\n  switch (part) {\n    case 'era':\n    case 'year':\n    case 'month':\n    case 'day':\n      return value.cycle(part, amount, {round: part === 'year'});\n  }\n\n  if ('hour' in value) {\n    switch (part) {\n      case 'dayPeriod': {\n        const hours = value.hour;\n        const isPM = hours >= 12;\n        return value.set({hour: isPM ? hours - 12 : hours + 12});\n      }\n      case 'hour':\n      case 'minute':\n      case 'second':\n        return value.cycle(part, amount, {\n          round: part !== 'hour',\n          hourCycle: options.hour12 ? 12 : 24,\n        });\n    }\n  }\n\n  return value;\n}\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function setSegment(\n  value: ZonedDateTime,\n  part: string,\n  segmentValue: number,\n  options: Intl.ResolvedDateTimeFormatOptions\n) {\n  switch (part) {\n    case 'day':\n    case 'month':\n    case 'year':\n      return value.set({[part]: segmentValue});\n  }\n\n  if ('hour' in value) {\n    switch (part) {\n      case 'dayPeriod': {\n        const hours = value.hour;\n        const wasPM = hours >= 12;\n        const isPM = segmentValue >= 12;\n        if (isPM === wasPM) {\n          return value;\n        }\n        return value.set({hour: wasPM ? hours - 12 : hours + 12});\n      }\n      case 'hour':\n        // In 12 hour time, ensure that AM/PM does not change\n        if (options.hour12) {\n          const hours = value.hour;\n          const wasPM = hours >= 12;\n          if (!wasPM && segmentValue === 12) {\n            segmentValue = 0;\n          }\n          if (wasPM && segmentValue < 12) {\n            segmentValue += 12;\n          }\n        }\n      // fallthrough\n      case 'minute':\n      case 'second':\n        return value.set({[part]: segmentValue});\n    }\n  }\n\n  return value;\n}\n","export const PAGE_STEP = {\n  year: 5,\n  month: 2,\n  day: 7,\n  hour: 2,\n  minute: 15,\n  second: 15,\n  dayPeriod: 1,\n};\n","import {useFocusManager} from '@react-aria/focus';\nimport React, {\n  ComponentPropsWithoutRef,\n  HTMLAttributes,\n  KeyboardEventHandler,\n  useMemo,\n  useRef,\n} from 'react';\nimport {NumberParser} from '@internationalized/number';\nimport {mergeProps} from '@react-aria/utils';\nimport {today, ZonedDateTime} from '@internationalized/date';\nimport {useSelectedLocale} from '@common/i18n/selected-locale';\nimport {useDateFormatter} from '@common/i18n/use-date-formatter';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {adjustSegment} from './utils/adjust-segment';\nimport {setSegment} from './utils/set-segment';\nimport {PAGE_STEP} from './utils/page-step';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\nexport interface EditableSegment {\n  type: 'day' | 'dayPeriod' | 'hour' | 'minute' | 'month' | 'second' | 'year';\n  text: string;\n  value: number;\n  minValue: number;\n  maxValue: number;\n  minLength: number;\n}\n\ninterface DatePickerSegmentProps {\n  segment: EditableSegment;\n  domProps?: ComponentPropsWithoutRef<'div'>;\n  state: DatePickerState | DateRangePickerState;\n  value: ZonedDateTime;\n  onChange: (newValue: ZonedDateTime) => void;\n  isPlaceholder?: boolean;\n}\nexport function EditableDateSegment({\n  segment,\n  domProps,\n  value,\n  onChange,\n  isPlaceholder,\n  state: {timezone, calendarIsOpen, setCalendarIsOpen},\n}: DatePickerSegmentProps) {\n  const isMobile = useIsMobileMediaQuery();\n  const enteredKeys = useRef('');\n  const {localeCode} = useSelectedLocale();\n  const focusManager = useFocusManager();\n  const formatter = useDateFormatter({timeZone: timezone});\n  const parser = useMemo(\n    () => new NumberParser(localeCode, {maximumFractionDigits: 0}),\n    [localeCode],\n  );\n\n  const setSegmentValue = (newValue: number) => {\n    onChange(\n      setSegment(value, segment.type, newValue, formatter.resolvedOptions()),\n    );\n  };\n\n  const adjustSegmentValue = (amount: number) => {\n    onChange(\n      adjustSegment(value, segment.type, amount, formatter.resolvedOptions()),\n    );\n  };\n\n  const backspace = () => {\n    if (parser.isValidPartialNumber(segment.text)) {\n      const newValue = segment.text.slice(0, -1);\n      const parsed = parser.parse(newValue);\n      if (newValue.length === 0 || parsed === 0) {\n        const now = today(timezone);\n        if (segment.type in now) {\n          // @ts-ignore\n          setSegmentValue(now[segment.type]);\n        }\n      } else {\n        setSegmentValue(parsed);\n      }\n      enteredKeys.current = newValue;\n    } else if (segment.type === 'dayPeriod') {\n      adjustSegmentValue(-1);\n    }\n  };\n\n  const onKeyDown: KeyboardEventHandler = e => {\n    if (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) {\n      return;\n    }\n\n    // Navigation between date segments and deletion\n    switch (e.key) {\n      case 'ArrowLeft':\n        e.preventDefault();\n        e.stopPropagation();\n        focusManager?.focusPrevious();\n        break;\n      case 'ArrowRight':\n        e.preventDefault();\n        e.stopPropagation();\n        focusManager?.focusNext();\n        break;\n      case 'Enter':\n        (e.target as HTMLElement).closest('form')?.requestSubmit();\n        setCalendarIsOpen(!calendarIsOpen);\n        break;\n      case 'Tab':\n        break;\n      case 'Backspace':\n      case 'Delete': {\n        e.preventDefault();\n        e.stopPropagation();\n        backspace();\n        break;\n      }\n\n      // Spinbutton incrementing/decrementing\n      case 'ArrowUp':\n        e.preventDefault();\n        enteredKeys.current = '';\n        adjustSegmentValue(1);\n        break;\n      case 'ArrowDown':\n        e.preventDefault();\n        enteredKeys.current = '';\n        adjustSegmentValue(-1);\n        break;\n      case 'PageUp':\n        e.preventDefault();\n        enteredKeys.current = '';\n        adjustSegmentValue(PAGE_STEP[segment.type] || 1);\n        break;\n      case 'PageDown':\n        e.preventDefault();\n        enteredKeys.current = '';\n        adjustSegmentValue(-(PAGE_STEP[segment.type] || 1));\n        break;\n      case 'Home':\n        e.preventDefault();\n        enteredKeys.current = '';\n        setSegmentValue(segment.maxValue);\n        break;\n      case 'End':\n        e.preventDefault();\n        enteredKeys.current = '';\n        setSegmentValue(segment.minValue);\n        break;\n    }\n\n    onInput(e.key);\n  };\n\n  const amPmFormatter = useDateFormatter({hour: 'numeric', hour12: true});\n  const am = useMemo(() => {\n    const amDate = new Date();\n    amDate.setHours(0);\n    return amPmFormatter\n      .formatToParts(amDate)\n      .find(part => part.type === 'dayPeriod')!.value;\n  }, [amPmFormatter]);\n  const pm = useMemo(() => {\n    const pmDate = new Date();\n    pmDate.setHours(12);\n    return amPmFormatter\n      .formatToParts(pmDate)\n      .find(part => part.type === 'dayPeriod')!.value;\n  }, [amPmFormatter]);\n\n  // Update date values on user keyboard input\n  const onInput = (key: string) => {\n    const newValue = enteredKeys.current + key;\n\n    switch (segment.type) {\n      case 'dayPeriod':\n        if (am.toLowerCase().startsWith(key)) {\n          setSegmentValue(0);\n        } else if (pm.toLowerCase().startsWith(key)) {\n          setSegmentValue(12);\n        } else {\n          break;\n        }\n        focusManager?.focusNext();\n        break;\n      case 'day':\n      case 'hour':\n      case 'minute':\n      case 'second':\n      case 'month':\n      case 'year': {\n        if (!parser.isValidPartialNumber(newValue)) {\n          return;\n        }\n\n        let numberValue = parser.parse(newValue);\n        let segmentValue = numberValue;\n        let allowsZero = segment.minValue === 0;\n        if (segment.type === 'hour' && formatter.resolvedOptions().hour12) {\n          switch (formatter.resolvedOptions().hourCycle) {\n            case 'h11':\n              if (numberValue > 11) {\n                segmentValue = parser.parse(key);\n              }\n              break;\n            case 'h12':\n              allowsZero = false;\n              if (numberValue > 12) {\n                segmentValue = parser.parse(key);\n              }\n              break;\n          }\n\n          if (segment.value >= 12 && numberValue > 1) {\n            numberValue += 12;\n          }\n        } else if (numberValue > segment.maxValue) {\n          segmentValue = parser.parse(key);\n        }\n\n        if (Number.isNaN(numberValue)) {\n          return;\n        }\n\n        const shouldSetValue = segmentValue !== 0 || allowsZero;\n        if (shouldSetValue) {\n          setSegmentValue(segmentValue);\n        }\n\n        if (\n          Number(`${numberValue}0`) > segment.maxValue ||\n          newValue.length >= String(segment.maxValue).length\n        ) {\n          enteredKeys.current = '';\n          if (shouldSetValue) {\n            focusManager?.focusNext();\n          }\n        } else {\n          enteredKeys.current = newValue;\n        }\n        break;\n      }\n    }\n  };\n\n  const spinButtonProps: HTMLAttributes<HTMLDivElement> = isMobile\n    ? {}\n    : {\n        'aria-label': segment.type,\n        'aria-valuetext': isPlaceholder ? undefined : `${segment.value}`,\n        'aria-valuemin': segment.minValue,\n        'aria-valuemax': segment.maxValue,\n        'aria-valuenow': isPlaceholder ? undefined : segment.value,\n        tabIndex: 0,\n        onKeyDown,\n      };\n\n  return (\n    <div\n      {...mergeProps(domProps!, {\n        ...spinButtonProps,\n        onFocus: e => {\n          enteredKeys.current = '';\n          e.target.scrollIntoView({block: 'nearest'});\n        },\n        onClick: e => {\n          e.preventDefault();\n          e.stopPropagation();\n        },\n      } as HTMLAttributes<HTMLDivElement>)}\n      className=\"box-content cursor-default select-none whitespace-nowrap rounded p-2 text-center tabular-nums caret-transparent outline-none focus:bg-primary focus:text-on-primary\"\n    >\n      {segment.text.padStart(segment.minLength, '0')}\n    </div>\n  );\n}\n","import {useFocusManager} from '@react-aria/focus';\nimport {ComponentPropsWithoutRef} from 'react';\n\nexport interface LiteralSegment {\n  type: 'literal';\n  minLength: 1;\n  text: string;\n}\n\ninterface LiteralSegmentProps extends ComponentPropsWithoutRef<'div'> {\n  segment: LiteralSegment;\n  domProps?: ComponentPropsWithoutRef<'div'>;\n}\nexport function LiteralDateSegment({segment, domProps}: LiteralSegmentProps) {\n  const focusManager = useFocusManager();\n  return (\n    <div\n      {...domProps}\n      onPointerDown={e => {\n        if (e.pointerType === 'mouse') {\n          e.preventDefault();\n          const res = focusManager?.focusNext({from: e.target as HTMLElement});\n          if (!res) {\n            focusManager?.focusPrevious({from: e.target as HTMLElement});\n          }\n        }\n      }}\n      aria-hidden\n      className=\"min-w-4 cursor-default select-none\"\n    >\n      {segment.text}\n    </div>\n  );\n}\n","import {\n  DateValue,\n  getMinimumDayInMonth,\n  getMinimumMonthInYear,\n} from '@internationalized/date';\n\nexport function getSegmentLimits(\n  date: DateValue,\n  type: string,\n  options: Intl.ResolvedDateTimeFormatOptions\n) {\n  switch (type) {\n    case 'year':\n      return {\n        value: date.year,\n        placeholder: 'yyyy',\n        minValue: 1,\n        maxValue: date.calendar.getYearsInEra(date),\n      };\n    case 'month':\n      return {\n        value: date.month,\n        placeholder: 'mm',\n        minValue: getMinimumMonthInYear(date),\n        maxValue: date.calendar.getMonthsInYear(date),\n      };\n    case 'day':\n      return {\n        value: date.day,\n        minValue: getMinimumDayInMonth(date),\n        maxValue: date.calendar.getDaysInMonth(date),\n        placeholder: 'dd',\n      };\n  }\n\n  if ('hour' in date) {\n    switch (type) {\n      case 'dayPeriod':\n        return {\n          value: date.hour >= 12 ? 12 : 0,\n          minValue: 0,\n          maxValue: 12,\n          placeholder: '--',\n        };\n      case 'hour':\n        if (options.hour12) {\n          const isPM = date.hour >= 12;\n          return {\n            value: date.hour,\n            minValue: isPM ? 12 : 0,\n            maxValue: isPM ? 23 : 11,\n            placeholder: '--',\n          };\n        }\n\n        return {\n          value: date.hour,\n          minValue: 0,\n          maxValue: 23,\n          placeholder: '--',\n        };\n      case 'minute':\n        return {\n          value: date.minute,\n          minValue: 0,\n          maxValue: 59,\n          placeholder: '--',\n        };\n    }\n  }\n\n  return {};\n}\n","import React, {ComponentPropsWithoutRef, useMemo} from 'react';\nimport {ZonedDateTime} from '@internationalized/date';\nimport {EditableDateSegment, EditableSegment} from './editable-date-segment';\nimport {LiteralDateSegment, LiteralSegment} from './literal-segment';\nimport {useDateFormatter} from '@common/i18n/use-date-formatter';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {getSegmentLimits} from './utils/get-segment-limits';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface DateSegmentListProps {\n  segmentProps?: ComponentPropsWithoutRef<'div'>;\n  state: DatePickerState | DateRangePickerState;\n  value: ZonedDateTime;\n  onChange: (newValue: ZonedDateTime) => void;\n  isPlaceholder?: boolean;\n}\nexport function DateSegmentList({\n  segmentProps,\n  state,\n  value,\n  onChange,\n  isPlaceholder,\n}: DateSegmentListProps) {\n  const {granularity} = state;\n  const options = useMemo(() => {\n    const memoOptions: Intl.DateTimeFormatOptions = {\n      year: 'numeric',\n      month: 'numeric',\n      day: 'numeric',\n    };\n    if (granularity === 'minute') {\n      memoOptions.hour = 'numeric';\n      memoOptions.minute = 'numeric';\n    }\n    return memoOptions;\n  }, [granularity]);\n\n  const formatter = useDateFormatter(options);\n\n  const dateValue = useMemo(() => value.toDate(), [value]);\n  const segments = useMemo(() => {\n    return formatter.formatToParts(dateValue).map(segment => {\n      const limits = getSegmentLimits(\n        value,\n        segment.type,\n        formatter.resolvedOptions(),\n      );\n      const textValue =\n        isPlaceholder && segment.type !== 'literal'\n          ? limits.placeholder\n          : segment.value;\n      return {\n        type: segment.type,\n        text: segment.value === ', ' ? ' ' : textValue,\n        ...limits,\n        minLength:\n          segment.type !== 'literal' ? String(limits.maxValue).length : 1,\n      } as LiteralSegment | EditableSegment;\n    });\n  }, [dateValue, formatter, isPlaceholder, value]);\n\n  return (\n    <div className=\"flex items-center\">\n      {segments.map((segment, index) => {\n        if (segment.type === 'literal') {\n          return (\n            <LiteralDateSegment\n              domProps={segmentProps}\n              key={index}\n              segment={segment}\n            />\n          );\n        }\n        return (\n          <EditableDateSegment\n            isPlaceholder={isPlaceholder}\n            domProps={segmentProps}\n            state={state}\n            value={value}\n            onChange={onChange}\n            segment={segment}\n            key={index}\n          />\n        );\n      })}\n    </div>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowLeftIcon = createSvgIcon(\n  <path d=\"M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z\" />\n, 'KeyboardArrowLeftOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowRightIcon = createSvgIcon(\n  <path d=\"M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z\" />\n, 'KeyboardArrowRightOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {\n  CalendarDate,\n  DateValue,\n  getDayOfWeek,\n  isSameMonth,\n  isToday,\n} from '@internationalized/date';\nimport {useSelectedLocale} from '../../../../../i18n/selected-locale';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {dateIsInvalid} from '../utils';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface CalendarCellProps {\n  date: CalendarDate;\n  currentMonth: DateValue;\n  state: DatePickerState | DateRangePickerState;\n}\nexport function CalendarCell({\n  date,\n  currentMonth,\n  state: {\n    dayIsActive,\n    dayIsHighlighted,\n    dayIsRangeStart,\n    dayIsRangeEnd,\n    getCellProps,\n    timezone,\n    min,\n    max,\n  },\n}: CalendarCellProps) {\n  const {localeCode} = useSelectedLocale();\n  const dayOfWeek = getDayOfWeek(date, localeCode);\n  const isActive = dayIsActive(date);\n  const isHighlighted = dayIsHighlighted(date);\n  const isRangeStart = dayIsRangeStart(date);\n  const isRangeEnd = dayIsRangeEnd(date);\n  const dayIsToday = isToday(date, timezone);\n  const sameMonth = isSameMonth(date, currentMonth);\n  const isDisabled = dateIsInvalid(date, min, max);\n\n  return (\n    <div\n      role=\"button\"\n      aria-disabled={isDisabled}\n      className={clsx(\n        'w-40 h-40 text-sm relative isolate flex-shrink-0',\n        isDisabled && 'text-disabled pointer-events-none',\n        !sameMonth && 'invisible pointer-events-none'\n      )}\n      {...getCellProps(date, sameMonth)}\n    >\n      <span\n        className={clsx(\n          'absolute inset-0 flex items-center justify-center rounded-full w-full h-full select-none z-10 cursor-pointer',\n          !isActive && !dayIsToday && 'hover:bg-hover',\n          isActive && 'bg-primary text-on-primary font-semibold',\n          dayIsToday && !isActive && 'bg-chip'\n        )}\n      >\n        {date.day}\n      </span>\n      {isHighlighted && sameMonth && (\n        <span\n          className={clsx(\n            'absolute w-full h-full inset-0 bg-primary/focus',\n            (isRangeStart || dayOfWeek === 0 || date.day === 1) &&\n              'rounded-l-full',\n            (isRangeEnd ||\n              dayOfWeek === 6 ||\n              date.day ===\n                currentMonth.calendar.getDaysInMonth(currentMonth)) &&\n              'rounded-r-full'\n          )}\n        />\n      )}\n    </div>\n  );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {m} from 'framer-motion';\nimport {\n  CalendarDate,\n  endOfMonth,\n  getWeeksInMonth,\n  startOfMonth,\n  startOfWeek,\n} from '@internationalized/date';\nimport {KeyboardArrowLeftIcon} from '../../../../../icons/material/KeyboardArrowLeft';\nimport {IconButton} from '../../../../buttons/icon-button';\nimport {KeyboardArrowRightIcon} from '../../../../../icons/material/KeyboardArrowRight';\nimport {CalendarCell} from './calendar-cell';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {useDateFormatter} from '../../../../../i18n/use-date-formatter';\nimport {useSelectedLocale} from '../../../../../i18n/selected-locale';\nimport {dateIsInvalid} from '../utils';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\nexport interface CalendarMonthProps {\n  state: DatePickerState | DateRangePickerState;\n  startDate: CalendarDate;\n  isFirst: boolean;\n  isLast: boolean;\n}\nexport function CalendarMonth({\n  startDate,\n  state,\n  isFirst,\n  isLast,\n}: CalendarMonthProps) {\n  const {localeCode} = useSelectedLocale();\n  const weeksInMonth = getWeeksInMonth(startDate, localeCode);\n  const monthStart = startOfWeek(startDate, localeCode);\n\n  return (\n    <div className=\"w-280 flex-shrink-0\">\n      <CalendarMonthHeader\n        isFirst={isFirst}\n        isLast={isLast}\n        state={state}\n        currentMonth={startDate}\n      />\n      <div className=\"block\" role=\"grid\">\n        <WeekdayHeader state={state} startDate={startDate} />\n        {[...new Array(weeksInMonth).keys()].map(weekIndex => (\n          <m.div className=\"flex mb-6\" key={weekIndex}>\n            {[...new Array(7).keys()].map(dayIndex => (\n              <CalendarCell\n                key={dayIndex}\n                date={monthStart.add({weeks: weekIndex, days: dayIndex})}\n                currentMonth={startDate}\n                state={state}\n              />\n            ))}\n          </m.div>\n        ))}\n      </div>\n    </div>\n  );\n}\n\ninterface CalendarMonthHeaderProps {\n  state: DatePickerState | DateRangePickerState;\n  currentMonth: CalendarDate;\n  isFirst: boolean;\n  isLast: boolean;\n}\nfunction CalendarMonthHeader({\n  currentMonth,\n  isFirst,\n  isLast,\n  state: {calendarDates, setCalendarDates, timezone, min, max},\n}: CalendarMonthHeaderProps) {\n  const shiftCalendars = (direction: 'forward' | 'backward') => {\n    const count = calendarDates.length;\n    let newDates: CalendarDate[];\n    if (direction === 'forward') {\n      newDates = calendarDates.map(date =>\n        endOfMonth(date.add({months: count}))\n      );\n    } else {\n      newDates = calendarDates.map(date =>\n        endOfMonth(date.subtract({months: count}))\n      );\n    }\n    setCalendarDates(newDates);\n  };\n\n  const monthFormatter = useDateFormatter({\n    month: 'long',\n    year: 'numeric',\n    era: currentMonth.calendar.identifier !== 'gregory' ? 'long' : undefined,\n    calendar: currentMonth.calendar.identifier,\n  });\n\n  const isBackwardDisabled = dateIsInvalid(\n    currentMonth.subtract({days: 1}),\n    min,\n    max\n  );\n  const isForwardDisabled = dateIsInvalid(\n    startOfMonth(currentMonth.add({months: 1})),\n    min,\n    max\n  );\n\n  return (\n    <div className=\"flex items-center justify-between gap-10\">\n      <IconButton\n        size=\"md\"\n        className={clsx('text-muted', !isFirst && 'invisible')}\n        disabled={!isFirst || isBackwardDisabled}\n        aria-hidden={!isFirst}\n        onClick={() => {\n          shiftCalendars('backward');\n        }}\n      >\n        <KeyboardArrowLeftIcon />\n      </IconButton>\n      <div className=\"text-sm font-semibold select-none\">\n        {monthFormatter.format(currentMonth.toDate(timezone))}\n      </div>\n      <IconButton\n        size=\"md\"\n        className={clsx('text-muted', !isLast && 'invisible')}\n        disabled={!isLast || isForwardDisabled}\n        aria-hidden={!isLast}\n        onClick={() => {\n          shiftCalendars('forward');\n        }}\n      >\n        <KeyboardArrowRightIcon />\n      </IconButton>\n    </div>\n  );\n}\n\ninterface WeekdayHeaderProps {\n  state: DatePickerState | DateRangePickerState;\n  startDate: CalendarDate;\n}\nfunction WeekdayHeader({state: {timezone}, startDate}: WeekdayHeaderProps) {\n  const {localeCode} = useSelectedLocale();\n  const dayFormatter = useDateFormatter({weekday: 'short'});\n\n  const monthStart = startOfWeek(startDate, localeCode);\n\n  return (\n    <div className=\"flex\">\n      {[...new Array(7).keys()].map(index => {\n        const date = monthStart.add({days: index});\n        const dateDay = date.toDate(timezone);\n        const weekday = dayFormatter.format(dateDay);\n        return (\n          <div\n            className=\"w-40 h-40 text-sm font-semibold relative flex-shrink-0\"\n            key={index}\n          >\n            <div className=\"absolute flex items-center justify-center w-full h-full select-none\">\n              {weekday}\n            </div>\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n","import React, {Fragment} from 'react';\nimport {startOfMonth, toCalendarDate} from '@internationalized/date';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {CalendarMonth} from './calendar-month';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface CalendarProps {\n  state: DatePickerState | DateRangePickerState;\n  visibleMonths?: 1 | 2;\n}\nexport function Calendar({state, visibleMonths = 1}: CalendarProps) {\n  const isMobile = useIsMobileMediaQuery();\n\n  if (isMobile) {\n    visibleMonths = 1;\n  }\n\n  return (\n    <Fragment>\n      {[...new Array(visibleMonths).keys()].map(index => {\n        const startDate = toCalendarDate(\n          startOfMonth(state.calendarDates[index])\n        );\n        const isFirst = index === 0;\n        const isLast = index === visibleMonths - 1;\n        return (\n          <CalendarMonth\n            key={index}\n            state={state}\n            startDate={startDate}\n            isFirst={isFirst}\n            isLast={isLast}\n          />\n        );\n      })}\n    </Fragment>\n  );\n}\n","import {DateValue, parseAbsolute} from '@internationalized/date';\nimport {Fragment, memo} from 'react';\nimport {useDateFormatter} from './use-date-formatter';\nimport {useSettings} from '../core/settings/use-settings';\nimport {shallowEqual} from '../utils/shallow-equal';\nimport {useUserTimezone} from './use-user-timezone';\nimport {DateFormatPresets} from '@common/i18n/formatted-date';\n\ninterface FormattedDateTimeRangeProps {\n  start?: string | DateValue | Date;\n  end?: string | DateValue | Date;\n  options?: Intl.DateTimeFormatOptions;\n  preset?: keyof typeof DateFormatPresets;\n}\nexport const FormattedDateTimeRange = memo(\n  ({start, end, options, preset}: FormattedDateTimeRangeProps) => {\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 (!start || !end) {\n      return null;\n    }\n\n    let value: string;\n\n    try {\n      value = formatter.formatRange(\n        castToDate(start, timezone),\n        castToDate(end, timezone)\n      );\n    } catch (e) {\n      value = '';\n    }\n\n    return <Fragment>{value}</Fragment>;\n  },\n  shallowEqual\n);\n\nfunction castToDate(date: string | DateValue | Date, timezone: string): Date {\n  if (typeof date === 'string') {\n    return parseAbsolute(date, timezone).toDate();\n  }\n  if ('toDate' in date) {\n    return date.toDate(timezone);\n  }\n  return date;\n}\n","import {List, ListItem} from '@common/ui/list/list';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {Trans} from '@common/i18n/trans';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\n\ninterface DateRangePresetList {\n  onPresetSelected: (value: DateRangeValue) => void;\n  selectedValue?: DateRangeValue | null;\n}\nexport function DatePresetList({\n  onPresetSelected,\n  selectedValue,\n}: DateRangePresetList) {\n  return (\n    <List>\n      {DateRangePresets.map(preset => (\n        <ListItem\n          borderRadius=\"rounded-none\"\n          capitalizeFirst\n          key={preset.key}\n          isSelected={selectedValue?.preset === preset.key}\n          onSelected={() => {\n            const newValue = preset.getRangeValue();\n            onPresetSelected(newValue);\n          }}\n        >\n          <Trans {...preset.label} />\n        </ListItem>\n      ))}\n    </List>\n  );\n}\n","import {useMediaQuery, UseMediaQueryOptions} from './use-media-query';\n\nexport function useIsTabletMediaQuery(options?: UseMediaQueryOptions) {\n  return useMediaQuery('(max-width: 1024px)', options);\n}\n","import React, {ComponentPropsWithoutRef, ReactNode, useId} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {InputSize} from '../input-field/input-size';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {AutoFocusProps, useAutoFocus} from '../../focus/use-auto-focus';\n\ninterface SwitchProps\n  extends AutoFocusProps,\n    Omit<ComponentPropsWithoutRef<'input'>, 'size'> {\n  size?: InputSize;\n  className?: string;\n  description?: ReactNode;\n  invalid?: boolean;\n  errorMessage?: string;\n}\nexport const Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n  (props, ref) => {\n    const {\n      children,\n      size = 'sm',\n      description,\n      className,\n      invalid,\n      autoFocus,\n      errorMessage,\n      ...domProps\n    } = props;\n\n    const inputRef = useObjectRef(ref);\n    useAutoFocus({autoFocus}, inputRef);\n\n    const style = getSizeClassName(size);\n    const fieldClassNames = getInputFieldClassNames(props);\n\n    const descriptionId = useId();\n\n    return (\n      <div className={clsx(className, 'isolate')}>\n        <label className=\"flex items-center select-none\">\n          <input\n            {...domProps}\n            type=\"checkbox\"\n            role=\"switch\"\n            aria-invalid={invalid || undefined}\n            aria-describedby={description ? descriptionId : undefined}\n            ref={inputRef}\n            aria-checked={domProps.checked}\n            className={clsx(\n              style,\n              !invalid &&\n                'checked:bg-primary dark:checked:bg-primary-dark checked:border-primary dark:checked:border-primary-dark',\n              invalid && 'checked:bg-danger checked:border-danger',\n              'outline-none cursor-pointer bg-chip border-chip border checked:bg-primary checked:border-primary p-0 overflow-hidden relative rounded-3xl appearance-none transition-colors flex-shrink-0 flex items-center outline-none',\n              'before:z-10 before:border before:rounded-3xl before:block before:bg-white before:transition-transform before:translate-x-2',\n              'checked:before:border-white',\n              'focus-visible:ring',\n              props.disabled && 'opacity-80 cursor-not-allowed'\n            )}\n          />\n          {children && (\n            <span\n              className={clsx(\n                fieldClassNames.size.font,\n                'ml-12',\n                invalid && 'text-danger',\n                props.disabled && 'text-disabled'\n              )}\n            >\n              {children}\n            </span>\n          )}\n        </label>\n        {description && !errorMessage && (\n          <div id={descriptionId} className={fieldClassNames.description}>\n            {description}\n          </div>\n        )}\n        {errorMessage && (\n          <div id={descriptionId} className={fieldClassNames.error}>\n            {errorMessage}\n          </div>\n        )}\n      </div>\n    );\n  }\n);\n\ninterface FormSwitchProps extends SwitchProps {\n  name: string;\n}\nexport function FormSwitch(props: FormSwitchProps) {\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<SwitchProps> = {\n    onChange: e => {\n      if (e.target.value && e.target.value !== 'on') {\n        onChange(e.target.checked ? e.target.value : false);\n      } else {\n        onChange(e);\n      }\n    },\n    onBlur,\n    checked: !!value,\n    invalid,\n    errorMessage: error?.message,\n    name: props.name,\n  };\n\n  return <Switch ref={ref} {...mergeProps(props, formProps)} />;\n}\n\nfunction getSizeClassName(size: InputSize): string {\n  switch (size) {\n    case 'xl':\n      return 'w-68 h-36 before:w-28 before:h-28 checked:before:translate-x-36';\n    case 'lg':\n      return 'w-56 h-30 before:w-22 before:h-22 checked:before:translate-x-30';\n    case 'md':\n      return 'w-46 h-24 before:w-18 before:h-18 checked:before:translate-x-24';\n    case 'xs':\n      return 'w-30 h-16 before:w-12 before:h-12 checked:before:translate-x-16';\n    default:\n      return 'w-38 h-20 before:w-14 before:h-14 checked:before:translate-x-20';\n  }\n}\n","import {message} from '@common/i18n/message';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport interface DateRangeComparePreset {\n  key: number;\n  label: MessageDescriptor;\n  getRangeValue: (range: DateRangeValue) => DateRangeValue;\n}\n\nexport const DateRangeComparePresets: DateRangeComparePreset[] = [\n  {\n    key: 0,\n    label: message('Preceding period'),\n    getRangeValue: (range: DateRangeValue) => {\n      const startDate = range.start;\n      const endDate = range.end;\n\n      const diffInMilliseconds =\n        endDate.toDate().getTime() - startDate.toDate().getTime();\n      const diffInMinutes = diffInMilliseconds / (1000 * 60);\n      const newStart = startDate.subtract({minutes: diffInMinutes});\n      return {\n        preset: 0,\n        start: newStart,\n        end: startDate,\n      };\n    },\n  },\n  {\n    key: 1,\n    label: message('Same period last year'),\n    getRangeValue: (range: DateRangeValue) => {\n      return {\n        start: range.start.subtract({years: 1}),\n        end: range.end.subtract({years: 1}),\n        preset: 1,\n      };\n    },\n  },\n  {\n    key: 2,\n    label: message('Custom'),\n    getRangeValue: (range: DateRangeValue) => {\n      return {\n        start: range.start.subtract({weeks: 1}),\n        end: range.end.subtract({weeks: 1}),\n        preset: 2,\n      };\n    },\n  },\n];\n","import {List, ListItem} from '@common/ui/list/list';\nimport {Trans} from '@common/i18n/trans';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {DateRangeComparePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets';\n\ninterface DateRangePresetList {\n  originalRangeValue: DateRangeValue;\n  onPresetSelected: (value: DateRangeValue) => void;\n  selectedValue?: DateRangeValue | null;\n}\nexport function DateRangeComparePresetList({\n  originalRangeValue,\n  onPresetSelected,\n  selectedValue,\n}: DateRangePresetList) {\n  return (\n    <List>\n      {DateRangeComparePresets.map(preset => (\n        <ListItem\n          borderRadius=\"rounded-none\"\n          capitalizeFirst\n          key={preset.key}\n          isSelected={selectedValue?.preset === preset.key}\n          onSelected={() => {\n            const newValue = preset.getRangeValue(originalRangeValue);\n            onPresetSelected(newValue);\n          }}\n        >\n          <Trans {...preset.label} />\n        </ListItem>\n      ))}\n    </List>\n  );\n}\n","import React, {Fragment, ReactNode, useRef, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {DatePickerField} from '../date-picker-field';\nimport {DateRangePickerState} from '../use-date-range-picker-state';\nimport {Calendar} from '../../calendar/calendar';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {ArrowRightAltIcon} from '@common/icons/material/ArrowRightAlt';\nimport {DateSegmentList} from '../../segments/date-segment-list';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {DatePresetList} from './date-range-preset-list';\nimport {useIsTabletMediaQuery} from '@common/utils/hooks/is-tablet-media-query';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {DateRangeComparePresetList} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-preset-list';\n\ninterface DateRangeDialogProps {\n  state: DateRangePickerState;\n  compareState?: DateRangePickerState;\n  compareVisibleDefault?: boolean;\n  showInlineDatePickerField?: boolean;\n}\nexport function DateRangeDialog({\n  state,\n  compareState,\n  showInlineDatePickerField = false,\n  compareVisibleDefault = false,\n}: DateRangeDialogProps) {\n  const isTablet = useIsTabletMediaQuery();\n  const {close} = useDialogContext();\n  const initialStateRef = useRef<DateRangePickerState>(state);\n  const hasPlaceholder = state.isPlaceholder.start || state.isPlaceholder.end;\n  const [compareVisible, setCompareVisible] = useState(compareVisibleDefault);\n\n  const footer = (\n    <DialogFooter\n      dividerTop\n      startAction={\n        !hasPlaceholder && !isTablet ? (\n          <div className=\"text-xs\">\n            <FormattedDateTimeRange\n              start={state.selectedValue.start.toDate()}\n              end={state.selectedValue.end.toDate()}\n              options={{dateStyle: 'medium'}}\n            />\n          </div>\n        ) : undefined\n      }\n    >\n      <Button\n        variant=\"text\"\n        size=\"xs\"\n        onClick={() => {\n          state.setSelectedValue(initialStateRef.current.selectedValue);\n          state.setIsPlaceholder(initialStateRef.current.isPlaceholder);\n          close();\n        }}\n      >\n        <Trans message=\"Cancel\" />\n      </Button>\n      <Button\n        variant=\"flat\"\n        color=\"primary\"\n        size=\"xs\"\n        onClick={() => {\n          const value = state.selectedValue;\n          if (compareState && compareVisible) {\n            value.compareStart = compareState.selectedValue.start;\n            value.compareEnd = compareState.selectedValue.end;\n          }\n          close(value);\n        }}\n      >\n        <Trans message=\"Select\" />\n      </Button>\n    </DialogFooter>\n  );\n\n  return (\n    <Dialog size=\"auto\">\n      <DialogBody className=\"flex\" padding=\"p-0\">\n        {!isTablet && (\n          <div className=\"min-w-192 py-14\">\n            <DatePresetList\n              selectedValue={state.selectedValue}\n              onPresetSelected={preset => {\n                state.setSelectedValue(preset);\n                if (state.closeDialogOnSelection) {\n                  close(preset);\n                }\n              }}\n            />\n            {!!compareState && (\n              <Fragment>\n                <Switch\n                  className=\"mx-20 mb-10 mt-14\"\n                  checked={compareVisible}\n                  onChange={e => setCompareVisible(e.target.checked)}\n                >\n                  <Trans message=\"Compare\" />\n                </Switch>\n                {compareVisible && (\n                  <DateRangeComparePresetList\n                    originalRangeValue={state.selectedValue}\n                    selectedValue={compareState.selectedValue}\n                    onPresetSelected={preset => {\n                      compareState.setSelectedValue(preset);\n                    }}\n                  />\n                )}\n              </Fragment>\n            )}\n          </div>\n        )}\n        <AnimatePresence initial={false}>\n          <Calendars\n            state={state}\n            compareState={compareState}\n            showInlineDatePickerField={showInlineDatePickerField}\n            compareVisible={compareVisible}\n          />\n        </AnimatePresence>\n      </DialogBody>\n      {!state.closeDialogOnSelection && footer}\n    </Dialog>\n  );\n}\n\ninterface CustomRangePanelProps {\n  state: DateRangePickerState;\n  compareState?: DateRangePickerState;\n  showInlineDatePickerField?: boolean;\n  compareVisible: boolean;\n}\nfunction Calendars({\n  state,\n  compareState,\n  showInlineDatePickerField,\n  compareVisible,\n}: CustomRangePanelProps) {\n  return (\n    <m.div\n      initial={{width: 0, overflow: 'hidden'}}\n      animate={{width: 'auto'}}\n      exit={{width: 0, overflow: 'hidden'}}\n      transition={{type: 'tween', duration: 0.125}}\n      className=\"border-l px-20 pb-20 pt-10\"\n    >\n      {showInlineDatePickerField && (\n        <div>\n          <InlineDatePickerField state={state} />\n          {!!compareState && compareVisible && (\n            <InlineDatePickerField\n              state={compareState}\n              label={<Trans message=\"Compare\" />}\n            />\n          )}\n        </div>\n      )}\n      <div className=\"flex items-start gap-36\">\n        <Calendar state={state} visibleMonths={2} />\n      </div>\n    </m.div>\n  );\n}\n\ninterface InlineDatePickerFieldProps {\n  state: DateRangePickerState;\n  label?: ReactNode;\n}\nfunction InlineDatePickerField({state, label}: InlineDatePickerFieldProps) {\n  const {selectedValue, setSelectedValue} = state;\n  return (\n    <DatePickerField className=\"mb-20 mt-10\" label={label}>\n      <DateSegmentList\n        state={state}\n        value={selectedValue.start}\n        onChange={newValue => {\n          setSelectedValue({...selectedValue, start: newValue});\n        }}\n      />\n      <ArrowRightAltIcon className=\"block flex-shrink-0 text-muted\" size=\"md\" />\n      <DateSegmentList\n        state={state}\n        value={selectedValue.end}\n        onChange={newValue => {\n          setSelectedValue({...selectedValue, end: newValue});\n        }}\n      />\n    </DatePickerField>\n  );\n}\n","import React, {\n  ComponentPropsWithoutRef,\n  Fragment,\n  MouseEvent,\n  useRef,\n} from 'react';\nimport {DateRangeIcon} from '../../../../../icons/material/DateRange';\nimport {DialogTrigger} from '../../../../overlays/dialog/dialog-trigger';\nimport {DatePickerField, DatePickerFieldProps} from './date-picker-field';\nimport {useDateRangePickerState} from './use-date-range-picker-state';\nimport {ArrowRightAltIcon} from '../../../../../icons/material/ArrowRightAlt';\nimport {DatePickerValueProps} from '../date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-value';\nimport {DateSegmentList} from '../segments/date-segment-list';\nimport {DateRangeDialog} from './dialog/date-range-dialog';\nimport {useIsMobileMediaQuery} from '../../../../../utils/hooks/is-mobile-media-query';\n\nexport interface DateRangePickerProps\n  extends DatePickerValueProps<Partial<DateRangeValue>>,\n    Omit<DatePickerFieldProps, 'children'> {}\nexport function DateRangePicker(props: DateRangePickerProps) {\n  const {granularity, closeDialogOnSelection, ...fieldProps} = props;\n  const state = useDateRangePickerState(props);\n  const inputRef = useRef<HTMLDivElement>(null);\n  const isMobile = useIsMobileMediaQuery();\n  const hideCalendarIcon = isMobile && granularity !== 'day';\n\n  const dialog = (\n    <DialogTrigger\n      offset={8}\n      placement=\"bottom-start\"\n      isOpen={state.calendarIsOpen}\n      onOpenChange={state.setCalendarIsOpen}\n      type=\"popover\"\n      triggerRef={inputRef}\n      returnFocusToTrigger={false}\n      moveFocusToDialog={false}\n    >\n      <DateRangeDialog state={state} />\n    </DialogTrigger>\n  );\n\n  const openOnClick: ComponentPropsWithoutRef<'div'> = {\n    onClick: e => {\n      e.stopPropagation();\n      e.preventDefault();\n      if (!isHourSegment(e)) {\n        state.setCalendarIsOpen(true);\n      } else {\n        state.setCalendarIsOpen(false);\n      }\n    },\n  };\n\n  const value = state.selectedValue;\n  const onChange = state.setSelectedValue;\n\n  return (\n    <Fragment>\n      <DatePickerField\n        ref={inputRef}\n        wrapperProps={openOnClick}\n        endAdornment={!hideCalendarIcon ? <DateRangeIcon /> : undefined}\n        {...fieldProps}\n      >\n        <DateSegmentList\n          isPlaceholder={state.isPlaceholder?.start}\n          state={state}\n          segmentProps={openOnClick}\n          value={value.start}\n          onChange={newValue => {\n            onChange({start: newValue, end: value.end});\n          }}\n        />\n        <ArrowRightAltIcon\n          className=\"block flex-shrink-0 text-muted\"\n          size=\"md\"\n        />\n        <DateSegmentList\n          isPlaceholder={state.isPlaceholder?.end}\n          state={state}\n          segmentProps={openOnClick}\n          value={value.end}\n          onChange={newValue => {\n            onChange({start: value.start, end: newValue});\n          }}\n        />\n      </DatePickerField>\n      {dialog}\n    </Fragment>\n  );\n}\n\nfunction isHourSegment(e: MouseEvent<HTMLDivElement>): boolean {\n  return ['hour', 'minute', 'dayPeriod'].includes(\n    (e.currentTarget as HTMLElement).ariaLabel || ''\n  );\n}\n","import {parseAbsoluteToLocal, ZonedDateTime} from '@internationalized/date';\nimport {DateRangeValue} from './date-range-value';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport React from 'react';\nimport {DateRangePicker, DateRangePickerProps} from './date-range-picker';\n\nexport interface AbsoluteDateRange {\n  start?: string;\n  end?: string;\n  preset?: number;\n}\n\ninterface FormDateRange {\n  start?: string | ZonedDateTime;\n  end?: string | ZonedDateTime;\n  preset?: number;\n}\n\nexport interface FormDateRangePickerProps extends DateRangePickerProps {\n  name: string;\n}\nexport function FormDateRangePicker(props: FormDateRangePickerProps) {\n  const {\n    field: {onChange, onBlur, value, ref},\n    fieldState: {invalid, error},\n  } = useController({\n    name: props.name,\n  });\n\n  const formProps: Partial<DateRangePickerProps> = {\n    onChange: e => {\n      onChange(e ? dateRangeToAbsoluteRange(e) : null);\n    },\n    onBlur,\n    value: absoluteRangeToDateRange(value),\n    invalid,\n    errorMessage: error?.message,\n    inputRef: ref,\n  };\n\n  return <DateRangePicker {...mergeProps(formProps, props)} />;\n}\n\nexport function absoluteRangeToDateRange(props: FormDateRange | null) {\n  const {start, end, preset} = props || {};\n  const dateRange: Partial<DateRangeValue> = {preset};\n  try {\n    if (start) {\n      dateRange.start =\n        typeof start === 'string' ? parseAbsoluteToLocal(start) : start;\n    }\n    if (end) {\n      dateRange.end = typeof end === 'string' ? parseAbsoluteToLocal(end) : end;\n    }\n  } catch (e) {\n    // ignore\n  }\n  return dateRange;\n}\n\nexport function dateRangeToAbsoluteRange({\n  start,\n  end,\n  preset,\n}: Partial<DateRangeValue> = {}): AbsoluteDateRange {\n  const absoluteRange: AbsoluteDateRange = {\n    preset,\n  };\n  if (start) {\n    absoluteRange.start = start.toAbsoluteString();\n  }\n  if (end) {\n    absoluteRange.end = end.toAbsoluteString();\n  }\n  return absoluteRange;\n}\n","import {\n  BackendFilter,\n  DatePickerFilterControl,\n  FilterControlType,\n  FilterOperator,\n} from './backend-filter';\nimport {\n  DateRangePreset,\n  DateRangePresets,\n} from '../../ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {message} from '../../i18n/message';\nimport {dateRangeToAbsoluteRange} from '../../ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {PartialWithRequired} from '@common/utils/ts/partial-with-required';\n\nexport function timestampFilter(\n  options: PartialWithRequired<\n    BackendFilter<DatePickerFilterControl>,\n    'key' | 'label'\n  >\n): BackendFilter<DatePickerFilterControl> {\n  return {\n    ...options,\n    defaultOperator: FilterOperator.between,\n    control: {\n      type: FilterControlType.DateRangePicker,\n      defaultValue:\n        options.control?.defaultValue ||\n        dateRangeToAbsoluteRange(\n          (DateRangePresets[3] as Required<DateRangePreset>).getRangeValue()\n        ),\n    },\n  };\n}\n\nexport function createdAtFilter(\n  options: Partial<BackendFilter<DatePickerFilterControl>>\n): BackendFilter<DatePickerFilterControl> {\n  return timestampFilter({\n    key: 'created_at',\n    label: message('Date created'),\n    ...options,\n  });\n}\n\nexport function updatedAtFilter(\n  options: Partial<BackendFilter<DatePickerFilterControl>>\n): BackendFilter<DatePickerFilterControl> {\n  return timestampFilter({\n    key: 'updated_at',\n    label: message('Last updated'),\n    ...options,\n  });\n}\n","export const BackendFiltersUrlKey = 'filters';\n","import {FilterListValue} from './encode-backend-filters';\n\nexport function decodeBackendFilters(\n  encodedFilters: string | null\n): FilterListValue[] {\n  if (!encodedFilters) return [];\n  let filtersFromQuery: FilterListValue[] = [];\n  try {\n    filtersFromQuery = JSON.parse(atob(decodeURIComponent(encodedFilters)));\n    filtersFromQuery.map(filterValue => {\n      // set value key as value so selects work properly\n      if (filterValue.valueKey != null) {\n        filterValue.value = filterValue.valueKey;\n      }\n      return filterValue;\n    });\n  } catch (e) {\n    //\n  }\n  return filtersFromQuery;\n}\n","import {Key} from 'react';\nimport {BackendFilter} from '../backend-filter';\n\nexport interface FilterListValue {\n  key: Key;\n  value: BackendFilter['control']['defaultValue'];\n  operator?: BackendFilter['defaultOperator'];\n  valueKey?: Key;\n  isInactive?: boolean;\n  extraFilters?: {key: string; operator: string; value: any}[];\n}\n\nexport function encodeBackendFilters(\n  filterValues: FilterListValue[] | null,\n  filters?: BackendFilter[]\n): string {\n  if (!filterValues) return '';\n\n  // prepare values for backend\n  filterValues = !filters\n    ? filterValues\n    : filterValues\n        .filter(item => item.value !== '')\n        .map(item => transformValue(item, filters));\n\n  // remove all placeholder filters\n  filterValues = filterValues.filter(fm => !fm.isInactive);\n\n  if (!filterValues.length) {\n    return '';\n  }\n\n  return encodeURIComponent(btoa(JSON.stringify(filterValues)));\n}\n\nfunction transformValue(\n  filterValue: FilterListValue,\n  filters: BackendFilter[]\n) {\n  const filterConfig = filters.find(f => f.key === filterValue.key);\n  // select components will use a key always, because we can't use objects as\n  // value. Map over select options and replace key with actual value\n  if (filterConfig?.control.type === 'select') {\n    const option = (filterConfig.control.options || []).find(\n      o => o.key === filterValue.value\n    );\n    // if it's language or country select, there might not be an option\n    if (option) {\n      return {...filterValue, value: option.value, valueKey: option.key};\n    }\n  }\n\n  if (filterConfig?.extraFilters?.length) {\n    filterValue['extraFilters'] = filterConfig.extraFilters;\n  }\n\n  return filterValue;\n}\n","import {useNavigate, useSearchParams} from 'react-router-dom';\nimport {Key, useCallback, useMemo} from 'react';\nimport {BackendFilter} from './backend-filter';\nimport {BackendFiltersUrlKey} from './backend-filters-url-key';\nimport {decodeBackendFilters} from './utils/decode-backend-filters';\nimport {\n  encodeBackendFilters,\n  FilterListValue,\n} from './utils/encode-backend-filters';\n\nexport function useBackendFilterUrlParams(\n  filters?: BackendFilter[],\n  pinnedFilters?: string[]\n) {\n  const [searchParams] = useSearchParams();\n  const navigate = useNavigate();\n\n  const encodedFilters = searchParams.get(BackendFiltersUrlKey);\n\n  const decodedFilters: FilterListValue[] = useMemo(() => {\n    if (!filters) return [];\n    const decoded = decodeBackendFilters(encodedFilters);\n\n    // if filter is pinned, and it is not applied yet, add a placeholder\n    (pinnedFilters || []).forEach(key => {\n      if (!decoded.find(f => f.key === key)) {\n        const config = filters.find(f => f.key === key)!;\n        decoded.push({\n          key,\n          value: config.control.defaultValue,\n          operator: config.defaultOperator,\n          isInactive: true,\n        });\n      }\n    });\n\n    // preserve original filter order from configuration\n    decoded.sort(\n      (a, b) =>\n        filters.findIndex(f => f.key === a.key) -\n        filters.findIndex(f => f.key === b.key)\n    );\n\n    return decoded;\n  }, [encodedFilters, pinnedFilters, filters]);\n\n  const getDecodedWithoutKeys = useCallback(\n    (values: (FilterListValue | Key)[]) => {\n      const newFilters = [...decodedFilters];\n      values.forEach(value => {\n        const key = typeof value === 'object' ? value.key : value;\n        const index = newFilters.findIndex(f => f.key === key);\n        if (index > -1) {\n          newFilters.splice(index, 1);\n        }\n      });\n      return newFilters;\n    },\n    [decodedFilters]\n  );\n\n  const replaceAll = useCallback(\n    (filterValues: FilterListValue[]) => {\n      const encodedFilters = encodeBackendFilters(filterValues, filters);\n      if (encodedFilters) {\n        searchParams.set(BackendFiltersUrlKey, encodedFilters);\n      } else {\n        searchParams.delete(BackendFiltersUrlKey);\n      }\n      navigate({search: `?${searchParams}`}, {replace: true});\n    },\n    [filters, navigate, searchParams]\n  );\n\n  const add = useCallback(\n    (filterValues: FilterListValue[]) => {\n      const existing = getDecodedWithoutKeys(filterValues);\n      const decodedFilters = [...existing, ...filterValues];\n      replaceAll(decodedFilters);\n    },\n    [getDecodedWithoutKeys, replaceAll]\n  );\n\n  const remove = useCallback(\n    (key: Key) => replaceAll(getDecodedWithoutKeys([key])),\n    [getDecodedWithoutKeys, replaceAll]\n  );\n\n  return {\n    add,\n    remove,\n    replaceAll,\n    decodedFilters,\n    encodedFilters,\n  };\n}\n","import {\n  keepPreviousData,\n  useQuery,\n  UseQueryOptions,\n} from '@tanstack/react-query';\nimport {PaginatedBackendResponse} from '../../http/backend-response/pagination-response';\nimport {apiClient} from '../../http/query-client';\n\nexport interface GetDatatableDataParams {\n  orderBy?: string;\n  orderDir?: 'asc' | 'desc';\n  filters?: string | null;\n  query?: string;\n  with?: string;\n  perPage?: number | string | null;\n  page?: number | string;\n  [key: string]: string | number | boolean | undefined | null;\n}\n\nexport const DatatableDataQueryKey = (\n  endpoint: string,\n  params?: GetDatatableDataParams | Record<string, string | number | boolean>,\n) => {\n  // split endpoint by slash, so we can clear cache from the root later,\n  // for example, 'link-group' will clear 'link-group/1/links' endpoint\n  const key: (string | GetDatatableDataParams)[] = endpoint.split('/');\n  if (params) {\n    key.push(params);\n  }\n  return key;\n};\n\nexport function useDatatableData<T = object>(\n  endpoint: string,\n  params: GetDatatableDataParams,\n  options?: Omit<\n    UseQueryOptions<\n      PaginatedBackendResponse<T>,\n      unknown,\n      PaginatedBackendResponse<T>,\n      any[]\n    >,\n    'queryKey' | 'queryFn'\n  >,\n  onLoad?: (data: PaginatedBackendResponse<T>) => void,\n) {\n  return useQuery({\n    queryKey: DatatableDataQueryKey(endpoint, params),\n    queryFn: ({signal}) => paginate<T>(endpoint, params, onLoad, signal),\n    placeholderData: keepPreviousData,\n    ...options,\n  });\n}\n\nasync function paginate<T>(\n  endpoint: string,\n  params: GetDatatableDataParams,\n  onLoad?: (data: PaginatedBackendResponse<T>) => void,\n  signal?: AbortSignal,\n): Promise<PaginatedBackendResponse<T>> {\n  if (params.query) {\n    await new Promise(resolve => setTimeout(resolve, 300));\n  }\n  const response = await apiClient\n    .get(endpoint, {params, signal: params.query ? signal : undefined})\n    .then(response => response.data);\n  onLoad?.(response);\n  return response;\n}\n","import React, {useContext} from 'react';\nimport {GetDatatableDataParams} from '../requests/paginated-resources';\nimport {UseQueryResult} from '@tanstack/react-query';\nimport {PaginatedBackendResponse} from '../../http/backend-response/pagination-response';\n\nexport interface DataTableContextValue {\n  selectedRows: (string | number)[];\n  setSelectedRows: (keys: (string | number)[]) => void;\n  endpoint: string;\n  params: GetDatatableDataParams;\n  setParams: (value: GetDatatableDataParams) => void;\n  query: UseQueryResult<PaginatedBackendResponse<unknown>, unknown>;\n}\n\nexport const DataTableContext = React.createContext<DataTableContextValue>(\n  null!\n);\n\nexport function useDataTable() {\n  return useContext(DataTableContext);\n}\n","import {isMac} from '@react-aria/utils';\n\ninterface Event {\n  altKey: boolean;\n  ctrlKey: boolean;\n  metaKey: boolean;\n}\n\nexport function isCtrlKeyPressed(e: Event) {\n  if (isMac()) {\n    return e.metaKey;\n  }\n\n  return e.ctrlKey;\n}\n","import React, {KeyboardEventHandler} from 'react';\nimport {getFocusableTreeWalker} from '@react-aria/focus';\nimport {focusWithoutScrolling} from '@react-aria/utils';\nimport {isCtrlKeyPressed} from '../../utils/keybinds/is-ctrl-key-pressed';\n\ninterface Props {\n  cellCount: number;\n  rowCount: number;\n}\nexport function useGridNavigation(props: Props) {\n  const {cellCount, rowCount} = props;\n  const onKeyDown: KeyboardEventHandler<HTMLElement> = e => {\n    switch (e.key) {\n      case 'ArrowLeft':\n        focusSiblingCell(e, {cell: {op: 'decrement'}}, props);\n        break;\n      case 'ArrowRight':\n        focusSiblingCell(e, {cell: {op: 'increment'}}, props);\n        break;\n      case 'ArrowUp':\n        focusSiblingCell(e, {row: {op: 'decrement'}}, props);\n        break;\n      case 'ArrowDown':\n        focusSiblingCell(e, {row: {op: 'increment'}}, props);\n        break;\n      case 'PageUp':\n        focusSiblingCell(e, {row: {op: 'decrement', count: 5}}, props);\n        break;\n      case 'PageDown':\n        focusSiblingCell(e, {row: {op: 'increment', count: 5}}, props);\n        break;\n      case 'Tab':\n        focusFirstElementAfterGrid(e);\n        break;\n      case 'Home':\n        if (isCtrlKeyPressed(e)) {\n          // move to first cell in first row\n          focusSiblingCell(\n            e,\n            {\n              row: {op: 'decrement', count: rowCount},\n              cell: {op: 'decrement', count: cellCount},\n            },\n            props\n          );\n        } else {\n          // move to first cell in current row\n          focusSiblingCell(\n            e,\n            {cell: {op: 'decrement', count: cellCount}},\n            props\n          );\n        }\n        break;\n      case 'End':\n        if (isCtrlKeyPressed(e)) {\n          // move to last cell in last row\n          focusSiblingCell(\n            e,\n            {\n              row: {op: 'increment', count: rowCount},\n              cell: {op: 'increment', count: cellCount},\n            },\n            props\n          );\n        } else {\n          // move to last cell in current row\n          focusSiblingCell(\n            e,\n            {cell: {op: 'increment', count: cellCount}},\n            props\n          );\n        }\n        break;\n    }\n  };\n\n  return {onKeyDown};\n}\n\ninterface Operations {\n  cell?: {\n    op: 'increment' | 'decrement';\n    count?: number;\n  };\n  row?: {\n    op: 'increment' | 'decrement';\n    count?: number;\n  };\n}\nfunction focusSiblingCell(\n  e: React.KeyboardEvent,\n  operations: Operations,\n  {cellCount, rowCount}: Props\n) {\n  if (document.activeElement?.tagName === 'input') return;\n  e.preventDefault();\n  const grid = e.currentTarget as HTMLElement;\n\n  // focused element might be inside the cell and not the cell itself\n  const currentCell = (e.target as HTMLElement).closest('[aria-colindex]');\n  if (!currentCell || !grid) return;\n\n  const row = currentCell.closest('[aria-rowindex]');\n  if (!row) return;\n\n  // grab row and cell index from aria attributes\n  let rowIndex = parseInt(row.getAttribute('aria-rowindex') as string);\n  let cellIndex = parseInt(currentCell.getAttribute('aria-colindex') as string);\n  if (Number.isNaN(rowIndex) || Number.isNaN(cellIndex)) return;\n\n  // adjust row index for next cell selector\n  const rowOpCount = operations.row?.count ?? 1;\n  if (operations.row?.op === 'increment') {\n    rowIndex = Math.min(rowCount, rowIndex + rowOpCount);\n  } else if (operations.row?.op === 'decrement') {\n    rowIndex = Math.max(1, rowIndex - rowOpCount);\n  }\n\n  // adjust cell index for next cell selector\n  const cellOpCount = operations.cell?.count ?? 1;\n  if (operations.cell?.op === 'increment') {\n    cellIndex = Math.min(cellCount, cellIndex + cellOpCount);\n  } else if (operations.cell?.op === 'decrement') {\n    cellIndex = Math.max(1, cellIndex - cellOpCount);\n  }\n\n  // find the next cell that should be focused\n  const nextCell = grid.querySelector(\n    `[aria-rowindex=\"${rowIndex}\"] [aria-colindex=\"${cellIndex}\"]`\n  ) as HTMLElement | undefined;\n  if (!nextCell) return;\n\n  // find any focusable elements inside the cell\n  const walker = getFocusableTreeWalker(nextCell);\n  const nextFocusableElement = (walker.nextNode() || nextCell) as HTMLElement;\n\n  // adjust tab index on current and next cells and focus either next cell or first focusable element inside that cell\n  currentCell.setAttribute('tabindex', '-1');\n  nextFocusableElement.setAttribute('tabindex', '0');\n  nextFocusableElement.focus();\n}\n\n// grid is treated as a single tab stop, focus first element after grid, instead of moving focus withing grid on tab press\nfunction focusFirstElementAfterGrid(e: React.KeyboardEvent) {\n  const grid = e.currentTarget as HTMLElement;\n  if (e.shiftKey) {\n    grid.focus();\n  } else {\n    const walker = getFocusableTreeWalker(grid, {tabbable: true});\n    let next: HTMLElement;\n    let last: HTMLElement;\n    do {\n      last = walker.lastChild() as HTMLElement;\n      if (last) {\n        next = last;\n      }\n    } while (last);\n\n    // @ts-ignore\n    if (next && !next.contains(document.activeElement)) {\n      focusWithoutScrolling(next);\n    }\n  }\n}\n","import {createContext} from 'react';\nimport type {SortDescriptor} from './types/sort-descriptor';\nimport type {TableProps} from './table';\nimport type {ColumnConfig} from '../../datatable/column-config';\nimport type {TableDataItem} from './types/table-data-item';\n\nexport type TableSelectionStyle = 'checkbox' | 'highlight';\n\nexport interface TableContextValue<T extends TableDataItem = TableDataItem> {\n  isCollapsedMode: boolean;\n  selectedRows: (string | number)[];\n  onSelectionChange: (keys: (string | number)[]) => void;\n  sortDescriptor?: SortDescriptor;\n  onSortChange?: (descriptor: SortDescriptor) => any;\n  enableSelection?: boolean;\n  enableSorting?: boolean;\n  selectionStyle: TableSelectionStyle;\n  data: T[];\n  meta?: any;\n  columns: ColumnConfig<T>[];\n  toggleRow: (item: T) => void;\n  selectRow: (item: T | null, merge?: boolean) => void;\n  hideBorder: boolean;\n  hideHeaderRow: boolean;\n  collapseOnMobile: boolean;\n  onAction: TableProps<T>['onAction'];\n  selectRowOnContextMenu: TableProps<T>['selectRowOnContextMenu'];\n  cellHeight: string | undefined;\n  headerCellHeight: string | undefined;\n}\nexport const TableContext = createContext<TableContextValue>(null!);\n","import clsx from 'clsx';\nimport {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\n\ninterface Props {\n  index: number;\n  isHeader: boolean;\n}\nexport function useTableCellStyle({index, isHeader}: Props) {\n  const {\n    columns,\n    cellHeight = 'h-46',\n    headerCellHeight = 'h-46',\n  } = useContext(TableContext);\n  const column = columns[index];\n\n  const userPadding = column?.padding;\n\n  let justify = 'justify-start';\n  if (column?.align === 'center') {\n    justify = 'justify-center';\n  } else if (column?.align === 'end') {\n    justify = 'justify-end';\n  }\n\n  return clsx(\n    'flex items-center overflow-hidden whitespace-nowrap overflow-ellipsis outline-none focus-visible:outline focus-visible:outline-offset-2',\n    isHeader ? headerCellHeight : cellHeight,\n    column?.width ?? 'flex-1',\n    column?.maxWidth,\n    column?.minWidth,\n    justify,\n    userPadding,\n    column?.className\n  );\n}\n","import {useContext, useMemo} from 'react';\nimport {TableContext} from './table-context';\nimport {TableDataItem} from './types/table-data-item';\nimport {RowContext} from '@common/datatable/column-config';\nimport {useTableCellStyle} from '@common/ui/tables/style/use-table-cell-style';\n\ninterface TableCellProps {\n  rowIsHovered: boolean;\n  rowIndex: number;\n  index: number;\n  item: TableDataItem;\n  id?: string;\n}\nexport function TableCell({\n  rowIndex,\n  rowIsHovered,\n  index,\n  item,\n  id,\n}: TableCellProps) {\n  const {columns} = useContext(TableContext);\n  const column = columns[index];\n\n  const rowContext: RowContext = useMemo(() => {\n    return {\n      index: rowIndex,\n      isHovered: rowIsHovered,\n      isPlaceholder: item.isPlaceholder,\n    };\n  }, [rowIndex, rowIsHovered, item.isPlaceholder]);\n\n  const style = useTableCellStyle({\n    index: index,\n    isHeader: false,\n  });\n\n  return (\n    <div\n      tabIndex={-1}\n      role=\"gridcell\"\n      aria-colindex={index + 1}\n      id={id}\n      className={style}\n    >\n      <div className=\"overflow-x-hidden overflow-ellipsis min-w-0 w-full\">\n        {column.body(item, rowContext)}\n      </div>\n    </div>\n  );\n}\n","import React, {HTMLAttributes, useRef} from 'react';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\nimport {useGlobalListeners} from '@react-aria/utils';\n\ninterface PointerState {\n  lastPosition: {x: number; y: number};\n  id?: number;\n  started: boolean;\n  el?: HTMLElement;\n  originalTouchAction?: string;\n  originalUserSelect?: string;\n  longPressTimer?: any;\n  longPressTriggered?: boolean;\n}\n\ninterface UsePointerEventsReturn {\n  domProps: HTMLAttributes<HTMLElement>;\n}\n\nexport interface UsePointerEventsProps {\n  onMoveStart?: (e: PointerEvent, el: HTMLElement) => false | void;\n  onMove?: (e: PointerEvent, deltaX: number, deltaY: number) => void;\n  onMoveEnd?: (e: PointerEvent) => void;\n  onPointerDown?: (e: React.PointerEvent) => void | false;\n  onPointerUp?: (e: PointerEvent, el: HTMLElement) => void;\n  onPress?: (e: PointerEvent, el: HTMLElement) => void;\n  onLongPress?: (e: PointerEvent | React.PointerEvent, el: HTMLElement) => void;\n  preventDefault?: boolean;\n  stopPropagation?: boolean;\n  minimumMovement?: number;\n}\nexport function usePointerEvents({\n  onMoveStart,\n  onMove,\n  onMoveEnd,\n  minimumMovement = 0,\n  preventDefault,\n  stopPropagation = true,\n  onPress,\n  onLongPress,\n  ...props\n}: UsePointerEventsProps): UsePointerEventsReturn {\n  const stateRef = useRef<PointerState>({\n    lastPosition: {x: 0, y: 0},\n    started: false,\n    longPressTriggered: false,\n  });\n  const state = stateRef.current;\n\n  const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n\n  const start = (e: PointerEvent) => {\n    if (!state.el) return;\n    const result = onMoveStart?.(e, state.el);\n\n    // allow user to cancel interaction\n    if (result === false) return;\n\n    state.originalTouchAction = state.el.style.touchAction;\n    state.el.style.touchAction = 'none';\n    state.originalUserSelect = document.documentElement.style.userSelect;\n    document.documentElement.style.userSelect = 'none';\n    state.started = true;\n  };\n\n  const onPointerDown = (e: React.PointerEvent) => {\n    if (e.button === 0 && state.id == null) {\n      state.started = false;\n\n      const result = props.onPointerDown?.(e);\n      if (result === false) return;\n\n      if (stopPropagation) {\n        e.stopPropagation();\n      }\n      if (preventDefault) {\n        e.preventDefault();\n      }\n      state.id = e.pointerId;\n      state.el = e.currentTarget as HTMLElement;\n      state.lastPosition = {x: e.clientX, y: e.clientY};\n\n      // use global listeners, so we don't have to capture pointer,\n      // which would prevent click events on child nodes\n\n      if (onLongPress) {\n        state.longPressTimer = setTimeout(() => {\n          onLongPress(e, state.el!);\n          state.longPressTriggered = true;\n        }, 400);\n      }\n\n      if (onMoveStart || onMove) {\n        addGlobalListener(window, 'pointermove', onPointerMove, false);\n      }\n      addGlobalListener(window, 'pointerup', onPointerUp, false);\n      addGlobalListener(window, 'pointercancel', onPointerUp, false);\n    }\n  };\n\n  const onPointerMove = (e: PointerEvent) => {\n    if (e.pointerId === state.id) {\n      const deltaX = e.clientX - state.lastPosition.x;\n      const deltaY = e.clientY - state.lastPosition.y;\n\n      if (\n        (Math.abs(deltaX) >= minimumMovement ||\n          Math.abs(deltaY) >= minimumMovement) &&\n        !state.started\n      ) {\n        start(e);\n      }\n\n      if (state.started) {\n        onMove?.(e, deltaX, deltaY);\n        state.lastPosition = {x: e.clientX, y: e.clientY};\n      }\n    }\n  };\n\n  const onPointerUp = (e: PointerEvent) => {\n    if (e.pointerId === state.id) {\n      // cancel long press timer, if exists\n      if (state.longPressTimer) {\n        clearTimeout(state.longPressTimer);\n      }\n\n      const longPressTriggered = state.longPressTriggered;\n      state.longPressTriggered = false;\n\n      // only call onMoveEnd if we actually started moving\n      if (state.started) {\n        onMoveEnd?.(e);\n      }\n\n      if (state.el) {\n        // handle press only if event was not cancelled (via touch scroll on mobile for example)\n        if (e.type !== 'pointercancel') {\n          props.onPointerUp?.(e, state.el);\n\n          // only call onPress if pointer did not leave onPointerDown element\n          if (e.target && state.el.contains(e.target as HTMLElement)) {\n            // trigger either onPress or onLongPress\n            if (longPressTriggered) {\n              onLongPress?.(e, state.el);\n            } else {\n              onPress?.(e, state.el);\n            }\n          }\n        }\n\n        document.documentElement.style.userSelect =\n          state.originalUserSelect || '';\n        state.el.style.touchAction = state.originalTouchAction || '';\n      }\n      state.id = undefined;\n      state.started = false;\n      removeGlobalListener(window, 'pointermove', onPointerMove, false);\n      removeGlobalListener(window, 'pointerup', onPointerUp, false);\n      removeGlobalListener(window, 'pointercancel', onPointerUp, false);\n    }\n  };\n\n  return {\n    domProps: {\n      onPointerDown: createEventHandler(onPointerDown),\n    },\n  };\n}\n","import {isCtrlKeyPressed} from './is-ctrl-key-pressed';\n\ninterface Event {\n  altKey: boolean;\n  ctrlKey: boolean;\n  metaKey: boolean;\n  shiftKey: boolean;\n}\n\nexport function isCtrlOrShiftPressed(e: Event) {\n  return e.shiftKey || isCtrlKeyPressed(e);\n}\n","import clsx from 'clsx';\nimport {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport {useIsDarkMode} from '@common/ui/themes/use-is-dark-mode';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\ninterface Props {\n  index: number;\n  isSelected: boolean;\n  isHeader?: boolean;\n}\nexport function useTableRowStyle({index, isSelected, isHeader}: Props) {\n  const isDarkMode = useIsDarkMode();\n  const isMobile = useIsMobileMediaQuery();\n  const {hideBorder, enableSelection, collapseOnMobile, onAction} =\n    useContext(TableContext);\n  const isFirst = index === 0;\n  return clsx(\n    'flex gap-x-16 break-inside-avoid outline-none border border-transparent',\n    onAction && 'cursor-pointer',\n    isMobile && collapseOnMobile && hideBorder\n      ? 'mb-8 pl-8 pr-0 rounded'\n      : 'px-16',\n    !hideBorder && 'border-b-divider',\n    !hideBorder && isFirst && 'border-t-divider',\n    isSelected &&\n      !isDarkMode &&\n      'bg-primary/selected hover:bg-primary/focus focus-visible:bg-primary/focus',\n    isSelected &&\n      isDarkMode &&\n      'bg-selected hover:bg-focus focus-visible:bg-focus',\n    !isSelected &&\n      !isHeader &&\n      (enableSelection || onAction) &&\n      'focus-visible:bg-focus hover:bg-hover'\n  );\n}\n","import React, {\n  ComponentPropsWithoutRef,\n  JSXElementConstructor,\n  KeyboardEventHandler,\n  MouseEventHandler,\n  useContext,\n  useRef,\n  useState,\n} from 'react';\nimport {TableContext} from './table-context';\nimport {TableCell} from './table-cell';\nimport {TableDataItem} from './types/table-data-item';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\nimport {usePointerEvents} from '../interactions/use-pointer-events';\nimport {isCtrlOrShiftPressed} from '../../utils/keybinds/is-ctrl-or-shift-pressed';\nimport {useTableRowStyle} from '@common/ui/tables/style/use-table-row-style';\nimport clsx from 'clsx';\n\nconst interactableElements = ['button', 'a', 'input', 'select', 'textarea'];\n\nexport interface RowElementProps<T = TableDataItem>\n  extends ComponentPropsWithoutRef<'tr'> {\n  item: T & {isPlaceholder?: boolean};\n}\n\ninterface TableRowProps {\n  item: TableDataItem;\n  index: number;\n  renderAs?: JSXElementConstructor<RowElementProps>;\n  className?: string;\n  style?: React.CSSProperties;\n}\nexport function TableRow({\n  item,\n  index,\n  renderAs,\n  className,\n  style,\n}: TableRowProps) {\n  const {\n    selectedRows,\n    columns,\n    toggleRow,\n    selectRow,\n    onAction,\n    selectRowOnContextMenu,\n    enableSelection,\n    selectionStyle,\n    hideHeaderRow,\n  } = useContext(TableContext);\n\n  const isTouchDevice = useRef(false);\n  const isSelected = selectedRows.includes(item.id);\n  const [isHovered, setIsHovered] = useState(false);\n\n  const clickedOnInteractable = (e: React.MouseEvent | PointerEvent) => {\n    return (e.target as HTMLElement).closest(interactableElements.join(','));\n  };\n\n  const doubleClickHandler: MouseEventHandler<HTMLDivElement> = e => {\n    if (\n      selectionStyle === 'highlight' &&\n      onAction &&\n      !isTouchDevice.current &&\n      !clickedOnInteractable(e)\n    ) {\n      e.preventDefault();\n      e.stopPropagation();\n      onAction(item, index);\n    }\n  };\n\n  const anyRowsSelected = !!selectedRows.length;\n\n  const handleRowTap = (e: PointerEvent) => {\n    if (clickedOnInteractable(e)) return;\n    if (selectionStyle === 'checkbox') {\n      if (enableSelection && (anyRowsSelected || !onAction)) {\n        toggleRow(item);\n      } else if (onAction) {\n        onAction(item, index);\n      }\n    } else if (selectionStyle === 'highlight') {\n      if (isTouchDevice.current) {\n        if (enableSelection && anyRowsSelected) {\n          toggleRow(item);\n        } else {\n          onAction?.(item, index);\n        }\n      } else if (enableSelection) {\n        selectRow(item, isCtrlOrShiftPressed(e));\n      }\n    }\n  };\n\n  const {domProps} = usePointerEvents({\n    onPointerDown: e => {\n      isTouchDevice.current = e.pointerType === 'touch';\n    },\n    onPress: handleRowTap,\n    onLongPress: enableSelection\n      ? () => {\n          if (isTouchDevice.current) {\n            toggleRow(item);\n          }\n        }\n      : undefined,\n  });\n\n  const keyboardHandler: KeyboardEventHandler = e => {\n    if (enableSelection && e.key === ' ') {\n      e.preventDefault();\n      e.stopPropagation();\n      if (selectionStyle === 'checkbox') {\n        toggleRow(item);\n      } else {\n        selectRow(item);\n      }\n    } else if (e.key === 'Enter' && !selectedRows.length && onAction) {\n      e.preventDefault();\n      e.stopPropagation();\n      onAction(item, index);\n    }\n  };\n\n  const contextMenuHandler: MouseEventHandler = e => {\n    if (selectRowOnContextMenu && enableSelection) {\n      if (!selectedRows.includes(item.id)) {\n        selectRow(item);\n      }\n    }\n    // prevent context menu on mobile\n    if (isTouchDevice.current) {\n      e.preventDefault();\n      e.stopPropagation();\n    }\n  };\n\n  const styleClassName = useTableRowStyle({index, isSelected});\n\n  const RowElement = renderAs || 'div';\n  return (\n    <RowElement\n      role=\"row\"\n      aria-rowindex={index + 1 + (hideHeaderRow ? 0 : 1)}\n      aria-selected={isSelected}\n      tabIndex={-1}\n      className={clsx(className, styleClassName)}\n      item={RowElement === 'div' ? (undefined as any) : item}\n      onDoubleClick={createEventHandler(doubleClickHandler)}\n      onKeyDown={createEventHandler(keyboardHandler)}\n      onContextMenu={createEventHandler(contextMenuHandler)}\n      onPointerEnter={createEventHandler(() => setIsHovered(true))}\n      onPointerLeave={createEventHandler(() => setIsHovered(false))}\n      style={style}\n      {...domProps}\n    >\n      {columns.map((column, cellIndex) => (\n        <TableCell\n          rowIndex={index}\n          rowIsHovered={isHovered}\n          index={cellIndex}\n          item={item}\n          key={`${item.id}-${column.key}`}\n        />\n      ))}\n    </RowElement>\n  );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {TableDataItem} from '@common/ui/tables/types/table-data-item';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport React, {useContext} from 'react';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {TableContext} from '@common/ui/tables/table-context';\n\nexport const CheckboxColumnConfig: ColumnConfig<TableDataItem> = {\n  key: 'checkbox',\n  header: () => <SelectAllCheckbox />,\n  align: 'center',\n  width: 'w-24 flex-shrink-0',\n  body: (item, row) => {\n    if (row.isPlaceholder) {\n      return <Skeleton size=\"w-24 h-24\" variant=\"rect\" />;\n    }\n    return <SelectRowCheckbox item={item} />;\n  },\n};\n\ninterface SelectRowCheckboxProps {\n  item: TableDataItem;\n}\nfunction SelectRowCheckbox({item}: SelectRowCheckboxProps) {\n  const {selectedRows, toggleRow} = useContext(TableContext);\n  return (\n    <Checkbox\n      checked={selectedRows.includes(item.id)}\n      onChange={() => toggleRow(item)}\n    />\n  );\n}\n\nfunction SelectAllCheckbox() {\n  const {trans} = useTrans();\n\n  const {data, selectedRows, onSelectionChange} = useContext(TableContext);\n  const allRowsSelected = !!data.length && data.length === selectedRows.length;\n  const someRowsSelected = !allRowsSelected && !!selectedRows.length;\n\n  return (\n    <Checkbox\n      aria-label={trans({message: 'Select all'})}\n      isIndeterminate={someRowsSelected}\n      checked={allRowsSelected}\n      onChange={() => {\n        if (allRowsSelected) {\n          onSelectionChange([]);\n        } else {\n          onSelectionChange(data.map(d => d.id));\n        }\n      }}\n    />\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowDownwardIcon = createSvgIcon(\n  <path d=\"m20 12-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\" />\n, 'ArrowDownwardOutlined');\n","import {useContext, useState} from 'react';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {TableContext} from './table-context';\nimport {SortDescriptor} from './types/sort-descriptor';\nimport {ArrowDownwardIcon} from '../../icons/material/ArrowDownward';\nimport {useTableCellStyle} from '@common/ui/tables/style/use-table-cell-style';\n\ninterface HeaderCellProps {\n  index: number;\n}\nexport function HeaderCell({index}: HeaderCellProps) {\n  const {columns, sortDescriptor, onSortChange, enableSorting} =\n    useContext(TableContext);\n  const column = columns[index];\n\n  const style = useTableCellStyle({\n    index: index,\n    isHeader: true,\n  });\n\n  const [isHovered, setIsHovered] = useState(false);\n\n  const sortingKey = column.sortingKey || column.key;\n  const allowSorting = column.allowsSorting && enableSorting;\n  const {orderBy, orderDir} = sortDescriptor || {};\n\n  const sortActive = allowSorting && orderBy === sortingKey;\n\n  let ariaSort: 'ascending' | 'descending' | 'none' | undefined;\n  if (sortActive && orderDir === 'asc') {\n    ariaSort = 'ascending';\n  } else if (sortActive && orderDir === 'desc') {\n    ariaSort = 'descending';\n  } else if (allowSorting) {\n    ariaSort = 'none';\n  }\n\n  const toggleSorting = () => {\n    if (!allowSorting) return;\n\n    let newSort: SortDescriptor;\n\n    // if this col was sorted desc, go to asc\n    if (sortActive && orderDir === 'desc') {\n      newSort = {orderDir: 'asc', orderBy: sortingKey};\n\n      // if this col was sorted asc, clear sort\n    } else if (sortActive && orderDir === 'asc') {\n      newSort = {orderBy: undefined, orderDir: undefined};\n\n      // if sort was on another col, or no sort was applied yet, start from desc\n    } else {\n      newSort = {orderDir: 'desc', orderBy: sortingKey};\n    }\n\n    onSortChange?.(newSort);\n  };\n\n  const sortVisible = sortActive || isHovered;\n  const sortVariants = {\n    visible: {opacity: 1, y: 0},\n    hidden: {opacity: 0, y: '-25%'},\n  };\n\n  return (\n    <div\n      role=\"columnheader\"\n      tabIndex={-1}\n      aria-colindex={index + 1}\n      aria-sort={ariaSort}\n      className={clsx(\n        style,\n        'text-muted font-medium text-xs',\n        allowSorting && 'cursor-pointer'\n      )}\n      onMouseEnter={() => {\n        setIsHovered(true);\n      }}\n      onMouseLeave={() => {\n        setIsHovered(false);\n      }}\n      onKeyDown={e => {\n        if (e.key === ' ' || e.key === 'Enter') {\n          e.preventDefault();\n          toggleSorting();\n        }\n      }}\n      onClick={toggleSorting}\n    >\n      {column.hideHeader ? (\n        <div className=\"sr-only\">{column.header()}</div>\n      ) : (\n        column.header()\n      )}\n      <AnimatePresence>\n        {allowSorting && (\n          <m.span\n            variants={sortVariants}\n            animate={sortVisible ? 'visible' : 'hidden'}\n            initial={false}\n            transition={{type: 'tween'}}\n            key=\"sort-icon\"\n            className=\"inline-block ml-6 -mt-2\"\n            data-testid=\"table-sort-button\"\n            aria-hidden={!sortVisible}\n          >\n            <ArrowDownwardIcon\n              size=\"xs\"\n              className={clsx(\n                'text-muted',\n                orderDir === 'asc' &&\n                  orderBy === sortingKey &&\n                  'rotate-180 transition-transform'\n              )}\n            />\n          </m.span>\n        )}\n      </AnimatePresence>\n    </div>\n  );\n}\n","import {HeaderCell} from '@common/ui/tables/header-cell';\nimport React, {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\n\nexport function TableHeaderRow() {\n  const {columns} = useContext(TableContext);\n  return (\n    <div\n      role=\"row\"\n      aria-rowindex={1}\n      tabIndex={-1}\n      className=\"flex gap-x-16 px-16\"\n    >\n      {columns.map((column, columnIndex) => (\n        <HeaderCell index={columnIndex} key={column.key} />\n      ))}\n    </div>\n  );\n}\n","import React, {\n  cloneElement,\n  ComponentPropsWithoutRef,\n  Fragment,\n  JSXElementConstructor,\n  MutableRefObject,\n  ReactElement,\n  useCallback,\n  useContext,\n  useMemo,\n} from 'react';\nimport {useControlledState} from '@react-stately/utils';\nimport {SortDescriptor} from './types/sort-descriptor';\nimport {useGridNavigation} from './navigate-grid';\nimport {RowElementProps, TableRow} from './table-row';\nimport {\n  TableContext,\n  TableContextValue,\n  TableSelectionStyle,\n} from './table-context';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {TableDataItem} from './types/table-data-item';\nimport clsx from 'clsx';\nimport {useInteractOutside} from '@react-aria/interactions';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {isCtrlKeyPressed} from '@common/utils/keybinds/is-ctrl-key-pressed';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {CheckboxColumnConfig} from '@common/ui/tables/checkbox-column-config';\nimport {TableHeaderRow} from '@common/ui/tables/table-header-row';\n\nexport interface TableProps<T extends TableDataItem>\n  extends ComponentPropsWithoutRef<'table'> {\n  className?: string;\n  columns: ColumnConfig<T>[];\n  hideHeaderRow?: boolean;\n  data: T[];\n  meta?: any;\n  tableRef?: MutableRefObject<HTMLTableElement>;\n  selectedRows?: (number | string)[];\n  defaultSelectedRows?: (number | string)[];\n  onSelectionChange?: (keys: (number | string)[]) => void;\n  sortDescriptor?: SortDescriptor;\n  onSortChange?: (descriptor: SortDescriptor) => any;\n  enableSorting?: boolean;\n  onDelete?: (items: T[]) => void;\n  enableSelection?: boolean;\n  selectionStyle?: TableSelectionStyle;\n  ariaLabelledBy?: string;\n  onAction?: (item: T, index: number) => void;\n  selectRowOnContextMenu?: boolean;\n  renderRowAs?: JSXElementConstructor<RowElementProps<T>>;\n  tableBody?: ReactElement<TableBodyProps>;\n  hideBorder?: boolean;\n  closeOnInteractOutside?: boolean;\n  collapseOnMobile?: boolean;\n  cellHeight?: string;\n  headerCellHeight?: string;\n}\nexport function Table<T extends TableDataItem>({\n  className,\n  columns: userColumns,\n  collapseOnMobile = true,\n  hideHeaderRow = false,\n  hideBorder = false,\n  data,\n  selectedRows: propsSelectedRows,\n  defaultSelectedRows: propsDefaultSelectedRows,\n  onSelectionChange: propsOnSelectionChange,\n  sortDescriptor: propsSortDescriptor,\n  onSortChange: propsOnSortChange,\n  enableSorting = true,\n  onDelete,\n  enableSelection = true,\n  selectionStyle = 'checkbox',\n  ariaLabelledBy,\n  selectRowOnContextMenu,\n  onAction,\n  renderRowAs,\n  tableBody,\n  meta,\n  tableRef: propsTableRef,\n  closeOnInteractOutside = false,\n  cellHeight,\n  headerCellHeight,\n  ...domProps\n}: TableProps<T>) {\n  const isMobile = useIsMobileMediaQuery();\n  const isCollapsedMode = !!isMobile && collapseOnMobile;\n  if (isCollapsedMode) {\n    hideHeaderRow = true;\n    hideBorder = true;\n  }\n\n  const [selectedRows, onSelectionChange] = useControlledState(\n    propsSelectedRows,\n    propsDefaultSelectedRows || [],\n    propsOnSelectionChange,\n  );\n\n  const [sortDescriptor, onSortChange] = useControlledState(\n    propsSortDescriptor,\n    undefined,\n    propsOnSortChange,\n  );\n\n  const toggleRow = useCallback(\n    (item: TableDataItem) => {\n      const newValues = [...selectedRows];\n      if (!newValues.includes(item.id)) {\n        newValues.push(item.id);\n      } else {\n        const index = newValues.indexOf(item.id);\n        newValues.splice(index, 1);\n      }\n      onSelectionChange(newValues);\n    },\n    [selectedRows, onSelectionChange],\n  );\n\n  const selectRow = useCallback(\n    // allow deselecting all rows by passing in null\n    (item: TableDataItem | null, merge?: boolean) => {\n      let newValues: (string | number)[] = [];\n      if (item) {\n        newValues = merge\n          ? [...selectedRows?.filter(id => id !== item.id), item.id]\n          : [item.id];\n      }\n      onSelectionChange(newValues);\n    },\n    [selectedRows, onSelectionChange],\n  );\n\n  // add checkbox columns to config, if selection is enabled\n  const columns = useMemo(() => {\n    const filteredColumns = userColumns.filter(c => {\n      const visibleInMode = c.visibleInMode || 'regular';\n      if (visibleInMode === 'all') {\n        return true;\n      }\n      if (visibleInMode === 'compact' && isCollapsedMode) {\n        return true;\n      }\n      if (visibleInMode === 'regular' && !isCollapsedMode) {\n        return true;\n      }\n    });\n    const showCheckboxCell =\n      enableSelection && selectionStyle !== 'highlight' && !isMobile;\n    if (showCheckboxCell) {\n      filteredColumns.unshift(CheckboxColumnConfig);\n    }\n    return filteredColumns;\n  }, [isMobile, userColumns, enableSelection, selectionStyle, isCollapsedMode]);\n\n  const contextValue: TableContextValue<T> = {\n    isCollapsedMode,\n    cellHeight,\n    headerCellHeight,\n    hideBorder,\n    hideHeaderRow,\n    selectedRows,\n    onSelectionChange,\n    enableSorting,\n    enableSelection,\n    selectionStyle,\n    data,\n    columns,\n    sortDescriptor,\n    onSortChange,\n    toggleRow,\n    selectRow,\n    onAction,\n    selectRowOnContextMenu,\n    meta,\n    collapseOnMobile,\n  };\n\n  const navProps = useGridNavigation({\n    cellCount: enableSelection ? columns.length + 1 : columns.length,\n    rowCount: data.length + 1,\n  });\n\n  const tableBodyProps: TableBodyProps = {\n    renderRowAs: renderRowAs as any,\n  };\n\n  if (!tableBody) {\n    tableBody = <BasicTableBody {...tableBodyProps} />;\n  } else {\n    tableBody = cloneElement(tableBody, tableBodyProps);\n  }\n\n  // deselect rows when clicking outside the table\n  const tableRef = useObjectRef(propsTableRef);\n  useInteractOutside({\n    ref: tableRef,\n    onInteractOutside: e => {\n      if (\n        closeOnInteractOutside &&\n        enableSelection &&\n        selectedRows?.length &&\n        // don't deselect if clicking on a dialog (for example is table row has a context menu)\n        !(e.target as HTMLElement).closest('[role=\"dialog\"]')\n      ) {\n        onSelectionChange([]);\n      }\n    },\n  });\n\n  return (\n    <TableContext.Provider value={contextValue as any}>\n      <div\n        {...mergeProps(domProps, navProps, {\n          onKeyDown: (e: KeyboardEvent) => {\n            if (e.key === 'Escape') {\n              e.preventDefault();\n              e.stopPropagation();\n              if (selectedRows?.length) {\n                onSelectionChange([]);\n              }\n            } else if (e.key === 'Delete') {\n              e.preventDefault();\n              e.stopPropagation();\n              if (selectedRows?.length) {\n                onDelete?.(\n                  data.filter(item => selectedRows?.includes(item.id)),\n                );\n              }\n            } else if (isCtrlKeyPressed(e) && e.key === 'a') {\n              e.preventDefault();\n              e.stopPropagation();\n              if (enableSelection) {\n                onSelectionChange(data.map(item => item.id));\n              }\n            }\n          },\n        })}\n        role=\"grid\"\n        tabIndex={0}\n        aria-rowcount={data.length + 1}\n        aria-colcount={columns.length + 1}\n        ref={tableRef}\n        aria-multiselectable={enableSelection ? true : undefined}\n        aria-labelledby={ariaLabelledBy}\n        className={clsx(\n          className,\n          'isolate select-none text-sm outline-none focus-visible:ring-2',\n        )}\n      >\n        {!hideHeaderRow && <TableHeaderRow />}\n        {tableBody}\n      </div>\n    </TableContext.Provider>\n  );\n}\n\nexport interface TableBodyProps {\n  renderRowAs?: TableProps<TableDataItem>['renderRowAs'];\n}\nfunction BasicTableBody({renderRowAs}: TableBodyProps) {\n  const {data} = useContext(TableContext);\n  return (\n    <Fragment>\n      {data.map((item, rowIndex) => (\n        <TableRow\n          item={item}\n          index={rowIndex}\n          key={item.id}\n          renderAs={renderRowAs}\n        />\n      ))}\n    </Fragment>\n  );\n}\n","import {UseQueryResult} from '@tanstack/react-query';\nimport {\n  hasNextPage,\n  LengthAwarePaginationResponse,\n  PaginatedBackendResponse,\n} from '../http/backend-response/pagination-response';\nimport {useNumberFormatter} from '../i18n/use-number-formatter';\nimport {Select} from '../ui/forms/select/select';\nimport {Trans} from '../i18n/trans';\nimport {Item} from '../ui/forms/listbox/item';\nimport {IconButton} from '../ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '../icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '../icons/material/KeyboardArrowRight';\nimport React from 'react';\nimport {useIsMobileMediaQuery} from '../utils/hooks/is-mobile-media-query';\nimport clsx from 'clsx';\n\nconst defaultPerPage = 15;\nconst perPageOptions = [{key: 10}, {key: 15}, {key: 20}, {key: 50}, {key: 100}];\n\ntype DataTablePaginationFooterProps = {\n  query: UseQueryResult<PaginatedBackendResponse<unknown>, unknown>;\n  onPerPageChange?: (perPage: number) => void;\n  onPageChange?: (page: number) => void;\n  className?: string;\n};\nexport function DataTablePaginationFooter({\n  query,\n  onPerPageChange,\n  onPageChange,\n  className,\n}: DataTablePaginationFooterProps) {\n  const isMobile = useIsMobileMediaQuery();\n  const numberFormatter = useNumberFormatter();\n  const pagination = query.data\n    ?.pagination as LengthAwarePaginationResponse<any>;\n\n  if (!pagination) return null;\n\n  const perPageSelect = onPerPageChange ? (\n    <Select\n      minWidth=\"min-w-auto\"\n      selectionMode=\"single\"\n      disabled={query.isLoading}\n      labelPosition=\"side\"\n      size=\"xs\"\n      label={<Trans message=\"Items per page\" />}\n      selectedValue={pagination.per_page || defaultPerPage}\n      onSelectionChange={value => onPerPageChange(value as number)}\n    >\n      {perPageOptions.map(option => (\n        <Item key={option.key} value={option.key}>\n          {option.key}\n        </Item>\n      ))}\n    </Select>\n  ) : null;\n\n  return (\n    <div\n      className={clsx(\n        'flex h-54 select-none items-center justify-end gap-20 px-20',\n        className,\n      )}\n    >\n      {!isMobile && perPageSelect}\n      {pagination.from && pagination.to && 'total' in pagination && (\n        <div className=\"text-sm\">\n          <Trans\n            message=\":from - :to of :total\"\n            values={{\n              from: pagination.from,\n              to: pagination.to,\n              total: numberFormatter.format(pagination.total),\n            }}\n          />\n        </div>\n      )}\n      <div className=\"text-muted\">\n        <IconButton\n          disabled={query.isFetching || pagination.current_page < 2}\n          onClick={() => {\n            onPageChange?.(pagination?.current_page - 1);\n          }}\n        >\n          <KeyboardArrowLeftIcon />\n        </IconButton>\n        <IconButton\n          disabled={query.isFetching || !hasNextPage(pagination)}\n          onClick={() => {\n            onPageChange?.(pagination?.current_page + 1);\n          }}\n        >\n          <KeyboardArrowRightIcon />\n        </IconButton>\n      </div>\n    </div>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FilterAltIcon = createSvgIcon(\n  <path d=\"M7 6h10l-5.01 6.3L7 6zm-2.75-.39C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39c.51-.66.04-1.61-.79-1.61H5.04c-.83 0-1.3.95-.79 1.61z\" />\n, 'FilterAltOutlined');\n","export const AccordionAnimation = {\n  variants: {\n    open: {\n      height: 'auto',\n      visibility: 'visible',\n      transitionEnd: {\n        overflow: 'auto',\n      },\n    },\n    closed: {\n      height: 0,\n      overflow: 'hidden',\n      transitionEnd: {\n        visibility: 'hidden',\n      },\n    },\n  },\n  transition: {type: 'tween', duration: 0.2},\n} as const;\n","import React, {\n  cloneElement,\n  isValidElement,\n  Key,\n  ReactElement,\n  ReactNode,\n  useId,\n  useRef,\n} from 'react';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {useControlledState} from '@react-stately/utils';\nimport {FocusScope, useFocusManager} from '@react-aria/focus';\nimport {AccordionAnimation} from '@common/ui/accordion/accordtion-animation';\nimport {ArrowDropDownIcon} from '@common/icons/material/ArrowDropDown';\n\ntype Props = {\n  variant?: 'outline' | 'default' | 'minimal';\n  children?: ReactNode;\n  mode?: 'single' | 'multiple';\n  expandedValues?: Key[];\n  defaultExpandedValues?: Key[];\n  onExpandedChange?: (key: Key[]) => void;\n  className?: string;\n  isLazy?: boolean;\n};\nexport const Accordion = React.forwardRef<HTMLDivElement, Props>(\n  (\n    {\n      variant = 'default',\n      mode = 'single',\n      children,\n      className,\n      isLazy,\n      ...other\n    },\n    ref,\n  ) => {\n    const [expandedValues, setExpandedValues] = useControlledState(\n      other.expandedValues,\n      other.defaultExpandedValues || [],\n      other.onExpandedChange,\n    );\n\n    const itemsCount = React.Children.count(children);\n\n    return (\n      <div\n        className={clsx(variant === 'outline' && 'space-y-10', className)}\n        ref={ref}\n        role=\"presentation\"\n      >\n        <AnimatePresence>\n          <FocusScope>\n            {React.Children.map(children, (child, index) => {\n              if (!isValidElement<ClonedItemProps>(child)) return null;\n              return cloneElement<ClonedItemProps>(child, {\n                key: child.key || index,\n                value: child.props.value || index,\n                isFirst: index === 0,\n                isLast: index === itemsCount - 1,\n                mode,\n                variant,\n                expandedValues,\n                setExpandedValues,\n                isLazy,\n              });\n            })}\n          </FocusScope>\n        </AnimatePresence>\n      </div>\n    );\n  },\n);\n\ninterface AccordionItemProps {\n  children: ReactNode;\n  disabled?: boolean;\n  label: ReactNode;\n  description?: ReactNode;\n  value?: Key;\n  isFirst?: boolean;\n  isLast?: boolean;\n  bodyClassName?: string;\n  labelClassName?: string;\n  buttonPadding?: string;\n  chevronPosition?: 'left' | 'right';\n  startIcon?: ReactElement;\n  endAppend?: ReactElement;\n}\ninterface ClonedItemProps extends AccordionItemProps {\n  variant?: 'outline' | 'default' | 'minimal';\n  expandedValues: Key[];\n  setExpandedValues: (keys: Key[]) => void;\n  mode: 'single' | 'multiple';\n  value: Key;\n  isLazy?: boolean;\n}\nexport function AccordionItem({\n  children,\n  label,\n  disabled,\n  bodyClassName,\n  labelClassName,\n  buttonPadding = 'py-10 pl-14 pr-10',\n  startIcon,\n  description,\n  endAppend,\n  chevronPosition = 'right',\n  isFirst,\n  isLast,\n  ...other\n}: AccordionItemProps) {\n  const {expandedValues, setExpandedValues, variant, value, mode, isLazy} =\n    other as ClonedItemProps;\n  const ref = useRef<HTMLButtonElement>(null);\n  const isExpanded = !disabled && expandedValues.includes(value);\n  const wasExpandedOnce = useRef(false);\n  if (isExpanded) {\n    wasExpandedOnce.current = true;\n  }\n  const focusManager = useFocusManager();\n  const id = useId();\n  const buttonId = `${id}-button`;\n  const panelId = `${id}-panel`;\n\n  const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n    switch (e.key) {\n      case 'ArrowDown':\n        focusManager?.focusNext();\n        break;\n      case 'ArrowUp':\n        focusManager?.focusPrevious();\n        break;\n      case 'Home':\n        focusManager?.focusFirst();\n        break;\n      case 'End':\n        focusManager?.focusLast();\n        break;\n    }\n  };\n\n  const toggle = () => {\n    const i = expandedValues.indexOf(value);\n    if (i > -1) {\n      const newKeys = [...expandedValues];\n      newKeys.splice(i, 1);\n      setExpandedValues(newKeys);\n    } else if (mode === 'single') {\n      setExpandedValues([value]);\n    } else {\n      setExpandedValues([...expandedValues, value]);\n    }\n  };\n\n  const chevron = (\n    <div className={clsx(variant === 'minimal' && '')}>\n      <ArrowDropDownIcon\n        aria-hidden=\"true\"\n        size=\"md\"\n        className={clsx(\n          disabled ? 'text-disabled' : 'text-muted',\n          isExpanded && 'rotate-180 transition-transform',\n        )}\n      />\n    </div>\n  );\n\n  return (\n    <div\n      className={clsx(\n        variant === 'default' && 'border-b',\n        variant === 'outline' && 'rounded-panel border',\n        disabled && 'text-disabled',\n      )}\n    >\n      <h3\n        className={clsx(\n          'flex w-full items-center justify-between text-sm',\n          disabled && 'pointer-events-none',\n          isFirst && variant === 'default' && 'border-t',\n          isExpanded && variant !== 'minimal'\n            ? 'border-b'\n            : 'border-b border-b-transparent',\n          variant === 'outline'\n            ? isExpanded\n              ? 'rounded-panel-t'\n              : 'rounded-panel'\n            : undefined,\n        )}\n      >\n        <button\n          disabled={disabled}\n          aria-expanded={isExpanded}\n          id={buttonId}\n          aria-controls={panelId}\n          type=\"button\"\n          ref={ref}\n          onKeyDown={onKeyDown}\n          onClick={() => {\n            if (!disabled) {\n              toggle();\n            }\n          }}\n          className={clsx(\n            'flex flex-auto items-center gap-10 text-left outline-none hover:bg-hover focus-visible:bg-primary/focus',\n            buttonPadding,\n          )}\n        >\n          {chevronPosition === 'left' && chevron}\n          {startIcon &&\n            cloneElement(startIcon, {\n              size: 'md',\n              className: clsx(\n                startIcon.props.className,\n                disabled ? 'text-disabled' : 'text-muted',\n              ),\n            })}\n          <div className=\"flex-auto overflow-hidden overflow-ellipsis\">\n            <div className={labelClassName} data-testid=\"accordion-label\">\n              {label}\n            </div>\n            {description && (\n              <div className=\"text-xs text-muted\">{description}</div>\n            )}\n          </div>\n          {chevronPosition === 'right' && chevron}\n        </button>\n        {endAppend && (\n          <div className=\"flex-shrink-0 px-4 text-sm text-muted\">\n            {endAppend}\n          </div>\n        )}\n      </h3>\n      <m.div\n        aria-labelledby={id}\n        role=\"region\"\n        variants={AccordionAnimation.variants}\n        transition={AccordionAnimation.transition}\n        initial={false}\n        animate={isExpanded ? 'open' : 'closed'}\n      >\n        <div className={clsx('p-16', bodyClassName)}>\n          {!isLazy || wasExpandedOnce ? children : null}\n        </div>\n      </m.div>\n    </div>\n  );\n}\n","import {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {FilterSelectControl} from '@common/datatable/filters/backend-filter';\n\nexport function SelectFilterPanel({\n  filter,\n}: FilterPanelProps<FilterSelectControl>) {\n  const {trans} = useTrans();\n\n  return (\n    <FormSelect\n      size=\"sm\"\n      name={`${filter.key}.value`}\n      selectionMode=\"single\"\n      showSearchField={filter.control.showSearchField}\n      placeholder={\n        filter.control.placeholder\n          ? trans(filter.control.placeholder)\n          : undefined\n      }\n      searchPlaceholder={\n        filter.control.searchPlaceholder\n          ? trans(filter.control.searchPlaceholder)\n          : undefined\n      }\n    >\n      {filter.control.options.map(option => (\n        <Item key={option.key} value={option.key}>\n          <Trans {...option.label} />\n        </Item>\n      ))}\n    </FormSelect>\n  );\n}\n","import {FormDateRangePicker} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {DatePickerFilterControl} from '@common/datatable/filters/backend-filter';\n\nexport function DateRangeFilterPanel({\n  filter,\n}: FilterPanelProps<DatePickerFilterControl>) {\n  return (\n    <FormDateRangePicker\n      min={filter.control.min}\n      max={filter.control.max}\n      size=\"sm\"\n      name={`${filter.key}.value`}\n      granularity=\"day\"\n      closeDialogOnSelection={true}\n    />\n  );\n}\n","import clsx from 'clsx';\nimport React, {\n  ComponentProps,\n  ComponentPropsWithoutRef,\n  forwardRef,\n} from 'react';\nimport {Link} from 'react-router-dom';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {AvatarPlaceholderIcon} from '@common/auth/ui/account-settings/avatar/avatar-placeholder-icon';\n\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | string;\n\nexport interface AvatarProps extends ComponentPropsWithoutRef<any> {\n  className?: string;\n  src?: string;\n  label?: string;\n  circle?: boolean;\n  size?: Size;\n  link?: string;\n  fallback?: 'initials' | 'generic';\n  lazy?: boolean;\n}\nexport const Avatar = forwardRef<HTMLImageElement, AvatarProps>(\n  (\n    {\n      className,\n      circle,\n      size = 'md',\n      src,\n      link,\n      label,\n      fallback = 'generic',\n      lazy = true,\n      ...domProps\n    },\n    ref,\n  ) => {\n    let renderedAvatar = src ? (\n      <img\n        ref={ref}\n        src={src}\n        alt={label}\n        loading={lazy ? 'lazy' : undefined}\n        className=\"block h-full w-full object-cover\"\n      />\n    ) : (\n      <div className=\"h-full w-full bg-alt dark:bg-chip\">\n        <AvatarPlaceholderIcon\n          viewBox=\"0 0 48 48\"\n          className=\"h-full w-full text-muted\"\n        />\n      </div>\n    );\n\n    if (label) {\n      renderedAvatar = <Tooltip label={label}>{renderedAvatar}</Tooltip>;\n    }\n\n    const wrapperProps: ComponentProps<any> = {\n      ...domProps,\n      className: clsx(\n        className,\n        'relative block overflow-hidden select-none flex-shrink-0',\n        getSizeClassName(size),\n        circle ? 'rounded-full' : 'rounded',\n      ),\n    };\n\n    return link ? (\n      <Link {...wrapperProps} to={link}>\n        {renderedAvatar}\n      </Link>\n    ) : (\n      <div {...wrapperProps}>{renderedAvatar}</div>\n    );\n  },\n);\n\nfunction getSizeClassName(size: Size) {\n  switch (size) {\n    case 'xs':\n      return 'w-18 h-18';\n    case 'sm':\n      return 'w-24 h-24';\n    case 'md':\n      return 'w-32 h-32';\n    case 'lg':\n      return 'w-40 h-40';\n    case 'xl':\n      return 'w-60 h-60';\n    // allow overriding with custom classNames\n    default:\n      return size;\n  }\n}\n","import {\n  keepPreviousData,\n  useQuery,\n  UseQueryOptions,\n} from '@tanstack/react-query';\nimport {NormalizedModel} from '../../datatable/filters/normalized-model';\nimport {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n  results: NormalizedModel[];\n}\n\ninterface Params {\n  query?: string;\n  perPage?: number;\n  with?: string;\n}\n\nexport function useNormalizedModels(\n  endpoint: string,\n  queryParams: Params,\n  queryOptions?: Omit<\n    UseQueryOptions<Response, unknown, Response, [string, Params]>,\n    'queryKey' | 'queryFn'\n  > | null,\n) {\n  return useQuery({\n    queryKey: [endpoint, queryParams],\n    queryFn: () => fetchModels(endpoint, queryParams),\n    placeholderData: keepPreviousData,\n    ...queryOptions,\n  });\n}\n\nasync function fetchModels(endpoint: string, params: Params) {\n  return apiClient.get<Response>(endpoint, {params}).then(r => r.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {NormalizedModel} from '../../datatable/filters/normalized-model';\nimport {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n  model: NormalizedModel;\n}\n\nexport function useNormalizedModel(\n  endpoint: string,\n  queryParams?: Record<string, string>,\n  queryOptions?: {enabled?: boolean},\n) {\n  return useQuery({\n    queryKey: [endpoint, queryParams],\n    queryFn: () => fetchModel(endpoint, queryParams),\n    ...queryOptions,\n  });\n}\n\nasync function fetchModel(\n  endpoint: string,\n  params?: Record<string, string>,\n): Promise<Response> {\n  return apiClient.get(endpoint, {params}).then(r => r.data);\n}\n","import React, {ReactNode, useRef, useState} from 'react';\nimport {useTrans} from '../../i18n/use-trans';\nimport {Trans} from '../../i18n/trans';\nimport {Avatar} from '../images/avatar';\nimport {Tooltip} from '../tooltip/tooltip';\nimport {IconButton} from '../buttons/icon-button';\nimport {EditIcon} from '../../icons/material/Edit';\nimport {message} from '../../i18n/message';\nimport {Item} from './listbox/item';\nimport {useController, useFormContext} from 'react-hook-form';\nimport {useControlledState} from '@react-stately/utils';\nimport {getInputFieldClassNames} from './input-field/get-input-field-class-names';\nimport clsx from 'clsx';\nimport {Skeleton} from '../skeleton/skeleton';\nimport {useNormalizedModels} from '../../users/queries/use-normalized-models';\nimport {useNormalizedModel} from '../../users/queries/use-normalized-model';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '../animation/opacity-animation';\nimport {Select} from '@common/ui/forms/select/select';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {BaseFieldProps} from '@common/ui/forms/input-field/base-field-props';\n\ninterface NormalizedModelFieldProps {\n  label?: ReactNode;\n  className?: string;\n  background?: BaseFieldProps['background'];\n  value?: string | number;\n  placeholder?: MessageDescriptor;\n  searchPlaceholder?: MessageDescriptor;\n  defaultValue?: string | number;\n  onChange?: (value: string | number) => void;\n  invalid?: boolean;\n  errorMessage?: string;\n  description?: ReactNode;\n  autoFocus?: boolean;\n  queryParams?: Record<string, string>;\n  endpoint: string;\n  disabled?: boolean;\n  required?: boolean;\n}\nexport function NormalizedModelField({\n  label,\n  className,\n  background,\n  value,\n  defaultValue = '',\n  placeholder = message('Select item...'),\n  searchPlaceholder = message('Find an item...'),\n  onChange,\n  description,\n  errorMessage,\n  invalid,\n  autoFocus,\n  queryParams,\n  endpoint,\n  disabled,\n  required,\n}: NormalizedModelFieldProps) {\n  const inputRef = useRef<HTMLButtonElement>(null);\n  const [inputValue, setInputValue] = useState('');\n  const [selectedValue, setSelectedValue] = useControlledState(\n    value,\n    defaultValue,\n    onChange,\n  );\n  const query = useNormalizedModels(endpoint, {\n    query: inputValue,\n    ...queryParams,\n  });\n  const {trans} = useTrans();\n\n  const fieldClassNames = getInputFieldClassNames({size: 'md'});\n\n  if (selectedValue) {\n    return (\n      <div className={className}>\n        <div className={fieldClassNames.label}>{label}</div>\n        <div\n          className={clsx(\n            'rounded-input border p-8',\n            background,\n            invalid && 'border-danger',\n          )}\n        >\n          <AnimatePresence initial={false} mode=\"wait\">\n            <SelectedModelPreview\n              disabled={disabled}\n              endpoint={endpoint}\n              modelId={selectedValue}\n              queryParams={queryParams}\n              onEditClick={() => {\n                setSelectedValue('');\n                setInputValue('');\n                requestAnimationFrame(() => {\n                  inputRef.current?.focus();\n                  inputRef.current?.click();\n                });\n              }}\n            />\n          </AnimatePresence>\n        </div>\n        {description && !errorMessage && (\n          <div className={fieldClassNames.description}>{description}</div>\n        )}\n        {errorMessage && (\n          <div className={fieldClassNames.error}>{errorMessage}</div>\n        )}\n      </div>\n    );\n  }\n\n  return (\n    <Select\n      className={className}\n      showSearchField\n      invalid={invalid}\n      errorMessage={errorMessage}\n      description={description}\n      color=\"white\"\n      isAsync\n      background={background}\n      placeholder={trans(placeholder)}\n      searchPlaceholder={trans(searchPlaceholder)}\n      label={label}\n      isLoading={query.isFetching}\n      items={query.data?.results}\n      inputValue={inputValue}\n      onInputValueChange={setInputValue}\n      selectionMode=\"single\"\n      selectedValue={selectedValue}\n      onSelectionChange={setSelectedValue}\n      ref={inputRef}\n      autoFocus={autoFocus}\n      disabled={disabled}\n      required={required}\n    >\n      {model => (\n        <Item\n          value={model.id}\n          key={model.id}\n          description={model.description}\n          startIcon={<Avatar src={model.image} />}\n        >\n          {model.name}\n        </Item>\n      )}\n    </Select>\n  );\n}\n\ninterface SelectedModelPreviewProps {\n  modelId: string | number;\n  selectedValue?: number | string;\n  onEditClick?: () => void;\n  endpoint?: string;\n  disabled?: boolean;\n  queryParams?: NormalizedModelFieldProps['queryParams'];\n}\nfunction SelectedModelPreview({\n  modelId,\n  onEditClick,\n  endpoint,\n  disabled,\n  queryParams,\n}: SelectedModelPreviewProps) {\n  const {data, isLoading} = useNormalizedModel(\n    `${endpoint}/${modelId}`,\n    queryParams,\n  );\n\n  if (isLoading || !data?.model) {\n    return <LoadingSkeleton key=\"skeleton\" />;\n  }\n\n  return (\n    <m.div\n      className={clsx(\n        'flex items-center gap-10',\n        disabled && 'pointer-events-none cursor-not-allowed text-disabled',\n      )}\n      key=\"preview\"\n      {...opacityAnimation}\n    >\n      {data.model.image && <Avatar src={data.model.image} />}\n      <div>\n        <div className=\"text-sm leading-4\">{data.model.name}</div>\n        <div className=\"text-xs text-muted\">{data.model.description}</div>\n      </div>\n      <Tooltip label={<Trans message=\"Change item\" />}>\n        <IconButton\n          className=\"ml-auto text-muted\"\n          size=\"sm\"\n          onClick={onEditClick}\n          disabled={disabled}\n        >\n          <EditIcon />\n        </IconButton>\n      </Tooltip>\n    </m.div>\n  );\n}\n\nfunction LoadingSkeleton() {\n  return (\n    <m.div className=\"flex items-center gap-10\" {...opacityAnimation}>\n      <Skeleton variant=\"rect\" size=\"w-32 h-32\" />\n      <div className=\"max-h-[36px] flex-auto\">\n        <Skeleton className=\"text-xs\" />\n        <Skeleton className=\"max-h-8 text-xs\" />\n      </div>\n      <Skeleton variant=\"icon\" size=\"w-24 h-24\" />\n    </m.div>\n  );\n}\n\ninterface FormNormalizedModelFieldProps extends NormalizedModelFieldProps {\n  name: string;\n}\nexport function FormNormalizedModelField({\n  name,\n  ...fieldProps\n}: FormNormalizedModelFieldProps) {\n  const {clearErrors} = useFormContext();\n  const {\n    field: {onChange, value = ''},\n    fieldState: {invalid, error},\n  } = useController({\n    name,\n  });\n\n  return (\n    <NormalizedModelField\n      value={value}\n      onChange={value => {\n        onChange(value);\n        clearErrors(name);\n      }}\n      invalid={invalid}\n      errorMessage={error?.message}\n      {...fieldProps}\n    />\n  );\n}\n","import {FilterPanelProps} from './filter-panel-props';\nimport {FormNormalizedModelField} from '@common/ui/forms/normalized-model-field';\nimport {FilterSelectModelControl} from '@common/datatable/filters/backend-filter';\n\nexport function NormalizedModelFilterPanel({\n  filter,\n}: FilterPanelProps<FilterSelectModelControl>) {\n  return (\n    <FormNormalizedModelField\n      name={`${filter.key}.value`}\n      endpoint={`normalized-models/${filter.control.model}`}\n    />\n  );\n}\n","import {FilterOperator} from './backend-filter';\nimport {message} from '../../i18n/message';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\n\nexport const FilterOperatorNames: {[op in FilterOperator]: MessageDescriptor} =\n  {\n    '=': message('is'),\n    '!=': message('is not'),\n    '>': message('is greater than'),\n    '>=': message('is greater than or equal to'),\n    '<': message('is less than'),\n    '<=': message('is less than or equal to'),\n    has: message('Include'),\n    doesntHave: message('Do not include'),\n    between: message('Is between'),\n    hasAll: message('Include all'),\n  };\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FilterOperatorNames} from '@common/datatable/filters/filter-operator-names';\nimport {Fragment} from 'react';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {\n  FilterNumberInputControl,\n  FilterTextInputControl,\n} from '@common/datatable/filters/backend-filter';\n\nexport function InputFilterPanel({\n  filter,\n}: FilterPanelProps<FilterTextInputControl | FilterNumberInputControl>) {\n  const control = filter.control;\n  return (\n    <Fragment>\n      <FormSelect\n        selectionMode=\"single\"\n        name={`${filter.key}.operator`}\n        className=\"mb-14\"\n        size=\"sm\"\n        required\n      >\n        {filter.operators?.map(operator => (\n          <Item key={operator} value={operator}>\n            {<Trans {...FilterOperatorNames[operator]} />}\n          </Item>\n        ))}\n      </FormSelect>\n      <FormTextField\n        size=\"sm\"\n        name={`${filter.key}.value`}\n        type={filter.control.inputType}\n        min={'minValue' in control ? control.minValue : undefined}\n        max={'maxValue' in control ? control.maxValue : undefined}\n        minLength={'minLength' in control ? control.minLength : undefined}\n        maxLength={'maxLength' in control ? control.maxLength : undefined}\n        required\n      />\n    </Fragment>\n  );\n}\n","import {FilterPanelProps} from './filter-panel-props';\nimport {FilterBooleanToggleControl} from '@common/datatable/filters/backend-filter';\n\nexport function BooleanFilterPanel({\n  filter,\n}: FilterPanelProps<FilterBooleanToggleControl>) {\n  // Toggling accordion in the dialog will already apply boolean filter, no need for any extra fields here\n  return null;\n}\n","import React, {\n  Children,\n  cloneElement,\n  isValidElement,\n  ReactElement,\n} from 'react';\nimport clsx from 'clsx';\nimport type {ChipProps} from './chip';\n\nexport interface ChipListProps {\n  className?: string;\n  children?: ReactElement | ReactElement[];\n  size?: ChipProps['size'];\n  radius?: ChipProps['radius'];\n  color?: ChipProps['color'];\n  selectable?: ChipProps['selectable'];\n  wrap?: boolean;\n}\nexport function ChipList({\n  className,\n  children,\n  size,\n  color,\n  radius,\n  selectable,\n  wrap = true,\n}: ChipListProps) {\n  return (\n    <div\n      className={clsx(\n        'flex items-center gap-8',\n        wrap && 'flex-wrap',\n        className,\n      )}\n    >\n      {Children.map(children, chip => {\n        if (isValidElement<ChipProps>(chip)) {\n          return cloneElement<ChipProps>(chip, {\n            size,\n            color,\n            selectable,\n            radius,\n          });\n        }\n      })}\n    </div>\n  );\n}\n","import {ChipValue} from './chip-field';\n\nexport function stringToChipValue(value: string | number): ChipValue {\n  // add both name and description so \"validateWith\" works properly in chip field, if it depends on description\n  return {id: value, name: `${value}`, description: `${value}`};\n}\n","import React, {\n  HTMLAttributes,\n  Key,\n  ReactElement,\n  ReactNode,\n  Ref,\n  RefObject,\n  useCallback,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport {useFocusManager} from '@react-aria/focus';\nimport clsx from 'clsx';\nimport {mergeProps, useLayoutEffect, useObjectRef} from '@react-aria/utils';\nimport {useControlledState} from '@react-stately/utils';\nimport {ChipList} from './chip-list';\nimport {Field} from '../field';\nimport {Input} from '../input';\nimport {Chip, ChipProps} from './chip';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {getInputFieldClassNames} from '../get-input-field-class-names';\nimport {ProgressCircle} from '../../../progress/progress-circle';\nimport {useField} from '../use-field';\nimport {Avatar} from '../../../images/avatar';\nimport {Listbox} from '../../listbox/listbox';\nimport {useListbox} from '../../listbox/use-listbox';\nimport {BaseFieldPropsWithDom} from '../base-field-props';\nimport {useListboxKeyboardNavigation} from '../../listbox/use-listbox-keyboard-navigation';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {ListBoxChildren, ListboxProps} from '../../listbox/types';\nimport {stringToChipValue} from './string-to-chip-value';\nimport {Popover} from '../../../overlays/popover';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\n\nexport interface ChipValue extends Omit<NormalizedModel, 'model_type'> {\n  invalid?: boolean;\n  errorMessage?: string;\n}\n\nexport type ChipFieldProps<T> = Omit<\n  ListboxProps,\n  'selectionMode' | 'displayWith'\n> &\n  Omit<\n    BaseFieldPropsWithDom<HTMLInputElement>,\n    'value' | 'onChange' | 'defaultValue'\n  > & {\n    value?: (ChipValue | string)[];\n    defaultValue?: (ChipValue | string)[];\n    displayWith?: (value: ChipValue) => ReactNode;\n    validateWith?: (value: ChipValue) => ChipValue;\n    allowCustomValue?: boolean;\n    showDropdownArrow?: boolean;\n    onChange?: (value: ChipValue[]) => void;\n    suggestions?: T[];\n    children?: ListBoxChildren<T>['children'];\n    placeholder?: string;\n    chipSize?: ChipProps['size'];\n    openMenuOnFocus?: boolean;\n    valueKey?: 'id' | 'name';\n    onChipClick?: (value: ChipValue) => void;\n  };\n\nfunction ChipFieldInner<T>(\n  props: ChipFieldProps<T>,\n  ref: Ref<HTMLInputElement>,\n) {\n  const fieldRef = useRef<HTMLDivElement>(null);\n  const inputRef = useObjectRef(ref);\n  const {\n    displayWith = v => v.name,\n    validateWith,\n    children,\n    suggestions,\n    isLoading,\n    inputValue,\n    onInputValueChange,\n    onItemSelected,\n    placeholder,\n    onOpenChange,\n    chipSize = 'sm',\n    openMenuOnFocus = true,\n    showEmptyMessage,\n    value: propsValue,\n    defaultValue,\n    onChange: propsOnChange,\n    valueKey,\n    isAsync,\n    allowCustomValue = true,\n    showDropdownArrow,\n    onChipClick,\n    ...inputFieldProps\n  } = props;\n  const fieldClassNames = getInputFieldClassNames({\n    ...props,\n    flexibleHeight: true,\n  });\n\n  const [value, onChange] = useChipFieldValueState(props);\n\n  const [listboxIsOpen, setListboxIsOpen] = useState(false);\n\n  const loadingIndicator = (\n    <ProgressCircle isIndeterminate size=\"sm\" aria-label=\"loading...\" />\n  );\n\n  const dropdownArrow = showDropdownArrow ? <KeyboardArrowDownIcon /> : null;\n\n  const {fieldProps, inputProps} = useField({\n    ...inputFieldProps,\n    focusRef: inputRef,\n    endAdornment: isLoading && listboxIsOpen ? loadingIndicator : dropdownArrow,\n  });\n\n  return (\n    <Field fieldClassNames={fieldClassNames} {...fieldProps}>\n      <Input\n        ref={fieldRef}\n        className={clsx('flex flex-wrap items-center', fieldClassNames.input)}\n        onClick={() => {\n          // refocus input when clicking outside it, but while still inside chip field\n          inputRef.current?.focus();\n        }}\n      >\n        <ListWrapper\n          displayChipUsing={displayWith}\n          onChipClick={onChipClick}\n          items={value}\n          setItems={onChange}\n          chipSize={chipSize}\n        />\n        <ChipInput\n          showEmptyMessage={showEmptyMessage}\n          inputProps={inputProps}\n          inputValue={inputValue}\n          onInputValueChange={onInputValueChange}\n          fieldRef={fieldRef}\n          inputRef={inputRef}\n          chips={value}\n          setChips={onChange}\n          validateWith={validateWith}\n          isLoading={isLoading}\n          suggestions={suggestions}\n          placeholder={placeholder}\n          openMenuOnFocus={openMenuOnFocus}\n          listboxIsOpen={listboxIsOpen}\n          setListboxIsOpen={setListboxIsOpen}\n          allowCustomValue={allowCustomValue}\n        >\n          {children}\n        </ChipInput>\n      </Input>\n    </Field>\n  );\n}\n\ninterface ListWrapperProps {\n  items: ChipValue[];\n  setItems: (items: ChipValue[]) => void;\n  displayChipUsing: (value: ChipValue) => ReactNode;\n  chipSize?: ChipProps['size'];\n  onChipClick?: (value: ChipValue) => void;\n}\nfunction ListWrapper({\n  items,\n  setItems,\n  displayChipUsing,\n  chipSize,\n  onChipClick,\n}: ListWrapperProps) {\n  const manager = useFocusManager();\n  const removeItem = useCallback(\n    (key: Key) => {\n      const i = items.findIndex(cr => cr.id === key);\n      const newItems = [...items];\n      if (i > -1) {\n        newItems.splice(i, 1);\n        setItems(newItems);\n      }\n      return newItems;\n    },\n    [items, setItems],\n  );\n\n  return (\n    <ChipList\n      className=\"my-8 max-w-full flex-shrink-0 flex-wrap\"\n      size={chipSize}\n      selectable\n    >\n      {items.map(item => (\n        <Chip\n          key={item.id}\n          errorMessage={item.errorMessage}\n          adornment={item.image ? <Avatar circle src={item.image} /> : null}\n          onClick={() => onChipClick?.(item)}\n          onRemove={() => {\n            const newItems = removeItem(item.id);\n            if (newItems.length) {\n              // focus previous chip\n              manager?.focusPrevious({tabbable: true});\n            } else {\n              // focus input\n              manager?.focusLast();\n            }\n          }}\n        >\n          {displayChipUsing(item)}\n        </Chip>\n      ))}\n    </ChipList>\n  );\n}\n\ninterface ChipInputProps<T> {\n  showEmptyMessage?: boolean;\n  inputProps: ReturnType<typeof useField>['inputProps'];\n  inputValue?: string;\n  onInputValueChange?: (value: string) => void;\n  fieldRef: RefObject<HTMLDivElement>;\n  inputRef: RefObject<HTMLInputElement>;\n  chips: ChipValue[];\n  setChips: (items: ChipValue[]) => void;\n  validateWith?: (value: ChipValue) => ChipValue;\n  isLoading?: boolean;\n  suggestions?: T[];\n  placeholder?: string;\n  openMenuOnFocus?: boolean;\n  listboxIsOpen: boolean;\n  setListboxIsOpen: (value: boolean) => void;\n  allowCustomValue: boolean;\n  children: ListBoxChildren<T>['children'];\n}\nfunction ChipInput<T>(props: ChipInputProps<T>) {\n  const {\n    inputRef,\n    fieldRef,\n    validateWith,\n    setChips,\n    chips,\n    suggestions,\n    inputProps,\n    placeholder,\n    openMenuOnFocus,\n    listboxIsOpen,\n    setListboxIsOpen,\n    allowCustomValue,\n    isLoading,\n  } = props;\n  const inputClassName = 'outline-none text-sm mx-8 my-4 h-30 flex-auto';\n  const manager = useFocusManager();\n\n  const addItems = useCallback(\n    (items?: ChipValue[]) => {\n      items = (items || []).filter(item => {\n        const invalid = !item || !item.id || !item.name;\n        const alreadyExists = chips.findIndex(cr => cr.id === item?.id) > -1;\n        return !alreadyExists && !invalid;\n      });\n      if (!items.length) return;\n\n      if (validateWith) {\n        items = items.map(item => validateWith(item));\n      }\n      setChips([...chips, ...items]);\n    },\n    [chips, setChips, validateWith],\n  );\n\n  const listbox = useListbox<T>({\n    ...props,\n    clearInputOnItemSelection: true,\n    isOpen: listboxIsOpen,\n    onOpenChange: setListboxIsOpen,\n    items: suggestions,\n    selectionMode: 'none',\n    role: 'listbox',\n    virtualFocus: true,\n    onItemSelected: value => {\n      handleItemSelection(value as string);\n    },\n  });\n\n  const {\n    state: {\n      activeIndex,\n      setActiveIndex,\n      isOpen,\n      setIsOpen,\n      inputValue,\n      setInputValue,\n    },\n    refs,\n    listboxId,\n    collection,\n    onInputChange,\n  } = listbox;\n\n  const handleItemSelection = (textValue: string) => {\n    const option =\n      collection.size && activeIndex != null\n        ? [...collection.values()][activeIndex]\n        : null;\n    if (option?.item) {\n      addItems([option.item]);\n    } else if (allowCustomValue) {\n      addItems([stringToChipValue(option ? option.value : textValue)]);\n    }\n\n    setInputValue('');\n    setActiveIndex(null);\n    setIsOpen(false);\n  };\n\n  // position dropdown relative to whole chip field, not the input\n  useLayoutEffect(() => {\n    if (fieldRef.current && refs.reference.current !== fieldRef.current) {\n      listbox.reference(fieldRef.current);\n    }\n  }, [fieldRef, listbox, refs]);\n\n  const {handleTriggerKeyDown, handleListboxKeyboardNavigation} =\n    useListboxKeyboardNavigation(listbox);\n\n  const handleFocusAndClick = createEventHandler(() => {\n    if (openMenuOnFocus && !isOpen) {\n      setIsOpen(true);\n    }\n  });\n\n  return (\n    <Listbox\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      <input\n        type=\"text\"\n        className={clsx(inputClassName, 'bg-transparent')}\n        placeholder={placeholder}\n        {...mergeProps(inputProps, {\n          ref: inputRef,\n          value: inputValue,\n          onChange: onInputChange,\n          onPaste: e => {\n            const paste = e.clipboardData.getData('text');\n            const emails = paste.match(\n              /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+)/gi,\n            );\n            if (emails) {\n              e.preventDefault();\n              const selection = window.getSelection();\n              if (selection?.rangeCount) {\n                selection.deleteFromDocument();\n                addItems(emails.map(email => stringToChipValue(email)));\n              }\n            }\n          },\n          'aria-autocomplete': 'list',\n          'aria-controls': isOpen ? listboxId : undefined,\n          autoComplete: 'off',\n          autoCorrect: 'off',\n          spellCheck: 'false',\n          onKeyDown: e => {\n            const input = e.target as HTMLInputElement;\n\n            if (e.key === 'Enter') {\n              // prevent form submitting\n              e.preventDefault();\n              // add chip from selected listbox option or current input text value\n              handleItemSelection(input.value);\n              return;\n            }\n\n            // on escape, clear input and close dropdown\n            if (e.key === 'Escape' && isOpen) {\n              setIsOpen(false);\n              setInputValue('');\n            }\n\n            // move focus to input when focus is on first item and prevent arrow up from cycling listbox\n            if (\n              e.key === 'ArrowUp' &&\n              isOpen &&\n              (activeIndex === 0 || activeIndex == null)\n            ) {\n              setActiveIndex(null);\n              return;\n            }\n\n            // block left and right arrows from navigating in input, if focus is on listbox\n            if (\n              activeIndex != null &&\n              (e.key === 'ArrowLeft' || e.key === 'ArrowRight')\n            ) {\n              e.preventDefault();\n              return;\n            }\n\n            // move focus on the last chip, if focus is at the  start of input\n            if (\n              (e.key === 'ArrowLeft' ||\n                e.key === 'Backspace' ||\n                e.key === 'Delete') &&\n              input.selectionStart === 0 &&\n              activeIndex == null &&\n              chips.length\n            ) {\n              manager?.focusPrevious({tabbable: true});\n              return;\n            }\n\n            // fallthrough to listbox navigation handlers for arrow keys\n            const handled = handleTriggerKeyDown(e);\n            if (!handled) {\n              handleListboxKeyboardNavigation(e);\n            }\n          },\n          onFocus: handleFocusAndClick,\n          onClick: handleFocusAndClick,\n        } as HTMLAttributes<HTMLInputElement>)}\n      />\n    </Listbox>\n  );\n}\n\nfunction useChipFieldValueState({\n  onChange,\n  value,\n  defaultValue,\n  valueKey,\n}: ChipFieldProps<any>) {\n  // convert value from string[] to ChipValue[], if needed\n  const propsValue = useMemo(() => {\n    return mixedValueToChipValue(value);\n  }, [value]);\n\n  // convert defaultValue from string[] to ChipValue[], if needed\n  const propsDefaultValue = useMemo(() => {\n    return mixedValueToChipValue(defaultValue);\n  }, [defaultValue]);\n\n  // emit string[] or ChipValue[] on change, based on \"valueKey\" prop\n  const handleChange = useCallback(\n    (value: ChipValue[]) => {\n      const newValue = valueKey ? value.map(v => v[valueKey]) : value;\n      onChange?.(newValue as any);\n    },\n    [onChange, valueKey],\n  );\n\n  return useControlledState<ChipValue[]>(\n    !propsValue ? undefined : propsValue,\n    propsDefaultValue || [],\n    handleChange,\n  );\n}\n\nfunction mixedValueToChipValue(\n  value?: (string | number | ChipValue)[] | null,\n): ChipValue[] | undefined {\n  if (value == null) {\n    return undefined;\n  }\n\n  return value.map(v => {\n    return typeof v !== 'object' ? stringToChipValue(v as string) : v;\n  });\n}\n\nexport const ChipField = React.forwardRef(ChipFieldInner) as <T>(\n  props: ChipFieldProps<T> & {ref?: Ref<HTMLInputElement>},\n) => ReactElement;\n","import {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport React from 'react';\nimport {ChipField, ChipFieldProps} from './chip-field';\n\nexport type FormChipFieldProps<T> = ChipFieldProps<T> & {\n  name: string;\n};\n\nexport function FormChipField<T>({children, ...props}: FormChipFieldProps<T>) {\n  const {\n    field: {onChange, onBlur, value = [], ref},\n    fieldState: {invalid, error},\n  } = useController({\n    name: props.name,\n  });\n\n  const formProps: Partial<ChipFieldProps<T>> = {\n    onChange,\n    onBlur,\n    value,\n    invalid,\n    errorMessage: error?.message,\n  };\n\n  return (\n    <ChipField ref={ref} {...mergeProps(formProps, props)}>\n      {children}\n    </ChipField>\n  );\n}\n","import {Item} from '@common/ui/forms/listbox/item';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {FilterChipFieldControl} from '@common/datatable/filters/backend-filter';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ChipFieldFilterPanel({\n  filter,\n}: FilterPanelProps<FilterChipFieldControl>) {\n  const {trans} = useTrans();\n  return (\n    <FormChipField\n      size=\"sm\"\n      name={`${filter.key}.value`}\n      valueKey=\"id\"\n      allowCustomValue={false}\n      showDropdownArrow\n      placeholder={\n        filter.control.placeholder\n          ? trans(filter.control.placeholder)\n          : undefined\n      }\n      displayWith={chip =>\n        filter.control.options.find(o => o.key === chip.id)?.label.message\n      }\n      suggestions={filter.control.options.map(o => ({\n        id: o.key,\n        name: o.label.message,\n      }))}\n    >\n      {chip => (\n        <Item key={chip.id} value={chip.id}>\n          {<Trans message={chip.name} />}\n        </Item>\n      )}\n    </FormChipField>\n  );\n}\n","import {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {\n  BackendFilter,\n  CustomFilterControl,\n  DatePickerFilterControl,\n  FilterBooleanToggleControl,\n  FilterChipFieldControl,\n  FilterControlType,\n  FilterOperator,\n  FilterSelectControl,\n  FilterSelectModelControl,\n  FilterTextInputControl,\n} from './backend-filter';\nimport {Trans} from '../../i18n/trans';\nimport {Key, useState} from 'react';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {useBackendFilterUrlParams} from './backend-filter-url-params';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Accordion, AccordionItem} from '../../ui/accordion/accordion';\nimport {Button} from '../../ui/buttons/button';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '../../ui/forms/form';\nimport {Checkbox} from '../../ui/forms/toggle/checkbox';\nimport {SelectFilterPanel} from './panels/select-filter-panel';\nimport {DateRangeFilterPanel} from './panels/date-range-filter-panel';\nimport {NormalizedModelFilterPanel} from './panels/normalized-model-filter-panel';\nimport {InputFilterPanel} from './panels/input-filter-panel';\nimport {BooleanFilterPanel} from './panels/boolean-filter-panel';\nimport clsx from 'clsx';\nimport {ChipFieldFilterPanel} from '@common/datatable/filters/panels/chip-field-filter-panel';\n\nexport interface FilterItemFormValue<T = any> {\n  value: T;\n  operator?: FilterOperator;\n}\n\ninterface AddFilterDialogProps {\n  filters: BackendFilter[];\n}\nexport function AddFilterDialog({filters}: AddFilterDialogProps) {\n  const {decodedFilters} = useBackendFilterUrlParams(filters);\n  const {formId} = useDialogContext();\n\n  // expand currently active filters\n  const [expandedFilters, setExpandedFilters] = useState<Key[]>(() => {\n    return decodedFilters.map(f => f.key);\n  });\n\n  const clearButton = (\n    <Button\n      size=\"xs\"\n      variant=\"outline\"\n      className=\"mr-auto\"\n      onClick={() => {\n        setExpandedFilters([]);\n      }}\n    >\n      <Trans message=\"Clear\" />\n    </Button>\n  );\n\n  const applyButton = (\n    <Button\n      size=\"xs\"\n      variant=\"flat\"\n      color=\"primary\"\n      className=\"ml-auto\"\n      type=\"submit\"\n      form={formId}\n    >\n      <Trans message=\"Apply\" />\n    </Button>\n  );\n\n  return (\n    <Dialog className=\"min-w-[300px]\" maxWidth=\"max-w-400\" size=\"auto\">\n      <DialogHeader\n        padding=\"px-14 py-10\"\n        leftAdornment={clearButton}\n        rightAdornment={applyButton}\n      >\n        <Trans message=\"Filter\" />\n      </DialogHeader>\n      <DialogBody padding=\"p-0\">\n        <FilterList\n          filters={filters}\n          expandedFilters={expandedFilters}\n          setExpandedFilters={setExpandedFilters}\n        />\n      </DialogBody>\n    </Dialog>\n  );\n}\n\ninterface FilterListProps {\n  filters: BackendFilter[];\n  expandedFilters: Key[];\n  setExpandedFilters: (value: Key[]) => void;\n}\nfunction FilterList({\n  filters,\n  expandedFilters,\n  setExpandedFilters,\n}: FilterListProps) {\n  const {decodedFilters, replaceAll} = useBackendFilterUrlParams(filters);\n\n  // either get value and operator from url params if filter is active, or get defaults from filter config\n  const defaultValues: Record<string, FilterItemFormValue> = {};\n  filters.forEach(filter => {\n    const appliedFilter = decodedFilters.find(f => f.key === filter.key);\n    defaultValues[filter.key] =\n      appliedFilter?.value !== undefined\n        ? // there might be some extra keys set on filter besides\n          // \"value\" and \"operator\", so add the whole object to form\n          appliedFilter\n        : {\n            value: filter.control.defaultValue,\n            operator: filter.defaultOperator,\n          };\n  });\n  const form = useForm<Record<string, FilterItemFormValue>>({defaultValues});\n  const {formId, close} = useDialogContext();\n\n  return (\n    <Form\n      form={form}\n      id={formId}\n      onSubmit={formValue => {\n        const filterValue = Object.entries(formValue)\n          // remove undefined and non-expanded filters, so \"clear\" button will correctly remove active filters\n          .filter(\n            ([key, fieldValue]) =>\n              expandedFilters.includes(key) && fieldValue !== undefined\n          )\n          .map(([key, fieldValue]) => ({\n            key,\n            ...fieldValue, // value and operator from form\n          }));\n\n        replaceAll(filterValue);\n        close();\n      }}\n    >\n      <Accordion\n        mode=\"multiple\"\n        expandedValues={expandedFilters}\n        onExpandedChange={setExpandedFilters}\n      >\n        {filters.map(filter => (\n          <AccordionItem\n            startIcon={\n              <Checkbox checked={expandedFilters.includes(filter.key)} />\n            }\n            key={filter.key}\n            value={filter.key}\n            label={<Trans {...filter.label} />}\n            bodyClassName=\"max-h-288 overflow-y-auto compact-scrollbar\"\n          >\n            {filter.description && (\n              <div\n                className={clsx(\n                  'text-xs text-muted',\n                  // boolean filter will have nothing in the panel, no need to add margin\n                  filter.control.type !== FilterControlType.BooleanToggle &&\n                    'mb-14'\n                )}\n              >\n                <Trans {...filter.description} />\n              </div>\n            )}\n            <AddFilterDialogPanel filter={filter} />\n          </AccordionItem>\n        ))}\n      </Accordion>\n    </Form>\n  );\n}\n\ninterface ActiveFilterPanelProps {\n  filter: BackendFilter;\n}\nexport function AddFilterDialogPanel({filter}: ActiveFilterPanelProps) {\n  switch (filter.control.type) {\n    case FilterControlType.Select:\n      return (\n        <SelectFilterPanel\n          filter={filter as BackendFilter<FilterSelectControl>}\n        />\n      );\n    case FilterControlType.ChipField:\n      return (\n        <ChipFieldFilterPanel\n          filter={filter as BackendFilter<FilterChipFieldControl>}\n        />\n      );\n    case FilterControlType.DateRangePicker:\n      return (\n        <DateRangeFilterPanel\n          filter={filter as BackendFilter<DatePickerFilterControl>}\n        />\n      );\n    case FilterControlType.SelectModel:\n      return (\n        <NormalizedModelFilterPanel\n          filter={filter as BackendFilter<FilterSelectModelControl>}\n        />\n      );\n    case FilterControlType.Input:\n      return (\n        <InputFilterPanel\n          filter={filter as BackendFilter<FilterTextInputControl>}\n        />\n      );\n    case FilterControlType.BooleanToggle:\n      return (\n        <BooleanFilterPanel\n          filter={filter as BackendFilter<FilterBooleanToggleControl>}\n        />\n      );\n    case 'custom':\n      const CustomComponent = filter.control.panel;\n      return (\n        <CustomComponent\n          filter={filter as BackendFilter<CustomFilterControl>}\n        />\n      );\n    default:\n      return null;\n  }\n}\n","import {Button, ButtonProps} from '../../ui/buttons/button';\nimport {BackendFilter} from './backend-filter';\nimport {FilterAltIcon} from '../../icons/material/FilterAlt';\nimport {Trans} from '../../i18n/trans';\nimport {useIsMobileMediaQuery} from '../../utils/hooks/is-mobile-media-query';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {AddFilterDialog} from './add-filter-dialog';\nimport {ReactElement} from 'react';\n\ninterface AddFilterButtonProps {\n  filters: BackendFilter[];\n  icon?: ReactElement;\n  color?: ButtonProps['color'];\n  variant?: ButtonProps['variant'];\n  disabled?: boolean;\n  size?: ButtonProps['size'];\n  className?: string;\n}\nexport function AddFilterButton({\n  filters,\n  icon = <FilterAltIcon />,\n  color = 'primary',\n  variant = 'outline',\n  size = 'sm',\n  disabled,\n  className,\n}: AddFilterButtonProps) {\n  const isMobile = useIsMobileMediaQuery();\n\n  const desktopButton = (\n    <Button\n      variant={variant}\n      color={color}\n      startIcon={icon}\n      disabled={disabled}\n      size={size}\n      className={className}\n    >\n      <Trans message=\"Filter\" />\n    </Button>\n  );\n\n  const mobileButton = (\n    <IconButton\n      color={color}\n      size=\"sm\"\n      variant={variant}\n      disabled={disabled}\n      className={className}\n    >\n      {icon}\n    </IconButton>\n  );\n\n  return (\n    <DialogTrigger type=\"popover\">\n      {isMobile ? mobileButton : desktopButton}\n      <AddFilterDialog filters={filters} />\n    </DialogTrigger>\n  );\n}\n","import React, {ComponentPropsWithoutRef, ReactNode} from 'react';\nimport {BackendFilter} from './filters/backend-filter';\nimport {useTrans} from '../i18n/use-trans';\nimport {TextField} from '../ui/forms/input-field/text-field/text-field';\nimport {SearchIcon} from '../icons/material/Search';\nimport {AddFilterButton} from './filters/add-filter-button';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\ninterface Props {\n  actions?: ReactNode;\n  filters?: BackendFilter[];\n  filtersLoading?: boolean;\n  searchPlaceholder?: MessageDescriptor;\n  searchValue?: string;\n  onSearchChange: (value: string) => void;\n}\nexport function DataTableHeader({\n  actions,\n  filters,\n  filtersLoading,\n  searchPlaceholder = message('Type to search...'),\n  searchValue = '',\n  onSearchChange,\n}: Props) {\n  const {trans} = useTrans();\n  return (\n    <HeaderLayout>\n      <TextField\n        inputTestId=\"datatable-search\"\n        className=\"flex-auto max-w-440 mr-auto\"\n        inputWrapperClassName=\"mr-24 md:mr-0\"\n        placeholder={trans(searchPlaceholder)}\n        startAdornment={<SearchIcon />}\n        value={searchValue}\n        onChange={e => {\n          onSearchChange(e.target.value);\n        }}\n      />\n      {filters && (\n        <AddFilterButton filters={filters} disabled={filtersLoading} />\n      )}\n      {actions}\n    </HeaderLayout>\n  );\n}\n\ninterface AnimatedHeaderProps extends ComponentPropsWithoutRef<'div'> {\n  children: ReactNode;\n}\nexport function HeaderLayout({children, ...domProps}: AnimatedHeaderProps) {\n  return (\n    <div\n      className=\"mb-24 flex items-center gap-8 md:gap-12 text-muted relative h-42\"\n      {...domProps}\n    >\n      {children}\n    </div>\n  );\n}\n","import {BackendFilter, FilterControlType} from '../backend-filter';\nimport {ComponentPropsWithRef, forwardRef, ReactNode} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\n\ninterface TriggerButtonProps\n  extends Omit<ComponentPropsWithRef<'button'>, 'color'> {\n  isInactive?: boolean;\n  filter: BackendFilter;\n  children?: ReactNode;\n}\nexport const FilterListTriggerButton = forwardRef<\n  HTMLButtonElement,\n  TriggerButtonProps\n>((props, ref) => {\n  // pass through all props from menu trigger and dialog trigger to button\n  const {isInactive, filter, ...domProps} = props;\n\n  if (isInactive) {\n    return <InactiveFilterButton filter={filter} {...domProps} ref={ref} />;\n  }\n\n  return <ActiveFilterButton filter={filter} {...domProps} ref={ref} />;\n});\n\ninterface InactiveFilterButtonProps\n  extends Omit<ComponentPropsWithRef<'button'>, 'color'> {\n  filter: BackendFilter;\n}\nexport const InactiveFilterButton = forwardRef<\n  HTMLButtonElement,\n  InactiveFilterButtonProps\n>(({filter, ...domProps}, ref) => {\n  return (\n    <Button\n      variant=\"outline\"\n      size=\"xs\"\n      color=\"paper\"\n      radius=\"rounded-md\"\n      border=\"border\"\n      ref={ref}\n      endIcon={<KeyboardArrowDownIcon />}\n      {...domProps}\n    >\n      <Trans {...filter.label} />\n    </Button>\n  );\n});\n\nexport const ActiveFilterButton = forwardRef<\n  HTMLButtonElement,\n  InactiveFilterButtonProps\n>(({filter, children, ...domProps}, ref) => {\n  const isBoolean = filter.control.type === FilterControlType.BooleanToggle;\n  return (\n    <Button\n      variant=\"outline\"\n      size=\"xs\"\n      color=\"primary\"\n      radius=\"rounded-r-md\"\n      border=\"border-y border-r\"\n      endIcon={!isBoolean && <KeyboardArrowDownIcon />}\n      ref={ref}\n      {...domProps}\n    >\n      <span\n        className={clsx(\n          !isBoolean && 'border-r border-r-primary-light mr-8 pr-8'\n        )}\n      >\n        <Trans {...filter.label} />\n      </span>\n      {children}\n    </Button>\n  );\n});\n","import {DialogTrigger} from '../../../ui/overlays/dialog/dialog-trigger';\nimport {FilterListTriggerButton} from './filter-list-trigger-button';\nimport {ReactNode} from 'react';\nimport {useForm} from 'react-hook-form';\nimport {FilterItemFormValue} from '../add-filter-dialog';\nimport {useDialogContext} from '../../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../../i18n/trans';\nimport {DialogBody} from '../../../ui/overlays/dialog/dialog-body';\nimport {Form} from '../../../ui/forms/form';\nimport {DialogFooter} from '../../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../../ui/buttons/button';\nimport {FilterListControlProps} from './filter-list-control';\n\ninterface FilterListItemDialogTriggerProps extends FilterListControlProps<any> {\n  label: ReactNode;\n  panel: ReactNode;\n}\nexport function FilterListItemDialogTrigger(\n  props: FilterListItemDialogTriggerProps\n) {\n  const {onValueChange, isInactive, filter, label} = props;\n  return (\n    <DialogTrigger\n      offset={10}\n      type=\"popover\"\n      onClose={(value?: FilterItemFormValue) => {\n        if (value !== undefined) {\n          onValueChange(value);\n        }\n      }}\n    >\n      <FilterListTriggerButton isInactive={isInactive} filter={filter}>\n        {label}\n      </FilterListTriggerButton>\n      <FilterListControlDialog {...props} />\n    </DialogTrigger>\n  );\n}\n\nexport function FilterListControlDialog({\n  filter,\n  panel,\n  value,\n  operator,\n}: FilterListItemDialogTriggerProps) {\n  const form = useForm<Record<string, FilterItemFormValue>>({\n    defaultValues: {\n      [filter.key]: {value, operator},\n    },\n  });\n  const {close, formId} = useDialogContext();\n  return (\n    <Dialog size=\"xs\">\n      <DialogHeader>\n        <Trans {...filter.label} />\n      </DialogHeader>\n      <DialogBody padding=\"px-14 pt-14 pb-4 max-h-288\">\n        <Form\n          form={form}\n          id={formId}\n          onSubmit={formValue => {\n            close(formValue[filter.key]);\n          }}\n        >\n          {filter.description && (\n            <div className=\"text-muted text-xs mb-14\">\n              <Trans {...filter.description} />\n            </div>\n          )}\n          {panel}\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          form={formId}\n          type=\"submit\"\n          variant=\"flat\"\n          color=\"primary\"\n          size=\"xs\"\n        >\n          <Trans message=\"Apply\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {\n  BackendFilter,\n  CustomFilterControl,\n  DatePickerFilterControl,\n  FilterBooleanToggleControl,\n  FilterChipFieldControl,\n  FilterControl,\n  FilterControlType,\n  FilterNumberInputControl,\n  FilterOperator,\n  FilterSelectControl,\n  FilterSelectModelControl,\n  FilterTextInputControl,\n} from '../backend-filter';\nimport {FilterListTriggerButton} from './filter-list-trigger-button';\nimport {Trans} from '@common/i18n/trans';\nimport {SelectFilterPanel} from '../panels/select-filter-panel';\nimport {FilterListItemDialogTrigger} from './filter-list-item-dialog-trigger';\nimport {Avatar} from '@common/ui/images/avatar';\nimport {NormalizedModelFilterPanel} from '../panels/normalized-model-filter-panel';\nimport {DateRangeFilterPanel} from '../panels/date-range-filter-panel';\nimport {Fragment, Key, ReactNode} from 'react';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {AbsoluteDateRange} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {InputFilterPanel} from '../panels/input-filter-panel';\nimport {FilterOperatorNames} from '../filter-operator-names';\nimport {FilterItemFormValue} from '../add-filter-dialog';\nimport {useNormalizedModel} from '@common/users/queries/use-normalized-model';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {ChipFieldFilterPanel} from '@common/datatable/filters/panels/chip-field-filter-panel';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\n\nexport interface FilterListControlProps<T = unknown, E = FilterControl> {\n  filter: BackendFilter<E>;\n  onValueChange: (value: FilterItemFormValue<T>) => void;\n  value: T;\n  operator?: FilterOperator;\n  isInactive?: boolean;\n}\nexport function FilterListControl(props: FilterListControlProps<any, any>) {\n  switch (props.filter.control.type) {\n    case FilterControlType.DateRangePicker:\n      return <DatePickerControl {...props} />;\n    case FilterControlType.BooleanToggle:\n      return <BooleanToggleControl {...props} />;\n    case FilterControlType.Select:\n      return <SelectControl {...props} />;\n    case FilterControlType.ChipField:\n      return <ChipFieldControl {...props} />;\n    case FilterControlType.Input:\n      return <InputControl {...props} />;\n    case FilterControlType.SelectModel:\n      return <SelectModelControl {...props} />;\n    case FilterControlType.Custom:\n      const Control = (props.filter.control as CustomFilterControl).listItem;\n      return <Control {...props} />;\n    default:\n      return null;\n  }\n}\n\nfunction DatePickerControl(\n  props: FilterListControlProps<\n    Required<AbsoluteDateRange>,\n    DatePickerFilterControl\n  >,\n) {\n  const {value, filter} = props;\n\n  let valueLabel: ReactNode;\n  if (value.preset !== undefined) {\n    valueLabel = <Trans {...DateRangePresets[value.preset].label} />;\n  } else {\n    valueLabel = (\n      <FormattedDateTimeRange\n        start={new Date(value.start)}\n        end={new Date(value.end)}\n        options={{dateStyle: 'medium'}}\n      />\n    );\n  }\n\n  return (\n    <FilterListItemDialogTrigger\n      {...props}\n      label={valueLabel}\n      panel={<DateRangeFilterPanel filter={filter} />}\n    />\n  );\n}\n\nfunction BooleanToggleControl({\n  filter,\n  isInactive,\n  onValueChange,\n}: FilterListControlProps<\n  FilterBooleanToggleControl['defaultValue'],\n  FilterBooleanToggleControl\n>) {\n  // todo: toggle control on or off here\n  return (\n    <FilterListTriggerButton\n      onClick={() => {\n        onValueChange({value: filter.control.defaultValue});\n      }}\n      filter={filter}\n      isInactive={isInactive}\n    />\n  );\n}\n\nfunction SelectControl(\n  props: FilterListControlProps<Key, FilterSelectControl>,\n) {\n  const {filter, value} = props;\n  const option = filter.control.options.find(o => o.key === value);\n  return (\n    <FilterListItemDialogTrigger\n      {...props}\n      label={option ? <Trans {...option.label} /> : null}\n      panel={<SelectFilterPanel filter={filter} />}\n    />\n  );\n}\n\nfunction ChipFieldControl(\n  props: FilterListControlProps<string[], FilterChipFieldControl>,\n) {\n  return (\n    <FilterListItemDialogTrigger\n      {...props}\n      label={<MultipleValues {...props} />}\n      panel={<ChipFieldFilterPanel filter={props.filter} />}\n    />\n  );\n}\n\nfunction MultipleValues(\n  props: FilterListControlProps<string[], FilterChipFieldControl>,\n) {\n  const {trans} = useTrans();\n  const {filter, value} = props;\n  const options = value.map(v => filter.control.options.find(o => o.key === v));\n  const maxShownCount = 3;\n  const notShownCount = value.length - maxShownCount;\n\n  // translate names, add commas and limit to 3\n  const names = (\n    <Fragment>\n      {options\n        .filter(Boolean)\n        .slice(0, maxShownCount)\n        .map((o, i) => {\n          let name = '';\n          if (i !== 0) {\n            name += ', ';\n          }\n          name += trans(o!.label);\n          return name;\n        })}\n    </Fragment>\n  );\n\n  // indicate that there are some names not shown\n  return notShownCount > 0 ? (\n    <Trans\n      message=\":names + :count more\"\n      values={{names: names, count: notShownCount}}\n    />\n  ) : (\n    names\n  );\n}\n\nfunction InputControl(\n  props: FilterListControlProps<\n    string,\n    FilterTextInputControl | FilterNumberInputControl\n  >,\n) {\n  const {filter, value, operator} = props;\n\n  const operatorLabel = operator ? (\n    <Trans {...FilterOperatorNames[operator]} />\n  ) : null;\n\n  const formattedValue =\n    filter.control.inputType === 'number' ? (\n      <FormattedNumber value={value as any} />\n    ) : (\n      value\n    );\n\n  return (\n    <FilterListItemDialogTrigger\n      {...props}\n      label={\n        <Fragment>\n          {operatorLabel} {formattedValue}\n        </Fragment>\n      }\n      panel={<InputFilterPanel filter={filter} />}\n    />\n  );\n}\n\nfunction SelectModelControl(\n  props: FilterListControlProps<string, FilterSelectModelControl>,\n) {\n  const {value, filter} = props;\n  const {isLoading, data} = useNormalizedModel(\n    `normalized-models/${filter.control.model}/${value}`,\n    undefined,\n    {enabled: !!value},\n  );\n\n  const skeleton = (\n    <Fragment>\n      <Skeleton variant=\"avatar\" size=\"w-18 h-18 mr-6\" />\n      <Skeleton variant=\"rect\" size=\"w-50\" />\n    </Fragment>\n  );\n  const modelPreview = (\n    <Fragment>\n      <Avatar size=\"xs\" src={data?.model.image} className=\"mr-6\" />\n      {data?.model.name}\n    </Fragment>\n  );\n\n  const label = isLoading || !data ? skeleton : modelPreview;\n\n  return (\n    <FilterListItemDialogTrigger\n      {...props}\n      label={label}\n      panel={<NormalizedModelFilterPanel filter={filter} />}\n    />\n  );\n}\n","import clsx from 'clsx';\nimport {BackendFilter} from '../backend-filter';\nimport {useBackendFilterUrlParams} from '../backend-filter-url-params';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FilterListControl} from './filter-list-control';\nimport {FilterItemFormValue} from '../add-filter-dialog';\n\ninterface FilterListProps {\n  filters: BackendFilter[];\n  // these filters will always be shown, even if value is not yet selected for filter\n  pinnedFilters?: string[];\n  className?: string;\n}\nexport function FilterList({\n  filters,\n  pinnedFilters,\n  className,\n}: FilterListProps) {\n  const {decodedFilters, remove, replaceAll} = useBackendFilterUrlParams(\n    filters,\n    pinnedFilters\n  );\n\n  if (!decodedFilters.length) return null;\n\n  return (\n    <div className={clsx('flex items-center gap-6 overflow-x-auto', className)}>\n      {decodedFilters.map((field, index) => {\n        const filter = filters.find(f => f.key === field.key);\n\n        if (!filter) return null;\n\n        const handleValueChange = (payload: FilterItemFormValue) => {\n          const newFilters = [...decodedFilters];\n          newFilters.splice(index, 1, {\n            key: filter.key,\n            value: payload.value,\n            isInactive: false,\n            operator: payload.operator || filter.defaultOperator,\n          });\n          replaceAll(newFilters);\n        };\n\n        return (\n          <div key={field.key}>\n            {!field.isInactive && (\n              <IconButton\n                variant=\"outline\"\n                color=\"primary\"\n                size=\"xs\"\n                radius=\"rounded-l-md\"\n                onClick={() => {\n                  remove(field.key);\n                }}\n              >\n                <CloseIcon />\n              </IconButton>\n            )}\n            <FilterListControl\n              filter={filter}\n              isInactive={field.isInactive}\n              value={field.valueKey != null ? field.valueKey : field.value}\n              operator={field.operator}\n              onValueChange={handleValueChange}\n            />\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React, {ReactNode} from 'react';\nimport {HeaderLayout} from '@common/datatable/data-table-header';\n\ninterface Props {\n  actions?: ReactNode;\n  selectedItemsCount: number;\n}\nexport function SelectedStateDatatableHeader({\n  actions,\n  selectedItemsCount,\n}: Props) {\n  return (\n    <HeaderLayout data-testid=\"datatable-selected-header\">\n      <div className=\"mr-auto\">\n        <Trans\n          message=\"[one 1 item|other :count items] selected\"\n          values={{count: selectedItemsCount}}\n        />\n      </div>\n      {actions}\n    </HeaderLayout>\n  );\n}\n","import {m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport React from 'react';\n\nexport function FilterListSkeleton() {\n  return (\n    <m.div\n      className=\"flex items-center gap-6 h-30\"\n      key=\"filter-list-skeleton\"\n      {...opacityAnimation}\n    >\n      <Skeleton variant=\"rect\" size=\"h-full w-144\" radius=\"rounded-md\" />\n      <Skeleton variant=\"rect\" size=\"h-full w-112\" radius=\"rounded-md\" />\n      <Skeleton variant=\"rect\" size=\"h-full w-172\" radius=\"rounded-md\" />\n    </m.div>\n  );\n}\n","import React, {\n  cloneElement,\n  ComponentProps,\n  ReactElement,\n  ReactNode,\n  useState,\n} from 'react';\nimport {TableDataItem} from '../ui/tables/types/table-data-item';\nimport {BackendFilter} from './filters/backend-filter';\nimport {MessageDescriptor} from '../i18n/message-descriptor';\nimport {ColumnConfig} from './column-config';\nimport {useTrans} from '../i18n/use-trans';\nimport {useBackendFilterUrlParams} from './filters/backend-filter-url-params';\nimport {\n  GetDatatableDataParams,\n  useDatatableData,\n} from './requests/paginated-resources';\nimport {DataTableContext} from './page/data-table-context';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {ProgressBar} from '../ui/progress/progress-bar';\nimport {Table, TableProps} from '../ui/tables/table';\nimport {DataTablePaginationFooter} from './data-table-pagination-footer';\nimport {DataTableHeader} from './data-table-header';\nimport {FilterList} from './filters/filter-list/filter-list';\nimport {SelectedStateDatatableHeader} from '@common/datatable/selected-state-datatable-header';\nimport clsx from 'clsx';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {BackendFiltersUrlKey} from '@common/datatable/filters/backend-filters-url-key';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {FilterListSkeleton} from '@common/datatable/filters/filter-list/filter-list-skeleton';\n\nexport interface DataTableProps<T extends TableDataItem> {\n  filters?: BackendFilter[];\n  filtersLoading?: boolean;\n  columns: ColumnConfig<T>[];\n  searchPlaceholder?: MessageDescriptor;\n  queryParams?: Record<string, string | number | undefined | null>;\n  endpoint: string;\n  resourceName?: ReactNode;\n  emptyStateMessage: ReactElement<{isFiltering: boolean}>;\n  actions?: ReactNode;\n  enableSelection?: boolean;\n  selectionStyle?: TableProps<T>['selectionStyle'];\n  selectedActions?: ReactNode;\n  onRowAction?: TableProps<T>['onAction'];\n  tableDomProps?: ComponentProps<'table'>;\n  children?: ReactNode;\n  collapseTableOnMobile?: boolean;\n  cellHeight?: string;\n}\nexport function DataTable<T extends TableDataItem>({\n  filters,\n  filtersLoading,\n  columns,\n  searchPlaceholder,\n  queryParams,\n  endpoint,\n  actions,\n  selectedActions,\n  emptyStateMessage,\n  tableDomProps,\n  onRowAction,\n  enableSelection = true,\n  selectionStyle = 'checkbox',\n  children,\n  cellHeight,\n  collapseTableOnMobile = true,\n}: DataTableProps<T>) {\n  const isMobile = useIsMobileMediaQuery();\n  const {trans} = useTrans();\n  const {encodedFilters} = useBackendFilterUrlParams(filters);\n  const [params, setParams] = useState<GetDatatableDataParams>({perPage: 15});\n  const [selectedRows, setSelectedRows] = useState<(string | number)[]>([]);\n  const query = useDatatableData<T>(\n    endpoint,\n    {\n      ...params,\n      ...queryParams,\n      [BackendFiltersUrlKey]: encodedFilters,\n    },\n    undefined,\n    () => setSelectedRows([]),\n  );\n\n  const isFiltering = !!(params.query || params.filters || encodedFilters);\n  const pagination = query.data?.pagination;\n\n  return (\n    <DataTableContext.Provider\n      value={{\n        selectedRows,\n        setSelectedRows,\n        endpoint,\n        params,\n        setParams,\n        query,\n      }}\n    >\n      {children}\n      <AnimatePresence initial={false} mode=\"wait\">\n        {selectedRows.length ? (\n          <SelectedStateDatatableHeader\n            selectedItemsCount={selectedRows.length}\n            actions={selectedActions}\n            key=\"selected\"\n          />\n        ) : (\n          <DataTableHeader\n            searchPlaceholder={searchPlaceholder}\n            searchValue={params.query}\n            onSearchChange={query => setParams({...params, query})}\n            actions={actions}\n            filters={filters}\n            filtersLoading={filtersLoading}\n            key=\"default\"\n          />\n        )}\n      </AnimatePresence>\n\n      {filters && (\n        <div className=\"mb-14\">\n          <AnimatePresence initial={false} mode=\"wait\">\n            {filtersLoading && encodedFilters ? (\n              <FilterListSkeleton />\n            ) : (\n              <m.div key=\"filter-list\" {...opacityAnimation}>\n                <FilterList filters={filters} />\n              </m.div>\n            )}\n          </AnimatePresence>\n        </div>\n      )}\n\n      <div\n        className={clsx(\n          'relative rounded-panel',\n          (!isMobile || !collapseTableOnMobile) && 'border',\n        )}\n      >\n        {query.isFetching && (\n          <ProgressBar\n            isIndeterminate\n            className=\"absolute left-0 top-0 z-10 w-full\"\n            aria-label={trans({message: 'Loading'})}\n            size=\"xs\"\n          />\n        )}\n\n        <div className=\"relative overflow-x-auto md:overflow-hidden\">\n          <Table\n            {...tableDomProps}\n            columns={columns}\n            data={pagination?.data || []}\n            sortDescriptor={params}\n            onSortChange={descriptor => {\n              setParams({...params, ...descriptor});\n            }}\n            selectedRows={selectedRows}\n            enableSelection={enableSelection}\n            selectionStyle={selectionStyle}\n            onSelectionChange={setSelectedRows}\n            onAction={onRowAction}\n            collapseOnMobile={collapseTableOnMobile}\n            cellHeight={cellHeight}\n          />\n        </div>\n\n        {(query.isFetched || query.isPlaceholderData) &&\n        !pagination?.data.length ? (\n          <div className=\"pt-50\">\n            {cloneElement(emptyStateMessage, {\n              isFiltering,\n            })}\n          </div>\n        ) : undefined}\n\n        <DataTablePaginationFooter\n          query={query}\n          onPageChange={page => setParams({...params, page})}\n          onPerPageChange={perPage => setParams({...params, perPage})}\n        />\n      </div>\n    </DataTableContext.Provider>\n  );\n}\n","import React, {ReactElement, ReactNode, useId} from 'react';\nimport {TableDataItem} from '../../ui/tables/types/table-data-item';\nimport {DataTable, DataTableProps} from '../data-table';\nimport {TableProps} from '../../ui/tables/table';\nimport {StaticPageTitle} from '../../seo/static-page-title';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport clsx from 'clsx';\n\ninterface Props<T extends TableDataItem> extends DataTableProps<T> {\n  title?: ReactElement<MessageDescriptor>;\n  headerContent?: ReactNode;\n  headerItemsAlign?: string;\n  enableSelection?: boolean;\n  onRowAction?: TableProps<T>['onAction'];\n  className?: string;\n}\nexport function DataTablePage<T extends TableDataItem>({\n  title,\n  headerContent,\n  headerItemsAlign = 'items-end',\n  className,\n  ...dataTableProps\n}: Props<T>) {\n  const titleId = useId();\n\n  return (\n    <div className={clsx('p-12 md:p-24', className)}>\n      {title && (\n        <div\n          className={clsx(\n            'mb-16',\n            headerContent && `flex ${headerItemsAlign} gap-4`\n          )}\n        >\n          <StaticPageTitle>{title}</StaticPageTitle>\n          <h1 className=\"text-3xl font-light first:capitalize\" id={titleId}>\n            {title}\n          </h1>\n          {headerContent}\n        </div>\n      )}\n\n      <DataTable\n        {...dataTableProps}\n        tableDomProps={{\n          'aria-labelledby': title ? titleId : undefined,\n        }}\n      />\n    </div>\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {DatatableDataQueryKey} from './paginated-resources';\nimport {useDataTable} from '../page/data-table-context';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\nimport {Key} from 'react';\n\ninterface Response extends BackendResponse {\n  //\n}\n\nexport function useDeleteSelectedRows() {\n  const {endpoint, selectedRows, setSelectedRows} = useDataTable();\n  return useMutation({\n    mutationFn: () => deleteSelectedRows(endpoint, selectedRows),\n    onSuccess: async () => {\n      await queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey(endpoint),\n      });\n      toast(\n        message('Deleted [one 1 record|other :count records]', {\n          values: {count: selectedRows.length},\n        }),\n      );\n      setSelectedRows([]);\n    },\n    onError: err =>\n      showHttpErrorToast(err, message('Could not delete records')),\n  });\n}\n\nfunction deleteSelectedRows(endpoint: string, ids: Key[]): Promise<Response> {\n  return apiClient.delete(`${endpoint}/${ids.join(',')}`).then(r => r.data);\n}\n","import {Button} from '../../ui/buttons/button';\nimport {Trans} from '../../i18n/trans';\nimport {ConfirmationDialog} from '../../ui/overlays/dialog/confirmation-dialog';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport React from 'react';\nimport {useDeleteSelectedRows} from '../requests/delete-selected-rows';\nimport {useDataTable} from './data-table-context';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\nexport function DeleteSelectedItemsAction() {\n  return (\n    <DialogTrigger type=\"modal\">\n      <Button variant=\"flat\" color=\"danger\" className=\"ml-auto\">\n        <Trans message=\"Delete\" />\n      </Button>\n      <DeleteItemsDialog />\n    </DialogTrigger>\n  );\n}\n\nfunction DeleteItemsDialog() {\n  const deleteSelectedRows = useDeleteSelectedRows();\n  const {selectedRows} = useDataTable();\n  const {close} = useDialogContext();\n  return (\n    <ConfirmationDialog\n      isLoading={deleteSelectedRows.isPending}\n      title={\n        <Trans\n          message=\"Delete [one 1 item|other :count items]?\"\n          values={{count: selectedRows.length}}\n        />\n      }\n      body={\n        <Trans message=\"This will permanently remove the items and cannot be undone.\" />\n      }\n      confirm={<Trans message=\"Delete\" />}\n      isDanger\n      onConfirm={() => {\n        deleteSelectedRows.mutate(undefined, {onSuccess: () => close()});\n      }}\n    />\n  );\n}\n","import React, {ReactNode} from 'react';\nimport {IllustratedMessage} from '../../ui/images/illustrated-message';\nimport {SvgImage} from '../../ui/images/svg-image/svg-image';\nimport {Trans} from '../../i18n/trans';\nimport {useIsMobileMediaQuery} from '../../utils/hooks/is-mobile-media-query';\n\nexport interface DataTableEmptyStateMessageProps {\n  isFiltering?: boolean;\n  title: ReactNode;\n  filteringTitle?: ReactNode;\n  image: string;\n  size?: 'sm' | 'md';\n  className?: string;\n}\nexport function DataTableEmptyStateMessage({\n  isFiltering,\n  title,\n  filteringTitle,\n  image,\n  size,\n  className,\n}: DataTableEmptyStateMessageProps) {\n  const isMobile = useIsMobileMediaQuery();\n  if (!size) {\n    size = isMobile ? 'sm' : 'md';\n  }\n\n  // allow user to disable filtering message variation by not passing in \"filteringTitle\"\n  return (\n    <IllustratedMessage\n      className={className}\n      size={size}\n      image={<SvgImage src={image} />}\n      title={isFiltering && filteringTitle ? filteringTitle : title}\n      description={\n        isFiltering && filteringTitle ? (\n          <Trans message=\"Try another search query or different filters\" />\n        ) : undefined\n      }\n    />\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddIcon = createSvgIcon(\n  <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n, 'AddOutlined');\n","import {AddIcon} from '../icons/material/Add';\nimport {Button} from '../ui/buttons/button';\nimport React, {ReactNode} from 'react';\nimport {useIsMobileMediaQuery} from '../utils/hooks/is-mobile-media-query';\nimport {IconButton} from '../ui/buttons/icon-button';\nimport {To} from 'react-router-dom';\nimport {ButtonBaseProps} from '../ui/buttons/button-base';\n\nexport interface DataTableAddItemButtonProps {\n  children: ReactNode;\n  to?: To;\n  elementType?: ButtonBaseProps['elementType'];\n  onClick?: ButtonBaseProps['onClick'];\n}\nexport const DataTableAddItemButton = React.forwardRef<\n  HTMLButtonElement,\n  DataTableAddItemButtonProps\n>(({children, to, elementType, onClick}, ref) => {\n  const isMobile = useIsMobileMediaQuery();\n\n  if (isMobile) {\n    return (\n      <IconButton\n        ref={ref}\n        variant=\"flat\"\n        color=\"primary\"\n        className=\"flex-shrink-0\"\n        size=\"sm\"\n        to={to}\n        elementType={elementType}\n        onClick={onClick}\n      >\n        <AddIcon />\n      </IconButton>\n    );\n  }\n\n  return (\n    <Button\n      ref={ref}\n      startIcon={<AddIcon />}\n      variant=\"flat\"\n      color=\"primary\"\n      size=\"sm\"\n      to={to}\n      elementType={elementType}\n      onClick={onClick}\n    >\n      {children}\n    </Button>\n  );\n});\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FileDownloadIcon = createSvgIcon(\n  <path d=\"M18 15v3H6v-3H4v3c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-3h-2zm-1-4-1.41-1.41L13 12.17V4h-2v8.17L8.41 9.59 7 11l5 5 5-5z\" />\n, 'FileDownloadOutlined');\n","import {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n  downloadPath?: string;\n  result?: 'jobQueued';\n}\n\nexport type ExportCsvPayload = Record<string, string | number | undefined>;\n\nexport function useExportCsv(endpoint: string) {\n  return useMutation({\n    mutationFn: (payload?: ExportCsvPayload) => exportCsv(endpoint, payload),\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction exportCsv(\n  endpoint: string,\n  payload: ExportCsvPayload | undefined,\n): Promise<Response> {\n  return apiClient.post(endpoint, payload).then(r => r.data);\n}\n","export function downloadFileFromUrl(url: string, name?: string) {\n  const link = document.createElement('a');\n  link.href = url;\n  if (name) link.download = name;\n  document.body.appendChild(link);\n  link.click();\n  document.body.removeChild(link);\n}\n","import {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '../../ui/overlays/dialog/dialog-footer';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {Button} from '../../ui/buttons/button';\nimport {Trans} from '../../i18n/trans';\n\nexport function CsvExportInfoDialog() {\n  const {close} = useDialogContext();\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Csv export\" />\n      </DialogHeader>\n      <DialogBody>\n        <Trans\n          message=\"Your request is being processed. We'll email you when the report is ready to download. In\n            certain cases, it might take a little longer, depending on the number of items beings\n            exported and the volume of activity.\"\n        />\n      </DialogBody>\n      <DialogFooter>\n        <Button variant=\"flat\" color=\"primary\" onClick={close}>\n          <Trans message=\"Got it\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {IconButton} from '../../ui/buttons/icon-button';\nimport {FileDownloadIcon} from '../../icons/material/FileDownload';\nimport React, {Fragment, useState} from 'react';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {ExportCsvPayload, useExportCsv} from '../requests/use-export-csv';\nimport {downloadFileFromUrl} from '../../uploads/utils/download-file-from-url';\nimport {CsvExportInfoDialog} from './csv-export-info-dialog';\n\ninterface DataTableExportCsvButtonProps {\n  endpoint: string;\n  payload?: ExportCsvPayload;\n}\nexport function DataTableExportCsvButton({\n  endpoint,\n  payload,\n}: DataTableExportCsvButtonProps) {\n  const [dialogIsOpen, setDialogIsOpen] = useState(false);\n  const exportCsv = useExportCsv(endpoint);\n\n  return (\n    <Fragment>\n      <IconButton\n        variant=\"outline\"\n        color=\"primary\"\n        size=\"sm\"\n        className=\"flex-shrink-0\"\n        disabled={exportCsv.isPending}\n        onClick={() => {\n          exportCsv.mutate(payload, {\n            onSuccess: response => {\n              if (response.downloadPath) {\n                downloadFileFromUrl(response.downloadPath);\n              } else {\n                setDialogIsOpen(true);\n              }\n            },\n          });\n        }}\n      >\n        <FileDownloadIcon />\n      </IconButton>\n      <DialogTrigger\n        type=\"modal\"\n        isOpen={dialogIsOpen}\n        onOpenChange={setDialogIsOpen}\n      >\n        <CsvExportInfoDialog />\n      </DialogTrigger>\n    </Fragment>\n  );\n}\n","import React, {ReactNode} from 'react';\nimport {Avatar, AvatarProps} from '../../ui/images/avatar';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport clsx from 'clsx';\n\ninterface Props {\n  image?: string;\n  label: ReactNode;\n  description?: ReactNode;\n  labelClassName?: string;\n  avatarSize?: AvatarProps['size'];\n}\nexport function NameWithAvatar({\n  image,\n  label,\n  description,\n  labelClassName,\n  avatarSize = 'md',\n}: Props) {\n  return (\n    <div className=\"flex items-center gap-12\">\n      {image && (\n        <Avatar size={avatarSize} className=\"flex-shrink-0\" src={image} />\n      )}\n      <div className=\"min-w-0 overflow-hidden\">\n        <div\n          className={clsx(labelClassName, 'overflow-hidden overflow-ellipsis')}\n        >\n          {label}\n        </div>\n        {description && (\n          <div className=\"overflow-hidden overflow-ellipsis text-xs text-muted\">\n            {description}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n\nexport function NameWithAvatarPlaceholder({\n  labelClassName,\n  showDescription,\n}: Partial<Props> & {\n  showDescription?: boolean;\n}) {\n  return (\n    <div className=\"flex w-full max-w-4/5 items-center gap-12\">\n      <Skeleton size=\"w-40 h-40 md:w-32 md:h-32\" variant=\"rect\" />\n      <div className=\"flex-auto\">\n        <div className={clsx(labelClassName, 'leading-3')}>\n          <Skeleton />\n        </div>\n        {showDescription && (\n          <div className=\"mt-4 leading-3 text-muted\">{<Skeleton />}</div>\n        )}\n      </div>\n    </div>\n  );\n}\n","import {useControlledState} from '@react-stately/utils';\nimport {HTMLAttributes, useCallback, useState} from 'react';\nimport {\n  CalendarDate,\n  DateValue,\n  isSameDay,\n  toCalendarDate,\n  toZoned,\n  ZonedDateTime,\n} from '@internationalized/date';\nimport {useBaseDatePickerState} from '../use-base-date-picker-state';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\n\nexport type Granularity = 'day' | 'minute';\n\nexport type DatePickerState = BaseDatePickerState;\n\nexport interface BaseDatePickerState<T = ZonedDateTime, P = boolean> {\n  timezone: string;\n  granularity: Granularity;\n  selectedValue: T;\n  setSelectedValue: (value: T) => void;\n  calendarIsOpen: boolean;\n  setCalendarIsOpen: (isOpen: boolean) => void;\n  calendarDates: CalendarDate[];\n  setCalendarDates: (dates: CalendarDate[]) => void;\n  dayIsActive: (day: CalendarDate) => boolean;\n  dayIsHighlighted: (day: CalendarDate) => boolean;\n  dayIsRangeStart: (day: CalendarDate) => boolean;\n  dayIsRangeEnd: (day: CalendarDate) => boolean;\n  isPlaceholder: P;\n  setIsPlaceholder: (value: P) => void;\n  clear: () => void;\n  min?: ZonedDateTime;\n  max?: ZonedDateTime;\n  closeDialogOnSelection: boolean;\n  getCellProps: (\n    date: CalendarDate,\n    isSameMonth: boolean,\n  ) => HTMLAttributes<HTMLElement>;\n}\n\nexport interface DatePickerValueProps<V, CV = V> {\n  value?: V | null | '';\n  defaultValue?: V | null;\n  onChange?: (value: CV | null) => void;\n  min?: DateValue;\n  max?: DateValue;\n  granularity?: Granularity;\n  closeDialogOnSelection?: boolean;\n}\nexport function useDatePickerState(\n  props: DatePickerValueProps<ZonedDateTime>,\n): BaseDatePickerState {\n  const now = useCurrentDateTime();\n  const [isPlaceholder, setIsPlaceholder] = useState(\n    !props.value && !props.defaultValue,\n  );\n\n  // if user clears the date, we will want to still keep an\n  // instance internally, but return null via \"onChange\" callback\n  const setStateValue = props.onChange;\n  const [internalValue, setInternalValue] = useControlledState(\n    props.value || now,\n    props.defaultValue || now,\n    value => {\n      setIsPlaceholder(false);\n      setStateValue?.(value);\n    },\n  );\n\n  const {\n    min,\n    max,\n    granularity,\n    timezone,\n    calendarIsOpen,\n    setCalendarIsOpen,\n    closeDialogOnSelection,\n  } = useBaseDatePickerState(internalValue, props);\n\n  const clear = useCallback(() => {\n    setIsPlaceholder(true);\n    setInternalValue(now);\n    setStateValue?.(null);\n    setCalendarIsOpen(false);\n  }, [now, setInternalValue, setStateValue, setCalendarIsOpen]);\n\n  const [calendarDates, setCalendarDates] = useState<CalendarDate[]>(() => {\n    return [toCalendarDate(internalValue)];\n  });\n\n  const setSelectedValue = useCallback(\n    (newValue: DateValue) => {\n      if (min && newValue.compare(min) < 0) {\n        newValue = min;\n      } else if (max && newValue.compare(max) > 0) {\n        newValue = max;\n      }\n\n      // preserve time\n      const value = internalValue\n        ? internalValue.set(newValue)\n        : toZoned(newValue, timezone);\n      setInternalValue(value);\n      setCalendarDates([toCalendarDate(value)]);\n      setIsPlaceholder(false);\n    },\n    [setInternalValue, min, max, internalValue, timezone],\n  );\n\n  const dayIsActive = useCallback(\n    (day: DateValue) => !isPlaceholder && isSameDay(internalValue, day),\n    [internalValue, isPlaceholder],\n  );\n\n  const getCellProps = useCallback(\n    (date: DateValue): HTMLAttributes<HTMLElement> => {\n      return {\n        onClick: () => {\n          setSelectedValue?.(date);\n          if (closeDialogOnSelection) {\n            setCalendarIsOpen?.(false);\n          }\n        },\n      };\n    },\n    [setSelectedValue, setCalendarIsOpen, closeDialogOnSelection],\n  );\n\n  return {\n    selectedValue: internalValue,\n    setSelectedValue: setInternalValue,\n    calendarIsOpen,\n    setCalendarIsOpen,\n    dayIsActive,\n    dayIsHighlighted: () => false,\n    dayIsRangeStart: () => false,\n    dayIsRangeEnd: () => false,\n    getCellProps,\n    calendarDates,\n    setCalendarDates,\n    isPlaceholder,\n    clear,\n    setIsPlaceholder,\n    min,\n    max,\n    granularity,\n    timezone,\n    closeDialogOnSelection,\n  };\n}\n","import React, {\n  ComponentPropsWithoutRef,\n  Fragment,\n  MouseEvent,\n  useRef,\n} from 'react';\nimport {parseAbsoluteToLocal, ZonedDateTime} from '@internationalized/date';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport {\n  DatePickerValueProps,\n  useDatePickerState,\n} from './use-date-picker-state';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DateRangeIcon} from '@common/icons/material/DateRange';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Calendar} from '../calendar/calendar';\nimport {\n  DatePickerField,\n  DatePickerFieldProps,\n} from '../date-range-picker/date-picker-field';\nimport {DateSegmentList} from '../segments/date-segment-list';\nimport {useDateFormatter} from '@common/i18n/use-date-formatter';\nimport {useTrans} from '@common/i18n/use-trans';\nimport clsx from 'clsx';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\n\nexport interface DatePickerProps\n  extends Omit<DatePickerFieldProps, 'children'>,\n    DatePickerValueProps<ZonedDateTime> {}\nexport function DatePicker({showCalendarFooter, ...props}: DatePickerProps) {\n  const state = useDatePickerState(props);\n  const inputRef = useRef<HTMLDivElement>(null);\n  const now = useCurrentDateTime();\n\n  const footer = showCalendarFooter && (\n    <DialogFooter\n      padding=\"px-14 pb-14\"\n      startAction={\n        <Button\n          disabled={state.isPlaceholder}\n          variant=\"text\"\n          color=\"primary\"\n          onClick={() => {\n            state.clear();\n          }}\n        >\n          <Trans message=\"Clear\" />\n        </Button>\n      }\n    >\n      <Button\n        variant=\"text\"\n        color=\"primary\"\n        onClick={() => {\n          state.setSelectedValue(now);\n          state.setCalendarIsOpen(false);\n        }}\n      >\n        <Trans message=\"Today\" />\n      </Button>\n    </DialogFooter>\n  );\n\n  const dialog = (\n    <DialogTrigger\n      offset={8}\n      placement=\"bottom-start\"\n      isOpen={state.calendarIsOpen}\n      onOpenChange={state.setCalendarIsOpen}\n      type=\"popover\"\n      triggerRef={inputRef}\n      returnFocusToTrigger={false}\n      moveFocusToDialog={false}\n    >\n      <Dialog size=\"auto\">\n        <DialogBody\n          className=\"flex items-start gap-40\"\n          padding={showCalendarFooter ? 'px-24 pt-20 pb-10' : null}\n        >\n          <Calendar state={state} visibleMonths={1} />\n        </DialogBody>\n        {footer}\n      </Dialog>\n    </DialogTrigger>\n  );\n\n  const openOnClick: ComponentPropsWithoutRef<'div'> = {\n    onClick: e => {\n      e.stopPropagation();\n      e.preventDefault();\n      if (!isHourSegment(e)) {\n        state.setCalendarIsOpen(true);\n      } else {\n        state.setCalendarIsOpen(false);\n      }\n    },\n  };\n\n  return (\n    <Fragment>\n      <DatePickerField\n        ref={inputRef}\n        wrapperProps={openOnClick}\n        endAdornment={\n          <DateRangeIcon className={clsx(props.disabled && 'text-disabled')} />\n        }\n        {...props}\n      >\n        <DateSegmentList\n          segmentProps={openOnClick}\n          state={state}\n          value={state.selectedValue}\n          onChange={state.setSelectedValue}\n          isPlaceholder={state.isPlaceholder}\n        />\n      </DatePickerField>\n      {dialog}\n    </Fragment>\n  );\n}\n\ninterface FormDatePickerProps extends DatePickerProps {\n  name: string;\n}\nexport function FormDatePicker(props: FormDatePickerProps) {\n  const {min, max} = props;\n  const {trans} = useTrans();\n  const {format} = useDateFormatter();\n  const {\n    field: {onChange, onBlur, value = null, ref},\n    fieldState: {invalid, error},\n  } = useController({\n    name: props.name,\n    rules: {\n      validate: v => {\n        if (!v) return;\n        const date = parseAbsoluteToLocal(v);\n        if (min && date.compare(min) < 0) {\n          return trans({\n            message: 'Enter a date after :date',\n            values: {date: format(v)},\n          });\n        }\n        if (max && date.compare(max) > 0) {\n          return trans({\n            message: 'Enter a date before :date',\n            values: {date: format(v)},\n          });\n        }\n      },\n    },\n  });\n\n  const parsedValue: null | ZonedDateTime = value\n    ? parseAbsoluteToLocal(value)\n    : null;\n\n  const formProps: Partial<DatePickerProps> = {\n    onChange: e => {\n      onChange(e ? e.toAbsoluteString() : e);\n    },\n    onBlur,\n    value: parsedValue,\n    invalid,\n    errorMessage: error?.message,\n    inputRef: ref,\n  };\n\n  return <DatePicker {...mergeProps(formProps, props)} />;\n}\n\nfunction isHourSegment(e: MouseEvent<HTMLDivElement>): boolean {\n  return ['hour', 'minute', 'dayPeriod'].includes(\n    (e.currentTarget as HTMLElement).ariaLabel || ''\n  );\n}\n","export function chunkArray<T>(array: T[], chunkSize: number): T[][] {\n  return array.reduce<any>((resultArray, item, index) => {\n    const chunkIndex = Math.floor(index / chunkSize);\n\n    if (!resultArray[chunkIndex]) {\n      resultArray[chunkIndex] = [];\n    }\n\n    resultArray[chunkIndex].push(item);\n\n    return resultArray;\n  }, []);\n}\n","import {createSvgIcon} from '../../../../icons/create-svg-icon';\n\nexport const ColorIcon = createSvgIcon(\n  <path\n    stroke=\"#E0E0E0\"\n    d=\"M24,44c-7.168,0-13-5.816-13-12.971C11,24,24,4,24,4s13,20,13,27.029C37,38.184,31.168,44,24,44z\"\n  />\n);\n","import React from 'react';\nimport clsx from 'clsx';\nimport {ButtonBase} from '../buttons/button-base';\n\ntype Props = {\n  onChange?: (e: string) => void;\n  value?: string;\n  colors: string[];\n};\nexport function ColorSwatch({onChange, value, colors}: Props) {\n  const presetButtons = colors.map(color => {\n    const isSelected = value === color;\n    return (\n      <ButtonBase\n        key={color}\n        onClick={() => {\n          onChange?.(color);\n        }}\n        className={clsx(\n          'relative block flex-shrink-0 w-26 h-26 border rounded',\n          isSelected && 'shadow-md'\n        )}\n        style={{backgroundColor: color}}\n      >\n        {isSelected && (\n          <span className=\"absolute inset-0 m-auto rounded-full w-8 h-8 bg-white\" />\n        )}\n      </ButtonBase>\n    );\n  });\n\n  return <div className=\"flex flex-wrap gap-6\">{presetButtons}</div>;\n}\n","import {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport const ColorPresets: {\n  color: string;\n  name: MessageDescriptor;\n  foreground?: string;\n}[] = [\n  {\n    color: 'rgb(255, 255, 255)',\n    name: message('White'),\n  },\n  {\n    color: 'rgb(239,245,245)',\n    name: message('Solitude'),\n  },\n  {\n    color: 'rgb(245,213,174)',\n    name: message('Wheat'),\n  },\n  {\n    color: 'rgb(253,227,167)',\n    name: message('Cape Honey'),\n  },\n  {\n    color: 'rgb(242,222,186)',\n    name: message('Milk punch'),\n  },\n  {\n    color: 'rgb(97,118,75)',\n    name: message('Dingy'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n  {\n    color: 'rgb(4, 147, 114)',\n    name: message('Aquamarine'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n  {\n    color: 'rgb(222,245,229)',\n    name: message('Cosmic Latte'),\n  },\n  {\n    color: 'rgb(233,119,119)',\n    name: message('Geraldine'),\n    foreground: 'rgb(90,14,14)',\n  },\n  {\n    color: 'rgb(247,164,164)',\n    name: message('Sundown'),\n  },\n  {\n    color: 'rgb(30,139,195)',\n    name: message('Pelorous'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n  {\n    color: 'rgb(142,68,173)',\n    name: message('Deep Lilac'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n  {\n    color: 'rgb(108,74,182)',\n    name: message('Blue marguerite'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n  {\n    color: 'rgb(139,126,116)',\n    name: message('Americano'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n  {\n    color: 'rgb(0,0,0)',\n    name: message('Black'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n  {\n    color: 'rgb(64,66,88)',\n    name: message('Blue zodiac'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n  {\n    color: 'rgb(101,100,124)',\n    name: message('Comet'),\n    foreground: 'rgb(255, 255, 255)',\n  },\n];\n","import {HexColorInput, HexColorPicker} from 'react-colorful';\nimport React, {useState} from 'react';\nimport {parseColor} from '@react-stately/color';\nimport {ColorSwatch} from './color-swatch';\nimport {getInputFieldClassNames} from '../forms/input-field/get-input-field-class-names';\nimport {ColorPresets} from '@common/ui/color-picker/color-presets';\n\nconst DefaultPresets = ColorPresets.map(({color}) => color).slice(0, 14);\n\ntype Props = {\n  defaultValue?: string;\n  onChange?: (e: string) => void;\n  colorPresets?: string[];\n  showInput?: boolean;\n};\nexport function ColorPicker({\n  defaultValue,\n  onChange,\n  colorPresets,\n  showInput,\n}: Props) {\n  const [color, setColor] = useState<string | undefined>(defaultValue);\n\n  const presets: string[] = colorPresets || DefaultPresets;\n\n  const style = getInputFieldClassNames({size: 'sm'});\n\n  return (\n    <div>\n      <HexColorPicker\n        className=\"!w-auto\"\n        color={color}\n        onChange={newColor => {\n          onChange?.(newColor);\n          setColor(newColor);\n        }}\n      />\n      <div className=\"py-20 px-12\">\n        {presets && (\n          <ColorSwatch\n            colors={presets}\n            onChange={newColor => {\n              if (newColor) {\n                const hex = parseColor(newColor).toString('hex');\n                onChange?.(hex);\n                setColor(hex);\n              }\n            }}\n            value={color}\n          />\n        )}\n        {showInput && (\n          <div className=\"pt-20\">\n            <HexColorInput\n              autoComplete=\"off\"\n              role=\"textbox\"\n              autoCorrect=\"off\"\n              spellCheck=\"false\"\n              required\n              aria-label=\"Hex color\"\n              prefixed\n              className={style.input}\n              color={color}\n              onChange={newColor => {\n                onChange?.(newColor);\n                setColor(newColor);\n              }}\n            />\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n","import {useState} from 'react';\nimport {ColorPicker} from './color-picker';\nimport {DialogFooter} from '../overlays/dialog/dialog-footer';\nimport {Button} from '../buttons/button';\nimport {useDialogContext} from '../overlays/dialog/dialog-context';\nimport {Dialog} from '../overlays/dialog/dialog';\nimport {Trans} from '../../i18n/trans';\n\ninterface ColorPickerDialogProps {\n  defaultValue?: string;\n  onChange?: (color: string) => void;\n  hideFooter?: boolean;\n  showInput?: boolean;\n}\nexport function ColorPickerDialog({\n  defaultValue,\n  onChange,\n  hideFooter = false,\n  showInput = true,\n}: ColorPickerDialogProps) {\n  const {close} = useDialogContext();\n  const [value, setValue] = useState(defaultValue || '');\n  // todo: remove this once pixie and bedrive are refactored to use dialogTrigger currentValue (use \"currentValue\" for defaultValue as well)\n  //const initialValue = useRef(defaultValue);\n\n  return (\n    <Dialog size=\"2xs\">\n      <ColorPicker\n        showInput={showInput}\n        defaultValue={value}\n        onChange={newValue => {\n          setValue(newValue);\n          onChange?.(newValue);\n        }}\n      />\n      {!hideFooter && (\n        <DialogFooter dividerTop>\n          <Button\n            variant=\"text\"\n            size=\"xs\"\n            onClick={() => {\n              close();\n            }}\n          >\n            <Trans message=\"Cancel\" />\n          </Button>\n          <Button\n            variant=\"flat\"\n            color=\"primary\"\n            size=\"xs\"\n            onClick={() => {\n              close(value);\n            }}\n          >\n            <Trans message=\"Apply\" />\n          </Button>\n        </DialogFooter>\n      )}\n    </Dialog>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DragIndicatorIcon = createSvgIcon(\n  <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n, 'DragIndicatorOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DeleteIcon = createSvgIcon(\n  <path d=\"M16 9v10H8V9h8m-1.5-6h-5l-1 1H5v2h14V4h-3.5l-1-1zM18 7H6v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7z\" />\n, 'DeleteOutlined');\n","import {DragMonitor} from './use-drag-monitor';\nimport {ConnectedDraggable, DraggableId} from './use-draggable';\nimport {ConnectedDroppable} from './use-droppable';\n\nexport type DragSessionStatus =\n  | 'dropSuccess'\n  | 'dropFail'\n  | 'dragging'\n  | 'inactive';\n\nexport interface DragSession {\n  dragTargetId?: DraggableId;\n  status: DragSessionStatus;\n}\n\nexport const draggables = new Map<DraggableId, ConnectedDraggable>();\nexport const droppables = new Map<DraggableId, ConnectedDroppable>();\nexport const dragMonitors = new Map<DraggableId, DragMonitor>();\nexport const dragSession: DragSession = {\n  status: 'inactive',\n};\n","import React from 'react';\n\ntype NativeEvent =\n  | React.PointerEvent\n  | PointerEvent\n  | React.DragEvent<HTMLElement>\n  | DragEvent;\n\nexport interface InteractableEvent {\n  x: number;\n  y: number;\n  deltaX: number;\n  deltaY: number;\n  rect: InteractableRect;\n  nativeEvent: NativeEvent;\n}\n\nexport interface InteractableRect {\n  left: number;\n  top: number;\n  width: number;\n  height: number;\n  angle?: number;\n}\n\nexport function interactableEvent({\n  e,\n  rect,\n  deltaX,\n  deltaY,\n}: {\n  e: NativeEvent;\n  rect: InteractableRect;\n  deltaX?: number;\n  deltaY?: number;\n}): InteractableEvent {\n  return {\n    rect,\n    x: e.clientX,\n    y: e.clientY,\n    deltaX: deltaX ?? 0,\n    deltaY: deltaY ?? 0,\n    nativeEvent: e,\n  };\n}\n","type InteractionName = null | 'resize' | 'rotate' | 'drag' | 'move';\n\nexport let activeInteraction: InteractionName = null;\n\nexport function setActiveInteraction(name: InteractionName) {\n  activeInteraction = name;\n}\n","import {InteractableRect} from '../interactable-event';\n\nexport function domRectToObj(rect: DOMRect): InteractableRect {\n  return {\n    left: rect.left,\n    top: rect.top,\n    width: rect.width,\n    height: rect.height,\n  };\n}\n","// use intersection observer instead of getBoundingClientRect for better performance as this will be called in onPointerMove event\nimport {InteractableRect} from '../interactable-event';\nimport {ConnectedMouseSelectable} from './mouse-selection/use-mouse-selectable';\nimport {DraggableId} from './use-draggable';\nimport {ConnectedDroppable} from './use-droppable';\n\nexport function updateRects(\n  targets: Map<DraggableId, ConnectedDroppable | ConnectedMouseSelectable>\n) {\n  const observer = new IntersectionObserver(entries => {\n    entries.forEach(entry => {\n      const {width, height, left, top} = entry.boundingClientRect;\n      const [id, target] =\n        [...targets].find(\n          ([, target]) => target.ref.current === entry.target\n        ) || [];\n      if (id == null || target == null) return;\n\n      const rect: InteractableRect = {\n        width,\n        height,\n        left,\n        top,\n      };\n      targets.set(id, {...target, rect});\n    });\n    observer.disconnect();\n  });\n\n  [...targets.values()].forEach(target => {\n    if (target.ref.current) {\n      observer.observe(target.ref.current);\n    }\n  });\n}\n","import React, {RefObject, useLayoutEffect, useRef} from 'react';\nimport {draggables, dragMonitors, dragSession, droppables} from './drag-state';\nimport {\n  InteractableEvent,\n  interactableEvent,\n  InteractableRect,\n} from '../interactable-event';\nimport {activeInteraction, setActiveInteraction} from '../active-interaction';\nimport {domRectToObj} from '../utils/dom-rect-to-obj';\nimport {updateRects} from './update-rects';\nimport {useGlobalListeners} from '@react-aria/utils';\nimport {DragMonitor} from './use-drag-monitor';\nimport {NativeFileDraggable} from './use-droppable';\n\ninterface DragState {\n  currentRect?: InteractableRect;\n  lastPosition: {x: number; y: number};\n  clickedEl?: HTMLElement;\n}\n\nexport type DragPreviewRenderer = (\n  draggable: ConnectedDraggable,\n  callback: (node: HTMLElement) => void\n) => void;\n\nexport type DraggableId = string | number | object;\n\nexport interface ConnectedDraggable<T = any> {\n  type: string;\n  id: DraggableId;\n  getData: () => T;\n  ref: RefObject<HTMLElement>;\n}\n\n// Either draggable from within the app, or file dragged in from the desktop\nexport type MixedDraggable = ConnectedDraggable | NativeFileDraggable;\n\ninterface UseDragProps extends ConnectedDraggable {\n  disabled?: boolean;\n  onDragStart?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n  onDragMove?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n  onDragEnd?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n  preview?: RefObject<DragPreviewRenderer>;\n  hidePreview?: boolean;\n}\nexport function useDraggable({\n  id,\n  disabled,\n  ref,\n  preview,\n  hidePreview,\n  ...options\n}: UseDragProps) {\n  const dragHandleRef = useRef<HTMLButtonElement>(null);\n  const {addGlobalListener, removeAllGlobalListeners} = useGlobalListeners();\n\n  const state = useRef<DragState>({\n    lastPosition: {x: 0, y: 0},\n  }).current;\n\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  useLayoutEffect(() => {\n    if (!disabled) {\n      draggables.set(id, {\n        ...draggables.get(id),\n        id,\n        ref,\n        type: optionsRef.current.type,\n        getData: optionsRef.current.getData,\n      });\n    } else {\n      draggables.delete(id);\n    }\n    return () => {\n      draggables.delete(id);\n    };\n  }, [id, disabled, optionsRef, ref]);\n\n  // notify monitors connected to the same drag type as this draggable\n  const notifyMonitors = (callback: (m: DragMonitor) => void) => {\n    dragMonitors.forEach(monitor => {\n      if (monitor.type === draggables.get(id)?.type) {\n        callback(monitor);\n      }\n    });\n  };\n\n  const onDragStart = (e: React.DragEvent<HTMLElement>) => {\n    const draggable = draggables.get(id);\n    const el = ref.current;\n    const clickedOnHandle =\n      !dragHandleRef.current ||\n      !state.clickedEl ||\n      dragHandleRef.current.contains(state.clickedEl);\n\n    // if another interaction is in progress (rotate, resize, drag etc.), bail\n    if (activeInteraction || !el || !draggable || !clickedOnHandle) {\n      e.preventDefault();\n      e.stopPropagation();\n      return;\n    }\n\n    updateRects(droppables);\n    setActiveInteraction('drag');\n\n    // hide default browser ghost image\n    if (hidePreview) {\n      hideNativeGhostImage(e);\n    }\n    // this will hide default browser cursor icon, if \"dropEffect\" is not set in dragOver/dragEnter\n    e.dataTransfer.effectAllowed = 'move';\n\n    state.lastPosition = {x: e.clientX, y: e.clientY};\n    state.currentRect = domRectToObj(el.getBoundingClientRect());\n    const ie = interactableEvent({rect: state.currentRect!, e});\n\n    // If there is a preview option, use it to render a custom preview image that will\n    // appear under the pointer while dragging. If not, the element itself is dragged by the browser.\n    if (preview?.current) {\n      preview.current(draggable, node => {\n        e.dataTransfer.setDragImage(node, 0, 0);\n      });\n    }\n\n    dragSession.status = 'dragging';\n    dragSession.dragTargetId = id;\n    if (ref.current) {\n      ref.current.dataset.dragging = 'true';\n    }\n\n    optionsRef.current.onDragStart?.(ie, draggable);\n\n    // wait until next frame so changes made in \"onDragStart\" are reflected in drag monitors\n    requestAnimationFrame(() => {\n      notifyMonitors(m => m.onDragStart?.(ie, draggable));\n    });\n\n    // firefox does not provide clientX/clientY in \"onDrag\", need to listen for dragOver on window instead\n    addGlobalListener(window, 'dragover', onDragOver, true);\n  };\n\n  const onDragOver = (e: React.DragEvent<HTMLElement> | DragEvent) => {\n    e.preventDefault();\n\n    if (!state.currentRect) return;\n\n    const deltaX = e.clientX - state.lastPosition.x;\n    const deltaY = e.clientY - state.lastPosition.y;\n\n    const newRect = {\n      ...state.currentRect,\n      left: state.currentRect.left + deltaX,\n      top: state.currentRect.top + deltaY,\n    };\n\n    const ie = interactableEvent({rect: newRect, e, deltaX, deltaY});\n\n    const target = draggables.get(id);\n    if (target) {\n      optionsRef.current.onDragMove?.(ie, target);\n      notifyMonitors(m => m.onDragMove?.(ie, target));\n    }\n\n    state.lastPosition = {x: e.clientX, y: e.clientY};\n    state.currentRect = newRect;\n  };\n\n  const onDragEnd = (e: React.DragEvent<HTMLElement>) => {\n    removeAllGlobalListeners();\n    if (!state.currentRect) return;\n\n    setActiveInteraction(null);\n    if (emptyImage) {\n      emptyImage.remove();\n    }\n\n    const ie = interactableEvent({rect: state.currentRect, e});\n\n    const draggable = draggables.get(id);\n    if (draggable) {\n      optionsRef.current.onDragEnd?.(ie, draggable);\n      notifyMonitors(m => m.onDragEnd?.(ie, draggable, dragSession!.status));\n    }\n\n    // wait a frame before clearing so monitors have a chance to use drag session status\n    requestAnimationFrame(() => {\n      dragSession.dragTargetId = undefined;\n      dragSession.status = 'inactive';\n      if (ref.current) {\n        delete ref.current.dataset.dragging;\n      }\n    });\n  };\n\n  const draggableProps = {\n    draggable: !disabled,\n    onDragStart,\n    onDragEnd,\n    onPointerDown: (e: React.PointerEvent) => {\n      state.clickedEl = e.target as HTMLElement;\n    },\n  };\n\n  return {draggableProps, dragHandleRef};\n}\n\nlet emptyImage: HTMLImageElement | undefined;\nfunction hideNativeGhostImage(e: React.DragEvent) {\n  if (!emptyImage) {\n    emptyImage = new Image();\n    // image needs to be in the dom to prevent \"globe\" icon in chrome\n    document.body.append(emptyImage);\n    emptyImage.src =\n      'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n  }\n\n  e.dataTransfer.setDragImage(emptyImage, 0, 0);\n}\n","import {UploadedFile} from '@common/uploads/uploaded-file';\n\nexport async function* readFilesFromDataTransfer(dataTransfer: DataTransfer) {\n  const entries: FileSystemEntry[] = [];\n\n  // Pull out all entries before reading them, otherwise\n  // some entries will be lost due to recursion with promises\n  for (const item of dataTransfer.items) {\n    if (item.kind === 'file') {\n      const entry = item.webkitGetAsEntry();\n      if (entry) {\n        entries.push(entry);\n      }\n    }\n  }\n\n  for (const entry of entries) {\n    if (entry.isFile) {\n      if (entry.name === '.DS_Store') continue;\n      const file = await getEntryFile(entry as FileSystemFileEntry);\n      yield new UploadedFile(file, entry.fullPath);\n    } else if (entry.isDirectory) {\n      yield* getEntriesFromDirectory(entry as FileSystemDirectoryEntry);\n    }\n  }\n}\n\nasync function* getEntriesFromDirectory(\n  item: FileSystemDirectoryEntry\n): AsyncIterable<any> {\n  const reader = item.createReader();\n\n  // We must call readEntries repeatedly because there may be a limit to the\n  // number of entries that are returned at once.\n  let entries: FileSystemEntry[];\n  do {\n    entries = await new Promise((resolve, reject) => {\n      reader.readEntries(resolve, reject);\n    });\n\n    for (const entry of entries) {\n      if (entry.isFile) {\n        if (entry.name === '.DS_Store') continue;\n        const file = await getEntryFile(entry as FileSystemFileEntry);\n        yield new UploadedFile(file, entry.fullPath);\n      } else if (entry.isDirectory) {\n        yield* getEntriesFromDirectory(entry as FileSystemDirectoryEntry);\n      }\n    }\n  } while (entries.length > 0);\n}\n\nfunction getEntryFile(entry: FileSystemFileEntry): Promise<File> {\n  return new Promise((resolve, reject) => entry.file(resolve, reject));\n}\n","export async function asyncIterableToArray<T>(\n  iterator: AsyncIterable<T>\n): Promise<T[]> {\n  const items: T[] = [];\n  for await (const item of iterator) {\n    items.push(item);\n  }\n  return items;\n}\n","import React, {RefObject, useLayoutEffect, useRef} from 'react';\nimport {draggables, dragSession, droppables} from './drag-state';\nimport {readFilesFromDataTransfer} from './read-files-from-data-transfer';\nimport {asyncIterableToArray} from '@common/utils/array/async-iterable-to-array';\nimport {InteractableRect} from '../interactable-event';\nimport {DraggableId, MixedDraggable} from './use-draggable';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\nexport interface ConnectedDroppable {\n  id: DraggableId;\n  rect?: InteractableRect;\n  disabled?: boolean;\n  ref: RefObject<HTMLElement>;\n}\n\n// File dragged in from desktop\nexport interface NativeFileDraggable {\n  type: 'nativeFile';\n  el: null;\n  ref: null;\n  getData: () => Promise<UploadedFile[]>;\n}\n\ninterface UseDroppableProps<T extends HTMLElement> {\n  id: DraggableId;\n  disabled?: boolean;\n  types: ('nativeFile' | string)[];\n  ref: RefObject<T>;\n  // this will fire dragEnter/dragLeave/dragOver events when same element is both draggable and drop target and dragging target over itself. Used for showing line previews before/after element during sort.\n  allowDragEventsFromItself?: boolean;\n  onDragEnter?: (target: MixedDraggable) => void;\n  onDragLeave?: (target: MixedDraggable) => void;\n  onDragOver?: (\n    target: MixedDraggable,\n    e: React.DragEvent<HTMLElement>\n  ) => void;\n  // Handler that is called after draggable is held over droppable for a period of time.\n  // This typically opens the item so that the user can drop within it.\n  onDropActivate?: (e: MixedDraggable) => void;\n  onDrop?: (target: MixedDraggable) => void | Promise<void> | false;\n  acceptsDrop?: (target: MixedDraggable) => boolean;\n}\n\ninterface DroppableState {\n  dragOverElements: Set<Element>;\n  dropActivateTimer: ReturnType<typeof setTimeout> | undefined;\n}\n\nconst DROP_ACTIVATE_TIMEOUT = 400;\n\nexport function useDroppable<T extends HTMLElement>({\n  id,\n  disabled,\n  ref,\n  ...options\n}: UseDroppableProps<T>) {\n  const state = useRef<DroppableState>({\n    dragOverElements: new Set<Element>(),\n    dropActivateTimer: undefined,\n  }).current;\n\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  useLayoutEffect(() => {\n    droppables.set(id, {\n      ...droppables.get(id),\n      disabled,\n      id,\n      ref,\n    });\n    return () => {\n      droppables.delete(id);\n    };\n  }, [id, optionsRef, disabled, ref]);\n\n  // check if drop target accepts drag target\n  const canDrop = (draggable: MixedDraggable): boolean => {\n    const options = optionsRef.current;\n\n    const allowEventsOnSelf =\n      options.allowDragEventsFromItself ||\n      ref.current !== draggable.ref?.current;\n\n    return !!(\n      draggable?.type &&\n      allowEventsOnSelf &&\n      options.types.includes(draggable.type) &&\n      (!options.acceptsDrop || options.acceptsDrop(draggable))\n    );\n  };\n\n  const fireDragLeave = (e: React.DragEvent<HTMLElement>) => {\n    const draggable = getDraggable(e);\n    if (draggable) {\n      optionsRef.current.onDragLeave?.(draggable);\n    }\n  };\n\n  const onDragEnter = (e: React.DragEvent<HTMLElement>) => {\n    e.stopPropagation();\n\n    state.dragOverElements.add(e.target as Element);\n    if (state.dragOverElements.size > 1) {\n      return;\n    }\n\n    const draggable = getDraggable(e);\n    if (draggable && canDrop(draggable)) {\n      optionsRef.current.onDragEnter?.(draggable);\n\n      clearTimeout(state.dropActivateTimer);\n      if (typeof optionsRef.current.onDropActivate === 'function') {\n        state.dropActivateTimer = setTimeout(() => {\n          if (draggable) {\n            optionsRef.current.onDropActivate?.(draggable);\n          }\n        }, DROP_ACTIVATE_TIMEOUT);\n      }\n    }\n  };\n\n  const onDragLeave = (e: React.DragEvent<HTMLElement>) => {\n    e.stopPropagation();\n\n    // Track all the targets of dragenter events in a set, and remove them\n    // in dragleave. When the set becomes empty, we've left the drop target completely.\n    // We must also remove any elements that are no longer in the DOM, because dragleave\n    // events will never be fired for these. This can happen, for example, with drop\n    // indicators between items, which disappear when the drop target changes.\n    state.dragOverElements.delete(e.target as Element);\n    for (const element of state.dragOverElements) {\n      if (!e.currentTarget.contains(element)) {\n        state.dragOverElements.delete(element);\n      }\n    }\n\n    if (state.dragOverElements.size > 0) {\n      return;\n    }\n\n    const draggable = getDraggable(e);\n    if (draggable && canDrop(draggable)) {\n      fireDragLeave(e);\n      clearTimeout(state.dropActivateTimer);\n    }\n  };\n\n  const onDrop = async (e: React.DragEvent<HTMLElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n    state.dragOverElements.clear();\n\n    fireDragLeave(e);\n    clearTimeout(state.dropActivateTimer);\n\n    const draggable = getDraggable(e);\n    if (draggable) {\n      optionsRef.current.onDragLeave?.(draggable);\n\n      // drop target does not accept this type of droppable\n      if (!canDrop(draggable)) {\n        if (dragSession.status !== 'inactive') {\n          dragSession.status = 'dropFail';\n        }\n        // drop target accepts this type, but it might still reject the drop in callback\n      } else {\n        // allow callback to mark drop as failed\n        const dropResult = optionsRef.current.onDrop?.(draggable);\n\n        // drag session will only be active for draggables within the app, never for files dragged in from desktop\n        if (dragSession.status !== 'inactive') {\n          dragSession.status =\n            dropResult === false ? 'dropFail' : 'dropSuccess';\n        }\n      }\n    }\n  };\n\n  const droppableProps = {\n    onDragOver: (e: React.DragEvent<HTMLElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n      const draggable = getDraggable(e);\n      if (draggable && canDrop(draggable)) {\n        optionsRef.current.onDragOver?.(draggable, e);\n      }\n    },\n    onDragEnter,\n    onDragLeave,\n    onDrop,\n  };\n\n  return {\n    droppableProps: disabled ? {} : droppableProps,\n  };\n}\n\nfunction getDraggable(\n  e: React.DragEvent<HTMLElement>\n): MixedDraggable | undefined {\n  if (dragSession.dragTargetId != null) {\n    return draggables.get(dragSession.dragTargetId);\n  } else if (e.dataTransfer.types.includes('Files')) {\n    return {\n      type: 'nativeFile',\n      el: null,\n      ref: null,\n      getData: () => {\n        return asyncIterableToArray(readFilesFromDataTransfer(e.dataTransfer));\n      },\n    };\n  }\n}\n","import {clamp} from '../number/clamp';\n\nexport function moveItemInArray<T = any>(\n  array: T[],\n  fromIndex: number,\n  toIndex: number\n): T[] {\n  const from = clamp(fromIndex, 0, array.length - 1);\n  const to = clamp(toIndex, 0, array.length - 1);\n\n  if (from === to) {\n    return array;\n  }\n\n  const target = array[from];\n  const delta = to < from ? -1 : 1;\n\n  for (let i = from; i !== to; i += delta) {\n    array[i] = array[i + delta];\n  }\n\n  array[to] = target;\n\n  return array;\n}\n","export function moveItemInNewArray<T>(\n  array: T[],\n  from: number,\n  to: number\n): T[] {\n  const newArray = array.slice();\n  newArray.splice(\n    to < 0 ? newArray.length + to : to,\n    0,\n    newArray.splice(from, 1)[0]\n  );\n\n  return newArray;\n}\n","import {DraggableId, DragPreviewRenderer, useDraggable} from './use-draggable';\nimport {useDroppable} from './use-droppable';\nimport {RefObject, useEffect, useRef} from 'react';\nimport {getScrollParent, mergeProps} from '@react-aria/utils';\nimport {moveItemInArray} from '@common/utils/array/move-item-in-array';\nimport {droppables} from './drag-state';\nimport {moveItemInNewArray} from '@common/utils/array/move-item-in-new-array';\nimport {updateRects} from '@common/ui/interactions/dnd/update-rects';\n\nlet sortSession: null | {\n  // items in this list will be moved when user is sorting\n  sortables: DraggableId[];\n\n  // sortable user started dragging to start this session\n  activeSortable: DraggableId;\n  activeIndex: number;\n\n  // final index sortable was dropped in and should be moved to\n  finalIndex: number;\n\n  // drop position for displaying line preview\n  dropPosition: DropPosition;\n  // element that currently has a line preview at the top or bottom\n  linePreviewEl?: HTMLElement;\n  scrollParent?: Element;\n  scrollListener: () => void;\n} = null;\n\nexport type DropPosition = 'before' | 'after' | null;\n\nexport interface UseSortableProps {\n  item: DraggableId;\n  items: DraggableId[];\n  onSortStart?: () => void;\n  onSortEnd?: (oldIndex: number, newIndex: number) => void;\n  onDragEnd?: () => void;\n  onDropPositionChange?: (dropPosition: DropPosition) => void;\n  ref: RefObject<HTMLElement>;\n  type: string;\n  preview?: RefObject<DragPreviewRenderer>;\n  previewVariant?: 'line' | 'liveSort';\n  disabled?: boolean;\n}\nexport function useSortable({\n  item,\n  items,\n  type,\n  ref,\n  onSortEnd,\n  onSortStart,\n  onDragEnd,\n  preview,\n  disabled,\n  onDropPositionChange,\n  previewVariant = 'liveSort',\n}: UseSortableProps) {\n  const dropPosition = useRef<DropPosition>(null);\n\n  // todo: issue with sorting after scrolling menu editor item list\n\n  // update sortables and active index, in case we lazy load more items while sorting\n  useEffect(() => {\n    if (sortSession && sortSession.sortables.length !== items.length) {\n      sortSession.sortables = [...items];\n      sortSession.activeIndex = items.indexOf(item);\n    }\n  }, [items, item]);\n\n  const {draggableProps, dragHandleRef} = useDraggable({\n    id: item,\n    ref,\n    type,\n    preview,\n    disabled,\n    onDragStart: () => {\n      dropPosition.current = null;\n      sortSession = {\n        sortables: [...items],\n        activeSortable: item,\n        activeIndex: items.indexOf(item),\n        finalIndex: items.indexOf(item),\n        dropPosition: null,\n        scrollParent: ref.current ? getScrollParent(ref.current) : undefined,\n        scrollListener: () => {\n          updateRects(droppables);\n        },\n      };\n\n      if (previewVariant === 'liveSort') {\n        addSortStyles();\n      }\n      onSortStart?.();\n      sortSession.scrollParent?.addEventListener(\n        'scroll',\n        sortSession.scrollListener\n      );\n    },\n    onDragEnd: () => {\n      if (!sortSession) return;\n\n      if (previewVariant === 'liveSort') {\n        removeSortStyles();\n      }\n\n      sortSession.dropPosition = null;\n      onDropPositionChange?.(sortSession.dropPosition);\n      if (sortSession.activeIndex !== sortSession.finalIndex) {\n        onSortEnd?.(sortSession.activeIndex, sortSession.finalIndex);\n      }\n      sortSession.scrollParent?.removeEventListener(\n        'scroll',\n        sortSession.scrollListener\n      );\n      clearLinePreview();\n      // call \"onDragEnd\" after \"onSortEnd\", so listener has a chance to use sort session data\n      onDragEnd?.();\n      sortSession = null;\n    },\n    getData: () => {},\n  });\n\n  const {droppableProps} = useDroppable({\n    id: item,\n    ref,\n    types: [type],\n    disabled,\n    allowDragEventsFromItself: true,\n    onDragOver: (target, e) => {\n      if (!sortSession || previewVariant !== 'line') {\n        return;\n      }\n\n      const previousPosition = sortSession.dropPosition;\n      let newPosition: DropPosition = null;\n\n      const rect = droppables.get(item)?.rect;\n      if (rect) {\n        const midY = rect.top + rect.height / 2;\n        if (e.clientY <= midY) {\n          newPosition = 'before';\n        } else if (e.clientY >= midY) {\n          newPosition = 'after';\n        }\n      }\n\n      if (newPosition !== previousPosition) {\n        const overIndex = sortSession.sortables.indexOf(item);\n        sortSession.dropPosition = newPosition;\n        onDropPositionChange?.(sortSession.dropPosition);\n\n        clearLinePreview();\n        if (ref.current) {\n          if (sortSession.dropPosition === 'after') {\n            addLinePreview(ref.current, 'bottom');\n          } else {\n            // if it's the first row, add preview to the top border, as there's no previous element\n            if (overIndex === 0) {\n              addLinePreview(ref.current, 'top');\n              // otherwise add preview to the bottom border of the previous row\n            } else {\n              const droppableId = sortSession.sortables[overIndex - 1];\n              const droppable = droppables.get(droppableId);\n              if (droppable?.ref.current) {\n                addLinePreview(droppable.ref.current, 'bottom');\n              }\n            }\n          }\n        }\n\n        const itemIndex = items.indexOf(item);\n\n        // don't move item at all if hovering over itself\n        if (sortSession.activeIndex === itemIndex) {\n          sortSession.finalIndex = sortSession.activeIndex;\n          return;\n        }\n\n        // adjust final drop index based on whether we're dropping drag target after or before it's original index\n        // this is needed, so we get the same index if target is dropped after current item or before next item\n        const dragDirection =\n          overIndex > sortSession.activeIndex ? 'after' : 'before';\n        if (dragDirection === 'after') {\n          sortSession.finalIndex =\n            sortSession.dropPosition === 'before' ? itemIndex - 1 : itemIndex;\n        } else {\n          sortSession.finalIndex =\n            sortSession.dropPosition === 'after' ? itemIndex + 1 : itemIndex;\n        }\n      }\n    },\n    onDragEnter: () => {\n      if (!sortSession || previewVariant === 'line') return;\n\n      const overIndex = sortSession.sortables.indexOf(item);\n      const oldIndex = sortSession.sortables.indexOf(\n        sortSession.activeSortable\n      );\n\n      moveItemInArray(sortSession.sortables, oldIndex, overIndex);\n      const rects = sortSession.sortables.map(s => droppables.get(s)?.rect);\n\n      sortSession.sortables.forEach((sortable, index) => {\n        if (!sortSession) return;\n\n        const newRects = moveItemInNewArray(\n          rects,\n          overIndex,\n          sortSession.activeIndex\n        );\n        const oldRect = rects[index];\n        const newRect = newRects[index];\n        const sortableTarget = droppables.get(sortable);\n\n        if (sortableTarget?.ref.current && newRect && oldRect) {\n          const x = newRect.left - oldRect.left;\n          const y = newRect.top - oldRect.top;\n          sortableTarget.ref.current.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n        }\n      });\n\n      sortSession.finalIndex = overIndex;\n    },\n    onDragLeave: () => {\n      if (!sortSession || previewVariant !== 'line') {\n        return;\n      }\n      sortSession.dropPosition = null;\n      onDropPositionChange?.(sortSession.dropPosition);\n    },\n  });\n\n  return {\n    sortableProps: {...mergeProps(draggableProps, droppableProps)},\n    dragHandleRef,\n  };\n}\n\nconst transition = 'transform 0.2s cubic-bezier(0.2, 0, 0, 1)';\n\nfunction addSortStyles() {\n  if (!sortSession) return;\n  sortSession.sortables.forEach((sortable, index) => {\n    const droppable = droppables.get(sortable);\n    if (!droppable?.ref.current) return;\n\n    droppable.ref.current.style.transition = transition;\n\n    if (sortSession?.activeIndex === index) {\n      droppable.ref.current.style.opacity = '0.4';\n    }\n  });\n}\n\n// clear any styles and transforms applied to sortables during sorting\nfunction removeSortStyles() {\n  if (!sortSession) return;\n  sortSession.sortables.forEach(sortable => {\n    const droppable = droppables.get(sortable);\n    if (droppable?.ref.current) {\n      droppable.ref.current.style.transform = '';\n      droppable.ref.current.style.transition = '';\n      droppable.ref.current.style.opacity = '';\n      droppable.ref.current.style.zIndex = '';\n    }\n  });\n}\n\nfunction clearLinePreview() {\n  if (sortSession?.linePreviewEl) {\n    sortSession.linePreviewEl.style.borderBottomColor = '';\n    sortSession.linePreviewEl.style.borderTopColor = '';\n    sortSession.linePreviewEl = undefined;\n  }\n}\n\nfunction addLinePreview(el: HTMLElement, side: 'top' | 'bottom') {\n  const color = 'rgb(var(--be-primary))';\n  if (side === 'top') {\n    el.style.borderTopColor = color;\n  } else {\n    el.style.borderBottomColor = color;\n  }\n  if (sortSession) {\n    sortSession.linePreviewEl = el;\n  }\n}\n","import React, {MutableRefObject, ReactNode, Suspense, useState} from 'react';\nimport {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../i18n/trans';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {ProgressCircle} from '../ui/progress/progress-circle';\nimport {useDialogContext} from '../ui/overlays/dialog/dialog-context';\nimport {DialogFooter} from '../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../ui/buttons/button';\nimport type ReactAce from 'react-ace';\n\nconst AceEditor = React.lazy(() => import('./ace-editor'));\n\ninterface TextEditorSourcecodeDialogProps {\n  defaultValue: string;\n  mode?: 'css' | 'html' | 'php_laravel_blade';\n  title: ReactNode;\n  onSave?: (value?: string) => void;\n  isSaving?: boolean;\n  footerStartAction?: ReactNode;\n  beautify?: boolean;\n  editorRef?: MutableRefObject<ReactAce | null>;\n}\nexport function AceDialog({\n  defaultValue,\n  mode = 'html',\n  title,\n  onSave,\n  isSaving,\n  footerStartAction,\n  beautify,\n  editorRef,\n}: TextEditorSourcecodeDialogProps) {\n  const [value, setValue] = useState(defaultValue);\n  const [isValid, setIsValid] = useState<boolean>(true);\n\n  return (\n    <Dialog size=\"fullscreen\" className=\"h-full w-full\">\n      <DialogHeader>{title}</DialogHeader>\n      <DialogBody className=\"relative flex-auto\" padding=\"p-0\">\n        <Suspense\n          fallback={\n            <div className=\"flex h-400 w-full items-center justify-center\">\n              <ProgressCircle\n                aria-label=\"Loading editor...\"\n                isIndeterminate\n                size=\"md\"\n              />\n            </div>\n          }\n        >\n          <AceEditor\n            beautify={beautify}\n            mode={mode}\n            onChange={newValue => setValue(newValue)}\n            defaultValue={value || ''}\n            onIsValidChange={setIsValid}\n            editorRef={editorRef}\n          />\n        </Suspense>\n      </DialogBody>\n      <Footer\n        disabled={!isValid || isSaving}\n        value={value}\n        onSave={onSave}\n        startAction={footerStartAction}\n      />\n    </Dialog>\n  );\n}\n\ninterface FooterProps {\n  disabled: boolean | undefined;\n  value?: string;\n  onSave?: (value?: string) => void;\n  startAction?: ReactNode;\n}\nfunction Footer({disabled, value, onSave, startAction}: FooterProps) {\n  const {close} = useDialogContext();\n  return (\n    <DialogFooter dividerTop startAction={startAction}>\n      <Button onClick={() => close()}>\n        <Trans message=\"Cancel\" />\n      </Button>\n      <Button\n        disabled={disabled}\n        variant=\"flat\"\n        color=\"primary\"\n        onClick={() => {\n          if (onSave) {\n            onSave(value);\n          } else {\n            close(value);\n          }\n        }}\n      >\n        <Trans message=\"Save\" />\n      </Button>\n    </DialogFooter>\n  );\n}\n","export default \"__VITE_ASSET__8acde003__\"","import {Permission} from './permission';\nimport {Subscription} from '../billing/subscription';\nimport {Role} from './role';\nimport {SocialProfile} from './social-profile';\nimport {AccessToken} from './access-token';\nimport type {ActiveSession} from '@common/auth/ui/account-settings/sessions-panel/requests/use-user-sessions';\n\nexport const USER_MODEL = 'user';\n\nexport interface User {\n  id: number;\n  display_name: string;\n  username?: string;\n  first_name?: string;\n  last_name?: string;\n  avatar?: string;\n  email_verified_at: string;\n  permissions?: Permission[];\n  email: string;\n  password: string;\n  language: string;\n  timezone: string;\n  country: string;\n  created_at: string;\n  updated_at: string;\n  subscriptions?: Omit<Subscription, 'user'>[];\n  roles: Role[];\n  social_profiles: SocialProfile[];\n  tokens?: AccessToken[];\n  has_password: boolean;\n  available_space: number | null;\n  unread_notifications_count?: number;\n  card_last_four?: number;\n  card_brand?: string;\n  card_expires?: string;\n  model_type: typeof USER_MODEL;\n  banned_at?: string;\n  followed_users?: Omit<User, 'followed_users' | 'followers'>[];\n  followers_count?: number;\n  followed_users_count?: number;\n  followers?: Omit<User, 'followed_users' | 'followers'>[];\n  last_login?: ActiveSession;\n  bans?: {\n    id: number;\n    comment: string;\n    expired_at?: string;\n  }[];\n  two_factor_confirmed_at?: string;\n  two_factor_recovery_codes?: string[];\n}\n","import {\n  BackendFilter,\n  FilterControlType,\n  FilterOperator,\n} from '../../datatable/filters/backend-filter';\nimport {message} from '../../i18n/message';\nimport {USER_MODEL} from '../../auth/user';\nimport {SiteConfigContextValue} from '@common/core/settings/site-config-context';\nimport {\n  createdAtFilter,\n  updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const CustomPageDatatableFilters = (\n  config: SiteConfigContextValue\n): BackendFilter[] => {\n  const dynamicFilters: BackendFilter[] =\n    config.customPages.types.length > 1\n      ? [\n          {\n            control: {\n              type: FilterControlType.Select,\n              defaultValue: 'default',\n              options: config.customPages.types.map(type => ({\n                value: type.type,\n                label: type.label,\n                key: type.type,\n              })),\n            },\n\n            key: 'type',\n            label: message('Type'),\n            description: message('Type of the page'),\n            defaultOperator: FilterOperator.eq,\n          },\n        ]\n      : [];\n\n  return [\n    {\n      key: 'user_id',\n      label: message('User'),\n      description: message('User page was created by'),\n      defaultOperator: FilterOperator.eq,\n      control: {\n        type: FilterControlType.SelectModel,\n        model: USER_MODEL,\n      },\n    },\n    ...dynamicFilters,\n    createdAtFilter({\n      description: message('Date page was created'),\n    }),\n    updatedAtFilter({\n      description: message('Date page was last updated'),\n    }),\n  ];\n};\n","import {parseColor} from '@react-stately/color';\n\nexport function themeValueToHex(value: string): string {\n  try {\n    return parseColor(`rgb(${value.split(' ').join(',')})`).toString('hex');\n  } catch (e) {\n    return value;\n  }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TuneIcon = createSvgIcon(\n  <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n, 'TuneOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoreVertIcon = createSvgIcon(\n  <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n, 'MoreVertOutlined');\n","import React, {RefObject} from 'react';\n\nexport interface TabsContext {\n  selectedTab: number;\n  setSelectedTab: (newTab: number) => void;\n  tabsRef: RefObject<HTMLElement[]>;\n  size: 'sm' | 'md';\n  isLazy?: boolean;\n  id: string;\n}\n\nexport const TabContext = React.createContext<TabsContext>(null!);\n","import React, {ReactElement, useId, useMemo, useRef} from 'react';\nimport clsx from 'clsx';\nimport {useControlledState} from '@react-stately/utils';\nimport {TabContext, TabsContext} from './tabs-context';\nimport {TabListProps} from './tab-list';\nimport {TabPanelsProps} from './tab-panels';\n\nexport interface TabsProps {\n  children: [ReactElement<TabListProps>, ReactElement<TabPanelsProps>];\n  size?: 'sm' | 'md';\n  className?: string;\n  selectedTab?: number;\n  defaultSelectedTab?: number;\n  onTabChange?: (newTab: number) => void;\n  isLazy?: boolean;\n  overflow?: string;\n}\n\nexport function Tabs(props: TabsProps) {\n  const {\n    size = 'md',\n    children,\n    className,\n    isLazy,\n    overflow = 'overflow-hidden',\n  } = props;\n\n  const tabsRef = useRef<HTMLButtonElement[]>([]);\n  const id = useId();\n\n  const [selectedTab, setSelectedTab] = useControlledState(\n    props.selectedTab,\n    props.defaultSelectedTab || 0,\n    props.onTabChange\n  );\n\n  const ContextValue: TabsContext = useMemo(() => {\n    return {\n      selectedTab,\n      setSelectedTab,\n      tabsRef,\n      size,\n      isLazy,\n      id,\n    };\n  }, [selectedTab, id, isLazy, setSelectedTab, size]);\n\n  return (\n    <TabContext.Provider value={ContextValue}>\n      <div className={clsx(className, overflow, 'max-w-full')}>{children}</div>\n    </TabContext.Provider>\n  );\n}\n","import React, {useContext, useState} from 'react';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport clsx from 'clsx';\nimport {TabContext} from './tabs-context';\n\ninterface TabLineStyle {\n  width?: string;\n  transform?: string;\n  className?: string;\n}\n\nexport function TabLine() {\n  const {tabsRef, selectedTab} = useContext(TabContext);\n  const [style, setStyle] = useState<TabLineStyle>({\n    width: undefined,\n    transform: undefined,\n    className: undefined,\n  });\n\n  useLayoutEffect(() => {\n    if (selectedTab != null && tabsRef.current) {\n      const el = tabsRef.current[selectedTab];\n      if (!el) return;\n\n      setStyle(prevState => {\n        return {\n          width: `${el.offsetWidth}px`,\n          transform: `translateX(${el.offsetLeft}px)`,\n          // disable initial transition for tabline\n          className: prevState.width === undefined ? '' : 'transition-all',\n        };\n      });\n    }\n  }, [setStyle, selectedTab, tabsRef]);\n\n  return (\n    <div\n      className={clsx(\n        'absolute bottom-0 left-0 h-2 bg-primary',\n        style.className\n      )}\n      role=\"presentation\"\n      style={{width: style.width, transform: style.transform}}\n    />\n  );\n}\n","import React, {Children, cloneElement, isValidElement, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {FocusScope} from '@react-aria/focus';\nimport {TabProps} from './tab';\nimport {TabLine} from './tab-line';\n\nexport interface TabListProps {\n  children: ReactNode;\n  // center tabs within tablist\n  center?: boolean;\n  // expand tabs to fill in tablist space fully. By default, tabs are only as wide as their content.\n  expand?: boolean;\n  className?: string;\n}\nexport function TabList({children, center, expand, className}: TabListProps) {\n  const childrenArray = Children.toArray(children);\n\n  return (\n    <FocusScope>\n      <div\n        className={clsx(\n          // hide scrollbar completely on mobile, show compact one on desktop\n          'flex relative max-w-full overflow-auto border-b max-sm:hidden-scrollbar md:compact-scrollbar',\n          className\n        )}\n        role=\"tablist\"\n        aria-orientation=\"horizontal\"\n      >\n        {childrenArray.map((child, index) => {\n          if (isValidElement<TabProps>(child)) {\n            return cloneElement<TabProps>(child, {\n              index,\n              className: clsx(\n                child.props.className,\n                expand && 'flex-auto',\n                center && index === 0 && 'ml-auto',\n                center && index === childrenArray.length - 1 && 'mr-auto'\n              ),\n            });\n          }\n          return null;\n        })}\n        <TabLine />\n      </div>\n    </FocusScope>\n  );\n}\n","import React, {JSXElementConstructor, ReactNode, useContext} from 'react';\nimport clsx from 'clsx';\nimport {useFocusManager} from '@react-aria/focus';\nimport {TabContext} from './tabs-context';\nimport {LinkProps} from 'react-router-dom';\n\nexport interface TabProps {\n  className?: string;\n  index?: number;\n  children: ReactNode;\n  isDisabled?: boolean;\n  padding?: string;\n  elementType?: 'button' | 'a' | JSXElementConstructor<any>;\n  to?: LinkProps['to'];\n  relative?: LinkProps['relative'];\n  replace?: LinkProps['replace'];\n  width?: string;\n}\nexport function Tab({\n  index,\n  className,\n  isDisabled,\n  children,\n  padding: paddingProp,\n  elementType = 'button',\n  to,\n  relative,\n  width = 'min-w-min',\n}: TabProps) {\n  const {\n    selectedTab,\n    setSelectedTab,\n    tabsRef,\n    size = 'md',\n    id,\n  } = useContext(TabContext);\n  const isSelected = index === selectedTab;\n  const focusManager = useFocusManager();\n  const padding = paddingProp || (size === 'sm' ? 'px-12' : 'px-18');\n\n  const mergedClassname = clsx(\n    'tracking-wide overflow-hidden capitalize text-sm flex items-center justify-center outline-none transition-colors',\n    'focus-visible:ring focus-visible:ring-2 ring-inset rounded whitespace-nowrap cursor-pointer',\n    width,\n    textColor({isDisabled, isSelected}),\n    className,\n    size === 'md' && `${padding} h-48`,\n    size === 'sm' && `${padding} h-32`,\n    isDisabled && 'pointer-events-none',\n  );\n\n  const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n    switch (e.key) {\n      case 'ArrowLeft':\n        focusManager?.focusPrevious();\n        break;\n      case 'ArrowRight':\n        focusManager?.focusNext();\n        break;\n      case 'Home':\n        focusManager?.focusFirst();\n        break;\n      case 'End':\n        focusManager?.focusLast();\n        break;\n    }\n  };\n\n  const tabIndex = isSelected ? 0 : -1;\n  const Element = elementType;\n\n  return (\n    <Element\n      disabled={isDisabled}\n      id={`${id}-${index}-tab`}\n      aria-controls={`${id}-${index}-tabpanel`}\n      type=\"button\"\n      role=\"tab\"\n      aria-selected={isSelected}\n      tabIndex={isDisabled ? undefined : tabIndex}\n      onKeyDown={onKeyDown}\n      onClick={() => {\n        setSelectedTab(index!);\n      }}\n      to={to}\n      relative={relative}\n      className={mergedClassname}\n      ref={(el: HTMLElement) => {\n        if (tabsRef.current && el) {\n          tabsRef.current[index!] = el;\n        }\n      }}\n    >\n      {children}\n    </Element>\n  );\n}\n\ninterface TextColorProps {\n  isDisabled?: boolean;\n  isSelected: boolean;\n}\nfunction textColor({isDisabled, isSelected}: TextColorProps): string {\n  if (isDisabled) {\n    return 'text-disabled cursor-default';\n  }\n  if (isSelected) {\n    return 'text-primary';\n  }\n  return 'text-muted hover:text-main';\n}\n","import React, {\n  Children,\n  cloneElement,\n  ComponentPropsWithoutRef,\n  isValidElement,\n  ReactElement,\n  ReactNode,\n  useContext,\n  useRef,\n  useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport {getFocusableTreeWalker} from '@react-aria/focus';\nimport {TabContext} from './tabs-context';\n\nexport interface TabPanelsProps {\n  children: ReactNode;\n  className?: string;\n}\nexport function TabPanels({children, className}: TabPanelsProps) {\n  const {selectedTab, isLazy} = useContext(TabContext);\n\n  // filter out falsy values, in case of conditional rendering\n  const panelArray = Children.toArray(children).filter(p => !!p);\n\n  let rendered: ReactNode;\n  if (isLazy) {\n    const el = panelArray[selectedTab] as ReactElement;\n    rendered = isValidElement(el)\n      ? cloneElement<TabPanelProps>(panelArray[selectedTab] as ReactElement, {\n          index: selectedTab,\n        })\n      : null;\n  } else {\n    rendered = panelArray.map((panel, index) => {\n      if (isValidElement<TabPanelsProps>(panel)) {\n        const isSelected = index === selectedTab;\n        return cloneElement<TabPanelProps>(panel, {\n          index,\n          'aria-hidden': !isSelected,\n          className: !isSelected\n            ? clsx(panel.props.className, 'hidden')\n            : panel.props.className,\n        });\n      }\n      return null;\n    });\n  }\n\n  return <div className={className}>{rendered}</div>;\n}\n\ninterface TabPanelProps extends ComponentPropsWithoutRef<'div'> {\n  className?: string;\n  children: ReactNode;\n  index?: number;\n}\nexport function TabPanel({\n  className,\n  children,\n  index,\n  ...domProps\n}: TabPanelProps) {\n  const {id} = useContext(TabContext);\n\n  const [tabIndex, setTabIndex] = useState<number | undefined>(0);\n  const ref = useRef<HTMLDivElement>(null);\n\n  // The tabpanel should have tabIndex=0 when there are no tabbable elements within it.\n  // Otherwise, tabbing from the focused tab should go directly to the first tabbable element\n  // within the tabpanel.\n  useLayoutEffect(() => {\n    if (ref?.current) {\n      const update = () => {\n        // Detect if there are any tabbable elements and update the tabIndex accordingly.\n        const walker = getFocusableTreeWalker(ref.current!, {tabbable: true});\n        setTabIndex(walker.nextNode() ? undefined : 0);\n      };\n\n      update();\n\n      // Update when new elements are inserted, or the tabIndex/disabled attribute updates.\n      const observer = new MutationObserver(update);\n      observer.observe(ref.current, {\n        subtree: true,\n        childList: true,\n        attributes: true,\n        attributeFilter: ['tabIndex', 'disabled'],\n      });\n\n      return () => {\n        observer.disconnect();\n      };\n    }\n  }, [ref]);\n\n  return (\n    <div\n      tabIndex={tabIndex}\n      ref={ref}\n      id={`${id}-${index}-tabpanel`}\n      aria-labelledby={`${id}-${index}-tab`}\n      className={clsx(className, 'focus-visible:outline-primary-light')}\n      role=\"tabpanel\"\n      {...domProps}\n    >\n      {children}\n    </div>\n  );\n}\n","import {ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface SectionHelperProps {\n  title?: ReactNode;\n  description?: ReactNode;\n  actions?: ReactNode;\n  color?: 'positive' | 'danger' | 'warning' | 'primary' | 'neutral';\n  className?: string;\n}\nexport function SectionHelper({\n  title,\n  description,\n  actions,\n  color = 'primary',\n  className,\n}: SectionHelperProps) {\n  return (\n    <div\n      className={clsx(\n        className,\n        'p-10 rounded',\n        color === 'positive' &&\n          'bg-positive/focus border-l-positive border-l-4',\n        color === 'warning' && 'bg-warning/focus border-l-warning border-l-4',\n        color === 'danger' && 'bg-danger/focus border-l-danger border-l-4',\n        color === 'primary' && 'bg-primary/focus border-l-primary border-l-4',\n        color === 'neutral' && 'bg-paper border'\n      )}\n    >\n      {title && <div className=\"text-sm mb-4 font-medium\">{title}</div>}\n      {description && <div className=\"text-sm\">{description}</div>}\n      {actions && <div className=\"mt-14\">{actions}</div>}\n    </div>\n  );\n}\n","import {useCallback, useRef, useState} from 'react';\n\nexport function useStickySentinel() {\n  const [isSticky, setIsSticky] = useState(false);\n\n  const observerRef = useRef<IntersectionObserver>();\n\n  const sentinelRef = useCallback((sentinel: HTMLDivElement | null) => {\n    if (sentinel) {\n      const observer = new IntersectionObserver(\n        ([e]) => setIsSticky(e.intersectionRatio < 1),\n        {threshold: [1]}\n      );\n      observerRef.current = observer;\n      observer.observe(sentinel);\n    } else if (observerRef.current) {\n      observerRef.current?.disconnect();\n    }\n  }, []);\n\n  return {isSticky, sentinelRef};\n}\n","import slugify from 'slugify';\n\nexport function slugifyString(\n  text: string,\n  replacement = '-',\n  strict = false\n): string {\n  if (!text) return text;\n  let slugified = slugify(text, {\n    lower: true,\n    replacement,\n    strict,\n    remove: /[*+~.()'\"!:@?\\|/\\\\]/g,\n  });\n  // some chinese text might not get slugified properly,\n  // just replace whitespace with dash in that case\n  if (!slugified) {\n    slugified = text.replace(/\\s+/g, '-').toLowerCase();\n  }\n  return slugified;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UnfoldMoreIcon = createSvgIcon(\n  <path d=\"M12 5.83 15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z\" />\n, 'UnfoldMoreOutlined');\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 {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {Workspace} from '../types/workspace';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {message} from '../../i18n/message';\n\ninterface Response extends BackendResponse {\n  workspace: Workspace;\n}\n\ninterface Props {\n  name: string;\n}\n\nexport function useCreateWorkspace(form: UseFormReturn<Props>) {\n  return useMutation({\n    mutationFn: (props: Props) => createWorkspace(props),\n    onSuccess: () => {\n      toast(message('Created workspace'));\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n      });\n    },\n    onError: r => onFormQueryError(r, form),\n  });\n}\n\nfunction createWorkspace(props: Props): Promise<Response> {\n  return apiClient.post('workspace', props).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {FormTextField} from '../ui/forms/input-field/text-field/text-field';\nimport {Form} from '../ui/forms/form';\nimport {Button} from '../ui/buttons/button';\nimport {useCreateWorkspace} from './requests/create-workspace';\nimport {DialogFooter} from '../ui/overlays/dialog/dialog-footer';\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 {Trans} from '../i18n/trans';\n\nexport function NewWorkspaceDialog() {\n  const form = useForm<{name: string}>();\n  const {formId, close} = useDialogContext();\n  const createWorkspace = useCreateWorkspace(form);\n\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Create workspace\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          form={form}\n          id={formId}\n          onSubmit={() => {\n            createWorkspace.mutate(form.getValues(), {\n              onSuccess: response => {\n                close(response.workspace.id);\n              },\n            });\n          }}\n        >\n          <FormTextField\n            name=\"name\"\n            autoFocus\n            label={<Trans message=\"Workspace name\" />}\n            minLength={3}\n            required\n          />\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button variant=\"text\" onClick={close}>\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={createWorkspace.isPending}\n        >\n          <Trans message=\"Create\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {WorkspaceQueryKeys} from './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 FetchWorkspaceWithMembersResponse extends BackendResponse {\n  workspace: Workspace;\n}\n\nfunction fetchWorkspaceWithMembers(\n  workspaceId: number,\n): Promise<FetchWorkspaceWithMembersResponse> {\n  return apiClient\n    .get(`workspace/${workspaceId}`)\n    .then(response => response.data);\n}\n\nexport function useWorkspaceWithMembers(workspaceId: number) {\n  return useQuery({\n    queryKey: WorkspaceQueryKeys.workspaceWithMembers(workspaceId),\n    queryFn: () => fetchWorkspaceWithMembers(workspaceId),\n  });\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const GroupIcon = 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, 'GroupOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n  invites: WorkspaceInvite[];\n}\n\ninterface Props {\n  workspaceId: number;\n  emails: string[];\n  roleId: number;\n}\n\nfunction InviteMembers({workspaceId, ...other}: Props): Promise<Response> {\n  return apiClient\n    .post(`workspace/${workspaceId}/invite`, other)\n    .then(r => r.data);\n}\n\nexport function useInviteMembers() {\n  return useMutation({\n    mutationFn: (props: Props) => InviteMembers(props),\n    onSuccess: (response, props) => {\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n      });\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient} from '../../http/query-client';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n  invite: WorkspaceInvite;\n}\n\ninterface Props {\n  workspaceId: number;\n  inviteId: string;\n}\n\nfunction ResendInvite({\n  workspaceId,\n  inviteId,\n  ...other\n}: Props): Promise<Response> {\n  return apiClient\n    .post(`workspace/${workspaceId}/${inviteId}/resend`, other)\n    .then(r => r.data);\n}\n\nexport function useResendInvite() {\n  return useMutation({\n    mutationFn: (props: Props) => ResendInvite(props),\n    onSuccess: () => {\n      toast('Invite sent');\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n","const matcher =\n  /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\nexport function isEmail(string?: string): boolean {\n  if (!string) return false;\n  if (string.length > 320) return false;\n  return matcher.test(string);\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 {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {WorkspaceMember} from '../types/workspace-member';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Props {\n  workspaceId: number;\n  member: WorkspaceMember | WorkspaceInvite;\n  roleId: number;\n}\n\nfunction ChangeRole({workspaceId, member, ...other}: Props): Promise<Response> {\n  const modelType = member.model_type;\n  const memberId =\n    member.model_type === 'invite' ? member.id : member.member_id;\n  return apiClient\n    .post(\n      `workspace/${workspaceId}/${modelType}/${memberId}/change-role`,\n      other,\n    )\n    .then(r => r.data);\n}\n\nexport function useChangeRole() {\n  return useMutation({\n    mutationFn: (props: Props) => ChangeRole(props),\n    onSuccess: (response, props) => {\n      toast(message('Role changed'));\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n      });\n    },\n    onError: err => showHttpErrorToast(err),\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 {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {useAuth} from '../../auth/use-auth';\nimport {useActiveWorkspaceId} from '../active-workspace-id-context';\nimport {PersonalWorkspace} from '../user-workspaces';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Props {\n  workspaceId: number;\n  memberId: number | string;\n  memberType: 'invite' | 'member';\n}\n\nfunction removeMember({\n  workspaceId,\n  memberId,\n  memberType,\n}: Props): Promise<Response> {\n  const endpoint =\n    memberType === 'invite'\n      ? `workspace/invite/${memberId}`\n      : `workspace/${workspaceId}/member/${memberId}`;\n  return apiClient.delete(endpoint).then(r => r.data);\n}\n\nexport function useRemoveMember() {\n  const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n  const {user} = useAuth();\n  return useMutation({\n    mutationFn: (props: Props) => removeMember(props),\n    onSuccess: (response, props) => {\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n      });\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n      });\n\n      // if user left workspace that is currently active, switch to personal workspace\n      if (props.memberId === user?.id && workspaceId === props.workspaceId) {\n        setWorkspaceId(PersonalWorkspace.id);\n      }\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n","import {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {Trans} from '../i18n/trans';\n\ninterface Props {\n  onConfirm?: () => void;\n  isLoading?: boolean;\n}\nexport function LeaveWorkspaceConfirmation({onConfirm, isLoading}: Props) {\n  return (\n    <ConfirmationDialog\n      isDanger\n      title={<Trans message=\"Leave workspace\" />}\n      isLoading={isLoading}\n      onConfirm={onConfirm}\n      body={\n        <div>\n          <Trans message=\"Are you sure you want to leave this workspace?\" />\n          <div className=\"mt-8 font-semibold\">\n            <Trans message=\"All resources you've created in the workspace will be transferred to workspace owner.\" />\n          </div>\n        </div>\n      }\n      confirm={<Trans message=\"Leave\" />}\n    />\n  );\n}\n","import {useEffect, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {useWorkspaceWithMembers} from './requests/workspace-with-members';\nimport {ProgressCircle} from '../ui/progress/progress-circle';\nimport {Workspace} from './types/workspace';\nimport {GroupIcon} from '../icons/material/Group';\nimport {WorkspaceMember} from './types/workspace-member';\nimport {useAuth} from '../auth/use-auth';\nimport {\n  ChipField,\n  ChipValue,\n} from '../ui/forms/input-field/chip-field/chip-field';\nimport {useValueLists} from '../http/value-lists';\nimport {Button} from '../ui/buttons/button';\nimport {ArrowDropDownIcon} from '../icons/material/ArrowDropDown';\nimport {useInviteMembers} from './requests/invite-members';\nimport {WorkspaceInvite} from './types/workspace-invite';\nimport {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {useResendInvite} from './requests/resend-invite';\nimport {isEmail} from '../utils/string/is-email';\nimport {ButtonSize} from '../ui/buttons/button-size';\nimport {useChangeRole} from './requests/change-role';\nimport {IconButton} from '../ui/buttons/icon-button';\nimport {useRemoveMember} from './requests/remove-member';\nimport {CloseIcon} from '../icons/material/Close';\nimport {ExitToAppIcon} from '../icons/material/ExitToApp';\nimport {toast} from '../ui/toast/toast';\nimport {DialogTrigger} from '../ui/overlays/dialog/dialog-trigger';\nimport {Menu, MenuItem, MenuTrigger} from '../ui/navigation/menu/menu-trigger';\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 {Trans} from '../i18n/trans';\nimport {useTrans} from '../i18n/use-trans';\nimport {message} from '../i18n/message';\nimport {LeaveWorkspaceConfirmation} from './leave-workspace-confirmation';\n\ninterface WorkspaceMembersDialogProps {\n  workspace: Workspace;\n}\nexport function WorkspaceMembersDialog({\n  workspace,\n}: WorkspaceMembersDialogProps) {\n  const {data, isLoading} = useWorkspaceWithMembers(workspace.id);\n  return (\n    <Dialog size=\"lg\">\n      <DialogHeader>\n        <Trans message=\"Manage workspace members\" />\n      </DialogHeader>\n      <DialogBody>\n        {isLoading ? (\n          <div className=\"flex items-center justify-center min-h-[238px]\">\n            <ProgressCircle isIndeterminate aria-label=\"Loading workspace...\" />\n          </div>\n        ) : (\n          <Manager workspace={data!.workspace} />\n        )}\n      </DialogBody>\n    </Dialog>\n  );\n}\n\ninterface ManagerProps {\n  workspace: Workspace;\n}\nfunction Manager({workspace}: ManagerProps) {\n  const can = usePermissions(workspace);\n  const members: (WorkspaceMember | WorkspaceInvite)[] = [\n    ...(workspace.members || []),\n    ...(workspace.invites || []),\n  ];\n\n  return (\n    <div>\n      {can.invite && <InviteChipField workspace={workspace} />}\n      <div className=\"flex items-center gap-10 mb-14 text-base\">\n        <GroupIcon className=\"icon-sm\" />\n        <Trans\n          message=\"Members of `:workspace`\"\n          values={{workspace: workspace.name}}\n        />\n      </div>\n      <AnimatePresence initial={false}>\n        {members.map(member => (\n          <MemberListItem\n            key={`${member.model_type}.${member.id}`}\n            workspace={workspace}\n            member={member}\n          />\n        ))}\n      </AnimatePresence>\n    </div>\n  );\n}\n\ninterface MemberListItemProps {\n  member: WorkspaceMember | WorkspaceInvite;\n  workspace: Workspace;\n}\nfunction MemberListItem({workspace, member}: MemberListItemProps) {\n  return (\n    <m.div\n      initial={{x: '-100%', opacity: 0}}\n      animate={{x: 0, opacity: 1}}\n      exit={{x: '100%', opacity: 0}}\n      transition={{type: 'tween', duration: 0.125}}\n      className=\"flex items-start text-sm gap-14 mb-20\"\n      key={`${member.model_type}.${member.id}`}\n    >\n      <img\n        className=\"w-36 h-36 rounded flex-shrink-0\"\n        src={member.avatar}\n        alt=\"\"\n      />\n      <div className=\"md:flex flex-auto items-center justify-between gap-14 min-w-0\">\n        <div className=\"overflow-hidden mb-10 md:mb-0 md:mr-10\">\n          <div className=\"flex items-center justify-start gap-6\">\n            <div className=\"overflow-hidden text-ellipsis whitespace-nowrap\">\n              {member.display_name}\n            </div>\n            <MemberDisplayNameAppend workspace={workspace} member={member} />\n          </div>\n          <div className=\"text-muted\">{member.email}</div>\n        </div>\n        <MemberActions workspace={workspace} member={member} />\n      </div>\n    </m.div>\n  );\n}\n\nfunction usePermissions(workspace: Workspace) {\n  const {user: authUser} = useAuth();\n  const response = {update: false, invite: false, delete: false};\n  const permissions = ['update', 'invite', 'delete'] as const;\n  const authMember = workspace.members?.find(mb => mb.id === authUser?.id);\n\n  if (authMember) {\n    permissions.forEach(permission => {\n      response[permission] =\n        authMember.is_owner ||\n        !!authMember.permissions?.find(\n          p => p.name === `workspace_members.${permission}`,\n        );\n    });\n  }\n\n  return response;\n}\n\ninterface MemberActionsProps {\n  workspace: Workspace;\n  member: WorkspaceMember | WorkspaceInvite;\n}\nfunction MemberActions({workspace, member}: MemberActionsProps) {\n  const [selectedRole, setSelectedRole] = useState<number>(member.role_id);\n  const changeRole = useChangeRole();\n  const {user} = useAuth();\n\n  const can = usePermissions(workspace);\n  const isOwner = member.model_type === 'member' && member.is_owner;\n  const isCurrentUser =\n    member.model_type === 'member' && user?.id === member.id;\n\n  const roleSelector =\n    !can.update || isOwner || isCurrentUser ? (\n      <div className=\"text-muted ml-auto first:capitalize\">\n        <Trans message={member.role_name} />\n      </div>\n    ) : (\n      <RoleMenuTrigger\n        className=\"ml-auto flex-shrink-0\"\n        size=\"xs\"\n        value={selectedRole}\n        isDisabled={changeRole.isPending}\n        onChange={roleId => {\n          setSelectedRole(roleId);\n          changeRole.mutate({\n            roleId,\n            workspaceId: workspace.id,\n            member,\n          });\n        }}\n      />\n    );\n\n  return (\n    <>\n      {roleSelector}\n      {!isOwner && (isCurrentUser || can.delete) && (\n        <RemoveMemberButton\n          type={isCurrentUser ? 'leave' : 'remove'}\n          member={member}\n          workspace={workspace}\n        />\n      )}\n    </>\n  );\n}\n\ninterface InviteChipFieldProps {\n  workspace: Workspace;\n}\nfunction InviteChipField({workspace}: InviteChipFieldProps) {\n  const {trans} = useTrans();\n  const [chips, setChips] = useState<ChipValue[]>([]);\n  const allEmailsValid = chips.every(chip => !chip.invalid);\n  const displayWith = (chip: ChipValue) => chip.description || chip.name;\n  const [selectedRole, setSelectedRole] = useState<number>();\n  const inviteMembers = useInviteMembers();\n  const {data} = useValueLists(['workspaceRoles']);\n\n  useEffect(() => {\n    if (!selectedRole && data?.workspaceRoles?.length) {\n      setSelectedRole(data.workspaceRoles[0].id);\n    }\n  }, [data, selectedRole]);\n\n  return (\n    <div className=\"mb-30\">\n      <ChipField\n        value={chips}\n        onChange={setChips}\n        displayWith={displayWith}\n        validateWith={chip => {\n          const invalid = !isEmail(chip.description);\n          return {\n            ...chip,\n            invalid,\n            errorMessage: invalid\n              ? trans({message: 'Not a valid email'})\n              : undefined,\n          };\n        }}\n        placeholder={trans({message: 'Enter email addresses'})}\n        label={<Trans message=\"Invite people\" />}\n      />\n      <div className=\"flex items-center gap-14 justify-between mt-14\">\n        <RoleMenuTrigger onChange={setSelectedRole} value={selectedRole} />\n        {chips.length && selectedRole ? (\n          <Button\n            variant=\"flat\"\n            color=\"primary\"\n            size=\"sm\"\n            disabled={inviteMembers.isPending || !allEmailsValid}\n            onClick={() => {\n              inviteMembers.mutate(\n                {\n                  emails: chips.map(c => displayWith(c)),\n                  roleId: selectedRole,\n                  workspaceId: workspace.id,\n                },\n                {\n                  onSuccess: () => {\n                    setChips([]);\n                  },\n                },\n              );\n            }}\n          >\n            <Trans message=\"Invite\" />\n          </Button>\n        ) : null}\n      </div>\n    </div>\n  );\n}\n\ninterface RemoveMemberButtonProps {\n  member: WorkspaceMember | WorkspaceInvite;\n  workspace: Workspace;\n  type: 'leave' | 'remove';\n}\nfunction RemoveMemberButton({\n  member,\n  workspace,\n  type,\n}: RemoveMemberButtonProps) {\n  const removeMember = useRemoveMember();\n  const {close} = useDialogContext();\n  return (\n    <DialogTrigger\n      type=\"modal\"\n      onClose={isConfirmed => {\n        if (isConfirmed) {\n          removeMember.mutate({\n            workspaceId: workspace.id,\n            memberId: member.id,\n            memberType: member.model_type,\n          });\n          if (type === 'leave') {\n            close();\n            toast(message('Left workspace'));\n          }\n        }\n      }}\n    >\n      <IconButton\n        size=\"md\"\n        className=\"text-muted flex-shrink-0\"\n        disabled={removeMember.isPending}\n      >\n        {type === 'leave' ? <ExitToAppIcon /> : <CloseIcon />}\n      </IconButton>\n      {type === 'leave' ? (\n        <LeaveWorkspaceConfirmation />\n      ) : (\n        <RemoveMemberConfirmation member={member} />\n      )}\n    </DialogTrigger>\n  );\n}\n\ninterface RemoveMemberConfirmationProps {\n  member: WorkspaceMember | WorkspaceInvite;\n}\nfunction RemoveMemberConfirmation({member}: RemoveMemberConfirmationProps) {\n  return (\n    <ConfirmationDialog\n      isDanger\n      title={<Trans message=\"Remove member\" />}\n      body={\n        <div>\n          <Trans\n            message=\"Are you sure you want to remove `:name`?\"\n            values={{name: member.display_name}}\n          />\n          <div className=\"font-semibold mt-8\">\n            <Trans\n              message=\"All workspace resources created by `:name` will be transferred to workspace owner.\"\n              values={{\n                name: member.display_name,\n              }}\n            />\n          </div>\n        </div>\n      }\n      confirm={<Trans message=\"Remove\" />}\n    />\n  );\n}\n\ninterface RoleMenuTriggerProps {\n  onChange: (value: number) => void;\n  value?: number;\n  size?: ButtonSize;\n  className?: string;\n  isDisabled?: boolean;\n}\nfunction RoleMenuTrigger({\n  value,\n  onChange,\n  size = 'xs',\n  className,\n  isDisabled,\n}: RoleMenuTriggerProps) {\n  const {data} = useValueLists(['workspaceRoles']);\n  const role = data?.workspaceRoles?.find(r => r.id === value);\n  if (!value || !role || !data?.workspaceRoles) return null;\n\n  return (\n    <MenuTrigger\n      selectionMode=\"single\"\n      selectedValue={value}\n      onSelectionChange={newValue => {\n        onChange(newValue as number);\n      }}\n    >\n      <Button\n        className={className}\n        size={size}\n        variant=\"flat\"\n        color=\"chip\"\n        disabled={isDisabled}\n        endIcon={<ArrowDropDownIcon />}\n      >\n        <Trans message={role.name} />\n      </Button>\n      <Menu>\n        {data.workspaceRoles.map(r => (\n          <MenuItem value={r.id} key={r.id} description={r.description}>\n            <Trans message={r.name} />\n          </MenuItem>\n        ))}\n      </Menu>\n    </MenuTrigger>\n  );\n}\n\ninterface MemberDisplayNameAppendProps {\n  member: WorkspaceMember | WorkspaceInvite;\n  workspace: Workspace;\n}\nfunction MemberDisplayNameAppend({\n  member,\n  workspace,\n}: MemberDisplayNameAppendProps) {\n  const {user} = useAuth();\n  const can = usePermissions(workspace);\n\n  if (user?.id === member.id) {\n    return (\n      <div className=\"font-medium\">\n        (<Trans message=\"You\" />)\n      </div>\n    );\n  }\n  if (member.model_type === 'invite') {\n    return (\n      <div className=\"flex items-center gap-4\">\n        <div>·</div>\n        <div className=\"font-medium\">\n          <Trans message=\"Invited\" />\n        </div>\n        {can.invite ? (\n          <>\n            <div>·</div>\n            <ResendInviteDialogTrigger member={member} workspace={workspace} />\n          </>\n        ) : null}\n      </div>\n    );\n  }\n  return null;\n}\n\nfunction ResendInviteDialogTrigger({\n  member,\n  workspace,\n}: MemberDisplayNameAppendProps) {\n  const resendInvite = useResendInvite();\n  return (\n    <DialogTrigger\n      type=\"modal\"\n      onClose={isConfirmed => {\n        if (isConfirmed) {\n          resendInvite.mutate({\n            workspaceId: workspace.id,\n            inviteId: member.id as string,\n          });\n        }\n      }}\n    >\n      <Button\n        variant=\"link\"\n        size=\"sm\"\n        color=\"primary\"\n        disabled={resendInvite.isPending}\n      >\n        <Trans message=\"Resend invite\" />\n      </Button>\n      <ConfirmationDialog\n        title={<Trans message=\"Resend invite\" />}\n        body={\n          <Trans message=\"Are you sure you want to send this invite again?\" />\n        }\n        confirm={<Trans message=\"Send\" />}\n      />\n    </DialogTrigger>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PersonAddIcon = createSvgIcon(\n  <path d=\"M15 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 8c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4zm-6 4c.22-.72 3.31-2 6-2 2.7 0 5.8 1.29 6 2H9zm-3-3v-3h3v-2H6V7H4v3H1v2h3v3z\" />\n, 'PersonAddOutlined');\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 {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {Workspace} from '../types/workspace';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {message} from '../../i18n/message';\n\ninterface Response extends BackendResponse {\n  workspace: Workspace;\n}\n\nexport interface UpdateWorkspacePayload {\n  id: number;\n  name: string;\n}\n\nfunction updateWorkspace({\n  id,\n  ...props\n}: UpdateWorkspacePayload): Promise<Response> {\n  return apiClient.put(`workspace/${id}`, props).then(r => r.data);\n}\n\nexport function useUpdateWorkspace(\n  form: UseFormReturn<UpdateWorkspacePayload>,\n) {\n  const {close} = useDialogContext();\n  return useMutation({\n    mutationFn: (props: UpdateWorkspacePayload) => updateWorkspace(props),\n    onSuccess: response => {\n      close();\n      toast(message('Updated workspace'));\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n      });\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.workspaceWithMembers(\n          response.workspace.id,\n        ),\n      });\n    },\n    onError: r => onFormQueryError(r, form),\n  });\n}\n","import {useForm} from 'react-hook-form';\nimport {FormTextField} from '../ui/forms/input-field/text-field/text-field';\nimport {Form} from '../ui/forms/form';\nimport {Button} from '../ui/buttons/button';\nimport {DialogFooter} from '../ui/overlays/dialog/dialog-footer';\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 {\n  UpdateWorkspacePayload,\n  useUpdateWorkspace,\n} from './requests/update-workspace';\nimport {Workspace} from './types/workspace';\nimport {Trans} from '../i18n/trans';\n\ninterface Props {\n  workspace: Workspace;\n}\nexport function RenameWorkspaceDialog({workspace}: Props) {\n  const form = useForm<UpdateWorkspacePayload>({\n    defaultValues: {id: workspace.id, name: workspace.name},\n  });\n  const {formId, close} = useDialogContext();\n  const updateWorkspace = useUpdateWorkspace(form);\n\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Rename workspace\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          form={form}\n          id={formId}\n          onSubmit={() => {\n            updateWorkspace.mutate(form.getValues());\n          }}\n        >\n          <FormTextField\n            name=\"name\"\n            autoFocus\n            label={<Trans message=\"Name\" />}\n            minLength={3}\n            required\n          />\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button variant=\"text\" onClick={close}>\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={updateWorkspace.isPending}\n        >\n          <Trans message=\"Rename\" />\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 {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {useActiveWorkspaceId} from '../active-workspace-id-context';\nimport {PersonalWorkspace} from '../user-workspaces';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport interface DeleteWorkspacePayload {\n  id: number;\n}\n\nfunction deleteWorkspace({id}: DeleteWorkspacePayload): Promise<Response> {\n  return apiClient.delete(`workspace/${id}`).then(r => r.data);\n}\n\nexport function useDeleteWorkspace() {\n  const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n  return useMutation({\n    mutationFn: (props: DeleteWorkspacePayload) => deleteWorkspace(props),\n    onSuccess: (r, payload) => {\n      toast(message('Deleted workspace'));\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n      });\n      queryClient.invalidateQueries({\n        queryKey: WorkspaceQueryKeys.workspaceWithMembers(payload.id),\n      });\n\n      // if user deleted workspace that is currently active, switch to personal workspace\n      if (workspaceId === payload.id) {\n        setWorkspaceId(PersonalWorkspace.id);\n      }\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n","import clsx from 'clsx';\nimport {cloneElement, Fragment, ReactElement, useEffect, useState} from 'react';\nimport {ButtonBase} from '../ui/buttons/button-base';\nimport {PersonalWorkspace, useUserWorkspaces} from './user-workspaces';\nimport {UnfoldMoreIcon} from '../icons/material/UnfoldMore';\nimport {AddIcon} from '../icons/material/Add';\nimport {NewWorkspaceDialog} from './new-workspace-dialog';\nimport {WorkspaceMembersDialog} from './workspace-members-dialog';\nimport {useActiveWorkspaceId} from './active-workspace-id-context';\nimport {DialogTrigger} from '../ui/overlays/dialog/dialog-trigger';\nimport {Workspace} from './types/workspace';\nimport {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {Button, ButtonProps} from '../ui/buttons/button';\nimport {CheckIcon} from '../icons/material/Check';\nimport {Menu, MenuItem, MenuTrigger} from '../ui/navigation/menu/menu-trigger';\nimport {KeyboardArrowDownIcon} from '../icons/material/KeyboardArrowDown';\nimport {PersonAddIcon} from '../icons/material/PersonAdd';\nimport {DeleteIcon} from '../icons/material/Delete';\nimport {ExitToAppIcon} from '../icons/material/ExitToApp';\nimport {EditIcon} from '../icons/material/Edit';\nimport {RenameWorkspaceDialog} from './rename-workspace-dialog';\nimport {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteWorkspace} from './requests/delete-workspace';\nimport {useRemoveMember} from './requests/remove-member';\nimport {useAuth} from '../auth/use-auth';\nimport {Trans} from '../i18n/trans';\nimport {LeaveWorkspaceConfirmation} from './leave-workspace-confirmation';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\ninterface WorkspaceSelectorProps {\n  className?: string;\n  onChange?: (id: number) => void;\n  trigger?: ReactElement<ButtonProps>;\n}\nexport function WorkspaceSelector({\n  onChange,\n  className,\n  trigger: propsTrigger,\n}: WorkspaceSelectorProps) {\n  const {data: workspaces, isFetched, isFetching} = useUserWorkspaces();\n  const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n  const activeWorkspace = workspaces?.find(w => w.id === workspaceId);\n  const [selectorIsOpen, setSelectorIsOpen] = useState(false);\n  const {hasPermission} = useAuth();\n\n  // if user no longer has access to previously selected workspace, select personal one\n  useEffect(() => {\n    // make sure we don't unset active workspace while user workspaces are being re-fetched\n    if (isFetched && !isFetching && !activeWorkspace) {\n      setWorkspaceId(PersonalWorkspace.id);\n    }\n  }, [activeWorkspace, workspaces, setWorkspaceId, isFetched, isFetching]);\n\n  if (\n    !activeWorkspace ||\n    (!hasPermission('workspaces.create') && workspaces?.length === 1)\n  ) {\n    return null;\n  }\n\n  const defaultTrigger = (\n    <ButtonBase\n      className={clsx(\n        'flex items-center gap-10 rounded ring-inset hover:bg-hover focus-visible:ring-2',\n        className,\n      )}\n    >\n      <span className=\"mr-auto block flex-auto overflow-hidden text-left\">\n        <span className=\"block overflow-hidden overflow-ellipsis text-sm font-medium text-main\">\n          {activeWorkspace.default ? (\n            <Trans message={activeWorkspace.name} />\n          ) : (\n            activeWorkspace.name\n          )}\n        </span>\n        <span className=\"block text-xs text-muted\">\n          {activeWorkspace.default ? (\n            <Trans message=\"Personal workspace\" />\n          ) : (\n            <Trans\n              message=\":count members\"\n              values={{count: activeWorkspace.members_count}}\n            />\n          )}\n        </span>\n      </span>\n      <UnfoldMoreIcon className=\"shrink-0 icon-md\" />\n    </ButtonBase>\n  );\n\n  const trigger = propsTrigger || defaultTrigger;\n\n  return (\n    <Fragment>\n      <DialogTrigger\n        type=\"popover\"\n        isOpen={selectorIsOpen}\n        onClose={() => {\n          setSelectorIsOpen(false);\n        }}\n      >\n        {cloneElement(trigger, {\n          onClick: () => setSelectorIsOpen(!selectorIsOpen),\n        })}\n        <Dialog size=\"min-w-320\">\n          <DialogBody padding=\"p-10\">\n            <div className=\"mb-16 border-b pb-10\">\n              {workspaces?.map(workspace => (\n                <WorkspaceItem\n                  key={workspace.id}\n                  workspace={workspace}\n                  setSelectorIsOpen={setSelectorIsOpen}\n                  onChange={onChange}\n                />\n              ))}\n            </div>\n            <div className=\"mb-4 px-4 text-center\">\n              <Button\n                onClick={async e => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  setSelectorIsOpen(false);\n                  const workspaceId = await openDialog(NewWorkspaceDialog);\n                  if (workspaceId) {\n                    setWorkspaceId(workspaceId);\n                    onChange?.(workspaceId);\n                  }\n                }}\n                variant=\"outline\"\n                startIcon={<AddIcon />}\n                color=\"primary\"\n                className=\"h-40 w-full\"\n              >\n                <Trans message=\"Create new workspace\" />\n              </Button>\n            </div>\n          </DialogBody>\n        </Dialog>\n      </DialogTrigger>\n    </Fragment>\n  );\n}\n\ninterface WorkspaceItemProps {\n  workspace: Workspace;\n  onChange: WorkspaceSelectorProps['onChange'];\n  setSelectorIsOpen: (value: boolean) => void;\n}\nfunction WorkspaceItem({\n  workspace,\n  onChange,\n  setSelectorIsOpen,\n}: WorkspaceItemProps) {\n  const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n  const isActive = workspaceId === workspace.id;\n\n  return (\n    <div\n      onClick={() => {\n        setWorkspaceId(workspace.id);\n        onChange?.(workspace.id);\n        setSelectorIsOpen(false);\n      }}\n      className={clsx(\n        'mb-4 flex cursor-pointer items-center gap-12 rounded-lg p-10 text-left',\n        isActive && 'bg-primary/5',\n        !isActive && 'hover:bg-hover',\n      )}\n    >\n      <CheckIcon\n        size=\"sm\"\n        className={clsx('flex-shrink-0 text-primary', !isActive && 'invisible')}\n      />\n      <div className=\"flex-auto\">\n        <div className={clsx('text-sm', isActive && 'font-semibold')}>\n          {workspace.name}\n        </div>\n        <div className=\"text-sm text-muted\">\n          {workspace.default ? (\n            <Trans message=\"Personal workspace\" />\n          ) : (\n            <Trans\n              message=\":count members\"\n              values={{count: workspace.members_count}}\n            />\n          )}\n        </div>\n      </div>\n      {workspace.id !== 0 && (\n        <ManageButton\n          setSelectorIsOpen={setSelectorIsOpen}\n          workspace={workspace}\n          onChange={onChange}\n        />\n      )}\n    </div>\n  );\n}\n\ninterface LeaveWorkspaceDialogProps {\n  workspace: Workspace;\n  onChange?: (id: number) => void;\n}\nfunction LeaveWorkspaceDialog({\n  workspace,\n  onChange,\n}: LeaveWorkspaceDialogProps) {\n  const removeMember = useRemoveMember();\n  const {user} = useAuth();\n  const {close} = useDialogContext();\n  return (\n    <LeaveWorkspaceConfirmation\n      isLoading={removeMember.isPending}\n      onConfirm={() => {\n        removeMember.mutate(\n          {\n            workspaceId: workspace.id,\n            memberId: user!.id,\n            memberType: 'member',\n          },\n          {\n            onSuccess: () => {\n              close();\n              onChange?.(PersonalWorkspace.id);\n            },\n          },\n        );\n      }}\n    />\n  );\n}\n\ninterface DeleteWorkspaceConfirmationProps {\n  workspace: Workspace;\n  onChange?: (id: number) => void;\n}\nfunction DeleteWorkspaceConfirmation({\n  workspace,\n  onChange,\n}: DeleteWorkspaceConfirmationProps) {\n  const deleteWorkspace = useDeleteWorkspace();\n  const {close} = useDialogContext();\n  return (\n    <ConfirmationDialog\n      isDanger\n      title={<Trans message=\"Delete workspace\" />}\n      body={\n        <Trans\n          message=\"Are you sure you want to delete “:name“?\"\n          values={{name: workspace.name}}\n        />\n      }\n      confirm={<Trans message=\"Delete\" />}\n      isLoading={deleteWorkspace.isPending}\n      onConfirm={() => {\n        deleteWorkspace.mutate(\n          {id: workspace.id},\n          {\n            onSuccess: () => {\n              close();\n              onChange?.(PersonalWorkspace.id);\n            },\n          },\n        );\n      }}\n    />\n  );\n}\n\ninterface ManageButtonProps {\n  setSelectorIsOpen: (value: boolean) => void;\n  workspace: Workspace;\n  onChange?: (id: number) => void;\n}\nfunction ManageButton({\n  setSelectorIsOpen,\n  workspace,\n  onChange,\n}: ManageButtonProps) {\n  const {user} = useAuth();\n\n  return (\n    <MenuTrigger onItemSelected={() => setSelectorIsOpen(false)}>\n      <Button\n        onClick={e => {\n          e.preventDefault();\n          e.stopPropagation();\n        }}\n        color=\"primary\"\n        size=\"xs\"\n        variant=\"outline\"\n        endIcon={<KeyboardArrowDownIcon />}\n      >\n        <Trans message=\"Manage\" />\n      </Button>\n      <Menu>\n        <MenuItem\n          onClick={e => {\n            e.stopPropagation();\n            openDialog(WorkspaceMembersDialog, {workspace});\n          }}\n          value=\"workspaceMembers\"\n          startIcon={<PersonAddIcon />}\n        >\n          <Trans message=\"Members\" />\n        </MenuItem>\n        {workspace.owner_id === user?.id && (\n          <MenuItem\n            onClick={e => {\n              e.stopPropagation();\n              openDialog(RenameWorkspaceDialog, {workspace});\n            }}\n            value=\"updateWorkspace\"\n            startIcon={<EditIcon />}\n          >\n            <Trans message=\"Rename\" />\n          </MenuItem>\n        )}\n        {workspace.owner_id !== user?.id && (\n          <MenuItem\n            onClick={e => {\n              e.stopPropagation();\n              openDialog(LeaveWorkspaceDialog, {workspace, onChange});\n            }}\n            value=\"leaveWorkspace\"\n            startIcon={<ExitToAppIcon />}\n          >\n            <Trans message=\"Leave\" />\n          </MenuItem>\n        )}\n        {workspace.owner_id === user?.id && (\n          <MenuItem\n            onClick={e => {\n              e.stopPropagation();\n              openDialog(DeleteWorkspaceConfirmation, {workspace, onChange});\n            }}\n            value=\"deleteWorkspace\"\n            startIcon={<DeleteIcon />}\n          >\n            <Trans message=\"Delete\" />\n          </MenuItem>\n        )}\n      </Menu>\n    </MenuTrigger>\n  );\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\nconst endpoint = 'link/usage';\n\nexport interface ResourceUsage {\n  used: number;\n  total: number | null;\n  create?: boolean;\n  update?: boolean;\n  delete?: boolean;\n  createMsgType?: CreateMsgType;\n}\n\nexport interface LinkFeaturePermissions {\n  alias: boolean;\n  password: boolean;\n  expiration: boolean;\n  utm: boolean;\n  retargeting: boolean;\n}\n\nexport type CreateMsgType =\n  | 'overQuota'\n  | 'noPermission'\n  | 'noWorkspacePermission'\n  | keyof LinkFeaturePermissions;\n\nexport interface FetchLinkUsageResponse extends BackendResponse {\n  forWorkspace?: boolean;\n  userOwnsWorkspace?: boolean;\n  usage: {\n    links: ResourceUsage & LinkFeaturePermissions;\n    biolinks: ResourceUsage;\n    link_clicks: ResourceUsage;\n    link_overlays: ResourceUsage;\n    custom_pages: ResourceUsage & {options: boolean};\n    custom_domains: ResourceUsage;\n    link_groups: ResourceUsage;\n    tracking_pixels: ResourceUsage;\n  };\n}\n\nexport function useLinkSummary() {\n  return useQuery({\n    queryKey: [endpoint],\n    queryFn: () => fetchLinkUsage(),\n  });\n}\n\nfunction fetchLinkUsage(): Promise<FetchLinkUsageResponse> {\n  return apiClient.get(endpoint).then(response => response.data);\n}\n","import React from 'react';\nimport {ProgressBarBase, ProgressBarBaseProps} from './progress-bar-base';\n\nexport function Meter(props: ProgressBarBaseProps) {\n  return <ProgressBarBase {...props} role=\"meter progressbar\" />;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const InfoIcon = createSvgIcon(\n  <path d=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.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 8z\" />\n, 'InfoOutlined');\n","import {FetchLinkUsageResponse, useLinkSummary} from './use-link-summary';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\n\ntype ResourceKey = keyof FetchLinkUsageResponse['usage'];\n\nexport const resourceTranslationMap: Record<ResourceKey, MessageDescriptor> = {\n  links: message('Links'),\n  biolinks: message('Biolinks'),\n  link_clicks: message('Visitors'),\n  link_overlays: message('Link overlays'),\n  custom_pages: message('Custom link pages'),\n  custom_domains: message('Custom domains'),\n  link_groups: message('Link groups'),\n  tracking_pixels: message('Tracking pixels'),\n} as const;\n\nexport function ResourceUsageList() {\n  const {data} = useLinkSummary();\n  if (!data) {\n    return null;\n  }\n\n  const unlimited = <Trans message=\"Unlimited\" />;\n\n  return (\n    <ul>\n      {Object.entries(resourceTranslationMap).map(([key, label]) => {\n        const usage = data?.usage[key as ResourceKey];\n        if (!usage) return null;\n        const name = <Trans {...label} />;\n        return (\n          <li key={key} className=\"mt-8\">\n            {usage.total ? (\n              <Trans\n                message=\":used out of :total :name\"\n                values={{\n                  used: <FormattedNumber value={usage.used} />,\n                  total: usage.total ? (\n                    <FormattedNumber value={usage.total} />\n                  ) : (\n                    unlimited\n                  ),\n                  name,\n                }}\n              />\n            ) : (\n              <Trans\n                message=\":count :name created\"\n                values={{count: usage.used, name}}\n              />\n            )}\n          </li>\n        );\n      })}\n    </ul>\n  );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {InfoIcon} from '@common/icons/material/Info';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Trans} from '@common/i18n/trans';\nimport {ResourceUsageList} from '@app/dashboard/layout/sidenav/resource-usage-list';\n\ninterface UsageDetailsTriggerProps {\n  className?: string;\n}\nexport function UsageDetailsTrigger({className}: UsageDetailsTriggerProps) {\n  const {user} = useAuth();\n  const subscription = user?.subscriptions?.[0];\n  const planName = subscription?.product?.name;\n  const renewalDate = subscription?.renews_at ? (\n    <FormattedDate date={subscription.renews_at} />\n  ) : null;\n\n  return (\n    <DialogTrigger type=\"popover\" triggerOnHover>\n      <IconButton size=\"md\" className={className}>\n        <InfoIcon />\n      </IconButton>\n      <Dialog size=\"auto\">\n        <DialogBody>\n          <div className=\"border-b pb-10 mb-10\">\n            <div className=\"font-semibold\">\n              <Trans\n                message=\"Current plan: :planName\"\n                values={{\n                  planName: planName || <Trans message=\"Free\" />,\n                }}\n              />\n            </div>\n            <div className=\"text-muted text-xs\">\n              <Trans\n                message=\"Next payment: :date\"\n                values={{\n                  date: renewalDate || <Trans message=\"Never\" />,\n                }}\n              />\n            </div>\n          </div>\n          <ResourceUsageList />\n        </DialogBody>\n      </Dialog>\n    </DialogTrigger>\n  );\n}\n","import {useLinkSummary} from './use-link-summary';\nimport clsx from 'clsx';\nimport {Trans} from '@common/i18n/trans';\nimport {Meter} from '@common/ui/progress/meter';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {UsageDetailsTrigger} from '@app/dashboard/layout/sidenav/usage-details-trigger';\n\nexport function UsageMeter() {\n  const {isLoading, data} = useLinkSummary();\n  const links = data?.usage.links;\n\n  // prevent layout shift while usage is loading\n  if (!links) {\n    return <div className=\"h-[53px] pt-24 mt-24 border-t\" />;\n  }\n\n  // prevent translation placeholders from showing if summary is not loaded yet\n  const label = (\n    <span className={clsx('whitespace-nowrap', isLoading && 'invisible')}>\n      {links.total ? (\n        <Trans\n          message=\":used of :available links created\"\n          values={{\n            used: <FormattedNumber value={links.used} />,\n            available: <FormattedNumber value={links.total} />,\n          }}\n        />\n      ) : (\n        <Trans message=\":count links created\" values={{count: links.used}} />\n      )}\n    </span>\n  );\n  return (\n    <div className=\"border-t items-start gap-8 flex pl-6 pt-24 mt-24\">\n      <UsageDetailsTrigger className=\"-mt-14\" />\n      <Meter\n        className=\"flex-auto max-w-144\"\n        size=\"xs\"\n        value={links.total && links.used ? (links.used / links.total) * 100 : 0}\n        label={label}\n        showValueLabel={false}\n        labelPosition=\"bottom\"\n      />\n    </div>\n  );\n}\n","import {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {useAuth} from '@common/auth/use-auth';\n\nexport function UpgradeButton(props: ButtonProps) {\n  const {isSubscribed} = useAuth();\n  return (\n    <Button\n      elementType={Link}\n      to={isSubscribed ? '/billing/change-plan' : '/pricing'}\n      variant=\"outline\"\n      color=\"primary\"\n      size=\"xs\"\n      {...props}\n    >\n      <Trans message=\"Upgrade\" />\n    </Button>\n  );\n}\n","import clsx from 'clsx';\nimport {CustomMenu} from '@common/menus/custom-menu';\nimport React from 'react';\nimport {WorkspaceSelector} from '@common/workspace/workspace-selector';\nimport {UsageMeter} from './usage-meter';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {UpgradeButton} from '@app/dashboard/layout/sidenav/upgrade-button';\nimport {UsageDetailsTrigger} from '@app/dashboard/layout/sidenav/usage-details-trigger';\n\ninterface Props {\n  className?: string;\n  isCompactMode?: boolean;\n}\nexport function BelinkDashboardSidenav({className, isCompactMode}: Props) {\n  const {billing} = useSettings();\n\n  return (\n    <div\n      className={clsx(\n        'text-sm pt-26 text-muted font-medium bg-alt flex flex-col gap-20 border-r overflow-y-auto relative',\n        className\n      )}\n    >\n      <div className=\"flex-auto px-12\">\n        <CustomMenu\n          matchDescendants={to => to === '/dashboard'}\n          menu=\"dashboard-sidebar\"\n          orientation=\"vertical\"\n          onlyShowIcons={isCompactMode}\n          gap=\"gap-8\"\n          itemClassName={({isActive}) =>\n            clsx(\n              'block w-full rounded py-12 px-16 border-l-4',\n              isActive\n                ? 'bg-primary/hover border-l-primary'\n                : 'border-l-transparent hover:bg-hover'\n            )\n          }\n        />\n        {!isCompactMode && <UsageMeter />}\n        {billing.enable && !isCompactMode && (\n          <div className=\"mt-14 pl-60\">\n            <UpgradeButton />\n          </div>\n        )}\n      </div>\n      {!isCompactMode && (\n        <WorkspaceSelector className=\"w-full px-24 py-18 border-t flex-shrink-0 mt-auto\" />\n      )}\n      {isCompactMode && (\n        <UsageDetailsTrigger className=\"flex-shrink-0 mx-auto mb-10\" />\n      )}\n    </div>\n  );\n}\n","import {DashboardLayout} from '@common/ui/layout/dashboard-layout';\nimport {DashboardSidenav} from '@common/ui/layout/dashboard-sidenav';\nimport {DashboardContent} from '@common/ui/layout/dashboard-content';\nimport {Outlet} from 'react-router-dom';\nimport {DashboardNavbar} from '@common/ui/layout/dashboard-navbar';\nimport {BelinkDashboardSidenav} from './sidenav/belink-dashboard-sidenav';\nimport {useContext} from 'react';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\nimport {UpgradeButton} from '@app/dashboard/layout/sidenav/upgrade-button';\nimport {Button} from '@common/ui/buttons/button';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {Trans} from '@common/i18n/trans';\nimport {WorkspaceSelector} from '@common/workspace/workspace-selector';\nimport {Footer} from '@common/ui/footer/footer';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {useThemeSelector} from '@common/ui/themes/theme-selector-context';\n\nexport function BelinkDashboardLayout() {\n  const {\n    links: {dash_footer},\n  } = useSettings();\n  return (\n    <DashboardLayout name=\"belink-dashboard\" leftSidenavCanBeCompact>\n      <BelinkNavbar />\n      <DashboardSidenav position=\"left\">\n        <BelinkDashboardSidenav />\n      </DashboardSidenav>\n      <DashboardContent>\n        <div className=\"bg dark:bg-alt\">\n          <AdHost slot=\"dashboard\" className=\"mb-20 mt-50\" />\n          <Outlet />\n          {dash_footer && (\n            <Footer padding=\"px-16 md:px-28 pt-24 pb-28 md:pb-24\" />\n          )}\n        </div>\n      </DashboardContent>\n    </DashboardLayout>\n  );\n}\n\ninterface DashboardNavbarProps {}\nfunction BelinkNavbar(props: DashboardNavbarProps) {\n  const {billing} = useSettings();\n  const {leftSidenavStatus} = useContext(DashboardLayoutContext);\n  const {selectedTheme} = useThemeSelector();\n  const buttonColor =\n    selectedTheme.values?.['--be-navbar-color'] === 'bg' ? 'primary' : 'paper';\n  return (\n    <DashboardNavbar\n      {...props}\n      size=\"sm\"\n      menuPosition=\"dashboard-navbar\"\n      rightChildren={\n        leftSidenavStatus === 'compact' &&\n        billing.enable && <UpgradeButton variant=\"flat\" color={buttonColor} />\n      }\n    >\n      {leftSidenavStatus === 'compact' && (\n        <WorkspaceSelector\n          trigger={\n            <Button variant=\"text\" endIcon={<KeyboardArrowDownIcon />}>\n              <Trans message=\"Workspaces\" />\n            </Button>\n          }\n        />\n      )}\n    </DashboardNavbar>\n  );\n}\n","import {useDateRangePickerState} from '@common/ui/forms/input-field/date/date-range-picker/use-date-range-picker-state';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {DateRangeIcon} from '@common/icons/material/DateRange';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {DateRangeDialog} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-dialog';\nimport React from 'react';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {DateFormatPresets} from '@common/i18n/formatted-date';\nimport {DateRangeComparePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets';\nimport {Granularity} from '@common/ui/forms/input-field/date/date-picker/use-date-picker-state';\n\nconst monthDayFormat: Intl.DateTimeFormatOptions = {\n  month: 'short',\n  day: '2-digit',\n};\n\ninterface ReportDataSelectorProps {\n  value: DateRangeValue;\n  disabled?: boolean;\n  onChange: (value: DateRangeValue) => void;\n  compactOnMobile?: boolean;\n  enableCompare?: boolean;\n  granularity?: Granularity;\n}\nexport function ReportDateSelector({\n  value,\n  onChange,\n  disabled,\n  compactOnMobile = true,\n  enableCompare = false,\n  granularity = 'minute',\n}: ReportDataSelectorProps) {\n  const isMobile = useIsMobileMediaQuery();\n  return (\n    <DialogTrigger\n      type=\"popover\"\n      onClose={value => {\n        if (value) {\n          onChange(value);\n        }\n      }}\n    >\n      <Button\n        variant=\"outline\"\n        color=\"chip\"\n        endIcon={<DateRangeIcon />}\n        disabled={disabled}\n      >\n        <FormattedDateTimeRange\n          start={value.start}\n          end={value.end}\n          options={\n            isMobile && compactOnMobile\n              ? monthDayFormat\n              : DateFormatPresets.short\n          }\n        />\n      </Button>\n      <DateSelectorDialog\n        value={value}\n        enableCompare={enableCompare}\n        granularity={granularity}\n      />\n    </DialogTrigger>\n  );\n}\n\ninterface DateSelectorDialogProps {\n  value: DateRangeValue;\n  enableCompare: boolean;\n  granularity: Granularity;\n}\nfunction DateSelectorDialog({\n  value,\n  enableCompare,\n  granularity,\n}: DateSelectorDialogProps) {\n  const isMobile = useIsMobileMediaQuery();\n  const state = useDateRangePickerState({\n    granularity,\n    defaultValue: {\n      start: value.start,\n      end: value.end,\n      preset: value.preset,\n    },\n    closeDialogOnSelection: false,\n  });\n  const compareHasInitialValue = !!value.compareStart && !!value.compareEnd;\n  const compareState = useDateRangePickerState({\n    granularity,\n    defaultValue: compareHasInitialValue\n      ? {\n          start: value.compareStart,\n          end: value.compareEnd,\n          preset: value.comparePreset,\n        }\n      : DateRangeComparePresets[0].getRangeValue(state.selectedValue),\n  });\n  return (\n    <DateRangeDialog\n      state={state}\n      compareState={enableCompare ? compareState : undefined}\n      compareVisibleDefault={compareHasInitialValue}\n      showInlineDatePickerField={!isMobile}\n    />\n  );\n}\n","import {ReactNode, Ref} from 'react';\nimport clsx from 'clsx';\n\nexport interface ChartLayoutProps {\n  title: ReactNode;\n  description?: ReactNode;\n  className?: string;\n  children: ReactNode;\n  contentIsFlex?: boolean;\n  contentClassName?: string;\n  minHeight?: string;\n  contentRef?: Ref<HTMLDivElement>;\n  isLoading?: boolean;\n}\nexport function ChartLayout(props: ChartLayoutProps) {\n  const {\n    title,\n    description,\n    children,\n    className,\n    contentIsFlex = true,\n    contentClassName,\n    contentRef,\n    minHeight = 'min-h-440',\n  } = props;\n\n  return (\n    <div\n      className={clsx(\n        'rounded-panel flex h-full flex-auto flex-col border bg',\n        minHeight,\n        className,\n      )}\n    >\n      <div className=\"flex flex-shrink-0 items-center justify-between p-14 text-xs\">\n        <div className=\"text-sm font-semibold\">{title}</div>\n        {description && <div className=\"text-muted\">{description}</div>}\n      </div>\n      <div\n        ref={contentRef}\n        className={clsx(\n          'relative p-14',\n          contentIsFlex && 'flex flex-auto items-center justify-center',\n          contentClassName,\n        )}\n      >\n        {children}\n      </div>\n    </div>\n  );\n}\n","import {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ChartLoadingIndicator() {\n  return (\n    <div className=\"flex items-center gap-10 text-sm absolute mx-auto\">\n      <ProgressCircle isIndeterminate size=\"sm\" />\n      <Trans message=\"Chart loading\" />\n    </div>\n  );\n}\n","import type {ChartData, ChartOptions, ChartType} from 'chart.js';\nimport {lazy, Suspense} from 'react';\nimport {ChartLayout, ChartLayoutProps} from './chart-layout';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\n\nconst LazyChart = lazy(() => import('./lazy-chart'));\n\nexport interface BaseChartProps<Type extends ChartType = ChartType>\n  extends Omit<ChartLayoutProps, 'children'> {\n  type: Type;\n  data: ChartData<Type, unknown>;\n  options?: ChartOptions<Type>;\n  hideLegend?: boolean;\n}\nexport function BaseChart<Type extends ChartType = ChartType>(\n  props: BaseChartProps<Type>\n) {\n  const {title, description, className, contentRef, isLoading} = props;\n\n  return (\n    <ChartLayout\n      title={title}\n      description={description}\n      className={className}\n      contentRef={contentRef}\n    >\n      <Suspense fallback={<ChartLoadingIndicator />}>\n        <LazyChart {...props} />\n        {isLoading && <ChartLoadingIndicator />}\n      </Suspense>\n    </ChartLayout>\n  );\n}\n","import {DateFormatter, parseAbsoluteToLocal} from '@internationalized/date';\nimport memoize from 'nano-memoize';\nimport {ChartType} from 'chart.js';\nimport {\n  FormattedDatasetItem,\n  FormattedReportData,\n} from './formatted-dataset-item';\nimport {\n  DatasetItem,\n  RangedDatasetGranularity,\n  ReportMetric,\n} from '../../admin/analytics/report-metric';\nimport {shallowEqual} from '../../utils/shallow-equal';\n\ninterface Options {\n  localeCode: string;\n  shareFirstDatasetLabels?: boolean;\n}\n\ntype FormattedDatasetLabels = Omit<FormattedDatasetItem, 'value'>;\n\nexport function formatReportData(\n  report: ReportMetric<DatasetItem> | undefined,\n  {localeCode = 'en', shareFirstDatasetLabels = true}: Options,\n): FormattedReportData {\n  if (!report) return {datasets: []};\n\n  const firstDatasetLabels: FormattedDatasetLabels[] = [];\n\n  return {\n    ...report,\n    datasets: report.datasets.map((dataset, datasetIndex) => {\n      const data = dataset.data.map((datasetItem, itemIndex) => {\n        let label: FormattedDatasetLabels;\n        // when there are multiple datasets, we'll need to use labels from the first dataset, so charts are\n        // overlapped over one another, otherwise they will be side by side, if labels in all datasets are not identical.\n        if (datasetIndex === 0 || !shareFirstDatasetLabels) {\n          label = generateDatasetLabels(\n            datasetItem,\n            report.granularity,\n            localeCode,\n          );\n          firstDatasetLabels[itemIndex] = label;\n        } else {\n          label = firstDatasetLabels[itemIndex];\n        }\n        return {\n          ...label,\n          value: datasetItem.value,\n        };\n      });\n\n      return {...dataset, data};\n    }),\n  };\n}\n\nfunction generateDatasetLabels<T extends ChartType = ChartType>(\n  datum: DatasetItem,\n  granularity: RangedDatasetGranularity | undefined,\n  locale: string,\n): FormattedDatasetLabels {\n  if (datum.label) {\n    return {label: datum.label};\n  }\n\n  if (!datum.date) {\n    return {label: ''};\n  }\n\n  return generateTimeLabels(datum, granularity, locale);\n}\n\nfunction generateTimeLabels(\n  {date: isoDate, endDate: isoEndDate}: DatasetItem,\n  granularity: RangedDatasetGranularity | undefined = 'day',\n  locale: string,\n): Omit<FormattedDatasetItem, 'value'> {\n  const date = parseAbsoluteToLocal(isoDate!).toDate();\n  const endDate = isoEndDate ? parseAbsoluteToLocal(isoEndDate).toDate() : null;\n\n  switch (granularity) {\n    case 'minute':\n      return {\n        label: getFormatter(locale, {\n          second: '2-digit',\n        }).format(date),\n        tooltipTitle: getFormatter(locale, {\n          day: '2-digit',\n          hour: 'numeric',\n          minute: 'numeric',\n          second: '2-digit',\n        }).format(date),\n      };\n    case 'hour':\n      return {\n        label: getFormatter(locale, {\n          hour: 'numeric',\n          minute: 'numeric',\n        }).format(date),\n        tooltipTitle: getFormatter(locale, {\n          month: 'short',\n          day: '2-digit',\n          hour: 'numeric',\n          minute: 'numeric',\n        }).format(date),\n      };\n    case 'day':\n      return {\n        label: getFormatter(locale, {\n          day: '2-digit',\n          weekday: 'short',\n        }).format(date),\n        tooltipTitle: getFormatter(locale, {\n          day: '2-digit',\n          weekday: 'short',\n          month: 'short',\n        }).format(date),\n      };\n    case 'week':\n      return {\n        label: getFormatter(locale, {\n          month: 'short',\n          day: '2-digit',\n        }).format(date),\n        tooltipTitle: getFormatter(locale, {\n          day: '2-digit',\n          month: 'long',\n          year: 'numeric',\n        }).formatRange(date, endDate as Date),\n      };\n    case 'month':\n      return {\n        label: getFormatter(locale, {\n          month: 'short',\n          year: 'numeric',\n        }).format(date),\n        tooltipTitle: getFormatter(locale, {\n          month: 'long',\n          year: 'numeric',\n        }).format(date),\n      };\n    case 'year':\n      return {\n        label: getFormatter(locale, {\n          year: 'numeric',\n        }).format(date),\n        tooltipTitle: getFormatter(locale, {\n          year: 'numeric',\n        }).format(date),\n      };\n  }\n}\n\nconst getFormatter = memoize(\n  (locale, options: Intl.DateTimeFormatOptions) => {\n    return new DateFormatter(locale, options);\n  },\n  {\n    equals: (a, b) => {\n      return shallowEqual(a, b);\n    },\n    callTimeout: undefined as any,\n  },\n);\n","import {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst primaryColor = getBootstrapData().themes.all[0].values['--be-primary'];\nexport const ChartColors = [\n  [\n    `rgb(${primaryColor.replaceAll(' ', ',')})`,\n    `rgba(${primaryColor.replaceAll(' ', ',')},0.2)`,\n  ],\n  ['rgb(255,112,67)', 'rgb(255,112,67,0.2)'],\n  ['rgb(255,167,38)', 'rgb(255,167,38,0.2)'],\n  ['rgb(141,110,99)', 'rgb(141,110,99,0.2)'],\n  ['rgb(102,187,106)', 'rgba(102,187,106,0.2)'],\n  ['rgb(92,107,192)', 'rgb(92,107,192,0.2)'],\n];\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport clsx from 'clsx';\n\nconst LineChartOptions: ChartOptions<'line'> = {\n  parsing: {\n    xAxisKey: 'label',\n    yAxisKey: 'value',\n  },\n  datasets: {\n    line: {\n      fill: 'origin',\n      tension: 0.1,\n      pointBorderWidth: 4,\n      pointHitRadius: 10,\n    },\n  },\n  plugins: {\n    tooltip: {\n      intersect: false,\n      mode: 'index',\n    },\n  },\n};\n\ninterface LineChartProps extends Omit<BaseChartProps<'line'>, 'type' | 'data'> {\n  data?: ReportMetric<DatasetItem>;\n}\nexport function LineChart({data, className, ...props}: LineChartProps) {\n  const {localeCode} = useSelectedLocale();\n  const formattedData: ChartData<'line', FormattedDatasetItem[]> =\n    useMemo(() => {\n      const formattedData = formatReportData(data, {localeCode});\n      formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n        ...dataset,\n        backgroundColor: ChartColors[i][1],\n        borderColor: ChartColors[i][0],\n        pointBackgroundColor: ChartColors[i][0],\n      }));\n      return formattedData;\n    }, [data, localeCode]);\n\n  return (\n    <BaseChart\n      {...props}\n      className={clsx(className, 'min-w-500')}\n      data={formattedData}\n      type=\"line\"\n      options={LineChartOptions}\n    />\n  );\n}\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport clsx from 'clsx';\n\nconst PolarAreaChartOptions: ChartOptions<'polarArea'> = {\n  parsing: {\n    key: 'value',\n  },\n  plugins: {\n    tooltip: {\n      intersect: true,\n    },\n  },\n};\n\ninterface PolarAreaChartProps\n  extends Omit<BaseChartProps<'polarArea'>, 'type' | 'data'> {\n  data?: ReportMetric<DatasetItem>;\n}\nexport function PolarAreaChart({\n  data,\n  className,\n  ...props\n}: PolarAreaChartProps) {\n  const {localeCode} = useSelectedLocale();\n  const formattedData: ChartData<'polarArea', FormattedDatasetItem[]> =\n    useMemo(() => {\n      const formattedData = formatReportData(data, {localeCode});\n      formattedData.labels = formattedData.datasets[0]?.data.map(d => d.label);\n      formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n        ...dataset,\n        backgroundColor: ChartColors.map(c => c[1]),\n        borderColor: ChartColors.map(c => c[0]),\n        borderWidth: 2,\n      }));\n      return formattedData;\n    }, [data, localeCode]);\n\n  return (\n    <BaseChart\n      type=\"polarArea\"\n      data={formattedData}\n      options={PolarAreaChartOptions}\n      className={clsx(className, 'min-w-500')}\n      {...props}\n    />\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {ChartLayout, ChartLayoutProps} from '@common/charts/chart-layout';\nimport React from 'react';\nimport {DatasetItem, ReportMetric} from '@common/admin/analytics/report-metric';\nimport clsx from 'clsx';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\n\ninterface ReferrerChartProps extends Partial<ChartLayoutProps> {\n  data?: ReportMetric<DatasetItem>;\n}\nexport function ReferrerChart({\n  data,\n  isLoading,\n  ...layoutProps\n}: ReferrerChartProps) {\n  const dataItems = data?.datasets[0].data || [];\n  return (\n    <ChartLayout\n      {...layoutProps}\n      className=\"w-1/2 min-w-500 md:min-w-0\"\n      title={<Trans message=\"Referrers\" />}\n      contentIsFlex={isLoading}\n      contentClassName=\"max-h-[370px] overflow-y-auto\"\n    >\n      {isLoading && <ChartLoadingIndicator />}\n      {dataItems.map((dataItem, index) => (\n        <div\n          key={dataItem.label || index}\n          className=\"mb-20 flex items-center justify-between gap-24 text-sm\"\n        >\n          {dataItem.label ? (\n            <div className=\"flex items-center gap-8\">\n              <RemoteFavicon url={dataItem.label} />\n              <a\n                className={clsx(\n                  LinkStyle,\n                  'overflow-hidden overflow-ellipsis whitespace-nowrap lowercase',\n                )}\n                href={dataItem.label}\n                target=\"_blank\"\n                rel=\"noreferrer\"\n              >\n                {removeProtocol(dataItem.label)}\n              </a>\n            </div>\n          ) : (\n            <Trans message=\"Direct, Email, SMS\" />\n          )}\n          <Chip\n            radius=\"rounded\"\n            size=\"xs\"\n            color=\"primary\"\n            className=\"font-semibold\"\n          >\n            {dataItem.value}\n          </Chip>\n        </div>\n      ))}\n    </ChartLayout>\n  );\n}\n","import lazyLoader from '../../../utils/http/lazy-loader';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {RefObject, useCallback, useEffect, useRef} from 'react';\nimport {useThemeSelector} from '@common/ui/themes/theme-selector-context';\nimport {themeValueToHex} from '@common/ui/themes/utils/theme-value-to-hex';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {LocationDatasetItem} from '@common/admin/analytics/report-metric';\n\nconst loaderUrl = 'https://www.gstatic.com/charts/loader.js';\n\ninterface UseGoogleGeoChartProps {\n  placeholderRef: RefObject<HTMLDivElement>;\n  data: LocationDatasetItem[];\n  onCountrySelected?: (countryCode: string) => void;\n  country?: string;\n}\nexport function useGoogleGeoChart({\n  placeholderRef,\n  data,\n  country,\n  onCountrySelected,\n}: UseGoogleGeoChartProps) {\n  const {trans} = useTrans();\n  const {analytics} = useSettings();\n  const apiKey = analytics?.gchart_api_key;\n  const {selectedTheme} = useThemeSelector();\n  const geoChartRef = useRef<google.visualization.GeoChart>();\n  // only allow selecting countries, not cities\n  const regionInteractivity = !!onCountrySelected && !country;\n  const drawGoogleChart = useCallback(() => {\n    if (typeof google === 'undefined') return;\n\n    const seedData = data.map(location => [location.label, location.value]);\n    seedData.unshift([\n      country ? trans(message('City')) : trans(message('Country')),\n      trans(message('Clicks')),\n    ]);\n\n    const backgroundColor = `${themeValueToHex(\n      selectedTheme.values['--be-paper'],\n    )}`;\n    const chartColor = `${themeValueToHex(\n      selectedTheme.values['--be-primary'],\n    )}`;\n\n    const options: google.visualization.GeoChartOptions = {\n      colorAxis: {colors: [chartColor]},\n      backgroundColor,\n      region: country ? country.toUpperCase() : undefined,\n      resolution: country ? 'provinces' : 'countries',\n      displayMode: country ? 'markers' : 'regions',\n      enableRegionInteractivity: regionInteractivity,\n    };\n\n    if (\n      !geoChartRef.current &&\n      placeholderRef.current &&\n      google?.visualization?.GeoChart\n    ) {\n      geoChartRef.current = new google.visualization.GeoChart(\n        placeholderRef.current,\n      );\n    }\n    geoChartRef.current?.draw(\n      google.visualization.arrayToDataTable(seedData),\n      options,\n    );\n  }, [\n    selectedTheme,\n    data,\n    placeholderRef,\n    trans,\n    country,\n    regionInteractivity,\n  ]);\n\n  const initGoogleGeoChart = useCallback(async () => {\n    if (lazyLoader.isLoadingOrLoaded(loaderUrl)) return;\n    await lazyLoader.loadAsset(loaderUrl, {type: 'js', id: 'google-charts-js'});\n    await google.charts.load('current', {\n      packages: ['geochart'],\n      mapsApiKey: apiKey,\n    });\n    drawGoogleChart();\n  }, [apiKey, drawGoogleChart]);\n\n  useEffect(() => {\n    if (geoChartRef.current && onCountrySelected) {\n      google.visualization.events.addListener(\n        geoChartRef.current,\n        'regionClick',\n        (a: {region: string}) => onCountrySelected?.(a.region),\n      );\n    }\n\n    return () => {\n      if (geoChartRef.current) {\n        google.visualization.events.removeAllListeners(geoChartRef.current);\n      }\n    };\n    // this will correctly run when geochart instance is set on ref\n  }, [onCountrySelected, geoChartRef.current]);\n\n  // on component load: load chart library then draw, otherwise just draw\n  useEffect(() => {\n    initGoogleGeoChart();\n  }, [initGoogleGeoChart]);\n\n  // redraw chart if data or theme changes\n  useEffect(() => {\n    drawGoogleChart();\n  }, [selectedTheme, drawGoogleChart, data]);\n\n  return {drawGoogleChart};\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowBackIcon = createSvgIcon(\n  <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\" />\n, 'ArrowBackOutlined');\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const InfoDialogTriggerIcon = createSvgIcon(\n  <path d=\"M9 8a1 1 0 0 0-1-1H5.5a1 1 0 1 0 0 2H7v4a1 1 0 0 0 2 0zM4 0h8a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H4a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4zm4 5.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z\" />,\n  'InfoDialogTrigger'\n);\n","import {IconButton} from '@common/ui/buttons/icon-button';\nimport {InfoDialogTriggerIcon} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon';\nimport {Dialog, DialogSize} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport React, {ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface InfoDialogTriggerProps {\n  title?: ReactNode;\n  body: ReactNode;\n  dialogSize?: DialogSize;\n  className?: string;\n}\nexport function InfoDialogTrigger({\n  title,\n  body,\n  dialogSize = 'sm',\n  className,\n}: InfoDialogTriggerProps) {\n  return (\n    <DialogTrigger type=\"popover\" triggerOnHover>\n      <IconButton\n        className={clsx('text-muted opacity-70', className)}\n        size=\"xs\"\n      >\n        <InfoDialogTriggerIcon viewBox=\"0 0 16 16\" />\n      </IconButton>\n      <Dialog size={dialogSize}>\n        {title && (\n          <DialogHeader padding=\"px-18 pt-12\" size=\"md\" hideDismissButton>\n            {title}\n          </DialogHeader>\n        )}\n        <DialogBody>{body}</DialogBody>\n      </Dialog>\n    </DialogTrigger>\n  );\n}\n","import {useSelectedLocale} from '@common/i18n/selected-locale';\nimport {Fragment, memo} from 'react';\n\ninterface Props {\n  code: string;\n}\nexport const FormattedCountryName = memo(({code: countryCode}: Props) => {\n  const {localeCode} = useSelectedLocale();\n  const regionNames = new Intl.DisplayNames([localeCode], {type: 'region'});\n  let formattedName: string | undefined;\n\n  try {\n    formattedName = regionNames.of(countryCode.toUpperCase());\n  } catch (e) {}\n\n  return <Fragment>{formattedName}</Fragment>;\n});\n","import {\n  LocationDatasetItem,\n  ReportMetric,\n} from '@common/admin/analytics/report-metric';\nimport React, {useMemo, useRef} from 'react';\nimport {useGoogleGeoChart} from './use-google-geo-chart';\nimport {ChartLayout, ChartLayoutProps} from '@common/charts/chart-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\nimport {Button} from '@common/ui/buttons/button';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport clsx from 'clsx';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {FormattedCountryName} from '@common/i18n/formatted-country-name';\n\ninterface GeoChartData extends Partial<ChartLayoutProps> {\n  data?: ReportMetric<LocationDatasetItem>;\n  onCountrySelected?: (countryCode: string | undefined) => void;\n  country?: string;\n}\nexport function GeoChart({\n  data: metricData,\n  isLoading,\n  onCountrySelected,\n  country,\n  ...layoutProps\n}: GeoChartData) {\n  const placeholderRef = useRef<HTMLDivElement>(null);\n  const regionInteractivity = !!onCountrySelected;\n\n  // memo data to avoid redrawing chart on rerender\n  const initialData = metricData?.datasets[0].data;\n  const data = useMemo(() => {\n    return initialData || [];\n  }, [initialData]);\n  useGoogleGeoChart({placeholderRef, data, country, onCountrySelected});\n\n  return (\n    <ChartLayout\n      {...layoutProps}\n      className=\"min-w-500\"\n      title={\n        <div className=\"flex items-center\">\n          <Trans message=\"Top Locations\" />\n          {country ? (\n            <span className=\"pl-4\">\n              ({<FormattedCountryName code={country} />})\n            </span>\n          ) : null}\n          {regionInteractivity && <InfoTrigger />}\n        </div>\n      }\n      contentIsFlex={isLoading}\n    >\n      {isLoading && <ChartLoadingIndicator />}\n      <div className=\"flex gap-24\">\n        <div\n          ref={placeholderRef}\n          className=\"flex-auto w-[480px] min-h-[340px]\"\n        />\n        <div className=\"w-[170px]\">\n          <div className=\"text-sm max-h-[340px] w-full flex-initial overflow-y-auto\">\n            {data.map(location => (\n              <div\n                key={location.label}\n                className={clsx(\n                  'flex items-center gap-4 mb-4',\n                  regionInteractivity && 'cursor-pointer hover:underline'\n                )}\n                role={regionInteractivity ? 'button' : undefined}\n                onClick={() => {\n                  onCountrySelected?.(location.code);\n                }}\n              >\n                <div className=\"max-w-110 whitespace-nowrap overflow-hidden overflow-ellipsis\">\n                  {location.label}\n                </div>\n                <div>({location.percentage})%</div>\n              </div>\n            ))}\n          </div>\n          {country && (\n            <Button\n              variant=\"outline\"\n              size=\"xs\"\n              className=\"mt-14\"\n              startIcon={<ArrowBackIcon />}\n              onClick={() => {\n                onCountrySelected?.(undefined);\n              }}\n            >\n              <Trans message=\"Back to countries\" />\n            </Button>\n          )}\n        </div>\n      </div>\n    </ChartLayout>\n  );\n}\n\nfunction InfoTrigger() {\n  return (\n    <InfoDialogTrigger\n      title={<Trans message=\"Zooming in\" />}\n      body={\n        <Trans message=\"Click on a country inside the map or country list to zoom in and see city data for that country.\" />\n      }\n    />\n  );\n}\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport clsx from 'clsx';\n\ninterface BarChartProps extends Omit<BaseChartProps<'bar'>, 'type' | 'data'> {\n  direction?: 'horizontal' | 'vertical';\n  individualBarColors?: boolean;\n  data?: ReportMetric<DatasetItem>;\n}\nexport function BarChart({\n  data,\n  direction = 'vertical',\n  individualBarColors = false,\n  className,\n  ...props\n}: BarChartProps) {\n  const {localeCode} = useSelectedLocale();\n  const formattedData: ChartData<'bar', FormattedDatasetItem[]> =\n    useMemo(() => {\n      const formattedData = formatReportData(data, {localeCode});\n      formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n        ...dataset,\n        backgroundColor: individualBarColors\n          ? ChartColors.map(c => c[1])\n          : ChartColors[i][1],\n        borderColor: individualBarColors\n          ? ChartColors.map(c => c[0])\n          : ChartColors[i][0],\n        borderWidth: 2,\n      }));\n      return formattedData;\n    }, [data, localeCode, individualBarColors]);\n\n  const isHorizontal = direction === 'horizontal';\n  const options: ChartOptions<'bar'> = useMemo(() => {\n    return {\n      indexAxis: isHorizontal ? 'y' : 'x',\n      parsing: {\n        xAxisKey: isHorizontal ? 'value' : 'label',\n        yAxisKey: isHorizontal ? 'label' : 'value',\n      },\n    };\n  }, [isHorizontal]);\n\n  return (\n    <BaseChart\n      type=\"bar\"\n      className={clsx(className, 'min-w-500')}\n      data={formattedData}\n      options={options}\n      {...props}\n    />\n  );\n}\n","import {keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {apiClient} from '@common/http/query-client';\nimport {\n  LocationDatasetItem,\n  ReportMetric,\n} from '@common/admin/analytics/report-metric';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\nconst endpoint = 'reports/clicks';\n\nexport interface FetchLinkReportResponse extends BackendResponse {\n  report: {\n    totalClicks: number;\n    clicks: ReportMetric;\n    browsers: ReportMetric;\n    countries: ReportMetric<LocationDatasetItem>;\n    cities: ReportMetric;\n    devices: ReportMetric;\n    platforms: ReportMetric;\n    referrers: ReportMetric;\n  };\n}\n\nexport type ClicksReportMetric =\n  | 'clicks'\n  | 'devices'\n  | 'browsers'\n  | 'platforms'\n  | 'countries'\n  | 'cities'\n  | 'referrers';\n\ninterface Payload {\n  dateRange: DateRangeValue;\n  model?: string;\n  metrics?: ClicksReportMetric[];\n  country?: string | null;\n}\n\ninterface Options {\n  isEnabled: boolean;\n}\n\nexport function useClicksReport(payload: Payload, options: Options) {\n  return useQuery<FetchLinkReportResponse>({\n    queryKey: [endpoint, payload],\n    queryFn: () => fetchClicksReport(endpoint, payload),\n    placeholderData: keepPreviousData,\n    enabled: options.isEnabled,\n  });\n}\n\nfunction fetchClicksReport<\n  T extends FetchLinkReportResponse = FetchLinkReportResponse,\n>(endpoint: string, payload: Payload): Promise<T> {\n  const params: Record<string, any> = {\n    model: payload.model,\n    metrics: payload.metrics?.join(','),\n    country: payload.country,\n  };\n  params.startDate = payload.dateRange.start.toAbsoluteString();\n  params.endDate = payload.dateRange.end.toAbsoluteString();\n  params.timezone = payload.dateRange.start.timeZone;\n\n  return apiClient.get(endpoint, {params}).then(response => response.data);\n}\n","import React, {\n  cloneElement,\n  Fragment,\n  ReactElement,\n  useCallback,\n  useRef,\n  useState,\n} from 'react';\nimport {LineChart} from '@common/charts/line-chart';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {PolarAreaChart} from '@common/charts/polar-area-chart';\nimport {ReferrerChart} from '@app/dashboard/reports/referrer-chart';\nimport {GeoChart} from '@common/admin/analytics/geo-chart/geo-chart';\nimport {BarChart} from '@common/charts/bar-chart';\nimport {\n  ClicksReportMetric,\n  FetchLinkReportResponse,\n  useClicksReport,\n} from '@app/dashboard/reports/clicks/use-clicks-report';\nimport {BaseChartProps} from '@common/charts/base-chart';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {UseQueryResult} from '@tanstack/react-query';\nimport {useSearchParams} from 'react-router-dom';\n\ninterface Props {\n  dateRange: DateRangeValue;\n  model: string;\n}\nexport function ClicksReportCharts({dateRange, model}: Props) {\n  const colGap = 'gap-12 md:gap-24 mb-12 md:mb-24';\n  const rowClassName = `flex flex-col lg:flex-row lg:items-center overflow-x-auto ${colGap}`;\n\n  return (\n    <Fragment>\n      <div className={rowClassName}>\n        <AsyncChart metric=\"clicks\" model={model} dateRange={dateRange}>\n          {({data}) => (\n            <LineChart\n              className=\"flex-auto\"\n              title={<Trans message=\"Click count\" />}\n              hideLegend\n              description={\n                <Trans\n                  message=\":count total clicks\"\n                  values={{\n                    count: (\n                      <FormattedNumber value={data?.report.clicks.total || 0} />\n                    ),\n                  }}\n                />\n              }\n            />\n          )}\n        </AsyncChart>\n        <AsyncChart metric=\"devices\" model={model} dateRange={dateRange}>\n          <PolarAreaChart\n            title={<Trans message=\"Top devices\" />}\n            className=\"max-w-500\"\n          />\n        </AsyncChart>\n      </div>\n      <div className={rowClassName}>\n        <AsyncChart metric=\"referrers\" model={model} dateRange={dateRange}>\n          <ReferrerChart />\n        </AsyncChart>\n        <GeoChartWithCities dateRange={dateRange} model={model} />\n      </div>\n      <div className={rowClassName}>\n        <AsyncChart metric=\"browsers\" model={model} dateRange={dateRange}>\n          <BarChart\n            className=\"max-w-500\"\n            direction=\"horizontal\"\n            individualBarColors\n            hideLegend\n            title={<Trans message=\"Top browsers\" />}\n          />\n        </AsyncChart>\n        <AsyncChart metric=\"platforms\" model={model} dateRange={dateRange}>\n          <PolarAreaChart\n            className=\"max-w-500\"\n            title={<Trans message=\"Top platforms\" />}\n          />\n        </AsyncChart>\n      </div>\n    </Fragment>\n  );\n}\n\nfunction GeoChartWithCities({model, dateRange}: Props) {\n  const [params, setParams] = useSearchParams();\n  const selectedCountry = params.get('country') || undefined;\n\n  const handleCountrySelected = useCallback(\n    (country?: string) => {\n      setParams(prev => {\n        if (country) {\n          prev.set('country', country);\n        } else {\n          prev.delete('country');\n        }\n        return prev;\n      });\n    },\n    [setParams]\n  );\n\n  return (\n    <AsyncChart\n      metric={selectedCountry ? 'cities' : 'countries'}\n      model={model}\n      dateRange={dateRange}\n      country={selectedCountry}\n    >\n      <GeoChart\n        onCountrySelected={handleCountrySelected}\n        country={selectedCountry}\n        className=\"flex-auto w-1/2 lg:max-w-[740px]\"\n      />\n    </AsyncChart>\n  );\n}\n\ninterface AsyncChartProps {\n  children:\n    | ReactElement<BaseChartProps>\n    | ((\n        query: UseQueryResult<FetchLinkReportResponse>\n      ) => ReactElement<BaseChartProps>);\n  metric: ClicksReportMetric;\n  model: string;\n  dateRange: DateRangeValue;\n  country?: string;\n}\nfunction AsyncChart({children, metric, model, dateRange}: AsyncChartProps) {\n  const [isEnabled, setIsEnabled] = useState(false);\n  const [params] = useSearchParams();\n  const query = useClicksReport(\n    {metrics: [metric], model, dateRange, country: params.get('country')},\n    {isEnabled}\n  );\n  const chart = typeof children === 'function' ? children(query) : children;\n  const observerRef = useRef<IntersectionObserver>();\n\n  const contentRef = useCallback((el: HTMLDivElement | null) => {\n    if (el) {\n      const observer = new IntersectionObserver(\n        ([e]) => {\n          if (e.isIntersecting) {\n            setIsEnabled(true);\n            observerRef.current?.disconnect();\n            observerRef.current = undefined;\n          }\n        },\n        {threshold: 0.1} // if only header is visible, don't load\n      );\n      observerRef.current = observer;\n      observer.observe(el);\n    } else if (observerRef.current) {\n      observerRef.current?.disconnect();\n    }\n  }, []);\n\n  return cloneElement<BaseChartProps>(chart, {\n    data: query.data?.report?.[metric],\n    isLoading: query.isLoading,\n    contentRef,\n  });\n}\n","import {StaticPageTitle} from '@common/seo/static-page-title';\nimport {Trans} from '@common/i18n/trans';\nimport {ReportDateSelector} from '@common/admin/analytics/report-date-selector';\nimport {ClicksReportCharts} from '@app/dashboard/reports/clicks/clicks-report-charts';\nimport React, {ReactNode, useState} from 'react';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\n\ninterface ClicksReportPageLayoutProps {\n  model: string;\n  title: ReactNode;\n  actions?: ReactNode;\n}\nexport function ClicksReportPageLayout({\n  model,\n  title,\n  actions,\n}: ClicksReportPageLayoutProps) {\n  const [dateRange, setDateRange] = useState<DateRangeValue>(() => {\n    // This week\n    return DateRangePresets[2].getRangeValue();\n  });\n  return (\n    <div className=\"min-h-full gap-12 md:gap-24 p-12 md:p-24\">\n      <StaticPageTitle>\n        <Trans message=\"Clicks report\" />\n      </StaticPageTitle>\n      <div className=\"md:flex items-center justify-between gap-24 mb-24\">\n        {title}\n        <div className=\"flex-shrink-0 flex items-center md:justify-end mt-10 md:mt-0 gap-12\">\n          {actions}\n          <div className=\"text-sm font-semibold\">\n            <ReportDateSelector\n              value={dateRange}\n              onChange={setDateRange}\n              compactOnMobile={false}\n            />\n          </div>\n        </div>\n      </div>\n      <ClicksReportCharts dateRange={dateRange} model={model} />\n    </div>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ClicksReportPageLayout} from '@app/dashboard/reports/clicks/clicks-report-page-layout';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {useAuth} from '@common/auth/use-auth';\n\nexport function AllClicksReportPage() {\n  const {workspaceId} = useActiveWorkspaceId();\n  const {user} = useAuth();\n\n  const model =\n    workspaceId && workspaceId > 0\n      ? `workspace=${workspaceId}`\n      : `user=${user?.id}`;\n\n  return (\n    <ClicksReportPageLayout\n      model={model}\n      title={\n        <h1 className=\"text-3xl font-light\">\n          <Trans message=\"Clicks report\" />\n        </h1>\n      }\n    />\n  );\n}\n","import {\n  ALL_PRIMITIVE_OPERATORS,\n  BackendFilter,\n  FilterControlType,\n  FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {USER_MODEL} from '@common/auth/user';\nimport {\n  createdAtFilter,\n  timestampFilter,\n  updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const LinksDatatableFilters: BackendFilter[] = [\n  {\n    key: 'type',\n    label: message('Type'),\n    description: message('Type of the link'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.Select,\n      defaultValue: '01',\n      options: [\n        {\n          key: '01',\n          label: message('Direct'),\n          value: 'direct',\n        },\n        {\n          key: '02',\n          label: message('Overlay'),\n          value: 'overlay',\n        },\n        {\n          key: '03',\n          label: message('Frame'),\n          value: 'frame',\n        },\n        {\n          key: '04',\n          label: message('Custom page'),\n          value: 'link_page',\n        },\n      ],\n    },\n  },\n  {\n    key: 'active',\n    label: message('Status'),\n    description: message('Whether link is disabled or not'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.Select,\n      defaultValue: '01',\n      options: [\n        {\n          key: '01',\n          label: message('Enabled'),\n          value: true,\n        },\n        {\n          key: '02',\n          label: message('Disabled'),\n          value: false,\n        },\n      ],\n    },\n  },\n  {\n    key: 'password',\n    label: message('Password'),\n    description: message('Whether link is password protected'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.Select,\n      defaultValue: '01',\n      options: [\n        {\n          key: '01',\n          label: message('Has a password'),\n          value: {value: null, operator: FilterOperator.ne},\n        },\n        {\n          key: '02',\n          label: message('Does not have a password'),\n          value: {value: null, operator: FilterOperator.eq},\n        },\n      ],\n    },\n  },\n  {\n    key: 'clicks_count',\n    label: message('Click count'),\n    description: message('Total number of clicks for link'),\n    defaultOperator: FilterOperator.gte,\n    operators: ALL_PRIMITIVE_OPERATORS,\n    control: {\n      type: FilterControlType.Input,\n      inputType: 'number',\n      defaultValue: 1,\n    },\n  },\n  timestampFilter({\n    key: 'clicked_at',\n    label: message('Clicked at'),\n    description: message('Date link was last clicked'),\n  }),\n  timestampFilter({\n    key: 'expires_at',\n    label: message('Expires at'),\n    description: message('Date link will expire'),\n  }),\n  createdAtFilter({\n    description: message('Date link was created'),\n  }),\n  updatedAtFilter({\n    description: message('Date link was last updated'),\n  }),\n  {\n    key: 'user_id',\n    label: message('User'),\n    description: message('User link was created by'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.SelectModel,\n      model: USER_MODEL,\n    },\n  },\n];\n","import {\n  FetchValueListsResponse,\n  prefetchValueLists,\n  useValueLists,\n} from '@common/http/value-lists';\nimport {useAuth} from '@common/auth/use-auth';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst names: (keyof FetchValueListsResponse)[] = [\n  'countries',\n  'domains',\n  'pages',\n  'overlays',\n  'pixels',\n  'groups',\n];\n\nexport function useLinkFormValueLists() {\n  const {user} = useAuth();\n  return useValueLists(names, {userId: user?.id, pageType: 'link_page'});\n}\n\nexport function prefetchLinkFormValueLists() {\n  prefetchValueLists(names, {\n    userId: getBootstrapData().user?.id,\n    pageType: 'link_page',\n  });\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {useLinkFormValueLists} from '../requests/use-link-form-value-lists';\nimport {useFormContext} from 'react-hook-form';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\n\nexport function LinkTypeField() {\n  const {\n    branding: {site_name},\n  } = useSettings();\n  const {data} = useLinkFormValueLists();\n  const {watch, setValue} = useFormContext<CrupdateLinkFormValues>();\n  const type = watch('type');\n\n  return (\n    <div className=\"flex items-center gap-12\">\n      <FormSelect\n        className=\"mb-24 flex-auto\"\n        name=\"type\"\n        label={<Trans message=\"Type\" />}\n        selectionMode=\"single\"\n        onSelectionChange={() => {\n          // clear type id when link type changes\n          setValue('type_id', null);\n        }}\n      >\n        <Item\n          value=\"direct\"\n          description={<Trans message=\"Redirect user to url instantly\" />}\n        >\n          <Trans message=\"Direct\" />\n        </Item>\n        <Item\n          value=\"frame\"\n          description={\n            <Trans\n              message=\" Show url inside iframe with :siteName navigation bar.\"\n              values={{siteName: site_name}}\n            />\n          }\n        >\n          <Trans message=\"Frame\" />\n        </Item>\n        <Item\n          value=\"splash\"\n          description={\n            <Trans message=\"Show splash page with optional ads and redirect user to url after a delay.\" />\n          }\n        >\n          <Trans message=\"Splash\" />\n        </Item>\n        {data?.pages?.length ? (\n          <Item\n            value=\"page\"\n            description={\n              <Trans\n                message=\"Show specified link page with :siteName navigation bar and button to open\n      long url.\"\n                values={{siteName: site_name}}\n              />\n            }\n          >\n            <Trans message=\"Link page\" />\n          </Item>\n        ) : null}\n        {data?.overlays.length ? (\n          <Item\n            value=\"overlay\"\n            description={\n              <Trans message=\"Redirect user instantly and show specified overlay over the link.\" />\n            }\n          >\n            <Trans message=\"Overlay\" />\n          </Item>\n        ) : null}\n      </FormSelect>\n      {type === 'page' && (\n        <FormSelect\n          label={<Trans message=\"Link page\" />}\n          name=\"type_id\"\n          selectionMode=\"single\"\n          className=\"mb-24 flex-auto\"\n          required\n        >\n          {data?.pages?.map(page => (\n            <Item key={page.id} value={page.id}>\n              {page.title}\n            </Item>\n          ))}\n        </FormSelect>\n      )}\n      {type === 'overlay' && (\n        <FormSelect\n          label={<Trans message=\"Link overlay\" />}\n          name=\"type_id\"\n          selectionMode=\"single\"\n          className=\"mb-24 flex-auto\"\n          required\n        >\n          {data?.overlays?.map(overlay => (\n            <Item key={overlay.id} value={overlay.id}>\n              {overlay.name}\n            </Item>\n          ))}\n        </FormSelect>\n      )}\n    </div>\n  );\n}\n","export default \"__VITE_ASSET__4d22498a__\"","import {ReactNode} from 'react';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\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 {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport upgradeSvg from '@app/dashboard/upgrade/upgrade.svg';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\n\ninterface UpgradeDialogProps {\n  message?: ReactNode;\n  messageSuffix?: ReactNode;\n}\nexport function UpgradeDialog({message, messageSuffix}: UpgradeDialogProps) {\n  const {close} = useDialogContext();\n\n  return (\n    <Dialog size=\"sm\">\n      <DialogHeader>\n        <Trans message=\"Join the PROs\" />\n      </DialogHeader>\n      <DialogBody>\n        <div className=\"text-center mb-20\">\n          <SvgImage src={upgradeSvg} className=\"h-100 mx-auto\" />\n        </div>\n        <div>\n          {message} {messageSuffix}\n        </div>\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          size=\"xs\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Maybe later\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          size=\"xs\"\n          color=\"primary\"\n          elementType={Link}\n          to=\"/pricing\"\n          target=\"_blank\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Find out more\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {UpgradeDialog} from '@app/dashboard/upgrade/upgrade-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport {ReactNode} from 'react';\n\ninterface FeatureLockedDialogProps {\n  message?: ReactNode;\n  messageSuffix?: ReactNode;\n}\nexport function FeatureLockedDialog({\n  message,\n  messageSuffix,\n}: FeatureLockedDialogProps) {\n  return (\n    <UpgradeDialog\n      message={message}\n      messageSuffix={\n        messageSuffix === undefined ? (\n          <Trans message=\"Upgrade to unlock this feature and many more.\" />\n        ) : (\n          messageSuffix\n        )\n      }\n    />\n  );\n}\n","import {LockIcon} from '@common/icons/material/Lock';\nimport {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ReactNode} from 'react';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {FeatureLockedDialog} from '@app/dashboard/upgrade/feature-locked-dialog';\n\ninterface UpgradeButtonProps {\n  message?: ReactNode;\n  className?: string;\n}\nexport function NoPermissionButton({message, className}: UpgradeButtonProps) {\n  const {billing} = useSettings();\n\n  if (!billing.enable) {\n    return <GenericButton />;\n  }\n\n  return (\n    <DialogTrigger type=\"popover\">\n      <Button\n        variant=\"flat\"\n        color=\"primary\"\n        size=\"2xs\"\n        startIcon={<LockIcon />}\n        className={className}\n      >\n        <Trans message=\"Upgrade\" />\n      </Button>\n      <FeatureLockedDialog message={message} />\n    </DialogTrigger>\n  );\n}\n\nfunction GenericButton() {\n  return (\n    <Tooltip\n      label={\n        <Trans message=\"You don't have permissions to access this feature.\" />\n      }\n    >\n      <LockIcon size=\"sm\" className=\"text-muted\" />\n    </Tooltip>\n  );\n}\n","import {ReactElement, ReactNode} from 'react';\nimport {NoPermissionButton} from '@app/dashboard/upgrade/no-permission-button';\nimport clsx from 'clsx';\n\ninterface LinkFormSectionProps {\n  title: ReactElement;\n  description: ReactElement;\n  children: ReactNode;\n  upgradeMessage?: ReactNode;\n}\nexport function LinkFormSection({\n  title,\n  description,\n  children,\n  upgradeMessage,\n}: LinkFormSectionProps) {\n  return (\n    <div className=\"border-t pt-24\">\n      <div\n        className={clsx(\n          'font-semibold',\n          upgradeMessage && 'flex items-center gap-10 mb-8'\n        )}\n      >\n        <div className=\"text-sm\">{title}</div>\n        {upgradeMessage && <NoPermissionButton message={upgradeMessage} />}\n      </div>\n      <div className=\"text-muted text-sm\">{description}</div>\n      {children}\n    </div>\n  );\n}\n","import {\n  LinkFeaturePermissions,\n  useLinkSummary,\n} from '@app/dashboard/layout/sidenav/use-link-summary';\nimport {useAuth} from '@common/auth/use-auth';\n\nexport function useLinkFeatureStatus(feature: keyof LinkFeaturePermissions) {\n  const {data} = useLinkSummary();\n  const {hasPermission} = useAuth();\n  const disabled: boolean =\n    !data?.usage.links[feature] && !hasPermission('admin');\n  return {disabled};\n}\n","import {Fragment, ReactElement} from 'react';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {LinkFormSection} from './link-form-section';\nimport {useLinkFeatureStatus} from '@app/dashboard/upgrade/use-link-feature-status';\nimport {NoPermissionButton} from '@app/dashboard/upgrade/no-permission-button';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\ninterface LinkRestrictionFieldsProps {\n  linkName: ReactElement<MessageDescriptor>;\n}\nexport function LinkRestrictionFields({linkName}: LinkRestrictionFieldsProps) {\n  const {disabled} = useLinkFeatureStatus('password');\n\n  return (\n    <Fragment>\n      <FormTextField\n        type=\"password\"\n        name=\"password\"\n        label={<Trans message=\"Password\" />}\n        autoComplete=\"new-password\"\n        className=\"mb-24\"\n        labelSuffix={\n          disabled && (\n            <NoPermissionButton\n              message={\n                <Trans message=\"Your current plan doesn't include link password protection.\" />\n              }\n            />\n          )\n        }\n        disabled={disabled}\n      />\n      <ScheduleFields linkName={linkName} />\n      <ExpirationClicksField linkName={linkName} />\n    </Fragment>\n  );\n}\n\nfunction ScheduleFields({linkName}: LinkRestrictionFieldsProps) {\n  const now = useCurrentDateTime();\n  const {disabled} = useLinkFeatureStatus('expiration');\n\n  return (\n    <LinkFormSection\n      title={<Trans message=\"Schedule\" />}\n      description={\n        <Trans\n          message=\"Specify a date when :name should become active and when it should expire. Both activation and expiration dates are optional.\"\n          values={{name: linkName}}\n        />\n      }\n      upgradeMessage={\n        disabled && (\n          <Trans\n            message=\"Your current plan doesn't include :name scheduling.\"\n            values={{name: linkName}}\n          />\n        )\n      }\n    >\n      <div className=\"block md:flex items-center gap-24 mt-24\">\n        <FormDatePicker\n          showCalendarFooter\n          label={<Trans message=\"Activation date\" />}\n          min={now}\n          name=\"activates_at\"\n          className=\"mb-24 flex-auto\"\n          disabled={disabled}\n        />\n        <FormDatePicker\n          showCalendarFooter\n          label={<Trans message=\"Expiration date\" />}\n          min={now}\n          name=\"expires_at\"\n          className=\"mb-24 flex-auto\"\n          disabled={disabled}\n        />\n      </div>\n    </LinkFormSection>\n  );\n}\n\nfunction ExpirationClicksField({linkName}: LinkRestrictionFieldsProps) {\n  const {trans} = useTrans();\n  const {disabled} = useLinkFeatureStatus('expiration');\n\n  return (\n    <LinkFormSection\n      title={<Trans message=\"Expiration clicks\" />}\n      description={\n        <Trans\n          message=\"After :name is visited specified amount of times, it will no longer be accessible.\nOptionally, after click amount is reached :name can redirect to specified url instead.\"\n          values={{name: linkName}}\n        />\n      }\n      upgradeMessage={\n        disabled && (\n          <Trans message=\"Your current plan doesn't include expiration clicks.\" />\n        )\n      }\n    >\n      <div className=\"block md:flex items-center gap-24 mt-24\">\n        <FormTextField\n          type=\"number\"\n          label={<Trans message=\"Max clicks\" />}\n          name=\"exp_clicks_rule.key\"\n          className=\"mb-24 flex-auto\"\n          disabled={disabled}\n        />\n        <FormTextField\n          type=\"url\"\n          label={<Trans message=\"Redirect URL\" />}\n          placeholder={trans(message('Optional'))}\n          name=\"exp_clicks_rule.value\"\n          className=\"mb-24 flex-auto\"\n          disabled={disabled}\n        />\n      </div>\n    </LinkFormSection>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SwapVertIcon = createSvgIcon(\n  <path d=\"M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3 5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3 5 6.99h3V14h2V6.99h3L9 3z\" />\n, 'SwapVertOutlined');\n","import {LinkFormSection} from './link-form-section';\nimport {Trans} from '@common/i18n/trans';\nimport {useLinkFormValueLists} from '../requests/use-link-form-value-lists';\nimport {useFieldArray} from 'react-hook-form';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {cloneElement, Fragment, ReactElement} from 'react';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {useLinkFeatureStatus} from '@app/dashboard/upgrade/use-link-feature-status';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport function LinkRetargetingFields() {\n  return (\n    <div>\n      <GeoFields />\n      <DeviceFields />\n      <PlatformFields />\n    </div>\n  );\n}\n\nfunction GeoFields() {\n  const {trans} = useTrans();\n  const {data} = useLinkFormValueLists();\n  return (\n    <FieldsLayout\n      defaultKey=\"us\"\n      name=\"geo_rules\"\n      title={<Trans message=\"Location targeting\" />}\n      description={\n        <Trans message=\"Redirect users to different url based on their location.\" />\n      }\n      buttonLabel={<Trans message=\"Add location\" />}\n    >\n      <FormSelect\n        required\n        showSearchField\n        searchPlaceholder={trans(message('Search countries'))}\n        selectionMode=\"single\"\n        items={data?.countries}\n        name=\"temp\"\n        label={<Trans message=\"Country\" />}\n        className=\"mt-24 flex-auto\"\n      >\n        {country => (\n          <Item key={country.code} value={country.code}>\n            {country.name}\n          </Item>\n        )}\n      </FormSelect>\n    </FieldsLayout>\n  );\n}\n\nfunction DeviceFields() {\n  return (\n    <FieldsLayout\n      name=\"device_rules\"\n      title={<Trans message=\"Device targeting\" />}\n      description={\n        <Trans message=\"Redirect users to different url based on their device.\" />\n      }\n      buttonLabel={<Trans message=\"Add device\" />}\n      defaultKey=\"desktop\"\n    >\n      <FormSelect\n        required\n        selectionMode=\"single\"\n        name=\"temp\"\n        label={<Trans message=\"Device\" />}\n        className=\"mt-24 flex-auto\"\n      >\n        <Item value=\"desktop\">\n          <Trans message=\"Desktop\" />\n        </Item>\n        <Item value=\"table\">\n          <Trans message=\"Tablet\" />\n        </Item>\n        <Item value=\"mobile\">\n          <Trans message=\"Mobile\" />\n        </Item>\n      </FormSelect>\n    </FieldsLayout>\n  );\n}\n\nfunction PlatformFields() {\n  return (\n    <FieldsLayout\n      name=\"platform_rules\"\n      title={<Trans message=\"Platform targeting\" />}\n      description={\n        <Trans message=\"Redirect users to different url based on their platform.\" />\n      }\n      defaultKey=\"windows\"\n      buttonLabel={<Trans message=\"Add platform\" />}\n    >\n      <FormSelect\n        name=\"temp\"\n        required\n        selectionMode=\"single\"\n        label={<Trans message=\"Platform\" />}\n        className=\"mt-24 flex-auto\"\n      >\n        <Item value=\"windows\">\n          <Trans message=\"Windows\" />\n        </Item>\n        <Item value=\"osx\">\n          <Trans message=\"MacOs\" />\n        </Item>\n        <Item value=\"ios\">\n          <Trans message=\"iOS\" />\n        </Item>\n        <Item value=\"android\">\n          <Trans message=\"Android\" />\n        </Item>\n        <Item value=\"linux\">\n          <Trans message=\"Linux\" />\n        </Item>\n      </FormSelect>\n    </FieldsLayout>\n  );\n}\n\ninterface FieldsLayoutProps {\n  name: 'geo_rules' | 'device_rules' | 'platform_rules';\n  title: ReactElement;\n  description: ReactElement;\n  buttonLabel: ReactElement;\n  defaultKey: string;\n  children: ReactElement;\n}\nfunction FieldsLayout({\n  name,\n  title,\n  description,\n  buttonLabel,\n  defaultKey,\n  children,\n}: FieldsLayoutProps) {\n  const {fields, append, remove} = useFieldArray<CrupdateLinkFormValues>({\n    name,\n  });\n  const {disabled} = useLinkFeatureStatus('retargeting');\n\n  return (\n    <LinkFormSection\n      title={title}\n      description={description}\n      upgradeMessage={\n        disabled && (\n          <Trans message=\"Your current plan doesn't include link retargeting.\" />\n        )\n      }\n    >\n      {fields.map((field, index) => (\n        <div key={field.id} className=\"block items-end gap-14 md:flex\">\n          {cloneElement(children, {name: `${name}.${index}.key`, disabled})}\n          <FormTextField\n            required\n            type=\"url\"\n            name={`${name}.${index}.value`}\n            label={<Trans message=\"URL\" />}\n            className=\"mt-24 flex-auto\"\n            disabled={disabled}\n          />\n          <RemoveButton onClick={() => remove(index)} />\n        </div>\n      ))}\n      <Button\n        className=\"my-8\"\n        variant=\"text\"\n        color=\"primary\"\n        startIcon={<AddIcon />}\n        onClick={() => {\n          append({key: defaultKey, value: ''} as any);\n        }}\n        disabled={disabled}\n      >\n        {buttonLabel}\n      </Button>\n    </LinkFormSection>\n  );\n}\n\ninterface RemoveButtonProps {\n  onClick: () => void;\n}\nfunction RemoveButton({onClick}: RemoveButtonProps) {\n  return (\n    <Fragment>\n      <div className=\"mt-12 md:hidden\">\n        <Button variant=\"outline\" color=\"danger\" size=\"xs\" onClick={onClick}>\n          <Trans message=\"Remove\" />\n        </Button>\n      </div>\n      <IconButton color=\"danger\" onClick={onClick} className=\"max-md:hidden\">\n        <CloseIcon />\n      </IconButton>\n    </Fragment>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PublicIcon = 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 2zM4 12c0-.61.08-1.21.21-1.78L8.99 15v1c0 1.1.9 2 2 2v1.93C7.06 19.43 4 16.07 4 12zm13.89 5.4c-.26-.81-1-1.4-1.9-1.4h-1v-3c0-.55-.45-1-1-1h-6v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41C17.92 5.77 20 8.65 20 12c0 2.08-.81 3.98-2.11 5.4z\" />\n, 'PublicOutlined');\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\n\ninterface LinkSeoFieldsProps {\n  hideTitle?: boolean;\n}\nexport function LinkSeoFields({hideTitle}: LinkSeoFieldsProps) {\n  return (\n    <div>\n      <div className=\"block md:flex gap-24 mb-24\">\n        <FileUploadProvider>\n          <FormImageSelector\n            name=\"image\"\n            diskPrefix=\"links\"\n            variant=\"avatar\"\n            previewSize=\"w-90 h-90\"\n            previewRadius=\"rounded\"\n            placeholderIcon={<div className=\"w-full h-full bg-alt rounded\" />}\n            showRemoveButton\n          />\n        </FileUploadProvider>\n        <div className=\"flex-auto my-24 md:my-0\">\n          {!hideTitle && (\n            <FormTextField\n              name=\"name\"\n              label={<Trans message=\"Title\" />}\n              className=\"mb-24\"\n            />\n          )}\n          <FormTextField\n            inputElementType=\"textarea\"\n            name=\"description\"\n            rows={2}\n            label={<Trans message=\"description\" />}\n          />\n        </div>\n      </div>\n      <FormChipField\n        name=\"tags\"\n        label={<Trans message=\"Tags\" />}\n        valueKey=\"name\"\n      />\n    </div>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AccountTreeIcon = createSvgIcon(\n  <path d=\"M22 11V3h-7v3H9V3H2v8h7V8h2v10h4v3h7v-8h-7v3h-2V8h2v3h7zM7 9H4V5h3v4zm10 6h3v4h-3v-4zm0-10h3v4h-3V5z\" />\n, 'AccountTreeOutlined');\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {Button} from '@common/ui/buttons/button';\nimport {useFieldArray} from 'react-hook-form';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {LinkFormSection} from '@app/dashboard/links/forms/link-form-section';\nimport {useLinkFeatureStatus} from '@app/dashboard/upgrade/use-link-feature-status';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\nexport function LinkUtmFields() {\n  const {trans} = useTrans();\n  const {disabled} = useLinkFeatureStatus('utm');\n\n  return (\n    <LinkFormSection\n      title={<Trans message=\"UTM tags\" />}\n      description={\n        <Trans message=\"Add UTMs to track web traffic in analytics tools.\" />\n      }\n      upgradeMessage={\n        disabled && (\n          <Trans message=\"Your current plan doesn't include UTM functionality.\" />\n        )\n      }\n    >\n      <div className=\"block md:flex gap-24 items-center mt-24\">\n        <FormTextField\n          name=\"utm.source\"\n          label={<Trans message=\"Source\" />}\n          placeholder={trans(message('e.g: adwords, google, facebook'))}\n          className=\"mb-24 flex-auto\"\n          disabled={disabled}\n        />\n        <FormTextField\n          name=\"utm.medium\"\n          label={<Trans message=\"Medium\" />}\n          placeholder={trans(message('e.g: banner, email, social post'))}\n          className=\"mb-24 flex-auto\"\n          disabled={disabled}\n        />\n      </div>\n      <div className=\"block md:flex gap-24 items-center\">\n        <FormTextField\n          name=\"utm.campaign\"\n          label={<Trans message=\"Campaign\" />}\n          placeholder={trans(message('e.g: holiday special, birthday promo'))}\n          className=\"mb-24 flex-auto\"\n          disabled={disabled}\n        />\n        <FormTextField\n          name=\"utm.term\"\n          label={<Trans message=\"Term\" />}\n          placeholder={trans(message('Use to identify ppc keywords'))}\n          className=\"mb-24 flex-auto\"\n          disabled={disabled}\n        />\n      </div>\n      <FormTextField\n        name=\"utm.content\"\n        label={<Trans message=\"Content\" />}\n        placeholder={trans(\n          message('Use to differentiate ads or words on a page')\n        )}\n        className=\"mb-24\"\n        disabled={disabled}\n      />\n      <CustomTagsSection />\n    </LinkFormSection>\n  );\n}\n\nfunction CustomTagsSection() {\n  const {fields, append, remove} = useFieldArray<CrupdateLinkFormValues>({\n    name: 'utm_custom',\n  });\n  const {disabled} = useLinkFeatureStatus('utm');\n\n  return (\n    <LinkFormSection\n      title={<Trans message=\"Custom parameters\" />}\n      description={\n        <Trans message=\"Add query parameters to track web traffic in analytics tools.\" />\n      }\n      upgradeMessage={\n        disabled && (\n          <Trans message=\"Your current plan doesn't include query parameters functionality.\" />\n        )\n      }\n    >\n      {fields.map((field, index) => (\n        <div key={field.id} className=\"block md:flex items-end gap-14\">\n          <FormTextField\n            required\n            name={`utm_custom.${index}.key`}\n            label={<Trans message=\"Key\" />}\n            className=\"flex-auto mt-24\"\n            disabled={disabled}\n          />\n          <FormTextField\n            required\n            name={`utm_custom.${index}.value`}\n            label={<Trans message=\"Value\" />}\n            className=\"flex-auto mt-24\"\n            disabled={disabled}\n          />\n          <RemoveButton onClick={() => remove(index)} />\n        </div>\n      ))}\n      <Button\n        className=\"mb-24 mt-12\"\n        variant=\"text\"\n        color=\"primary\"\n        startIcon={<AddIcon />}\n        onClick={() => {\n          append({key: '', value: ''});\n        }}\n        disabled={disabled}\n      >\n        <Trans message=\"Add parameter\" />\n      </Button>\n    </LinkFormSection>\n  );\n}\n\ninterface RemoveButtonProps {\n  onClick: () => void;\n}\nfunction RemoveButton({onClick}: RemoveButtonProps) {\n  const isMobile = useIsMobileMediaQuery();\n\n  if (isMobile) {\n    return (\n      <div className=\"mt-12\">\n        <Button variant=\"outline\" color=\"danger\" size=\"xs\" onClick={onClick}>\n          <Trans message=\"Remove\" />\n        </Button>\n      </div>\n    );\n  }\n\n  return (\n    <IconButton color=\"danger\" onClick={onClick}>\n      <CloseIcon />\n    </IconButton>\n  );\n}\n","import {useMemo} from 'react';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\n\nexport function useDefaultCustomDomainHost(\n  allDomains?: CustomDomain[]\n): string {\n  const {custom_domains, base_url} = useSettings();\n  return useMemo(() => {\n    const selectedHost = custom_domains?.default_host;\n    if (selectedHost) {\n      const host = allDomains?.find(d => d.host === selectedHost)?.host;\n      if (host) return host;\n    }\n    return base_url.replace(/\\/$/, '').replace(/(^\\w+:|^)\\/\\//, '');\n  }, [custom_domains, base_url, allDomains]);\n}\n","import {FormSelect, FormSelectProps} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport {useDefaultCustomDomainHost} from '@common/custom-domains/use-default-custom-domain-host';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\n\ninterface FormCustomDomainSelectProps\n  extends Omit<FormSelectProps<any>, 'children' | 'selectionMode'> {}\nexport function LinkDomainSelect({\n  ...selectProps\n}: FormCustomDomainSelectProps) {\n  const {data} = useLinkFormValueLists();\n  const defaultHost = useDefaultCustomDomainHost(data?.domains);\n  const {custom_domains} = useSettings();\n  const domains = data?.domains || [];\n\n  if (!custom_domains?.allow_select || !domains.length) return null;\n\n  return (\n    <FormSelect\n      selectionMode=\"single\"\n      label={<Trans message=\"Domain\" />}\n      {...selectProps}\n    >\n      {custom_domains.allow_all_option && (\n        <Item value={null} key=\"all\">\n          <Trans message=\"All my domains (including default)\" />\n        </Item>\n      )}\n      <Item\n        value={0}\n        key=\"default\"\n        startIcon={<RemoteFavicon url={defaultHost} />}\n      >\n        {removeProtocol(defaultHost)}\n      </Item>\n      {data?.domains?.map(domain => {\n        if (domain.host === defaultHost) return null;\n        return (\n          <Item\n            value={domain.id}\n            key={domain.id}\n            startIcon={<RemoteFavicon url={domain.host} />}\n          >\n            {removeProtocol(domain.host)}\n          </Item>\n        );\n      })}\n    </FormSelect>\n  );\n}\n","import {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {Trans} from '@common/i18n/trans';\nimport {SettingsIcon} from '@common/icons/material/Settings';\nimport {LinkTypeField} from '@app/dashboard/links/forms/link-type-field';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {LockIcon} from '@common/icons/material/Lock';\nimport {LinkRestrictionFields} from '@app/dashboard/links/forms/link-restriction-fields';\nimport {SwapVertIcon} from '@common/icons/material/SwapVert';\nimport {LinkRetargetingFields} from '@app/dashboard/links/forms/link-retargeting-fields';\nimport {PublicIcon} from '@common/icons/material/Public';\nimport {LinkSeoFields} from '@app/dashboard/links/forms/link-seo-fields';\nimport {AccountTreeIcon} from '@common/icons/material/AccountTree';\nimport {LinkUtmFields} from '@app/dashboard/links/forms/link-utm-fields';\nimport {useLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {LinkDomainSelect} from '@app/dashboard/links/forms/link-domain-select';\nimport {Fragment, ReactElement, useState} from 'react';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\ntype AccordionKey = 'options' | 'restrictions' | 'retargeting' | 'seo' | 'utm';\nexport type HidableLinkSettingsField =\n  | 'type'\n  | 'groups'\n  | 'seo'\n  | 'enabled'\n  | 'alias'\n  | 'title';\n\ninterface LinkSettingsFormProps {\n  multipleLinks?: boolean;\n  defaultExpanded?: AccordionKey[];\n  hiddenFields?: HidableLinkSettingsField[];\n  linkName?: ReactElement<MessageDescriptor>;\n}\nexport function LinkSettingsForm({\n  defaultExpanded,\n  multipleLinks,\n  hiddenFields = [],\n  linkName = <Trans message=\"link\" />,\n}: LinkSettingsFormProps) {\n  const {\n    links: {retargeting},\n  } = useSettings();\n  const [expandedValues, setExpandedValues] = useState<AccordionKey[]>(\n    defaultExpanded || []\n  );\n\n  return (\n    <Accordion\n      className=\"-ml-14 -mr-14\"\n      mode=\"multiple\"\n      variant=\"minimal\"\n      expandedValues={expandedValues}\n      onExpandedChange={values => {\n        setExpandedValues(values as AccordionKey[]);\n      }}\n    >\n      <AccordionItem\n        value=\"options\"\n        label={<Trans message=\"Settings\" />}\n        startIcon={<SettingsIcon />}\n      >\n        <LinkOptionsFields\n          multipleLinks={multipleLinks}\n          hiddenFields={hiddenFields}\n          linkName={linkName}\n        />\n      </AccordionItem>\n      <AccordionItem\n        value=\"restrictions\"\n        label={<Trans message=\"Restrictions\" />}\n        startIcon={<LockIcon />}\n      >\n        <LinkRestrictionFields linkName={linkName} />\n      </AccordionItem>\n      {retargeting && (\n        <AccordionItem\n          value=\"retargeting\"\n          label={<Trans message=\"Retargeting\" />}\n          startIcon={<SwapVertIcon />}\n        >\n          <LinkRetargetingFields />\n        </AccordionItem>\n      )}\n      {!hiddenFields.includes('seo') && (\n        <AccordionItem\n          label={<Trans message=\"SEO\" />}\n          startIcon={<PublicIcon />}\n          value=\"seo\"\n        >\n          <LinkSeoFields hideTitle={hiddenFields?.includes('title')} />\n        </AccordionItem>\n      )}\n      <AccordionItem\n        value=\"utm\"\n        label={<Trans message=\"UTM\" />}\n        startIcon={<AccountTreeIcon />}\n      >\n        <LinkUtmFields />\n      </AccordionItem>\n    </Accordion>\n  );\n}\n\ninterface LinkOptionsFieldsProps {\n  multipleLinks?: boolean;\n  hiddenFields: HidableLinkSettingsField[];\n  linkName: ReactElement<MessageDescriptor>;\n}\nfunction LinkOptionsFields({\n  multipleLinks,\n  hiddenFields,\n  linkName,\n}: LinkOptionsFieldsProps) {\n  const {\n    links: {enable_type, pixels},\n  } = useSettings();\n  const linkCount = multipleLinks ? 2 : 1;\n  const hideGroups = hiddenFields.includes('groups');\n  const hideType = hiddenFields.includes('type');\n  const hideEnabled = hiddenFields.includes('enabled');\n\n  return (\n    <Fragment>\n      {enable_type && !hideType && <LinkTypeField />}\n      <LinkDomainSelect\n        name=\"domain_id\"\n        className=\"mb-24\"\n        description={\n          <Trans\n            message=\"Select which domain should [one :name|other :names] be accessible with.\"\n            values={{name: linkName, count: linkCount}}\n          />\n        }\n      />\n      {!hideGroups && <LinkGroupsField multipleLinks={multipleLinks} />}\n      {pixels && (\n        <LinkPixelsField multipleLinks={multipleLinks} linkName={linkName} />\n      )}\n      {!hideEnabled && (\n        <FormSwitch\n          name=\"active\"\n          description={\n            <Trans\n              message=\"When [one :name is|other :names are] disabled, 404 page will be shown when short URL is visited.\"\n              values={{name: linkName, count: linkCount}}\n            />\n          }\n        >\n          <Trans message=\"Enabled\" />\n        </FormSwitch>\n      )}\n    </Fragment>\n  );\n}\n\ninterface LinkGroupsFieldProps {\n  multipleLinks?: boolean;\n}\nfunction LinkGroupsField({multipleLinks}: LinkGroupsFieldProps) {\n  const {data} = useLinkFormValueLists();\n  return (\n    <FormChipField\n      suggestions={data?.groups}\n      openMenuOnFocus={true}\n      allowCustomValue={false}\n      showDropdownArrow\n      className=\"mb-24\"\n      name=\"groups\"\n      label={<Trans message=\"Groups\" />}\n      description={\n        <Trans\n          message=\"Which groups should [one link|other these links] belong to.\"\n          values={{count: multipleLinks ? 2 : 1}}\n        />\n      }\n    >\n      {group => <Item value={group.id}>{group.name}</Item>}\n    </FormChipField>\n  );\n}\n\ninterface LinkPixelsFieldProps {\n  multipleLinks?: boolean;\n  linkName: ReactElement<MessageDescriptor>;\n}\nfunction LinkPixelsField({multipleLinks, linkName}: LinkPixelsFieldProps) {\n  const {data} = useLinkFormValueLists();\n  return (\n    <FormChipField\n      suggestions={data?.pixels}\n      openMenuOnFocus={true}\n      className=\"mb-24\"\n      name=\"pixels\"\n      label={<Trans message=\"Pixels\" />}\n      description={\n        <Trans\n          message=\"Which tracking pixels should be used for [one this :name|other these :names].\"\n          values={{count: multipleLinks ? 2 : 1, name: linkName}}\n        />\n      }\n    >\n      {pixel => <Item value={pixel.id}>{pixel.name}</Item>}\n    </FormChipField>\n  );\n}\n","import React, {Fragment, useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {RefCallBack} from 'react-hook-form';\nimport {Button} from './buttons/button';\nimport {LinkIcon} from '../icons/material/Link';\nimport {TextField} from './forms/input-field/text-field/text-field';\nimport {Trans} from '../i18n/trans';\nimport {useSettings} from '../core/settings/use-settings';\nimport {slugifyString} from '@common/utils/string/slugify-string';\n\nexport interface SlugEditorProps {\n  prefix?: string;\n  suffix?: string;\n  host?: string;\n  value?: string | null;\n  placeholder?: string;\n  onChange?: (value: string) => void;\n  className?: string;\n  inputRef?: RefCallBack;\n  onInputBlur?: () => void;\n  showLinkIcon?: boolean;\n  pattern?: string;\n  minLength?: number;\n  maxLength?: number;\n  hideButton?: boolean;\n}\nexport function SlugEditor({\n  host,\n  value: initialValue = '',\n  placeholder,\n  onChange,\n  className,\n  inputRef,\n  onInputBlur,\n  showLinkIcon = true,\n  pattern,\n  minLength,\n  maxLength,\n  hideButton,\n  ...props\n}: SlugEditorProps) {\n  const {base_url} = useSettings();\n  const prefix = props.prefix ? `/${props.prefix}` : '';\n  const suffix = props.suffix ? `/${props.suffix}` : '';\n  const [isEditing, setIsEditing] = useState(false);\n  const [value, setValue] = useState(initialValue);\n  host = host || base_url;\n\n  useEffect(() => {\n    setValue(initialValue);\n  }, [initialValue]);\n\n  const handleSubmit = () => {\n    if (!isEditing) {\n      setIsEditing(true);\n    } else {\n      setIsEditing(false);\n      if (value) {\n        onChange?.(value);\n      }\n    }\n  };\n\n  let preview: string = '';\n  if (value) {\n    preview = value;\n  } else if (placeholder) {\n    preview = slugifyString(placeholder);\n  }\n\n  return (\n    // can't use <form/> here as component might be used inside another form\n    <div className={clsx('flex items-center', className)}>\n      {showLinkIcon && <LinkIcon className=\"icon-md text-muted\" />}\n      <div className=\"text-primary ml-6 mr-14\">\n        {host}\n        {prefix}\n        {!isEditing && preview && (\n          <Fragment>\n            <span>/</span>\n            <span className=\"font-medium\">{preview}</span>\n          </Fragment>\n        )}\n        {!isEditing ? suffix : null}\n      </div>\n      {isEditing && (\n        <TextField\n          pattern={pattern}\n          minLength={minLength}\n          maxLength={maxLength}\n          onKeyDown={e => {\n            if (e.key === 'Enter') {\n              handleSubmit();\n            }\n          }}\n          ref={inputRef}\n          aria-label=\"slug\"\n          autoFocus\n          className=\"mr-14\"\n          size=\"2xs\"\n          value={value as string}\n          onBlur={onInputBlur}\n          onChange={e => {\n            setValue(e.target.value);\n          }}\n        />\n      )}\n      {!hideButton && (\n        <Button\n          type=\"button\"\n          color=\"chip\"\n          variant=\"outline\"\n          size=\"2xs\"\n          onClick={() => {\n            handleSubmit();\n          }}\n        >\n          {isEditing ? <Trans message=\"Save\" /> : <Trans message=\"Edit\" />}\n        </Button>\n      )}\n    </div>\n  );\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {useLinkFeatureStatus} from '@app/dashboard/upgrade/use-link-feature-status';\nimport {SlugEditor} from '@common/ui/slug-editor';\nimport {NoPermissionButton} from '@app/dashboard/upgrade/no-permission-button';\nimport {Trans} from '@common/i18n/trans';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {useDefaultCustomDomainHost} from '@common/custom-domains/use-default-custom-domain-host';\n\ninterface AliasFieldProps {\n  form: UseFormReturn<{hash: string; alias: string} | any>;\n  name: 'alias' | 'hash';\n}\nexport function AliasField({form, name}: AliasFieldProps) {\n  const {\n    links: {alias_min, alias_max},\n  } = useSettings();\n  const {data} = useLinkFormValueLists();\n  const defaultHost = useDefaultCustomDomainHost(data?.domains);\n  const {disabled} = useLinkFeatureStatus('alias');\n  const {watch, setValue, formState} = form;\n  const currentAlias = watch('alias') || watch('hash');\n  const aliasError =\n    formState.errors.alias?.message || formState.errors.hash?.message;\n\n  return (\n    <div className=\"mb-24\">\n      <div className=\"flex items-center\">\n        <SlugEditor\n          host={defaultHost}\n          pattern=\"[A-Za-z0-9\\-]+\"\n          minLength={alias_min}\n          maxLength={alias_max}\n          value={currentAlias}\n          onChange={newAlias => {\n            setValue(name, newAlias, {shouldDirty: true});\n          }}\n          hideButton={disabled}\n        />\n        {disabled && (\n          <NoPermissionButton\n            message={\n              <Trans message=\"Your current plan does not include alias editing.\" />\n            }\n          />\n        )}\n      </div>\n      {aliasError && (\n        <div className=\"text-xs text-danger mt-6\">{aliasError as string}</div>\n      )}\n    </div>\n  );\n}\n","import {UseFormReturn} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {Link} from '../link';\nimport {\n  HidableLinkSettingsField,\n  LinkSettingsForm,\n} from '@app/dashboard/links/forms/link-settings-form';\nimport {urlIsValid} from '@app/dashboard/links/utils/url-is-valid';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {AliasField} from '@app/dashboard/links/forms/alias-field';\nimport {LinkeableFormValues} from '@app/dashboard/links/utils/build-linkeable-payload';\nimport clsx from 'clsx';\n\nexport interface CrupdateLinkFormValues\n  extends Omit<Link, 'id' | 'utm'>,\n    LinkeableFormValues {\n  position?: number;\n}\n\ninterface CrupdateLinkFormProps {\n  onSubmit: (values: CrupdateLinkFormValues) => void;\n  formId?: string;\n  form: UseFormReturn<CrupdateLinkFormValues>;\n  showButtonLabelField?: boolean;\n  hiddenFields?: HidableLinkSettingsField[];\n}\nexport function CrupdateLinkForm({\n  form,\n  onSubmit,\n  formId,\n  showButtonLabelField,\n  hiddenFields,\n}: CrupdateLinkFormProps) {\n  const {clearErrors} = form;\n  const {trans} = useTrans();\n  const {\n    links: {min_len, max_len},\n  } = useSettings();\n  const hideAlias = hiddenFields?.includes('alias');\n\n  return (\n    <Form\n      form={form}\n      onSubmit={values => {\n        if (!urlIsValid(values.long_url)) {\n          form.setError('long_url', {\n            message: trans(message('This url is invalid.')),\n          });\n        } else {\n          onSubmit(values);\n        }\n      }}\n      onBeforeSubmit={() => {\n        // hook form won't clear errors for fields that are not bound to input\n        clearErrors('alias');\n      }}\n      id={formId}\n    >\n      {showButtonLabelField && (\n        <FormTextField\n          name=\"name\"\n          label={<Trans message=\"Button label\" />}\n          className=\"mb-24 flex-auto\"\n          placeholder={trans(message('e.g. My Webpage'))}\n          autoFocus\n        />\n      )}\n      <FormTextField\n        label={<Trans message=\"Destination URL\" />}\n        name=\"long_url\"\n        placeholder=\"https://example.com\"\n        autoComplete=\"off\"\n        spellCheck=\"false\"\n        required\n        className={clsx(hideAlias ? 'mb-24' : 'mb-12')}\n        autoFocus={!showButtonLabelField}\n        minLength={min_len}\n        maxLength={max_len}\n      />\n      {!hideAlias && <AliasField form={form} name=\"alias\" />}\n      <LinkSettingsForm hiddenFields={hiddenFields} />\n    </Form>\n  );\n}\n","import {Biolink} from '@app/dashboard/biolink/biolink';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {Link} from '@app/dashboard/links/link';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {defaultUtmTags} from '@app/dashboard/links/utils/build-linkeable-payload';\n\nexport const placeholderPassword = '********';\n\nexport function buildLinkeableDefaultFormValues(\n  linkeable: Biolink | LinkGroup | Link\n) {\n  const rules = linkeable.rules || [];\n  const defaultUtm: CrupdateLinkFormValues['utm'] = {};\n  const customUtm: CrupdateLinkFormValues['utm_custom'] = [];\n\n  if (linkeable.utm) {\n    const queryParams = new URLSearchParams(linkeable.utm);\n    for (const [key, value] of queryParams.entries()) {\n      if (defaultUtmTags.includes(key)) {\n        defaultUtm[key] = value;\n      } else {\n        customUtm.push({key, value});\n      }\n    }\n  }\n\n  return {\n    hash: linkeable.hash,\n    active: linkeable.active,\n    activates_at: linkeable.activates_at,\n    expires_at: linkeable.expires_at,\n    name: linkeable.name,\n    description: linkeable.description,\n    image: linkeable.image,\n    geo_rules: rules.filter(rule => rule.type === 'geo'),\n    device_rules: rules.filter(rule => rule.type === 'device'),\n    platform_rules: rules.filter(rule => rule.type === 'platform'),\n    exp_clicks_rule: rules.find(r => r.type === 'exp_clicks'),\n    // show an indication to user that password exists\n    password: linkeable.has_password ? placeholderPassword : '',\n    utm: defaultUtm,\n    utm_custom: customUtm,\n    domain_id: linkeable.domain_id,\n    pixels: linkeable.pixels,\n    tags: linkeable.tags,\n  };\n}\n","import {removeEmptyValuesFromObject} from '@common/utils/objects/remove-empty-values-from-object';\nimport {Tag} from '@common/tags/tag';\nimport {LinkRule} from '@app/dashboard/links/link-rule';\nimport {TrackingPixel} from '@app/dashboard/tracking-pixels/tracking-pixel';\nimport {placeholderPassword} from '@app/dashboard/links/utils/build-linkeable-default-form-values';\n\nexport const defaultUtmTags = [\n  'source',\n  'medium',\n  'campaign',\n  'term',\n  'content',\n];\n\nexport interface CrupdateLinkeablePayload\n  extends Omit<LinkeableFormValues, 'utm' | 'groups' | 'pixels' | 'tags'> {\n  utm?: string | null;\n  groups?: number[] | null;\n  pixels?: number[] | null;\n  tags?: string[] | null;\n}\n\nexport interface LinkeableFormValues {\n  exp_clicks_rule?: LinkRule;\n  geo_rules?: LinkRule[];\n  device_rules?: LinkRule[];\n  platform_rules?: LinkRule[];\n  pixels?: TrackingPixel[];\n  tags?: Tag[];\n  password?: string;\n  utm?: {\n    source?: string;\n    medium?: string;\n    campaign?: string;\n    term?: string;\n    content?: string;\n    [key: string]: string | undefined;\n  };\n  utm_custom?: {key: string; value: string}[];\n}\n\nexport function buildLinkeablePayload<R extends CrupdateLinkeablePayload>(\n  values: LinkeableFormValues\n): R {\n  // remove placeholder password, otherwise it will be set every time link is updated\n  if (values.password === placeholderPassword) {\n    delete values.password;\n  }\n  let payload: CrupdateLinkeablePayload = {\n    ...values,\n    utm: null,\n    groups: null,\n    pixels: null,\n    tags: null,\n  };\n  payload = addUtmAndCustomQueryParams(payload, values);\n  payload.pixels = values.pixels ? values.pixels.map(pixel => pixel.id) : [];\n  payload.tags = values.tags?.map((tag: Tag | string) =>\n    typeof tag === 'string' ? tag : tag.name\n  );\n  return payload as R;\n}\n\nfunction addUtmAndCustomQueryParams(\n  payload: CrupdateLinkeablePayload,\n  values: LinkeableFormValues\n): CrupdateLinkeablePayload {\n  if (!values.utm && !values.utm_custom) return payload;\n  const utm = removeEmptyValuesFromObject(values.utm || {}) as Record<\n    string,\n    string\n  >;\n  values.utm_custom?.forEach(({key, value}) => {\n    utm[key] = value;\n  });\n\n  payload.utm = new URLSearchParams(utm).toString();\n  return payload;\n}\n","import {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {\n  buildLinkeablePayload,\n  CrupdateLinkeablePayload,\n} from '@app/dashboard/links/utils/build-linkeable-payload';\n\nexport interface CrupdateLinkPayload\n  extends Omit<CrupdateLinkFormValues, 'utm' | 'groups' | 'pixels' | 'tags'>,\n    CrupdateLinkeablePayload {}\n\nexport function buildLinkPayload(\n  values: CrupdateLinkFormValues\n): CrupdateLinkPayload {\n  const payload = buildLinkeablePayload<CrupdateLinkPayload>(values);\n  payload.groups = values.groups?.map(group => group.id);\n  return payload;\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CrupdateLinkFormValues} from '@app/dashboard/links/forms/crupdate-link-form';\nimport {buildLinkPayload} from '@app/dashboard/links/requests/build-link-payload';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\ninterface Options {\n  endpoint?: string;\n  invalidateQueries?: boolean;\n}\n\nexport function useCreateLink(\n  form: UseFormReturn<CrupdateLinkFormValues>,\n  {endpoint, invalidateQueries = true}: Options = {},\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: CrupdateLinkFormValues) =>\n      createLink(payload, endpoint),\n    onSuccess: () => {\n      toast.positive(trans(message('Link created')));\n      if (invalidateQueries) {\n        queryClient.invalidateQueries({\n          queryKey: DatatableDataQueryKey('link'),\n        });\n        queryClient.invalidateQueries({\n          queryKey: DatatableDataQueryKey('link-group'),\n        });\n        queryClient.invalidateQueries({\n          queryKey: DatatableDataQueryKey('biolink'),\n        });\n      }\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createLink(\n  values: CrupdateLinkFormValues,\n  endpoint?: string,\n): Promise<Response> {\n  return apiClient\n    .post(endpoint || `link`, buildLinkPayload(values))\n    .then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {\n  CrupdateLinkForm,\n  CrupdateLinkFormValues,\n} from '../forms/crupdate-link-form';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {useCreateLink} from '../requests/use-create-link';\nimport {useForm} from 'react-hook-form';\nimport {nanoid} from 'nanoid';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {HidableLinkSettingsField} from '@app/dashboard/links/forms/link-settings-form';\n\nexport interface CreateLinkDialogProps {\n  group?: LinkGroup | Biolink | null;\n  showButtonLabelField?: boolean;\n  hiddenFields?: HidableLinkSettingsField[];\n  endpoint?: string;\n  position?: number;\n  invalidateQueries?: boolean;\n  onSuccess?: (response: any) => void;\n}\nexport function CreateLinkDialog({\n  group,\n  position,\n  showButtonLabelField,\n  hiddenFields,\n  endpoint,\n  onSuccess,\n  invalidateQueries,\n}: CreateLinkDialogProps) {\n  const {close, formId} = useDialogContext();\n  const {\n    links: {default_type},\n    custom_domains,\n  } = useSettings();\n  const {verify, isVerifying} = useRecaptcha('link_creation');\n\n  const form = useForm<CrupdateLinkFormValues>({\n    defaultValues: {\n      hash: nanoid(5),\n      active: true,\n      type: default_type || 'direct',\n      geo_rules: [],\n      device_rules: [],\n      platform_rules: [],\n      // set undefined if no group id specified, so existing groups are not cleared in backend\n      groups: group ? [group as LinkGroup] : [],\n      position: position, // for biolink\n      utm: {},\n      utm_custom: [],\n      domain_id: custom_domains?.allow_all_option ? undefined : 0,\n    },\n  });\n  const createLink = useCreateLink(form, {endpoint, invalidateQueries});\n\n  return (\n    <Dialog size=\"lg\">\n      <DialogHeader>\n        <Trans message=\"Create link\" />\n      </DialogHeader>\n      <DialogBody>\n        <CrupdateLinkForm\n          hiddenFields={hiddenFields}\n          showButtonLabelField={showButtonLabelField}\n          formId={formId}\n          form={form}\n          onSubmit={async values => {\n            const isValid = await verify();\n            if (isValid) {\n              createLink.mutate(values, {\n                onSuccess: response => {\n                  onSuccess?.(response);\n                  close();\n                },\n              });\n            }\n          }}\n        />\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={createLink.isPending || isVerifying}\n        >\n          <Trans message=\"Create\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CrupdateLinkFormValues} from '../forms/crupdate-link-form';\nimport {buildLinkPayload} from '@app/dashboard/links/requests/build-link-payload';\nimport {Link} from '../link';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {\n  link: Link;\n}\n\ninterface Options {\n  endpoint?: string;\n  invalidateQueries?: boolean;\n}\n\nexport function useUpdateLink(\n  form: UseFormReturn<CrupdateLinkFormValues>,\n  linkId: number,\n  {endpoint, invalidateQueries = true}: Options = {},\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: CrupdateLinkFormValues) =>\n      updateLink(linkId, payload, endpoint),\n    onSuccess: async () => {\n      if (invalidateQueries) {\n        await Promise.allSettled([\n          queryClient.invalidateQueries({\n            queryKey: DatatableDataQueryKey('link'),\n          }),\n          queryClient.invalidateQueries({\n            queryKey: DatatableDataQueryKey('link-group'),\n          }),\n          queryClient.invalidateQueries({\n            queryKey: DatatableDataQueryKey('biolink'),\n          }),\n        ]);\n      }\n      toast.positive(trans(message('Link updated')));\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction updateLink(\n  id: number,\n  values: CrupdateLinkFormValues,\n  endpoint?: string,\n): Promise<Response> {\n  return apiClient\n    .put(endpoint || `link/${id}`, buildLinkPayload(values))\n    .then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {\n  CrupdateLinkForm,\n  CrupdateLinkFormValues,\n} from '../forms/crupdate-link-form';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {useForm} from 'react-hook-form';\nimport {useUpdateLink} from '../requests/use-update-link';\nimport {Link} from '../link';\nimport {useMemo} from 'react';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\nimport {buildLinkeableDefaultFormValues} from '@app/dashboard/links/utils/build-linkeable-default-form-values';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {CreateLinkDialogProps} from '@app/dashboard/links/dialogs/create-link-dialog';\n\ninterface UpdateLinkDialogProps extends Omit<CreateLinkDialogProps, 'group'> {\n  link: Link;\n}\nexport function UpdateLinkDialog({\n  link,\n  showButtonLabelField,\n  hiddenFields,\n  invalidateQueries,\n  onSuccess,\n  endpoint,\n}: UpdateLinkDialogProps) {\n  const {close, formId} = useDialogContext();\n  const {verify, isVerifying} = useRecaptcha('link_creation');\n\n  const defaultValues = useMemo(() => buildDefaultFormValues(link), [link]);\n  const form = useForm<CrupdateLinkFormValues>({\n    defaultValues,\n  });\n  const updateLink = useUpdateLink(form, link.id, {\n    endpoint,\n    invalidateQueries,\n  });\n\n  return (\n    <Dialog size=\"lg\">\n      <DialogHeader>\n        <Trans message=\"Update link\" />\n      </DialogHeader>\n      <DialogBody>\n        <CrupdateLinkForm\n          hiddenFields={hiddenFields}\n          showButtonLabelField={showButtonLabelField}\n          formId={formId}\n          form={form}\n          onSubmit={async values => {\n            const isValid = await verify();\n            if (isValid) {\n              updateLink.mutate(values, {\n                onSuccess: response => {\n                  onSuccess?.(response);\n                  close();\n                },\n              });\n            }\n          }}\n        />\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={updateLink.isPending || isVerifying}\n        >\n          <Trans message=\"Update\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n\nexport function buildDefaultFormValues(link: Link) {\n  const values = buildLinkeableDefaultFormValues(link);\n  return {\n    ...values,\n    long_url: link.long_url,\n    alias: link.alias,\n    type: link.type,\n    type_id: link.type_id,\n    groups: link.groups as LinkGroup[],\n  };\n}\n","import {Link} from '@app/dashboard/links/link';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport React from 'react';\n\ninterface LinkImageProps {\n  link: Link;\n  className?: string;\n}\nexport function LinkImage({link, className}: LinkImageProps) {\n  return link.image ? (\n    <img className={className} alt=\"\" src={link.image} />\n  ) : (\n    <RemoteFavicon className={className} url={link.long_url} />\n  );\n}\n","import {UpgradeDialog} from '@app/dashboard/upgrade/upgrade-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {useTrans} from '@common/i18n/use-trans';\n\ninterface FeatureLockedDialogProps {\n  resourceName: MessageDescriptor;\n}\nexport function OverQuotaDialog({resourceName}: FeatureLockedDialogProps) {\n  const {trans} = useTrans();\n  return (\n    <UpgradeDialog\n      message={\n        <Trans\n          message=\"You've reached the maximum number of :resource allowed for your current plan.\"\n          values={{resource: trans(resourceName)}}\n        />\n      }\n      messageSuffix={\n        <Trans message=\"Upgrade to increase this limit and unlock other features.\" />\n      }\n    />\n  );\n}\n","import React, {\n  cloneElement,\n  forwardRef,\n  ReactElement,\n  useMemo,\n  useState,\n} from 'react';\nimport {\n  FetchLinkUsageResponse,\n  useLinkSummary,\n} from '@app/dashboard/layout/sidenav/use-link-summary';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {OverQuotaDialog} from '@app/dashboard/upgrade/over-quota-dialog';\nimport {resourceTranslationMap} from '@app/dashboard/layout/sidenav/resource-usage-list';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {Link} from '@app/dashboard/links/link';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {TrackingPixel} from '@app/dashboard/tracking-pixels/tracking-pixel';\nimport {useAuth} from '@common/auth/use-auth';\n\ntype ResourceName =\n  | Link['model_type']\n  | Biolink['model_type']\n  | LinkOverlay['model_type']\n  | CustomPage['model_type']\n  | CustomDomain['model_type']\n  | LinkGroup['model_type']\n  | TrackingPixel['model_type'];\n\ninterface PermissionAwareButtonProps {\n  resource:\n    | ResourceName\n    | Link\n    | LinkGroup\n    | Biolink\n    | CustomDomain\n    | LinkOverlay\n    | CustomPage\n    | TrackingPixel;\n  action: 'create' | 'update' | 'delete';\n  children: ReactElement;\n}\n\nexport const PermissionAwareButton = forwardRef<\n  HTMLElement,\n  PermissionAwareButtonProps\n>(({children, resource, action, ...childProps}, ref) => {\n  const {user} = useAuth();\n  const [dialogIsOpen, setDialogIsOpen] = useState(false);\n  const {data} = useLinkSummary();\n\n  const usageKey = useMemo(() => {\n    // extract model type from resource\n    const resourceName =\n      typeof resource === 'string' ? resource : resource.model_type;\n\n    // pluralize model type and convert to snake case\n    return `${camelCaseToSnakeCase(\n      resourceName\n    )}s` as keyof FetchLinkUsageResponse['usage'];\n  }, [resource]);\n\n  const hasPermission = data?.usage[usageKey][action];\n  const messageType = data?.usage[usageKey].createMsgType;\n\n  // user has permission or owns the resource\n  if (\n    hasPermission ||\n    (typeof resource === 'object' && resource.user_id === user?.id)\n  ) {\n    return cloneElement(children, {...childProps, ref});\n  }\n\n  if (!hasPermission && messageType !== 'overQuota') {\n    return null;\n  }\n\n  return (\n    <div\n      onPointerDown={createEventHandler(e => {\n        e.preventDefault();\n        e.stopPropagation();\n      })}\n      onClickCapture={createEventHandler(e => {\n        e.preventDefault();\n        e.stopPropagation();\n        setDialogIsOpen(true);\n      })}\n      onKeyDownCapture={createEventHandler(event => {\n        const e = event as unknown as KeyboardEvent;\n        e.preventDefault();\n        e.stopPropagation();\n        if (e.key === 'Enter' || e.key === ' ') {\n          setDialogIsOpen(true);\n        }\n      })}\n    >\n      {children}\n      <DialogTrigger\n        type=\"modal\"\n        isOpen={dialogIsOpen}\n        onOpenChange={setDialogIsOpen}\n      >\n        <OverQuotaDialog resourceName={resourceTranslationMap[usageKey]} />\n      </DialogTrigger>\n    </div>\n  );\n});\n\nfunction camelCaseToSnakeCase(str: string) {\n  return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const BarChartIcon = createSvgIcon(\n  <path d=\"M5 9.2h3V19H5V9.2zM10.6 5h2.8v14h-2.8V5zm5.6 8H19v6h-2.8v-6z\" />\n, 'BarChartOutlined');\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Link} from '../link';\nimport {Trans} from '@common/i18n/trans';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Link as RouterLink} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {UpdateLinkDialog} from '../dialogs/update-link-dialog';\nimport React from 'react';\nimport {LinkImage} from '@app/dashboard/links/link-image';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {LinkClipboardButton} from '@app/dashboard/links/sharing/link-clipboard-button';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\n\nexport const linksDatatableColumns: ColumnConfig<Link>[] = [\n  {\n    key: 'summary',\n    header: () => <Trans message=\"Summary\" />,\n    width: 'flex-3 min-w-200',\n    visibleInMode: 'all',\n    body: link => (\n      <div>\n        <div className=\"flex items-center gap-6 whitespace-nowrap\">\n          <LinkImage link={link} className=\"w-16 h-16\" />\n          <a\n            className=\"block font-semibold hover:underline overflow-ellipsis overflow-hidden w-min\"\n            href={link.long_url}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            data-testid=\"long-url\"\n          >\n            {removeProtocol(link.long_url)}\n          </a>\n        </div>\n        <LinkClipboardButton\n          link={link}\n          variant=\"text\"\n          className=\"block text-muted hover:underline w-min\"\n          data-testid=\"short-url\"\n        />\n      </div>\n    ),\n  },\n  {\n    key: 'user_id',\n    allowsSorting: true,\n    header: () => <Trans message=\"Owner\" />,\n    width: 'flex-2 min-w-140',\n    body: link => {\n      if (!link.user) return '';\n      return (\n        <NameWithAvatar\n          image={link.user.avatar}\n          label={link.user.display_name}\n          description={link.user.email}\n        />\n      );\n    },\n  },\n  {\n    key: 'clicks',\n    sortingKey: 'clicks_count',\n    allowsSorting: true,\n    header: () => <Trans message=\"Clicks\" />,\n    body: link =>\n      link.clicks_count ? <FormattedNumber value={link.clicks_count} /> : '',\n  },\n  {\n    key: 'type',\n    sortingKey: 'type',\n    allowsSorting: true,\n    header: () => <Trans message=\"Type\" />,\n    body: link => (\n      <Chip size=\"xs\" radius=\"rounded\" className=\"capitalize\">\n        <Trans message={link.type} />\n      </Chip>\n    ),\n  },\n  {\n    key: 'password',\n    allowsSorting: true,\n    header: () => <Trans message=\"Password\" />,\n    body: link =>\n      link.has_password ? (\n        <CheckIcon className=\"icon-md text-positive\" />\n      ) : (\n        <CloseIcon className=\"icon-md text-danger\" />\n      ),\n  },\n  {\n    key: 'expires_at',\n    allowsSorting: true,\n    header: () => <Trans message=\"Expires at\" />,\n    body: link =>\n      link.expires_at ? <FormattedDate date={link.expires_at} /> : '',\n  },\n  {\n    key: 'clicked_at',\n    allowsSorting: true,\n    header: () => <Trans message=\"Last clicked\" />,\n    body: link =>\n      link.clicked_at ? <FormattedDate date={link.clicked_at} /> : '',\n  },\n  {\n    key: 'actions',\n    header: () => <Trans message=\"Actions\" />,\n    hideHeader: true,\n    align: 'end',\n    width: 'w-128 flex-shrink-0',\n    visibleInMode: 'all',\n    body: link => (\n      <div className=\"text-muted\">\n        <Tooltip label={<Trans message=\"Link statistics\" />}>\n          <RouterLink to={`${link.id}`}>\n            <IconButton size=\"md\">\n              <BarChartIcon />\n            </IconButton>\n          </RouterLink>\n        </Tooltip>\n        <ShareLinkButton link={link} />\n        <PermissionAwareButton resource={link} action=\"update\">\n          <DialogTrigger type=\"modal\">\n            <Tooltip label={<Trans message=\"Edit link\" />}>\n              <IconButton size=\"md\">\n                <EditIcon />\n              </IconButton>\n            </Tooltip>\n            <UpdateLinkDialog link={link} />\n          </DialogTrigger>\n        </PermissionAwareButton>\n      </div>\n    ),\n  },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddLinkIcon = createSvgIcon(\n  <path d=\"M8 11h8v2H8v-2zm12.1 1H22c0-2.76-2.24-5-5-5h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1zM3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM19 12h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z\" />\n, 'AddLinkOutlined');\n","import {createSvgIcon} from '../../icons/create-svg-icon';\n\nexport const ExportCsvIcon = createSvgIcon(\n  <path d=\"M 7 2 C 5.895 2 5 2.895 5 4 L 5 9 L 4 9 C 2.895 9 2 9.895 2 11 L 2 16 C 2 17.105 2.895 18 4 18 L 5 18 L 5 20 C 5 21.105 5.895 22 7 22 L 15.171875 22 L 13.171875 20 L 7 20 L 7 18 L 17 18 L 17 16 C 17 14.895 17.895 14 19 14 L 21 14 L 21 7 L 16 2 L 7 2 z M 7 4 L 15 4 L 15 8 L 19 8 L 19 9 L 7 9 L 7 4 z M 6 11 C 7.105 11 8 11.895 8 13 L 7 13 C 7 12.449 6.551 12 6 12 C 5.449 12 5 12.449 5 13 L 5 14 C 5 14.551 5.449 15 6 15 C 6.551 15 7 14.551 7 14 L 8 14 C 8 15.105 7.105 16 6 16 C 4.895 16 4 15.105 4 14 L 4 13 C 4 11.895 4.895 11 6 11 z M 10.644531 11 C 12.067531 11.041 12.154297 12.282906 12.154297 12.503906 L 11.1875 12.503906 C 11.1875 12.400906 11.204906 11.806641 10.628906 11.806641 C 10.453906 11.806641 10.059844 11.884188 10.089844 12.367188 C 10.118844 12.810188 10.703547 13.019406 10.810547 13.066406 C 11.034547 13.148406 12.141391 13.642391 12.150391 14.650391 C 12.152391 14.864391 12.097062 15.985 10.664062 16 C 9.1050625 16.017 9 14.675438 9 14.398438 L 9.9746094 14.398438 C 9.9746094 14.545438 9.9870625 15.256172 10.664062 15.201172 C 11.071063 15.167172 11.159828 14.87425 11.173828 14.65625 C 11.196828 14.28925 10.846563 14.068625 10.476562 13.890625 C 9.9565625 13.640625 9.1341406 13.333375 9.1191406 12.359375 C 9.1061406 11.482375 9.7505312 10.975 10.644531 11 z M 13 11 L 14.052734 11 L 14.992188 14.646484 L 15.9375 11 L 17 11 L 15.646484 16 L 14.345703 16 L 13 11 z M 19 16 L 19 20 L 16 20 L 20 24 L 24 20 L 21 20 L 21 16 L 19 16 z\"></path>\n);\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {\n  buildLinkPayload,\n  CrupdateLinkPayload,\n} from '@app/dashboard/links/requests/build-link-payload';\nimport {CreateMultipleLinksFormValue} from '@app/dashboard/links/dialogs/create-multiple-links-dialog';\nimport {Link} from '@app/dashboard/links/link';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface CreateMultipleLinksPayload\n  extends Omit<CrupdateLinkPayload, 'hash' | 'long_url'> {\n  long_urls: string[];\n}\n\ninterface Response extends BackendResponse {\n  links: Link[];\n}\n\nexport function useCreateMultipleLinks(\n  form: UseFormReturn<CreateMultipleLinksFormValue>,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (values: CreateMultipleLinksFormValue) => createLinks(values),\n    onSuccess: response => {\n      toast.positive(\n        trans(\n          message('[one 1 link|other :count links] shortened', {\n            values: {count: response.links.length},\n          }),\n        ),\n      );\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link'),\n      });\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link-group'),\n      });\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createLinks(values: CreateMultipleLinksFormValue): Promise<Response> {\n  return apiClient\n    .post('link/batch/shorten', formToPayload(values))\n    .then(r => r.data);\n}\n\nfunction formToPayload(\n  values: CreateMultipleLinksFormValue,\n): CreateMultipleLinksPayload {\n  const payload = buildLinkPayload(values as any);\n  const longUrls = values.long_urls.split(/\\n/g);\n  return {\n    ...payload,\n    long_urls: longUrls,\n  };\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {CrupdateLinkFormValues} from '../forms/crupdate-link-form';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {useForm} from 'react-hook-form';\nimport {useCreateMultipleLinks} from '@app/dashboard/links/requests/use-create-multiple-links';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {LinkSettingsForm} from '@app/dashboard/links/forms/link-settings-form';\nimport {urlIsValid} from '@app/dashboard/links/utils/url-is-valid';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\n\nexport interface CreateMultipleLinksFormValue\n  extends Omit<CrupdateLinkFormValues, 'hash' | 'long_url'> {\n  long_urls: string;\n}\n\ninterface CreateMultipleLinksDialogProps {\n  group?: LinkGroup | Biolink | null;\n}\nexport function CreateMultipleLinksDialog({\n  group,\n}: CreateMultipleLinksDialogProps) {\n  const {trans} = useTrans();\n  const {close, formId} = useDialogContext();\n  const form = useForm<CreateMultipleLinksFormValue>({\n    defaultValues: {\n      active: true,\n      type: 'direct',\n      geo_rules: [],\n      device_rules: [],\n      platform_rules: [],\n      // set undefined if no group id specified, so existing groups are not cleared in backend\n      groups: group ? [group as LinkGroup] : undefined,\n      utm: {},\n      utm_custom: [],\n    },\n  });\n  const createMultiple = useCreateMultipleLinks(form);\n  return (\n    <Dialog size=\"lg\">\n      <DialogHeader>\n        <Trans message=\"Shorten links\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          id={formId}\n          form={form}\n          onSubmit={values => {\n            const someUrlsInvalid = values.long_urls\n              .split(/\\r?\\n/)\n              .some(url => !urlIsValid(url));\n            if (someUrlsInvalid) {\n              form.setError('long_urls', {\n                message: trans(message('Some of the urls are not valid.')),\n              });\n            } else {\n              createMultiple.mutate(values, {onSuccess: () => close()});\n            }\n          }}\n        >\n          <FormTextField\n            label={<Trans message=\"Multiple URLs (one per line)\" />}\n            inputElementType=\"textarea\"\n            rows={10}\n            name=\"long_urls\"\n            autoComplete=\"off\"\n            spellCheck=\"false\"\n            required\n            className=\"mb-24\"\n            autoFocus\n          />\n          <LinkSettingsForm multipleLinks />\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={createMultiple.isPending}\n        >\n          <Trans message=\"Shorten\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React, {Fragment, useEffect, useMemo} from 'react';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport shareLink from '../share-link.svg';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {LinksDatatableFilters} from './links-datatable-filters';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {CreateLinkDialog} from '../dialogs/create-link-dialog';\nimport {useAuth} from '@common/auth/use-auth';\nimport {linksDatatableColumns} from './links-datatable-columns';\nimport {useExportCsv} from '@common/datatable/requests/use-export-csv';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {MoreHorizIcon} from '@common/icons/material/MoreHoriz';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {AddLinkIcon} from '@common/icons/material/AddLink';\nimport {ExportCsvIcon} from '@common/datatable/csv-export/export-csv-icon';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {CsvExportInfoDialog} from '@common/datatable/csv-export/csv-export-info-dialog';\nimport {CreateMultipleLinksDialog} from '@app/dashboard/links/dialogs/create-multiple-links-dialog';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {prefetchLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\n\ninterface LinksDatablePageProps {\n  forCurrentUser?: boolean;\n}\nexport function LinksDatablePage({forCurrentUser}: LinksDatablePageProps) {\n  const {user} = useAuth();\n  const {workspaceId} = useActiveWorkspaceId();\n  const {filters, columns} = useMemo(() => {\n    const columns = !forCurrentUser\n      ? linksDatatableColumns\n      : linksDatatableColumns.filter(col => col.key !== 'user_id');\n\n    const filters = !forCurrentUser\n      ? LinksDatatableFilters\n      : LinksDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n    return {filters, columns};\n  }, [forCurrentUser]);\n\n  const userId = forCurrentUser ? user?.id : '';\n\n  useEffect(() => {\n    prefetchLinkFormValueLists();\n  }, []);\n\n  return (\n    <DataTablePage\n      endpoint=\"link\"\n      queryParams={{userId, workspaceId, with: 'user'}}\n      title={<Trans message=\"Links\" />}\n      filters={filters}\n      columns={columns}\n      actions={<Actions />}\n      selectedActions={\n        <PermissionAwareButton resource=\"link\" action=\"delete\">\n          <DeleteSelectedItemsAction />\n        </PermissionAwareButton>\n      }\n      emptyStateMessage={\n        <DataTableEmptyStateMessage\n          image={shareLink}\n          title={<Trans message=\"No links have been created yet\" />}\n          filteringTitle={<Trans message=\"No matching links\" />}\n        />\n      }\n    />\n  );\n}\n\nfunction Actions() {\n  const exportCsv = useExportCsv('link/csv/export');\n\n  return (\n    <Fragment>\n      <MenuTrigger>\n        <IconButton\n          variant=\"outline\"\n          color=\"primary\"\n          size=\"sm\"\n          className=\"flex-shrink-0\"\n        >\n          <MoreHorizIcon />\n        </IconButton>\n        <Menu>\n          <Item\n            value=\"addMultiple\"\n            startIcon={<AddLinkIcon />}\n            onSelected={() => {\n              openDialog(CreateMultipleLinksDialog);\n            }}\n          >\n            <Trans message=\"Shorten multiple links\" />\n          </Item>\n          <Item\n            value=\"export\"\n            startIcon={<ExportCsvIcon />}\n            onSelected={() => {\n              exportCsv.mutate(\n                {},\n                {\n                  onSuccess: response => {\n                    if (response.downloadPath) {\n                      downloadFileFromUrl(response.downloadPath);\n                    } else {\n                      openDialog(CsvExportInfoDialog);\n                    }\n                  },\n                },\n              );\n            }}\n          >\n            <Trans message=\"Export links\" />\n          </Item>\n        </Menu>\n      </MenuTrigger>\n      <PermissionAwareButton resource=\"link\" action=\"create\">\n        <DialogTrigger type=\"modal\">\n          <DataTableAddItemButton>\n            <Trans message=\"Shorten link\" />\n          </DataTableAddItemButton>\n          <CreateLinkDialog />\n        </DialogTrigger>\n      </PermissionAwareButton>\n    </Fragment>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoveDownIcon = createSvgIcon(\n  <path d=\"M3 11c0 2.45 1.76 4.47 4.08 4.91l-1.49-1.49L7 13l4 4.01L7 21l-1.41-1.41 1.58-1.58v-.06C3.7 17.54 1 14.58 1 11c0-3.87 3.13-7 7-7h3v2H8c-2.76 0-5 2.24-5 5zm19 0V4h-9v7h9zm-2-2h-5V6h5v3zm-7 4h9v7h-9z\" />\n, 'MoveDownOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n  linkIds: number[];\n}\n\nexport function useMoveLinksToGroup(group: LinkGroup) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: Payload) => moveLinks(group.id, payload),\n    onSuccess: () => {\n      toast.positive(\n        trans(\n          message('Moved links to “:group“', {values: {group: group.name}}),\n        ),\n      );\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link-group'),\n      });\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction moveLinks(groupId: number, payload: Payload): Promise<Response> {\n  return apiClient\n    .post(`link-group/${groupId}/attach`, payload)\n    .then(r => r.data);\n}\n","import {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Trans} from '@common/i18n/trans';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {List, ListItem} from '@common/ui/list/list';\nimport {Link} from '@app/dashboard/links/link';\nimport {useMoveLinksToGroup} from '@app/dashboard/link-groups/link-group-links-datatable-page/requests/use-move-links-to-group';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport React, {useState} from 'react';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {LinkImage} from '@app/dashboard/links/link-image';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport linkSvg from '@app/dashboard/links/share-link.svg';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {\n  GetDatatableDataParams,\n  useDatatableData,\n} from '@common/datatable/requests/paginated-resources';\nimport {LengthAwarePaginationResponse} from '@common/http/backend-response/pagination-response';\n\ninterface MoveLinksToGroupDialogProps {\n  group: LinkGroup;\n}\nexport function MoveLinksToGroupDialog({group}: MoveLinksToGroupDialogProps) {\n  const {close} = useDialogContext();\n  const [selectedIds, setSelectedIds] = useState<number[]>([]);\n  const [params, setParams] = useState<GetDatatableDataParams>({\n    groupId: `!${group.id}`,\n    query: '',\n    perPage: 8,\n  });\n  const {data, isLoading} = useDatatableData<Link>('link', params);\n  const pagination = data?.pagination as LengthAwarePaginationResponse<Link>;\n  const moveLinks = useMoveLinksToGroup(group);\n\n  const paginationButtons = (\n    <div className=\"text-muted\">\n      <IconButton\n        disabled={isLoading || !pagination?.prev_page}\n        onClick={() => {\n          setParams({\n            ...params,\n            page: pagination?.prev_page!,\n          });\n        }}\n      >\n        <KeyboardArrowLeftIcon />\n      </IconButton>\n      <IconButton\n        disabled={isLoading || !pagination?.next_page}\n        onClick={() => {\n          setParams({\n            ...params,\n            page: pagination?.next_page!,\n          });\n        }}\n      >\n        <KeyboardArrowRightIcon />\n      </IconButton>\n    </div>\n  );\n\n  const emptyStageMessage = (\n    <IllustratedMessage\n      image={<SvgImage src={linkSvg} />}\n      title={<Trans message=\"No links found\" />}\n    />\n  );\n\n  const list = (\n    <div className=\"min-h-[464px]\">\n      <List>\n        <AnimatePresence mode=\"wait\">\n          {isLoading ? (\n            <LinksSkeleton />\n          ) : (\n            <LinksList\n              links={pagination?.data}\n              selectedIds={selectedIds}\n              setSelectedIds={setSelectedIds}\n            />\n          )}\n        </AnimatePresence>\n      </List>\n    </div>\n  );\n\n  return (\n    <Dialog size=\"lg\">\n      <DialogHeader>\n        <Trans message=\"Move links to “:group“\" values={{group: group.name}} />\n      </DialogHeader>\n      <DialogBody>\n        <TextField\n          className=\"mb-14\"\n          label={<Trans message=\"Search for links...\" />}\n          value={params.query}\n          onChange={e => {\n            setParams({...params, query: e.target.value});\n          }}\n        />\n        {!isLoading && !pagination?.data.length ? emptyStageMessage : list}\n      </DialogBody>\n      <DialogFooter startAction={paginationButtons}>\n        <Button variant=\"text\" onClick={close}>\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          onClick={() => {\n            moveLinks.mutate({linkIds: selectedIds}, {onSuccess: close});\n          }}\n          disabled={moveLinks.isPending}\n        >\n          <Trans message=\"Move\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n\ninterface ListItemsProps {\n  links?: Link[];\n  selectedIds: number[];\n  setSelectedIds: (ids: number[]) => void;\n}\nfunction LinksList({links, selectedIds, setSelectedIds}: ListItemsProps) {\n  return (\n    <m.div key=\"links-list\" {...opacityAnimation}>\n      <List>\n        {(links || []).map(link => {\n          const isSelected = selectedIds.includes(link.id);\n          return (\n            <ListItem\n              key={link.id}\n              isSelected={isSelected}\n              onSelected={() => {\n                if (isSelected) {\n                  setSelectedIds(selectedIds.filter(id => id !== link.id));\n                } else {\n                  setSelectedIds([...selectedIds, link.id]);\n                }\n              }}\n              startIcon={<Checkbox checked={isSelected} />}\n              description={removeProtocol(link.short_url)}\n            >\n              <div className=\"flex items-center gap-8\">\n                <LinkImage className=\"w-14 h-14\" link={link} />\n                <div>{removeProtocol(link.long_url)}</div>\n              </div>\n            </ListItem>\n          );\n        })}\n      </List>\n    </m.div>\n  );\n}\n\nconst skeletonCount = 8;\nfunction LinksSkeleton() {\n  return (\n    <m.div key=\"links-skeleton\" {...opacityAnimation}>\n      <List>\n        {Array.from({length: skeletonCount}).map((_, index) => (\n          <ListItem key={index} isDisabled>\n            <Skeleton variant=\"text\" className=\"min-h-40\" />\n          </ListItem>\n        ))}\n      </List>\n    </m.div>\n  );\n}\n","import React, {Fragment, useContext} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {LinksDatatableFilters} from '@app/dashboard/links/links-datatable-page/links-datatable-filters';\nimport {linksDatatableColumns} from '@app/dashboard/links/links-datatable-page/links-datatable-columns';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport shareLink from '../../links/share-link.svg';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {useParams} from 'react-router-dom';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {DataTable} from '@common/datatable/data-table';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {Link} from '@app/dashboard/links/link';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {CreateLinkDialog} from '@app/dashboard/links/dialogs/create-link-dialog';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {AddLinkIcon} from '@common/icons/material/AddLink';\nimport {ExportCsvIcon} from '@common/datatable/csv-export/export-csv-icon';\nimport {MoreHorizIcon} from '@common/icons/material/MoreHoriz';\nimport {MoveDownIcon} from '@common/icons/material/MoveDown';\nimport {useExportCsv} from '@common/datatable/requests/use-export-csv';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {CsvExportInfoDialog} from '@common/datatable/csv-export/csv-export-info-dialog';\nimport {MoveLinksToGroupDialog} from '@app/dashboard/link-groups/link-group-links-datatable-page/move-links-to-group-dialog';\nimport {DataTableContext} from '@common/datatable/page/data-table-context';\nimport {CreateMultipleLinksDialog} from '@app/dashboard/links/dialogs/create-multiple-links-dialog';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\n\ninterface LinkGroupLinksResponse extends PaginatedBackendResponse<Link> {\n  linkGroup: LinkGroup;\n}\n\nexport function LinkGroupsLinksDatatablePage() {\n  const {groupId} = useParams();\n\n  return (\n    <div className=\"p-12 md:p-24\">\n      <DataTable\n        endpoint={`link-group/${groupId}/links`}\n        filters={LinksDatatableFilters}\n        columns={linksDatatableColumns}\n        actions={<Actions groupId={groupId ? +groupId : undefined} />}\n        selectedActions={\n          <PermissionAwareButton resource=\"link\" action=\"delete\">\n            <DeleteSelectedItemsAction />\n          </PermissionAwareButton>\n        }\n        emptyStateMessage={\n          <DataTableEmptyStateMessage\n            image={shareLink}\n            title={<Trans message=\"There are no links in this group yet\" />}\n            filteringTitle={<Trans message=\"No matching links\" />}\n          />\n        }\n      >\n        <PageTitle />\n      </DataTable>\n    </div>\n  );\n}\n\nfunction PageTitle() {\n  const navigate = useNavigate();\n  const {query} = useContext(DataTableContext);\n  const linkGroup = (query.data as LinkGroupLinksResponse)?.linkGroup;\n\n  // avoid layout shift when link group is not loaded yet\n  if (!linkGroup) return <Breadcrumb size=\"xl\" className=\"mb-16\" />;\n\n  const title = (\n    <Trans message=\"“:group“ links\" values={{group: linkGroup.name}} />\n  );\n  return (\n    <Fragment>\n      <StaticPageTitle>{title}</StaticPageTitle>\n      <Breadcrumb size=\"xl\" className=\"mb-16\">\n        <BreadcrumbItem\n          onSelected={() => {\n            navigate('/dashboard/link-groups');\n          }}\n        >\n          <Trans message=\"Link groups\" />\n        </BreadcrumbItem>\n        <BreadcrumbItem className=\"first-letter:capitalize\">\n          {title}\n        </BreadcrumbItem>\n      </Breadcrumb>\n    </Fragment>\n  );\n}\n\ninterface ActionsProps {\n  groupId?: number;\n}\nfunction Actions({groupId}: ActionsProps) {\n  const exportCsv = useExportCsv('link/csv/export');\n  const {query} = useContext(DataTableContext);\n  const linkGroup = (query.data as LinkGroupLinksResponse)?.linkGroup;\n\n  return (\n    <Fragment>\n      <MenuTrigger>\n        <IconButton\n          variant=\"outline\"\n          color=\"primary\"\n          size=\"sm\"\n          className=\"flex-shrink-0\"\n        >\n          <MoreHorizIcon />\n        </IconButton>\n        <Menu>\n          <Item\n            value=\"moveLinks\"\n            startIcon={<MoveDownIcon />}\n            onSelected={() => {\n              openDialog(MoveLinksToGroupDialog, {group: linkGroup});\n            }}\n          >\n            <Trans message=\"Move links to this group\" />\n          </Item>\n          <Item\n            value=\"addMultiple\"\n            startIcon={<AddLinkIcon />}\n            onSelected={() => {\n              openDialog(CreateMultipleLinksDialog, {group: linkGroup});\n            }}\n          >\n            <Trans message=\"Add multiple links\" />\n          </Item>\n          <Item\n            value=\"export\"\n            startIcon={<ExportCsvIcon />}\n            onSelected={() => {\n              exportCsv.mutate(\n                {groupId},\n                {\n                  onSuccess: response => {\n                    if (response.downloadPath) {\n                      downloadFileFromUrl(response.downloadPath);\n                    } else {\n                      openDialog(CsvExportInfoDialog);\n                    }\n                  },\n                },\n              );\n            }}\n          >\n            <Trans message=\"Export links\" />\n          </Item>\n        </Menu>\n      </MenuTrigger>\n      <PermissionAwareButton resource=\"link\" action=\"create\">\n        <DialogTrigger type=\"modal\">\n          <DataTableAddItemButton>\n            <Trans message=\"Add link\" />\n          </DataTableAddItemButton>\n          <CreateLinkDialog group={linkGroup} />\n        </DialogTrigger>\n      </PermissionAwareButton>\n    </Fragment>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ListAltIcon = createSvgIcon(\n  <path d=\"M11 7h6v2h-6zm0 4h6v2h-6zm0 4h6v2h-6zM7 7h2v2H7zm0 4h2v2H7zm0 4h2v2H7zM20.1 3H3.9c-.5 0-.9.4-.9.9v16.2c0 .4.4.9.9.9h16.2c.4 0 .9-.5.9-.9V3.9c0-.5-.5-.9-.9-.9zM19 19H5V5h14v14z\" />\n, 'ListAltOutlined');\n","import {UseFormReturn} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {LinkDomainSelect} from '@app/dashboard/links/forms/link-domain-select';\nimport {LinkGroup} from '../../link-group';\nimport {AliasField} from '@app/dashboard/links/forms/alias-field';\n\nexport interface CrupdateLinkGroupPayload\n  extends Pick<\n    LinkGroup,\n    'name' | 'description' | 'hash' | 'active' | 'rotator' | 'domain_id'\n  > {}\n\ninterface CrupdateLinkGroupFormProps {\n  formId: string;\n  form: UseFormReturn<CrupdateLinkGroupPayload>;\n  onSubmit: (values: CrupdateLinkGroupPayload) => void;\n}\nexport function CrupdateLinkGroupForm({\n  onSubmit,\n  form,\n  formId,\n}: CrupdateLinkGroupFormProps) {\n  const {clearErrors} = form;\n  return (\n    <Form\n      form={form}\n      id={formId}\n      onBeforeSubmit={() => {\n        // hook form won't clear errors for fields that are not bound to input\n        clearErrors('hash');\n      }}\n      onSubmit={onSubmit}\n    >\n      <div className=\"mb-24\">\n        <FormTextField\n          name=\"name\"\n          label={<Trans message=\"Name\" />}\n          minLength={3}\n          className=\"mb-8\"\n          autoFocus\n        />\n        <AliasField form={form} name=\"hash\" />\n      </div>\n      <LinkDomainSelect name=\"domain_id\" className=\"mb-24\" />\n      <FormTextField\n        name=\"description\"\n        className=\"mb-24\"\n        label={<Trans message=\"Description\" />}\n        inputElementType=\"textarea\"\n        rows={2}\n      />\n      <FormSwitch\n        name=\"active\"\n        description={\n          <Trans message=\"Whether this link group is viewable publicly.\" />\n        }\n        className=\"mb-24\"\n      >\n        <Trans message=\"Active\" />\n      </FormSwitch>\n      <FormSwitch\n        name=\"rotator\"\n        description={\n          <Trans message=\"When checked, url above will redirect to random link from the group, instead of showing all links belonging to group.\" />\n        }\n      >\n        <Trans message=\"Rotator\" />\n      </FormSwitch>\n    </Form>\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CrupdateLinkGroupPayload} from '../crupdate/crupdate-link-group-form';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdateLinkGroup(\n  form: UseFormReturn<CrupdateLinkGroupPayload>,\n  groupId: number,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: CrupdateLinkGroupPayload) =>\n      updateLinkGroup(groupId, payload),\n    onSuccess: () => {\n      toast.positive(trans(message('Link group updated')));\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link-group'),\n      });\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction updateLinkGroup(\n  id: number,\n  payload: CrupdateLinkGroupPayload,\n): Promise<Response> {\n  return apiClient.put(`link-group/${id}`, payload).then(r => r.data);\n}\n","import {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {\n  CrupdateLinkGroupForm,\n  CrupdateLinkGroupPayload,\n} from './crupdate-link-group-form';\nimport {useForm} from 'react-hook-form';\nimport {useUpdateLinkGroup} from '../requests/use-update-link-group';\nimport {LinkGroup} from '../../link-group';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\n\ninterface UpdateLinkGroupDialogProps {\n  group: LinkGroup;\n}\nexport function UpdateLinkGroupDialog({group}: UpdateLinkGroupDialogProps) {\n  const {verify, isVerifying} = useRecaptcha('link_creation');\n  const {formId, close} = useDialogContext();\n  const form = useForm<CrupdateLinkGroupPayload>({\n    defaultValues: {\n      name: group.name,\n      hash: group.hash,\n      description: group.description,\n      active: group.active,\n      rotator: group.rotator,\n    },\n  });\n  const updateGroup = useUpdateLinkGroup(form, group.id);\n\n  return (\n    <Dialog size=\"md\">\n      <DialogHeader>\n        <Trans message=\"Update link group\" />\n      </DialogHeader>\n      <DialogBody>\n        <CrupdateLinkGroupForm\n          formId={formId}\n          form={form}\n          onSubmit={async values => {\n            const isValid = await verify();\n            if (isValid) {\n              updateGroup.mutate(values, {onSuccess: () => close()});\n            }\n          }}\n        />\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={updateGroup.isPending || isVerifying}\n        >\n          <Trans message=\"Update\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Link as RouterLink} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport React from 'react';\nimport {LinkGroup} from '../link-group';\nimport {ListAltIcon} from '@common/icons/material/ListAlt';\nimport {UpdateLinkGroupDialog} from '@app/dashboard/link-groups/link-groups-datatable-page/crupdate/update-link-group-dialog';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\nexport const LinkGroupsDatatableColumns: ColumnConfig<LinkGroup>[] = [\n  {\n    key: 'name',\n    allowsSorting: true,\n    header: () => <Trans message=\"Name\" />,\n    width: 'flex-3 min-w-200',\n    visibleInMode: 'all',\n    body: group => (\n      <a\n        href={group.short_url}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        className={LinkStyle}\n      >\n        {group.name}\n      </a>\n    ),\n  },\n  {\n    key: 'user_id',\n    allowsSorting: true,\n    width: 'flex-2 min-w-140',\n    header: () => <Trans message=\"Owner\" />,\n    body: group => {\n      if (!group.user) return '';\n      return (\n        <NameWithAvatar\n          image={group.user.avatar}\n          label={group.user.display_name}\n          description={group.user.email}\n        />\n      );\n    },\n  },\n  {\n    key: 'links_count',\n    allowsSorting: true,\n    header: () => <Trans message=\"Links\" />,\n    body: group =>\n      group.links_count ? <FormattedNumber value={group.links_count} /> : '-',\n  },\n  {\n    key: 'active',\n    allowsSorting: true,\n    header: () => <Trans message=\"Active\" />,\n    body: group =>\n      group.active ? (\n        <CheckIcon className=\"icon-md text-positive\" />\n      ) : (\n        <CloseIcon className=\"icon-md text-danger\" />\n      ),\n  },\n  {\n    key: 'rotator',\n    allowsSorting: true,\n    header: () => <Trans message=\"Rotator\" />,\n    body: group =>\n      group.rotator ? (\n        <CheckIcon className=\"icon-md text-positive\" />\n      ) : (\n        <CloseIcon className=\"icon-md text-danger\" />\n      ),\n  },\n  {\n    key: 'updated_at',\n    allowsSorting: true,\n    header: () => <Trans message=\"Last updated\" />,\n    body: link =>\n      link.updated_at ? <FormattedDate date={link.updated_at} /> : '',\n  },\n  {\n    key: 'actions',\n    header: () => <Trans message=\"Actions\" />,\n    hideHeader: true,\n    align: 'end',\n    width: 'w-160 flex-shrink-0',\n    visibleInMode: 'all',\n    body: group => (\n      <div className=\"text-muted\">\n        <Tooltip label={<Trans message=\"Clicks report\" />}>\n          <RouterLink to={`${group.id}`}>\n            <IconButton size=\"md\">\n              <BarChartIcon />\n            </IconButton>\n          </RouterLink>\n        </Tooltip>\n        <Tooltip label={<Trans message=\"Manage links\" />}>\n          <RouterLink to={`${group.id}/links`}>\n            <IconButton size=\"md\">\n              <ListAltIcon />\n            </IconButton>\n          </RouterLink>\n        </Tooltip>\n        <ShareLinkButton link={group} />\n        <PermissionAwareButton resource={group} action=\"update\">\n          <DialogTrigger type=\"modal\">\n            <Tooltip label={<Trans message=\"Edit link\" />}>\n              <IconButton size=\"md\">\n                <EditIcon />\n              </IconButton>\n            </Tooltip>\n            <UpdateLinkGroupDialog group={group} />\n          </DialogTrigger>\n        </PermissionAwareButton>\n      </div>\n    ),\n  },\n];\n","import {\n  ALL_PRIMITIVE_OPERATORS,\n  BackendFilter,\n  FilterControlType,\n  FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {USER_MODEL} from '@common/auth/user';\nimport {\n  createdAtFilter,\n  updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const LinkGroupsDatatableFilters: BackendFilter[] = [\n  {\n    key: 'rotator',\n    label: message('Type'),\n    defaultOperator: FilterOperator.eq,\n    description: message('Type of the group'),\n    control: {\n      type: FilterControlType.Select,\n      defaultValue: '01',\n      options: [\n        {\n          key: '01',\n          label: message('Default'),\n          value: false,\n        },\n        {\n          key: '02',\n          label: message('Rotator'),\n          value: true,\n        },\n      ],\n    },\n  },\n  {\n    key: 'active',\n    label: message('Status'),\n    description: message('Whether group is disabled or not'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.Select,\n      defaultValue: '01',\n      options: [\n        {\n          key: '01',\n          label: message('Enabled'),\n          value: true,\n        },\n        {\n          key: '02',\n          label: message('Disabled'),\n          value: false,\n        },\n      ],\n    },\n  },\n  {\n    key: 'links_count',\n    label: message('Link count'),\n    description: message('Number of links in the group'),\n    defaultOperator: FilterOperator.gte,\n    operators: ALL_PRIMITIVE_OPERATORS,\n    control: {\n      type: FilterControlType.Input,\n      inputType: 'number',\n      defaultValue: 1,\n    },\n  },\n  createdAtFilter({\n    description: message('Date group was created'),\n  }),\n  updatedAtFilter({\n    description: message('Date group was last updated'),\n  }),\n  {\n    key: 'user_id',\n    label: message('User'),\n    description: message('User group was created by'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.SelectModel,\n      model: USER_MODEL,\n    },\n  },\n];\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CrupdateLinkGroupPayload} from '../crupdate/crupdate-link-group-form';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useCreateLinkGroup(\n  form: UseFormReturn<CrupdateLinkGroupPayload>,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (props: CrupdateLinkGroupPayload) => createLinkGroup(props),\n    onSuccess: () => {\n      toast.positive(trans(message('Link group created')));\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link-group'),\n      });\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createLinkGroup(payload: CrupdateLinkGroupPayload): Promise<Response> {\n  return apiClient.post(`link-group`, payload).then(r => r.data);\n}\n","import {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {\n  CrupdateLinkGroupForm,\n  CrupdateLinkGroupPayload,\n} from './crupdate-link-group-form';\nimport {useForm} from 'react-hook-form';\nimport {useCreateLinkGroup} from '../requests/use-create-link-group';\nimport {nanoid} from 'nanoid';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\n\nexport function CreateLinkGroupDialog() {\n  const {formId, close} = useDialogContext();\n  const {custom_domains} = useSettings();\n  const {verify, isVerifying} = useRecaptcha('link_creation');\n\n  const form = useForm<CrupdateLinkGroupPayload>({\n    defaultValues: {\n      active: true,\n      hash: nanoid(6),\n      rotator: false,\n      domain_id: custom_domains?.allow_all_option ? undefined : 0,\n    },\n  });\n\n  const createGroup = useCreateLinkGroup(form);\n  return (\n    <Dialog size=\"md\">\n      <DialogHeader>\n        <Trans message=\"Create link group\" />\n      </DialogHeader>\n      <DialogBody>\n        <CrupdateLinkGroupForm\n          formId={formId}\n          form={form}\n          onSubmit={async values => {\n            const isValid = await verify();\n            if (isValid) {\n              createGroup.mutate(values, {onSuccess: () => close()});\n            }\n          }}\n        />\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={createGroup.isPending || isVerifying}\n        >\n          <Trans message=\"Create\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport React, {Fragment, useEffect, useMemo} from 'react';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport shareLink from '../../links/share-link.svg';\nimport {DataTableExportCsvButton} from '@common/datatable/csv-export/data-table-export-csv-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {LinkGroupsDatatableColumns} from './link-groups-datatable-columns';\nimport {LinkGroupsDatatableFilters} from './link-groups-datatable-filters';\nimport {CreateLinkGroupDialog} from './crupdate/create-link-group-dialog';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {prefetchLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\ninterface LinkGroupsDatatablePageProps {\n  forCurrentUser?: boolean;\n}\nexport function LinkGroupsDatatablePage({\n  forCurrentUser,\n}: LinkGroupsDatatablePageProps) {\n  const {user} = useAuth();\n  const {workspaceId} = useActiveWorkspaceId();\n  const {filters, columns} = useMemo(() => {\n    const columns = !forCurrentUser\n      ? LinkGroupsDatatableColumns\n      : LinkGroupsDatatableColumns.filter(col => col.key !== 'user_id');\n\n    const filters = !forCurrentUser\n      ? LinkGroupsDatatableFilters\n      : LinkGroupsDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n    return {filters, columns};\n  }, [forCurrentUser]);\n\n  useEffect(() => {\n    prefetchLinkFormValueLists();\n  }, []);\n\n  const userId = forCurrentUser ? user?.id : '';\n  return (\n    <DataTablePage\n      endpoint=\"link-group\"\n      queryParams={{\n        userId,\n        withCount: 'links',\n        with: 'user,domain',\n        workspaceId,\n      }}\n      title={<Trans message=\"Link groups\" />}\n      headerContent={<InfoTrigger />}\n      filters={filters}\n      columns={columns}\n      actions={<Actions />}\n      selectedActions={\n        <PermissionAwareButton resource=\"linkGroup\" action=\"delete\">\n          <DeleteSelectedItemsAction />\n        </PermissionAwareButton>\n      }\n      emptyStateMessage={\n        <DataTableEmptyStateMessage\n          image={shareLink}\n          title={<Trans message=\"No groups have been created yet\" />}\n          filteringTitle={<Trans message=\"No matching groups\" />}\n        />\n      }\n    />\n  );\n}\n\nfunction InfoTrigger() {\n  return (\n    <InfoDialogTrigger\n      dialogSize=\"auto\"\n      title={<Trans message=\"Group links together to:\" />}\n      body={\n        <ul className=\"list-inside list-disc whitespace-nowrap\">\n          <li>\n            <Trans message=\"Simplify multiple link management.\" />\n          </li>\n          <li>\n            <Trans message=\"View aggregated clicks report for the whole group.\" />\n          </li>\n          <li>\n            <Trans message=\"Redirect to a random link from within the group.\" />\n          </li>\n          <li>\n            <Trans message=\"Share all links in the group with one link.\" />\n          </li>\n        </ul>\n      }\n    />\n  );\n}\n\nfunction Actions() {\n  return (\n    <Fragment>\n      <DataTableExportCsvButton endpoint=\"link-group/csv/export\" />\n      <PermissionAwareButton resource=\"linkGroup\" action=\"create\">\n        <DialogTrigger type=\"modal\">\n          <DataTableAddItemButton>\n            <Trans message=\"New group\" />\n          </DataTableAddItemButton>\n          <CreateLinkGroupDialog />\n        </DialogTrigger>\n      </PermissionAwareButton>\n    </Fragment>\n  );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {LinkGroup} from '@app/dashboard/link-groups/link-group';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface FetchLinkGroupResponse extends BackendResponse {\n  linkGroup: LinkGroup;\n}\n\nexport function useLinkGroup(groupId: number | string) {\n  return useQuery({\n    queryKey: ['link-group', groupId],\n    queryFn: () => fetchLinkGroup(groupId),\n    initialData: seedInitialDataFromPaginatedList(groupId),\n  });\n}\n\nfunction fetchLinkGroup(\n  groupId: number | string,\n): Promise<FetchLinkGroupResponse> {\n  return apiClient.get(`link-group/${groupId}`).then(response => response.data);\n}\n\nfunction seedInitialDataFromPaginatedList(groupId: number | string) {\n  const linkGroup = queryClient\n    .getQueryData<PaginatedBackendResponse<LinkGroup>>(\n      DatatableDataQueryKey('link-group'),\n    )\n    ?.pagination?.data.find(link => link.id === +groupId);\n  return linkGroup ? {linkGroup} : undefined;\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ClicksReportPageLayout} from '@app/dashboard/reports/clicks/clicks-report-page-layout';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useParams} from 'react-router-dom';\nimport {useLinkGroup} from '@app/dashboard/link-groups/link-group-links-datatable-page/requests/use-link-group';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport clsx from 'clsx';\n\nexport function LinkGroupClicksReportPage() {\n  const navigate = useNavigate();\n  const {groupId} = useParams();\n  const query = useLinkGroup(groupId!);\n  const group = query.data?.linkGroup;\n\n  return (\n    <ClicksReportPageLayout\n      model={`link-group=${groupId}`}\n      title={\n        <Breadcrumb size=\"xl\" className={clsx(query.isLoading && 'invisible')}>\n          <BreadcrumbItem\n            onSelected={() => {\n              navigate('..', {relative: 'path'});\n            }}\n          >\n            <Trans message=\"Link groups\" />\n          </BreadcrumbItem>\n          <BreadcrumbItem className=\"first-letter:capitalize\">\n            <Trans message=\"“:name“ clicks\" values={{name: group?.name}} />\n          </BreadcrumbItem>\n        </Breadcrumb>\n      }\n      actions={\n        group && (\n          <ShareLinkButton className=\"flex-shrink-0 text-muted\" link={group} />\n        )\n      }\n    />\n  );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {Link} from '@app/dashboard/links/link';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\nexport interface GetLinkResponse extends BackendResponse {\n  link: Link;\n}\n\nexport function useLink(linkId: number | string) {\n  return useQuery({\n    queryKey: ['link', linkId],\n    queryFn: () => fetchLink(linkId),\n    initialData: seedInitialDataFromPaginatedList(linkId),\n  });\n}\n\nfunction fetchLink(linkId: number | string): Promise<GetLinkResponse> {\n  return apiClient.get(`link/${linkId}`).then(response => response.data);\n}\n\nfunction seedInitialDataFromPaginatedList(linkId: number | string) {\n  const link = queryClient\n    .getQueryData<PaginatedBackendResponse<Link>>(DatatableDataQueryKey('link'))\n    ?.pagination?.data.find(link => link.id === +linkId);\n  return link ? {link} : undefined;\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ClicksReportPageLayout} from '@app/dashboard/reports/clicks/clicks-report-page-layout';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useParams} from 'react-router-dom';\nimport {useLink} from '@app/dashboard/layout/sidenav/use-link';\nimport clsx from 'clsx';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\n\nexport function LinkClicksReportPage() {\n  const navigate = useNavigate();\n  const {linkId} = useParams();\n  const query = useLink(linkId!);\n  const link = query.data?.link;\n\n  return (\n    <ClicksReportPageLayout\n      model={`link=${linkId}`}\n      title={\n        <Breadcrumb size=\"xl\" className={clsx(query.isLoading && 'invisible')}>\n          <BreadcrumbItem\n            onSelected={() => {\n              navigate('..', {relative: 'path'});\n            }}\n          >\n            <Trans message=\"Links\" />\n          </BreadcrumbItem>\n          <BreadcrumbItem className=\"first-letter:capitalize\">\n            <Trans message=\"“:name“ clicks\" values={{name: link?.name}} />\n          </BreadcrumbItem>\n        </Breadcrumb>\n      }\n      actions={\n        link && (\n          <ShareLinkButton className=\"flex-shrink-0 text-muted\" link={link} />\n        )\n      }\n    />\n  );\n}\n","export default \"__VITE_ASSET__9a950bec__\"","import world from '@common/custom-domains/datatable/world.svg';\nimport {Trans} from '@common/i18n/trans';\nimport {\n  DataTableEmptyStateMessage,\n  DataTableEmptyStateMessageProps,\n} from '@common/datatable/page/data-table-emty-state-message';\nimport React from 'react';\n\nexport function DomainsEmptyStateMessage(\n  props: Partial<DataTableEmptyStateMessageProps>\n) {\n  return (\n    <DataTableEmptyStateMessage\n      {...props}\n      image={world}\n      title={<Trans message=\"No domains have been connected yet\" />}\n      filteringTitle={<Trans message=\"No matching domains\" />}\n    />\n  );\n}\n","import {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport React from 'react';\n\ninterface BooleanIndicatorProps {\n  value: boolean;\n}\nexport function BooleanIndicator({value}: BooleanIndicatorProps) {\n  if (value) {\n    return <CheckIcon className=\"icon-md text-positive\" />;\n  }\n  return <CloseIcon className=\"icon-md text-danger\" />;\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n  domain: CustomDomain;\n}\n\nexport function useDeleteDomain() {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (props: Payload) => deleteDomain(props),\n    onSuccess: (response, props) => {\n      toast.positive(\n        trans(\n          message('“:domain” removed', {values: {domain: props.domain.host}}),\n        ),\n      );\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('custom-domain'),\n      });\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction deleteDomain({domain}: Payload): Promise<Response> {\n  return apiClient.delete(`custom-domain/${domain.id}`).then(r => r.data);\n}\n","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport React from 'react';\nimport {useDeleteDomain} from '@common/custom-domains/datatable/requests/use-delete-domain';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\n\ninterface DeleteDomainButtonProps {\n  domain: CustomDomain;\n}\nexport function DeleteDomainButton({domain}: DeleteDomainButtonProps) {\n  const deleteDomain = useDeleteDomain();\n\n  return (\n    <DialogTrigger\n      type=\"modal\"\n      onClose={isConfirmed => {\n        if (isConfirmed) {\n          deleteDomain.mutate({domain});\n        }\n      }}\n    >\n      <Button\n        variant=\"outline\"\n        color=\"danger\"\n        size=\"xs\"\n        disabled={deleteDomain.isPending}\n      >\n        <Trans message=\"Remove\" />\n      </Button>\n      <ConfirmationDialog\n        title={<Trans message=\"Remove domain?\" />}\n        body={\n          <Trans\n            message=\"Are you sure you want to remove “:domain“?\"\n            values={{domain: domain.host}}\n          />\n        }\n        confirm={<Trans message=\"Remove\" />}\n        isDanger\n      />\n    </DialogTrigger>\n  );\n}\n","import {CustomDomain} from '@common/custom-domains/custom-domain';\nimport {ColumnConfig} from '@common/datatable/column-config';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Trans} from '@common/i18n/trans';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport React from 'react';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {BooleanIndicator} from '@common/datatable/column-templates/boolean-indicator';\nimport {DeleteDomainButton} from '@common/custom-domains/datatable/delete-domain-button';\n\nexport const domainsDatatableColumns: ColumnConfig<CustomDomain>[] = [\n  {\n    key: 'host',\n    allowsSorting: true,\n    header: () => <Trans message=\"Domain\" />,\n    width: 'flex-3 min-w-200',\n    visibleInMode: 'all',\n    body: domain => (\n      <div>\n        <div className=\"flex items-center gap-6 whitespace-nowrap\">\n          <RemoteFavicon url={domain.host} />\n          <a\n            className=\"block font-semibold hover:underline overflow-ellipsis overflow-hidden w-min\"\n            href={domain.host}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            data-testid=\"host-name\"\n          >\n            {domain.host}\n          </a>\n        </div>\n      </div>\n    ),\n  },\n  {\n    key: 'user_id',\n    allowsSorting: true,\n    header: () => <Trans message=\"Owner\" />,\n    width: 'flex-2 min-w-140',\n    body: domain => {\n      if (!domain.user) return '';\n      return (\n        <NameWithAvatar\n          image={domain.user.avatar}\n          label={domain.user.display_name}\n          description={domain.user.email}\n        />\n      );\n    },\n  },\n  {\n    key: 'global',\n    allowsSorting: true,\n    header: () => <Trans message=\"Global\" />,\n    body: domain => <BooleanIndicator value={domain.global} />,\n  },\n  {\n    key: 'updated_at',\n    allowsSorting: true,\n    header: () => <Trans message=\"Last updated\" />,\n    body: domain =>\n      domain.updated_at ? <FormattedDate date={domain.updated_at} /> : '',\n  },\n  {\n    key: 'actions',\n    header: () => <Trans message=\"Actions\" />,\n    hideHeader: true,\n    width: 'w-80 flex-shrink-0',\n    visibleInMode: 'all',\n    align: 'end',\n    body: domain => <DeleteDomainButton domain={domain} />,\n  },\n];\n","import {\n  BackendFilter,\n  FilterControlType,\n  FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {USER_MODEL} from '@common/auth/user';\nimport {\n  createdAtFilter,\n  updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const DomainsDatatableFilters: BackendFilter[] = [\n  {\n    key: 'global',\n    label: message('Global'),\n    description: message('Whether domain is marked as global'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.BooleanToggle,\n      defaultValue: true,\n    },\n  },\n  createdAtFilter({\n    description: message('Date domain was created'),\n  }),\n  updatedAtFilter({\n    description: message('Date domain was last updated'),\n  }),\n  {\n    key: 'user_id',\n    label: message('Owner'),\n    description: message('User domain belongs to'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.SelectModel,\n      model: USER_MODEL,\n    },\n  },\n];\n","export function isSubdomain(host: string): boolean {\n  return (host.replace('www.', '').match(/\\./g) || []).length > 1;\n}\n","import {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {Trans} from '@common/i18n/trans';\nimport {ReactNode} from 'react';\n\ninterface DomainProgressIndicatorProps {\n  message?: ReactNode;\n}\nexport function DomainProgressIndicator({\n  message = <Trans message=\"Checking DNS configuration...\" />,\n}: DomainProgressIndicatorProps) {\n  return (\n    <div className=\"flex items-center gap-18 text-base p-12 rounded bg-primary/10 text-primary\">\n      <ProgressCircle isIndeterminate size=\"sm\" />\n      <div>{message}</div>\n    </div>\n  );\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {Trans} from '@common/i18n/trans';\nimport {ReactNode} from 'react';\nimport {ConnectDomainStepProps} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\nimport {isSubdomain} from '@common/custom-domains/datatable/connect-domain-dialog/is-subdomain';\nimport {DomainProgressIndicator} from '@common/custom-domains/datatable/connect-domain-dialog/domain-progress-indicator';\n\nexport function InfoStep({\n  stepper: {\n    state: {isLoading, host, serverIp},\n  },\n}: ConnectDomainStepProps) {\n  const {base_url} = useSettings();\n\n  if (isLoading) {\n    return <DomainProgressIndicator />;\n  }\n\n  if (isSubdomain(host)) {\n    return (\n      <Message\n        title={\n          <Trans message=\"Add this CNAME record to your domain by visiting your DNS provider or registrar.\" />\n        }\n        record=\"CNAME\"\n        target={base_url}\n      />\n    );\n  }\n\n  return (\n    <Message\n      title={\n        <Trans message=\"Add this A record to your domain by visiting your DNS provider or registrar.\" />\n      }\n      record=\"A\"\n      target={serverIp}\n    />\n  );\n}\n\ninterface MessageProps {\n  title: ReactNode;\n  record: string;\n  target: string;\n}\n\nfunction Message({title, record, target}: MessageProps) {\n  return (\n    <div>\n      <div className=\"text-muted mb-10\">{title}</div>\n      <div className=\"flex items-center gap-12 text-base p-12 rounded bg-primary/10 text-primary font-semibold\">\n        <div>{record}</div>\n        {target}\n      </div>\n    </div>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment} from 'react';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {ConnectDomainStepProps} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\n\nexport function HostStep({stepper}: ConnectDomainStepProps) {\n  return (\n    <Fragment>\n      <FormTextField\n        autoFocus\n        name=\"host\"\n        required\n        maxLength={100}\n        label={<Trans message=\"Host\" />}\n        placeholder=\"https://example.com\"\n        description={\n          <Trans message=\"Enter the exact domain name you want your items to be accessible with. It can be a subdomain (example.yourdomain.com) or root domain (yourdomain.com).\" />\n        }\n      />\n      {stepper.showGlobalField && (\n        <FormSwitch\n          className=\"mt-24 border-t pt-24\"\n          name=\"global\"\n          description={\n            <Trans message=\"Whether all users should be able to select this domain.\" />\n          }\n        >\n          <Trans message=\"Global\" />\n        </FormSwitch>\n      )}\n    </Fragment>\n  );\n}\n","import {useConnectDomainStepper} from '@common/custom-domains/datatable/connect-domain-dialog/use-connect-domain-stepper';\n\nexport enum ConnectDomainStep {\n  Host = 1,\n  Info = 2,\n  ValidationFailed = 3,\n  Finalize = 4,\n}\n\nexport interface ConnectDomainStepProps {\n  stepper: ReturnType<typeof useConnectDomainStepper>;\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n  result: 'connected' | null;\n}\n\ninterface Payload {\n  host: string;\n}\n\nexport function useValidateDomainDns() {\n  return useMutation({\n    mutationFn: (props: Payload) => authorize(props),\n  });\n}\n\nfunction authorize(payload: Payload): Promise<Response> {\n  return apiClient\n    .post('secure/custom-domain/validate/2BrM45vvfS/api', payload)\n    .then(r => r.data);\n}\n","import {useSettings} from '@common/core/settings/use-settings';\nimport {Trans} from '@common/i18n/trans';\nimport {Fragment, ReactNode} from 'react';\nimport {ConnectDomainStepProps} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\nimport {useAuth} from '@common/auth/use-auth';\nimport {isSubdomain} from '@common/custom-domains/datatable/connect-domain-dialog/is-subdomain';\nimport {WarningIcon} from '@common/icons/material/Warning';\nimport {useValidateDomainDns} from '@common/custom-domains/datatable/requests/use-validate-domain-dns';\nimport {DomainProgressIndicator} from '@common/custom-domains/datatable/connect-domain-dialog/domain-progress-indicator';\n\nexport function ValidationFailedStep({\n  stepper: {\n    goToNextStep,\n    state: {host, serverIp, isLoading, validationFailReason},\n  },\n}: ConnectDomainStepProps) {\n  const validateDns = useValidateDomainDns();\n  const {base_url} = useSettings();\n  const {hasPermission} = useAuth();\n  const subdomain = isSubdomain(host);\n  const record = subdomain ? 'CNAME' : 'A';\n  const location = subdomain ? base_url : serverIp;\n\n  if (isLoading) {\n    return <DomainProgressIndicator />;\n  }\n\n  const errorMessage =\n    validationFailReason === 'serverNotConfigured' && hasPermission('admin') ? (\n      <ErrorMessage>\n        <Trans\n          message=\"DNS records for the domain are setup, however it seems that your server is not configured to handle requests from “:host“\"\n          values={{host: location}}\n        />\n      </ErrorMessage>\n    ) : (\n      <ErrorMessage>\n        <Trans\n          message=\"The domain is missing :record record pointing to :location or the changes haven't propagated yet.\"\n          values={{record, location}}\n        />\n      </ErrorMessage>\n    );\n\n  return (\n    <Fragment>\n      {errorMessage}\n      <div className=\"whitespace-nowrap text-xs text-muted mt-10\">\n        <Trans\n          message=\"You can wait and try again later, or <b>refresh</b>\"\n          values={{\n            b: (text: string) => (\n              <button\n                disabled={isLoading}\n                type=\"button\"\n                className=\"text-primary underline\"\n                onClick={() => {\n                  goToNextStep();\n                }}\n              >\n                {text}\n              </button>\n            ),\n          }}\n        />\n      </div>\n    </Fragment>\n  );\n}\n\ninterface ErrorMessageProps {\n  children: ReactNode;\n}\nfunction ErrorMessage({children}: ErrorMessageProps) {\n  return (\n    <div className=\"flex items-center gap-12 text-base p-12 rounded bg-warning/15 text-warning font-medium\">\n      <WarningIcon size=\"lg\" />\n      {children}\n    </div>\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 {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\n\ninterface Response extends BackendResponse {\n  serverIp: string;\n}\n\nexport interface AuthorizeDomainConnectPayload {\n  host: string;\n}\n\n// check if is this host is not connected already and if user has permissions to connect domains\nexport function useAuthorizeDomainConnect(\n  form: UseFormReturn<AuthorizeDomainConnectPayload>,\n) {\n  return useMutation({\n    mutationFn: (props: AuthorizeDomainConnectPayload) => authorize(props),\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction authorize(payload: AuthorizeDomainConnectPayload): Promise<Response> {\n  return apiClient\n    .post('secure/custom-domain/authorize/store', payload)\n    .then(r => r.data);\n}\n","import {useMutation, useQueryClient} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\n\ninterface Response extends BackendResponse {\n  domain: CustomDomain;\n}\n\ninterface Payload {\n  host: string;\n  global?: boolean;\n}\n\nexport function useConnectDomain() {\n  const {trans} = useTrans();\n  const queryClient = useQueryClient();\n  return useMutation({\n    mutationFn: (props: Payload) => connectDomain(props),\n    onSuccess: response => {\n      toast.positive(\n        trans(\n          message('“:domain” connected', {\n            values: {domain: response.domain.host},\n          }),\n        ),\n      );\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('custom-domain'),\n      });\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction connectDomain(payload: Payload): Promise<Response> {\n  return apiClient.post('custom-domain', payload).then(r => r.data);\n}\n","import {useState} from 'react';\nimport {ConnectDomainStep} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\nimport {DomainValidationErrorResponse} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-dialog';\nimport {\n  AuthorizeDomainConnectPayload,\n  useAuthorizeDomainConnect,\n} from '@common/custom-domains/datatable/requests/use-authorize-domain-connect';\nimport {useForm} from 'react-hook-form';\nimport {AxiosError} from 'axios';\nimport {useValidateDomainDns} from '@common/custom-domains/datatable/requests/use-validate-domain-dns';\nimport {useConnectDomain} from '@common/custom-domains/datatable/requests/use-connect-domain';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\ninterface ConnectDomainStepperState {\n  isLoading: boolean;\n  currentStep: ConnectDomainStep;\n  host: string;\n  serverIp: string;\n  validationFailReason?: DomainValidationErrorResponse['failReason'];\n}\n\ninterface StepHandlerResult {\n  status: 'success' | 'error';\n  newState?: Partial<ConnectDomainStepperState>;\n}\n\ninterface UseConnectDomainStepperProps {\n  showGlobalField?: boolean;\n}\nexport function useConnectDomainStepper({\n  showGlobalField,\n}: UseConnectDomainStepperProps) {\n  const {close} = useDialogContext();\n  const form = useForm<AuthorizeDomainConnectPayload>();\n  const authorizeDomainConnect = useAuthorizeDomainConnect(form);\n  const validateDns = useValidateDomainDns();\n  const connectDomain = useConnectDomain();\n\n  const [state, setState] = useState<ConnectDomainStepperState>({\n    isLoading: false,\n    currentStep: ConnectDomainStep.Host,\n    host: '',\n    serverIp: '',\n  });\n\n  const startLoading = () => {\n    setState({\n      ...state,\n      isLoading: true,\n    });\n  };\n\n  const handleDomainValidation = (): Promise<StepHandlerResult> => {\n    return new Promise(resolve => {\n      validateDns.mutate(\n        {host: state.host},\n        {\n          onSuccess: () => {\n            resolve({\n              status: 'success',\n              newState: {validationFailReason: undefined},\n            });\n          },\n          onError: err => {\n            resolve({\n              status: 'error',\n              newState: {\n                validationFailReason: (\n                  err as AxiosError<DomainValidationErrorResponse>\n                ).response?.data.failReason,\n              },\n            });\n          },\n        }\n      );\n    });\n  };\n\n  const handleDomainAuthorization = (): Promise<StepHandlerResult> => {\n    return new Promise(resolve => {\n      authorizeDomainConnect.mutate(form.getValues(), {\n        onSuccess: response => {\n          resolve({\n            status: 'success',\n            newState: {\n              host: form.getValues().host,\n              serverIp: response.serverIp,\n            },\n          });\n        },\n        onError: () => {\n          resolve({status: 'error'});\n        },\n      });\n    });\n  };\n\n  const hasPreviousStep = state.currentStep !== ConnectDomainStep.Host;\n\n  const goToPreviousStep = () => {\n    if (!hasPreviousStep || state.isLoading) return;\n\n    if (state.currentStep === ConnectDomainStep.Info) {\n      setState({\n        ...state,\n        currentStep: ConnectDomainStep.Host,\n      });\n    } else if (state.currentStep === ConnectDomainStep.ValidationFailed) {\n      setState({\n        ...state,\n        currentStep: ConnectDomainStep.Info,\n      });\n    }\n  };\n\n  const goToNextStep = async () => {\n    if (state.currentStep === ConnectDomainStep.Host) {\n      startLoading();\n      const result = await handleDomainAuthorization();\n      setState({\n        ...state,\n        ...result.newState,\n        isLoading: false,\n        currentStep:\n          result.status === 'success'\n            ? ConnectDomainStep.Info\n            : ConnectDomainStep.Host,\n      });\n    } else if (\n      state.currentStep === ConnectDomainStep.Info ||\n      state.currentStep === ConnectDomainStep.ValidationFailed\n    ) {\n      startLoading();\n      const validationResult = await handleDomainValidation();\n      const nextStep =\n        validationResult.status === 'success'\n          ? ConnectDomainStep.Finalize\n          : ConnectDomainStep.ValidationFailed;\n      setState({\n        ...state,\n        ...validationResult.newState,\n        isLoading: false,\n        currentStep: nextStep,\n      });\n      if (nextStep === ConnectDomainStep.Finalize) {\n        connectDomain.mutate(form.getValues(), {\n          onSettled: () => {\n            close();\n          },\n        });\n      }\n    }\n  };\n\n  return {\n    form,\n    state,\n    goToNextStep,\n    hasPreviousStep,\n    goToPreviousStep,\n    showGlobalField,\n  };\n}\n","import {Trans} from '@common/i18n/trans';\nimport {DomainProgressIndicator} from '@common/custom-domains/datatable/connect-domain-dialog/domain-progress-indicator';\n\nexport function FinalizeStep() {\n  return (\n    <div>\n      <DomainProgressIndicator\n        message={<Trans message=\"Connecting domain...\" />}\n      />\n      <div className=\"text-muted mt-10 text-xs\">\n        <Trans message=\"Don't close this window until domain is connected.\" />\n      </div>\n    </div>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {InfoStep} from '@common/custom-domains/datatable/connect-domain-dialog/info-step';\nimport {HostStep} from '@common/custom-domains/datatable/connect-domain-dialog/host-step';\nimport {ConnectDomainStep} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-step';\nimport {BackendErrorResponse} from '@common/errors/backend-error-response';\nimport {ValidationFailedStep} from '@common/custom-domains/datatable/connect-domain-dialog/validation-failed-step';\nimport {useConnectDomainStepper} from '@common/custom-domains/datatable/connect-domain-dialog/use-connect-domain-stepper';\nimport {Form} from '@common/ui/forms/form';\nimport {FinalizeStep} from '@common/custom-domains/datatable/connect-domain-dialog/finalize-step';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\n\nexport interface DomainValidationErrorResponse extends BackendErrorResponse {\n  failReason: 'serverNotConfigured' | 'dnsNotSetup';\n}\n\ninterface ConnectDomainDialogProps {\n  showGlobalField?: boolean;\n}\nexport function ConnectDomainDialog({\n  showGlobalField,\n}: ConnectDomainDialogProps) {\n  const {close, formId} = useDialogContext();\n  const stepper = useConnectDomainStepper({showGlobalField});\n  const StepComponent = getStepComponent(stepper.state.currentStep);\n\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Connect domain\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          form={stepper.form}\n          id={formId}\n          onSubmit={() => {\n            stepper.goToNextStep();\n          }}\n        >\n          <StepComponent stepper={stepper} />\n        </Form>\n      </DialogBody>\n      <DialogFooter\n        startAction={\n          <Button\n            variant=\"text\"\n            onClick={() => {\n              close();\n            }}\n          >\n            <Trans message=\"Cancel\" />\n          </Button>\n        }\n      >\n        {stepper.hasPreviousStep && (\n          <Button\n            startIcon={<KeyboardArrowLeftIcon />}\n            color=\"primary\"\n            variant=\"text\"\n            onClick={() => {\n              stepper.goToPreviousStep();\n            }}\n            disabled={stepper.state.isLoading}\n          >\n            <Trans message=\"Previous\" />\n          </Button>\n        )}\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          endIcon={<KeyboardArrowRightIcon />}\n          disabled={stepper.state.isLoading}\n        >\n          <Trans message=\"Next\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n\nfunction getStepComponent(step: ConnectDomainStep) {\n  switch (step) {\n    case ConnectDomainStep.Host:\n      return HostStep;\n    case ConnectDomainStep.Info:\n      return InfoStep;\n    case ConnectDomainStep.ValidationFailed:\n      return ValidationFailedStep;\n    case ConnectDomainStep.Finalize:\n      return FinalizeStep;\n  }\n}\n","import {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport React, {useMemo} from 'react';\nimport {DomainsEmptyStateMessage} from '@common/custom-domains/datatable/domains-empty-state-message';\nimport {domainsDatatableColumns} from '@common/custom-domains/datatable/domains-datatable-columns';\nimport {DomainsDatatableFilters} from '@common/custom-domains/datatable/domains-datatable-filters';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ConnectDomainDialog} from '@common/custom-domains/datatable/connect-domain-dialog/connect-domain-dialog';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {DeleteDomainButton} from '@common/custom-domains/datatable/delete-domain-button';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\n\nconst datatableColumns = domainsDatatableColumns.map(col => {\n  if (col.key === 'actions') {\n    return {\n      ...col,\n      body: (domain: CustomDomain) => (\n        <PermissionAwareButton resource={domain} action=\"delete\">\n          <DeleteDomainButton domain={domain} />\n        </PermissionAwareButton>\n      ),\n    };\n  }\n  return col;\n});\n\ninterface DomainsDatatablePageProps {\n  forCurrentUser?: boolean;\n}\nexport function DomainsDatatablePage({\n  forCurrentUser,\n}: DomainsDatatablePageProps) {\n  const {user} = useAuth();\n  const {workspaceId} = useActiveWorkspaceId();\n  const {filters, columns} = useMemo(() => {\n    const columns = !forCurrentUser\n      ? datatableColumns\n      : datatableColumns.filter(col => col.key !== 'user_id');\n\n    const filters = !forCurrentUser\n      ? DomainsDatatableFilters\n      : DomainsDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n    return {filters, columns};\n  }, [forCurrentUser]);\n\n  const userId = forCurrentUser ? user?.id : '';\n\n  return (\n    <DataTablePage\n      enableSelection={false}\n      endpoint=\"custom-domain\"\n      queryParams={{userId, workspaceId, with: 'user'}}\n      title={<Trans message=\"Branded domains\" />}\n      headerContent={<InfoTrigger />}\n      filters={filters}\n      columns={columns}\n      actions={<Actions />}\n      emptyStateMessage={<DomainsEmptyStateMessage />}\n    />\n  );\n}\n\nfunction Actions() {\n  const {hasPermission} = useAuth();\n  return (\n    <PermissionAwareButton resource=\"customDomain\" action=\"create\">\n      <DialogTrigger type=\"modal\">\n        <DataTableAddItemButton>\n          <Trans message=\"Connect domain\" />\n        </DataTableAddItemButton>\n        <ConnectDomainDialog showGlobalField={hasPermission('admin')} />\n      </DialogTrigger>\n    </PermissionAwareButton>\n  );\n}\n\nfunction InfoTrigger() {\n  return (\n    <InfoDialogTrigger\n      body={\n        <Trans message=\"Create trusted links with your own branded domains. Once connected, you can set the domain as default or only use it for specific links.\" />\n      }\n    />\n  );\n}\n","export interface SupportedTrackingPixel {\n  name: string;\n  type: 'number' | 'text';\n  pattern?: string;\n  docsUrl?: string;\n}\n\nexport const SupportedTrackingPixels: SupportedTrackingPixel[] = [\n  {\n    name: 'facebook',\n    type: 'number',\n    docsUrl:\n      'https://www.facebook.com/business/help/952192354843755?id=1205376682832142',\n  },\n  {\n    name: 'twitter',\n    type: 'number',\n    docsUrl:\n      'https://business.twitter.com/en/help/campaign-measurement-and-analytics/conversion-tracking-for-websites.html',\n  },\n  {\n    name: 'google-tag-manager',\n    type: 'text',\n    pattern: 'GTM-[a-zA-Z0-9]+',\n    docsUrl: 'https://tagmanager.google.com',\n  },\n  {\n    name: 'google-analytics',\n    type: 'text',\n    docsUrl: 'https://analytics.google.com',\n  },\n  {\n    name: 'adwords',\n    type: 'number',\n    docsUrl: 'https://ads.google.com',\n  },\n  {\n    name: 'bing',\n    type: 'number',\n    docsUrl:\n      'https://about.ads.microsoft.com/en-us/solutions/tools/universal-event-tracking',\n  },\n  {\n    name: 'pinterest',\n    type: 'number',\n    docsUrl:\n      'https://help.pinterest.com/en/business/article/track-conversions-with-pinterest-tag',\n  },\n  {\n    name: 'linkedin',\n    type: 'text',\n    docsUrl:\n      'https://www.linkedin.com/help/lms/answer/a418880/add-the-linkedin-insight-tag-to-your-website',\n  },\n  {\n    name: 'quora',\n    type: 'text',\n    pattern: '[a-z0-9]+',\n    docsUrl:\n      'https://quoraadsupport.zendesk.com/hc/en-us/articles/115010303387-About-the-Quora-Pixel',\n  },\n  {\n    name: 'adroll',\n    type: 'text',\n    docsUrl:\n      'https://help.adroll.com/hc/en-us/articles/211846018-What-is-the-AdRoll-Pixel',\n  },\n  {\n    name: 'nexus-segment',\n    type: 'text',\n    docsUrl: 'https://segment.com/catalog/integrations/appnexus',\n  },\n  {\n    name: 'custom',\n    type: 'text',\n  },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HelpOutlineIcon = createSvgIcon(\n  <path d=\"M11 18h2v-2h-2v2zm1-16C6.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 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z\" />\n, 'HelpOutlineOutlined');\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {UseFormReturn} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {SupportedTrackingPixels} from '@app/dashboard/tracking-pixels/supported-tracking-pixels';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {TuneIcon} from '@common/icons/material/Tune';\nimport {Fragment} from 'react';\nimport {HelpOutlineIcon} from '@common/icons/material/HelpOutline';\n\nexport interface CrupdatePixelFormValue {\n  name: string;\n  type: string;\n  pixel_id?: string | number;\n  head_code?: string;\n  body_code?: string;\n}\n\ninterface CrupdatePixelFormProps {\n  formId: string;\n  form: UseFormReturn<CrupdatePixelFormValue>;\n  onSubmit: (value: CrupdatePixelFormValue) => void;\n}\nexport function CrupdatePixelForm({\n  formId,\n  form,\n  onSubmit,\n}: CrupdatePixelFormProps) {\n  const {watch} = form;\n  const type = watch('type');\n  const config = SupportedTrackingPixels.find(p => p.name === type);\n\n  return (\n    <Form id={formId} form={form} onSubmit={onSubmit}>\n      <FormTextField\n        autoFocus\n        required\n        name=\"name\"\n        label={<Trans message=\"Name\" />}\n        className=\"mb-24\"\n      />\n      <FormSelect\n        name=\"type\"\n        selectionMode=\"single\"\n        className=\"mb-24\"\n        label={<Trans message=\"Type\" />}\n        description={\n          config?.docsUrl ? (\n            <div className=\"flex items-center gap-6\">\n              <HelpOutlineIcon size=\"sm\" />\n              <a\n                data-testid=\"pixel-docs-link\"\n                href={config.docsUrl}\n                target=\"_blank\"\n                rel=\"noreferrer\"\n                className=\"underline\"\n              >\n                <Trans message=\"More information\" />\n              </a>\n            </div>\n          ) : null\n        }\n      >\n        {SupportedTrackingPixels.map(pixel => (\n          <Item\n            capitalizeFirst\n            key={pixel.name}\n            value={pixel.name}\n            startIcon={\n              pixel.docsUrl ? (\n                <RemoteFavicon url={pixel.docsUrl} />\n              ) : (\n                <TuneIcon size=\"xs\" />\n              )\n            }\n          >\n            {pixel.name}\n          </Item>\n        ))}\n      </FormSelect>\n      {type !== 'custom' && (\n        <FormTextField\n          required\n          pattern={config?.pattern}\n          type={config?.type === 'number' ? 'number' : 'text'}\n          name=\"pixel_id\"\n          label={<Trans message=\"Pixel ID\" />}\n        />\n      )}\n      {type === 'custom' && <CustomCodeFields />}\n    </Form>\n  );\n}\n\nfunction CustomCodeFields() {\n  return (\n    <Fragment>\n      <FormTextField\n        name=\"head_code\"\n        label={<Trans message=\"Custom code for page head\" />}\n        className=\"mb-24\"\n        inputElementType=\"textarea\"\n        rows={5}\n      />\n      <FormTextField\n        name=\"body_code\"\n        label={<Trans message=\"Custom code for page body\" />}\n        inputElementType=\"textarea\"\n        rows={5}\n      />\n    </Fragment>\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {CrupdatePixelFormValue} from '@app/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdatePixel(\n  pixelId: number,\n  form: UseFormReturn<CrupdatePixelFormValue>,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (props: CrupdatePixelFormValue) => createPixel(pixelId, props),\n    onSuccess: () => {\n      toast.positive(trans(message('Pixel updated')));\n      queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('tp')});\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createPixel(\n  pixelId: number,\n  payload: CrupdatePixelFormValue,\n): Promise<Response> {\n  return apiClient.put(`tp/${pixelId}`, payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {\n  CrupdatePixelForm,\n  CrupdatePixelFormValue,\n} from '@app/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form';\nimport {Trans} from '@common/i18n/trans';\nimport {TrackingPixel} from '@app/dashboard/tracking-pixels/tracking-pixel';\nimport {useUpdatePixel} from '@app/dashboard/tracking-pixels/requests/use-update-pixel';\n\ninterface UpdatePixelDialogProps {\n  pixel: TrackingPixel;\n}\nexport function UpdatePixelDialog({pixel}: UpdatePixelDialogProps) {\n  const form = useForm<CrupdatePixelFormValue>({\n    defaultValues: {\n      name: pixel.name,\n      type: pixel.type,\n      pixel_id: pixel.pixel_id,\n      head_code: pixel.head_code,\n      body_code: pixel.body_code,\n    },\n  });\n  const {formId, close} = useDialogContext();\n  const updatePixel = useUpdatePixel(pixel.id, form);\n\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Update “:name“\" values={{name: pixel.name}} />\n      </DialogHeader>\n      <DialogBody>\n        <CrupdatePixelForm\n          formId={formId}\n          form={form}\n          onSubmit={values => {\n            updatePixel.mutate(values, {\n              onSuccess: () => {\n                close();\n              },\n            });\n          }}\n        />\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={updatePixel.isPending}\n        >\n          <Trans message=\"Update\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {TrackingPixel} from '@app/dashboard/tracking-pixels/tracking-pixel';\nimport {SupportedTrackingPixels} from '@app/dashboard/tracking-pixels/supported-tracking-pixels';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {UpdatePixelDialog} from '@app/dashboard/tracking-pixels/crupdate-dialog/update-pixel-dialog';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\nexport const TrackingPixelsDatatableColumns: ColumnConfig<TrackingPixel>[] = [\n  {\n    key: 'name',\n    allowsSorting: true,\n    width: 'flex-3 min-w-200',\n    visibleInMode: 'all',\n    header: () => <Trans message=\"Name\" />,\n    body: pixel => pixel.name,\n  },\n  {\n    key: 'type',\n    allowsSorting: true,\n    header: () => <Trans message=\"Type\" />,\n    body: pixel => {\n      const docsUrl = SupportedTrackingPixels.find(\n        p => p.name === pixel.type\n      )?.docsUrl;\n\n      return (\n        <div>\n          <div className=\"flex items-center gap-10\">\n            {docsUrl ? <RemoteFavicon url={docsUrl} /> : null}\n            {docsUrl ? (\n              <a\n                href={docsUrl}\n                target=\"_blank\"\n                rel=\"noreferrer\"\n                className={LinkStyle}\n              >\n                {pixel.type}\n              </a>\n            ) : (\n              pixel.type\n            )}\n          </div>\n        </div>\n      );\n    },\n  },\n  {\n    key: 'user_id',\n    allowsSorting: true,\n    header: () => <Trans message=\"Owner\" />,\n    width: 'flex-2 min-w-140',\n    body: pixel => {\n      if (!pixel.user) return '';\n      return (\n        <NameWithAvatar\n          image={pixel.user.avatar}\n          label={pixel.user.display_name}\n          description={pixel.user.email}\n        />\n      );\n    },\n  },\n  {\n    key: 'pixel_id',\n    header: () => <Trans message=\"Pixel ID\" />,\n    body: pixel => pixel.pixel_id,\n  },\n  {\n    key: 'updated_at',\n    allowsSorting: true,\n    header: () => <Trans message=\"Last updated\" />,\n    body: pixel =>\n      pixel.updated_at ? <FormattedDate date={pixel.updated_at} /> : '',\n  },\n  {\n    key: 'actions',\n    header: () => <Trans message=\"Actions\" />,\n    hideHeader: true,\n    align: 'end',\n    width: 'w-42 flex-shrink-0',\n    body: pixel => {\n      return (\n        <PermissionAwareButton resource={pixel} action=\"update\">\n          <DialogTrigger type=\"modal\">\n            <IconButton className=\"text-muted\">\n              <EditIcon />\n            </IconButton>\n            <UpdatePixelDialog pixel={pixel} />\n          </DialogTrigger>\n        </PermissionAwareButton>\n      );\n    },\n  },\n];\n","export default \"__VITE_ASSET__537f9c7f__\"","import {\n  BackendFilter,\n  FilterControlType,\n  FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {\n  createdAtFilter,\n  updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\nimport {USER_MODEL} from '@common/auth/user';\nimport {SupportedTrackingPixels} from '@app/dashboard/tracking-pixels/supported-tracking-pixels';\n\nexport const TrackingPixelsDatatableFilters: BackendFilter[] = [\n  {\n    key: 'type',\n    label: message('Type'),\n    description: message('Type of the pixel'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.Select,\n      options: SupportedTrackingPixels.map((pixel, index) => {\n        return {key: pixel.name, value: pixel.name, label: message(pixel.name)};\n      }),\n    },\n  },\n  createdAtFilter({\n    description: message('Date pixel was created'),\n  }),\n  updatedAtFilter({\n    description: message('Date pixel was last updated'),\n  }),\n  {\n    key: 'user_id',\n    label: message('Owner'),\n    description: message('User pixel belongs to'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.SelectModel,\n      model: USER_MODEL,\n    },\n  },\n];\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {CrupdatePixelFormValue} from '@app/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useCreatePixel(form: UseFormReturn<CrupdatePixelFormValue>) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (props: CrupdatePixelFormValue) => createPixel(props),\n    onSuccess: () => {\n      toast.positive(trans(message('Pixel created')));\n      queryClient.invalidateQueries({queryKey: DatatableDataQueryKey('tp')});\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createPixel(payload: CrupdatePixelFormValue): Promise<Response> {\n  return apiClient.post('tp', payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {useCreatePixel} from '@app/dashboard/tracking-pixels/requests/use-create-pixel';\nimport {\n  CrupdatePixelForm,\n  CrupdatePixelFormValue,\n} from '@app/dashboard/tracking-pixels/crupdate-dialog/crupdate-pixel-form';\nimport {Trans} from '@common/i18n/trans';\n\nexport function CreatePixelDialog() {\n  const form = useForm<CrupdatePixelFormValue>({\n    defaultValues: {type: 'facebook'},\n  });\n  const {formId, close} = useDialogContext();\n  const createPixel = useCreatePixel(form);\n\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Create pixel\" />\n      </DialogHeader>\n      <DialogBody>\n        <CrupdatePixelForm\n          formId={formId}\n          form={form}\n          onSubmit={values => {\n            createPixel.mutate(values, {\n              onSuccess: () => {\n                close();\n              },\n            });\n          }}\n        />\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={createPixel.isPending}\n        >\n          <Trans message=\"Create\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport React, {useMemo} from 'react';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {TrackingPixelsDatatableColumns} from '@app/dashboard/tracking-pixels/tracking-pixels-datatable-columns';\nimport locationTracking from './location-tracking.svg';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {TrackingPixelsDatatableFilters} from '@app/dashboard/tracking-pixels/tracking-pixels-datatable-filters';\nimport {CreatePixelDialog} from '@app/dashboard/tracking-pixels/crupdate-dialog/create-pixel-dialog';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\n\ninterface TrackingPixelsDatablePageProps {\n  forCurrentUser?: boolean;\n}\nexport function TrackingPixelsDatablePage({\n  forCurrentUser,\n}: TrackingPixelsDatablePageProps) {\n  const {user} = useAuth();\n  const {workspaceId} = useActiveWorkspaceId();\n  const {filters, columns} = useMemo(() => {\n    const columns = !forCurrentUser\n      ? TrackingPixelsDatatableColumns\n      : TrackingPixelsDatatableColumns.filter(col => col.key !== 'user_id');\n\n    const filters = !forCurrentUser\n      ? TrackingPixelsDatatableFilters\n      : TrackingPixelsDatatableFilters.filter(\n          filter => filter.key !== 'user_id'\n        );\n\n    return {filters, columns};\n  }, [forCurrentUser]);\n\n  const userId = forCurrentUser ? user?.id : '';\n\n  return (\n    <DataTablePage\n      endpoint=\"tp\"\n      queryParams={{userId, with: 'user', workspaceId}}\n      title={<Trans message=\"Tracking pixels\" />}\n      filters={filters}\n      columns={columns}\n      headerContent={<InfoTrigger />}\n      actions={<Actions />}\n      selectedActions={\n        <PermissionAwareButton resource=\"trackingPixel\" action=\"delete\">\n          <DeleteSelectedItemsAction />\n        </PermissionAwareButton>\n      }\n      emptyStateMessage={\n        <DataTableEmptyStateMessage\n          image={locationTracking}\n          title={<Trans message=\"No tracking pixels have been added yet\" />}\n          filteringTitle={<Trans message=\"No matching tracking pixels\" />}\n        />\n      }\n    />\n  );\n}\n\nfunction Actions() {\n  return (\n    <PermissionAwareButton resource=\"trackingPixel\" action=\"create\">\n      <DialogTrigger type=\"modal\">\n        <DataTableAddItemButton>\n          <Trans message=\"Add pixel\" />\n        </DataTableAddItemButton>\n        <CreatePixelDialog />\n      </DialogTrigger>\n    </PermissionAwareButton>\n  );\n}\n\nfunction InfoTrigger() {\n  return (\n    <InfoDialogTrigger\n      body={\n        <Trans message=\"Add third party tracking integration to your links using pixels or custom code snippet.\" />\n      }\n    />\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport interface UpdateLinkPageOptionsPayload {\n  hideNavbar: boolean;\n  hideFooter: boolean;\n}\n\nexport function useUpdateLinkPageOptions(\n  pageId: number | string,\n  form: UseFormReturn<UpdateLinkPageOptionsPayload>,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (props: UpdateLinkPageOptionsPayload) =>\n      updatePage(pageId, props),\n    onSuccess: () => {\n      toast.positive(trans(message('Page options updated')));\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link-page'),\n      });\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction updatePage(\n  pageId: number | string,\n  payload: UpdateLinkPageOptionsPayload,\n): Promise<Response> {\n  return apiClient\n    .put(`link-page/${pageId}`, {meta: payload})\n    .then(r => r.data);\n}\n","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {SettingsIcon} from '@common/icons/material/Settings';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\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 {useForm} from 'react-hook-form';\nimport {\n  UpdateLinkPageOptionsPayload,\n  useUpdateLinkPageOptions,\n} from '@app/dashboard/link-pages/requests/use-update-link-page-options';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {NoPermissionButton} from '@app/dashboard/upgrade/no-permission-button';\nimport {useLinkSummary} from '@app/dashboard/layout/sidenav/use-link-summary';\nimport {useAuth} from '@common/auth/use-auth';\n\ninterface LinkPageOptionsTriggerProps {\n  page: CustomPage;\n}\nexport function LinkPageOptionsTrigger({page}: LinkPageOptionsTriggerProps) {\n  return (\n    <DialogTrigger type=\"modal\">\n      <Tooltip label={<Trans message=\"Page options\" />}>\n        <IconButton className=\"text-muted\">\n          <SettingsIcon />\n        </IconButton>\n      </Tooltip>\n      <OptionsDialog page={page} />\n    </DialogTrigger>\n  );\n}\n\ninterface OptionsDialogProps {\n  page: CustomPage;\n}\nfunction OptionsDialog({page}: OptionsDialogProps) {\n  const {data} = useLinkSummary();\n  const {hasPermission} = useAuth();\n  const canChangeOptions =\n    data?.usage.custom_pages.options || hasPermission('admin');\n  const {formId, close} = useDialogContext();\n  const form = useForm<UpdateLinkPageOptionsPayload>({\n    defaultValues: {\n      hideFooter: Boolean(page.meta?.hideFooter),\n      hideNavbar: Boolean(page.meta?.hideNavbar),\n    },\n  });\n  const updateOptions = useUpdateLinkPageOptions(page.id, form);\n\n  return (\n    <Dialog size=\"sm\">\n      <DialogHeader>\n        <Trans message=\"Link page options\" />\n      </DialogHeader>\n      <DialogBody>\n        {!canChangeOptions && (\n          <NoPermissionButton\n            className=\"mb-24\"\n            message={\n              <Trans message=\"Your current plan does not include link page option editing.\" />\n            }\n          />\n        )}\n        <Form\n          id={formId}\n          form={form}\n          onSubmit={values => {\n            updateOptions.mutate(values, {onSuccess: close});\n          }}\n        >\n          <FormSwitch\n            className=\"mb-24\"\n            name=\"hideNavbar\"\n            disabled={!canChangeOptions}\n            description={\n              <Trans message=\"Whether navbar should be hidden on this link page.\" />\n            }\n          >\n            <Trans message=\"Hide navbar\" />\n          </FormSwitch>\n          <FormSwitch\n            name=\"hideFooter\"\n            disabled={!canChangeOptions}\n            description={\n              <Trans message=\"Whether footer should be hidden on this link page.\" />\n            }\n          >\n            <Trans message=\"Hide footer\" />\n          </FormSwitch>\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button variant=\"text\" onClick={() => close()}>\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={updateOptions.isPending || !canChangeOptions}\n        >\n          <Trans message=\"Save\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport React, {Fragment} from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {LinkPageOptionsTrigger} from '@app/dashboard/link-pages/link-page-options-trigger';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\n\nexport const LinkPagesDatatableColumns: ColumnConfig<CustomPage>[] = [\n  {\n    key: 'title',\n    allowsSorting: true,\n    width: 'flex-2 min-w-200',\n    visibleInMode: 'all',\n    header: () => <Trans message=\"Title\" />,\n    body: page => (\n      <Link target=\"_blank\" to={`/pages/${page.slug}`} className={LinkStyle}>\n        {page.title}\n      </Link>\n    ),\n  },\n  {\n    key: 'user_id',\n    allowsSorting: true,\n    width: 'flex-2 min-w-140',\n    header: () => <Trans message=\"Owner\" />,\n    body: page =>\n      page.user && (\n        <NameWithAvatar\n          image={page.user.avatar}\n          label={page.user.display_name}\n          description={page.user.email}\n        />\n      ),\n  },\n  {\n    key: 'updated_at',\n    allowsSorting: true,\n    width: 'w-100',\n    header: () => <Trans message=\"Last updated\" />,\n    body: page => <FormattedDate date={page.updated_at} />,\n  },\n  {\n    key: 'actions',\n    header: () => <Trans message=\"Actions\" />,\n    hideHeader: true,\n    align: 'end',\n    width: 'w-84 flex-shrink-0',\n    visibleInMode: 'all',\n    body: page => (\n      <Fragment>\n        <LinkPageOptionsTrigger page={page} />\n        <PermissionAwareButton resource={page} action=\"update\">\n          <Tooltip label={<Trans message=\"Edit page\" />}>\n            <IconButton\n              size=\"md\"\n              className=\"text-muted\"\n              elementType={Link}\n              to={`${page.id}/edit`}\n            >\n              <EditIcon />\n            </IconButton>\n          </Tooltip>\n        </PermissionAwareButton>\n      </Fragment>\n    ),\n  },\n];\n","import {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {CustomPageDatatableFilters} from '@common/admin/custom-pages/custom-page-datatable-filters';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {useAuth} from '@common/auth/use-auth';\nimport React, {useContext, useMemo} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport articlesSvg from '@common/admin/custom-pages/articles.svg';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {LinkPagesDatatableColumns} from '@app/dashboard/link-pages/link-pages-datatable-columns';\n\ninterface CustomPageDatablePageProps {\n  forCurrentUser?: boolean;\n}\nexport function LinkPagesDatatablePage({\n  forCurrentUser,\n}: CustomPageDatablePageProps) {\n  const config = useContext(SiteConfigContext);\n  const {user} = useAuth();\n  const {workspaceId} = useActiveWorkspaceId();\n  const {filters, columns} = useMemo(() => {\n    const columns = !forCurrentUser\n      ? LinkPagesDatatableColumns\n      : LinkPagesDatatableColumns.filter(col => col.key !== 'user_id');\n\n    const filters = !forCurrentUser\n      ? CustomPageDatatableFilters(config)\n      : CustomPageDatatableFilters(config).filter(\n          filter => filter.key !== 'user_id'\n        );\n\n    return {filters, columns};\n  }, [forCurrentUser, config]);\n\n  const userId = forCurrentUser ? user?.id : '';\n\n  return (\n    <DataTablePage\n      endpoint=\"link-page\"\n      title={<Trans message=\"Link pages\" />}\n      filters={filters}\n      columns={columns}\n      headerContent={<InfoTrigger />}\n      queryParams={{userId, with: 'user', workspaceId}}\n      actions={<Actions />}\n      selectedActions={\n        <PermissionAwareButton resource=\"customPage\" action=\"delete\">\n          <DeleteSelectedItemsAction />\n        </PermissionAwareButton>\n      }\n      emptyStateMessage={\n        <DataTableEmptyStateMessage\n          image={articlesSvg}\n          title={<Trans message=\"No link pages have been created yet\" />}\n          filteringTitle={<Trans message=\"No matching link pages\" />}\n        />\n      }\n    />\n  );\n}\n\nfunction Actions() {\n  return (\n    <PermissionAwareButton resource=\"customPage\" action=\"create\">\n      <DataTableAddItemButton elementType={Link} to=\"new\">\n        <Trans message=\"New page\" />\n      </DataTableAddItemButton>\n    </PermissionAwareButton>\n  );\n}\n\nfunction InfoTrigger() {\n  return (\n    <InfoDialogTrigger\n      body={\n        <Trans message=\"Show a transitional page with fully custom markup. Users who visit the short url will briefly see the page before being redirected to destination url.\" />\n      }\n    />\n  );\n}\n","export default \"__VITE_ASSET__0aad6980__\"","import {ColumnConfig} from '@common/datatable/column-config';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {Link} from 'react-router-dom';\nimport {ColorIcon} from '@common/admin/appearance/sections/themes/color-icon';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\nexport const LinkOverlaysDatatableColumns: ColumnConfig<LinkOverlay>[] = [\n  {\n    key: 'name',\n    allowsSorting: true,\n    width: 'flex-1 min-w-200',\n    visibleInMode: 'all',\n    header: () => <Trans message=\"Name\" />,\n    body: overlay => overlay.name,\n  },\n  {\n    key: 'message',\n    allowsSorting: true,\n    header: () => <Trans message=\"Message\" />,\n    body: overlay => overlay.message,\n  },\n  {\n    key: 'btn_text',\n    allowsSorting: true,\n    header: () => <Trans message=\"Button text\" />,\n    body: overlay => overlay.btn_text,\n  },\n  {\n    key: 'color',\n    header: () => <Trans message=\"Color\" />,\n    body: overlay => (\n      <ColorIcon\n        viewBox=\"0 0 48 48\"\n        className=\"icon-lg\"\n        style={{fill: overlay.colors['bg-color']}}\n      />\n    ),\n  },\n  {\n    key: 'user_id',\n    allowsSorting: true,\n    header: () => <Trans message=\"Owner\" />,\n    width: 'flex-2 min-w-140',\n    body: overlay => {\n      if (!overlay.user) return '';\n      return (\n        <NameWithAvatar\n          image={overlay.user.avatar}\n          label={overlay.user.display_name}\n          description={overlay.user.email}\n        />\n      );\n    },\n  },\n  {\n    key: 'updated_at',\n    allowsSorting: true,\n    header: () => <Trans message=\"Last updated\" />,\n    body: pixel =>\n      pixel.updated_at ? <FormattedDate date={pixel.updated_at} /> : '',\n  },\n  {\n    key: 'actions',\n    header: () => <Trans message=\"Actions\" />,\n    hideHeader: true,\n    align: 'end',\n    width: 'w-42 flex-shrink-0',\n    body: overlay => {\n      return (\n        <PermissionAwareButton resource={overlay} action=\"update\">\n          <IconButton\n            className=\"text-muted\"\n            elementType={Link}\n            to={`${overlay.id}/edit`}\n          >\n            <EditIcon />\n          </IconButton>\n        </PermissionAwareButton>\n      );\n    },\n  },\n];\n","import {message} from '@common/i18n/message';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport const LinkOverlayThemes = [\n  {key: 'default', label: message('Default')},\n  {key: 'full-width', label: message('Full width')},\n  {key: 'rounded', label: message('Rounded')},\n  {key: 'pill', label: message('Pill')},\n];\n\nexport const LinkOverlayPositions = [\n  {key: 'top-left', label: message('Top left')},\n  {key: 'top-right', label: message('Top right')},\n  {key: 'bottom-left', label: message('Bottom left')},\n  {key: 'bottom-right', label: message('Bottom right')},\n];\n\nexport const LinkOverlayColors: {\n  key: keyof LinkOverlay['colors'];\n  label: MessageDescriptor;\n}[] = [\n  {key: 'bg-color', label: message('Background color')},\n  {key: 'text-color', label: message('Text color')},\n  {key: 'btn-bg-color', label: message('Button background')},\n  {key: 'btn-text-color', label: message('Button text')},\n  {key: 'label-bg-color', label: message('Label background')},\n  {key: 'label-color', label: message('Label text')},\n];\n","import {\n  BackendFilter,\n  FilterControlType,\n  FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {\n  createdAtFilter,\n  updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\nimport {USER_MODEL} from '@common/auth/user';\nimport {\n  LinkOverlayPositions,\n  LinkOverlayThemes,\n} from '@app/dashboard/link-overlays/crupdate/link-overlay-constants';\n\nexport const LinkOverlaysDatatableFilters: BackendFilter[] = [\n  {\n    key: 'theme',\n    label: message('Theme'),\n    description: message('Theme for the overlay'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.Select,\n      defaultValue: 'default',\n      options: LinkOverlayThemes.map(theme => ({\n        key: theme.key,\n        value: theme.key,\n        label: theme.label,\n      })),\n    },\n  },\n  {\n    key: 'position',\n    label: message('Position'),\n    description: message('Position for the overlay'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.Select,\n      defaultValue: 'bottom-left',\n      options: LinkOverlayPositions.map(position => ({\n        key: position.key,\n        value: position.key,\n        label: position.label,\n      })),\n    },\n  },\n  createdAtFilter({\n    description: message('Date overlay was created'),\n  }),\n  updatedAtFilter({\n    description: message('Date overlay was last updated'),\n  }),\n  {\n    key: 'user_id',\n    label: message('Owner'),\n    description: message('User overlay belongs to'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.SelectModel,\n      model: USER_MODEL,\n    },\n  },\n];\n","import {useAuth} from '@common/auth/use-auth';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport React, {useMemo} from 'react';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport preferencesPopup from './preferences-popup.svg';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport {Link} from 'react-router-dom';\nimport {LinkOverlaysDatatableColumns} from '@app/dashboard/link-overlays/link-overlays-datatable-columns';\nimport {LinkOverlaysDatatableFilters} from '@app/dashboard/link-overlays/link-overlays-datatable-filters';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\ninterface TrackingPixelsDatablePageProps {\n  forCurrentUser?: boolean;\n}\nexport function LinkOverlaysDatatablePage({\n  forCurrentUser,\n}: TrackingPixelsDatablePageProps) {\n  const {user} = useAuth();\n  const {workspaceId} = useActiveWorkspaceId();\n  const {filters, columns} = useMemo(() => {\n    const columns = !forCurrentUser\n      ? LinkOverlaysDatatableColumns\n      : LinkOverlaysDatatableColumns.filter(col => col.key !== 'user_id');\n\n    const filters = !forCurrentUser\n      ? LinkOverlaysDatatableFilters\n      : LinkOverlaysDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n    return {filters, columns};\n  }, [forCurrentUser]);\n\n  const userId = forCurrentUser ? user?.id : '';\n\n  return (\n    <DataTablePage\n      endpoint=\"link-overlay\"\n      queryParams={{userId, with: 'user', workspaceId}}\n      title={<Trans message=\"Call-to-action overlays\" />}\n      headerContent={<InfoTrigger />}\n      filters={filters}\n      columns={columns}\n      actions={<Actions />}\n      selectedActions={\n        <PermissionAwareButton resource=\"linkOverlay\" action=\"delete\">\n          <DeleteSelectedItemsAction />\n        </PermissionAwareButton>\n      }\n      emptyStateMessage={\n        <DataTableEmptyStateMessage\n          image={preferencesPopup}\n          title={<Trans message=\"No overlays have been added yet\" />}\n          filteringTitle={<Trans message=\"No matching overlays\" />}\n        />\n      }\n    />\n  );\n}\n\nfunction InfoTrigger() {\n  return (\n    <InfoDialogTrigger\n      body={\n        <Trans message=\"Display fully customizable, non-intrusive overlay with a message and call-to-action button over destination website.\" />\n      }\n    />\n  );\n}\n\nfunction Actions() {\n  return (\n    <PermissionAwareButton resource=\"linkOverlay\" action=\"create\">\n      <DataTableAddItemButton to=\"new\" elementType={Link}>\n        <Trans message=\"Add overlay\" />\n      </DataTableAddItemButton>\n    </PermissionAwareButton>\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useCreateLinkOverlay(\n  form: UseFormReturn<CrupdateLinkOverlayPayload>,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: CrupdateLinkOverlayPayload) => createOverlay(payload),\n    onSuccess: () => {\n      toast.positive(trans(message('Overlay created')));\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link-overlay'),\n      });\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createOverlay(payload: CrupdateLinkOverlayPayload): Promise<Response> {\n  return apiClient.post('link-overlay', payload).then(r => r.data);\n}\n","export function OverlayWebsiteBackground() {\n  return (\n    <div className=\"bg-card h-full overflow-hidden\">\n      <div className=\"navbar flex items-center bg-alt h-40 w-full\">\n        <div\n          className=\"os-button w-20 h-20 rounded-full ml-14\"\n          style={{background: '#d7665d'}}\n        />\n        <div\n          className=\"os-button w-20 h-20 rounded-full ml-14\"\n          style={{background: '#deab54'}}\n        />\n        <div\n          className=\"os-button w-20 h-20 rounded-full ml-14\"\n          style={{background: '#6fb54c'}}\n        />\n      </div>\n\n      <div className=\"page-body p-24\">\n        <div className=\"top-row flex items-center h-60 bg-alt p-10 mb-24\">\n          <div className=\"circle w-40 h-40 rounded-full mr-auto bg-disabled-bg\"></div>\n          <div className=\"line w-1/6 h-20 rounded bg-disabled-bg ml-14\" />\n          <div className=\"line w-1/6 h-20 rounded bg-disabled-bg ml-14\" />\n          <div className=\"line w-1/6 h-20 rounded bg-disabled-bg ml-14\" />\n        </div>\n\n        <div className=\"middle-row flex items-center justify-center flex-col h-[260px] bg-alt my-24\">\n          <div className=\"line rounded h-36 mb-20 w-3/5 bg-disabled-bg\" />\n          <div className=\"line rounded h-14 mb-4 w-1/2 bg-disabled-bg/5\" />\n          <div className=\"line rounded h-14 mb-4 w-1/2 bg-disabled-bg/5\" />\n          <div className=\"line rounded h-14 mb-4 w-1/2 bg-disabled-bg/5\" />\n        </div>\n\n        <div className=\"flex-container flex\">\n          <div className=\"left w-1/3\">\n            <div className=\"rect h-144 bg-disabled-bg/5 mb-6\" />\n            <div className=\"line fat-line h-36 mb-10 rounded bg-disabled-bg/5\" />\n            <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n            <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n            <div className=\"separator h-1 bg-divider my-24\"></div>\n            <div className=\"rect h-144 bg-disabled-bg/5 mb-10\" />\n            <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n            <div className=\"rect h-144 bg-disabled-bg/5 mb-6\" />\n          </div>\n\n          <div className=\"right w-2/3 pl-24\">\n            <div className=\"rect h-288 mb-32 bg-disabled-bg/5\" />\n            <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n            <div className=\"line fat-line h-36 mb-10 rounded bg-disabled-bg/5\" />\n            <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n            <div className=\"separator h-1 bg-divider my-24\" />\n            <div className=\"line mb-10 h-20 rounded bg-disabled-bg\" />\n            <div className=\"rect h-288 mb-32 bg-disabled-bg/5\" />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n","import {useFormContext, UseFormReturn} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {Trans} from '@common/i18n/trans';\nimport {TabPanel, TabPanels} from '@common/ui/tabs/tab-panels';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {\n  LinkOverlayColors,\n  LinkOverlayPositions,\n  LinkOverlayThemes,\n} from '@app/dashboard/link-overlays/crupdate/link-overlay-constants';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {OverlayWebsiteBackground} from './overlay-website-background';\nimport {Fragment, ReactElement} from 'react';\nimport {FloatingLinkOverlay} from '@app/short-links/floating-link-overlay';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ColorIcon} from '@common/admin/appearance/sections/themes/color-icon';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\n\ninterface CrupdateLinkOverlayFormProps {\n  isLoading: boolean;\n  form: UseFormReturn<CrupdateLinkOverlayPayload>;\n  onSubmit: (values: CrupdateLinkOverlayPayload) => void;\n}\nexport function CrupdateLinkOverlayForm({\n  form,\n  isLoading,\n  onSubmit,\n}: CrupdateLinkOverlayFormProps) {\n  return (\n    <Form form={form} onSubmit={onSubmit} className=\"flex h-full\">\n      <div className=\"flex-shrink-0 w-full md:w-288 px-16 md:border-r md:shadow-lg h-full overflow-y-auto\">\n        <Tabs>\n          <TabList expand>\n            <Tab>\n              <Trans message=\"General\" />\n            </Tab>\n            <Tab>\n              <Trans message=\"Style\" />\n            </Tab>\n          </TabList>\n          <TabPanels className=\"my-24\">\n            <TabPanel>\n              <GeneralFields />\n              <SaveButton disabled={isLoading} />\n            </TabPanel>\n            <TabPanel>\n              <StyleFields />\n              <SaveButton disabled={isLoading} className=\"mt-14\" />\n            </TabPanel>\n          </TabPanels>\n        </Tabs>\n      </div>\n      <div className=\"flex-auto relative hidden md:block\">\n        <OverlayWebsiteBackground />\n        <OverlayPreview />\n      </div>\n    </Form>\n  );\n}\n\nfunction SaveButton(props: ButtonProps) {\n  return (\n    <Button type=\"submit\" variant=\"flat\" color=\"primary\" {...props}>\n      <Trans message=\"Save\" />\n    </Button>\n  );\n}\n\nfunction BackgroundField() {\n  return (\n    <FormImageSelector\n      className=\"mb-20\"\n      name=\"colors.bg-image\"\n      label={<Trans message=\"Background image\" />}\n      diskPrefix=\"overlays\"\n      showRemoveButton\n    />\n  );\n}\n\ninterface ColorFieldProps {\n  name: keyof LinkOverlay['colors'];\n  children: ReactElement;\n}\nfunction ColorField({name, children}: ColorFieldProps) {\n  const {watch, setValue} = useFormContext<CrupdateLinkOverlayPayload>();\n  const color = watch(`colors.${name}`);\n\n  return (\n    <DialogTrigger\n      currentValue={color}\n      type=\"popover\"\n      placement=\"right\"\n      offset={10}\n      onClose={newColor => {\n        setValue(`colors.${name}`, newColor);\n      }}\n    >\n      <ButtonBase className=\"flex items-center gap-10 w-full rounded border text-sm h-54 px-14 mb-10 bg relative hover:bg-hover\">\n        <ColorIcon\n          viewBox=\"0 0 48 48\"\n          className=\"icon-lg\"\n          style={{fill: color}}\n        />\n        <div>{children}</div>\n        <KeyboardArrowRightIcon className=\"icon-sm text-muted ml-auto\" />\n      </ButtonBase>\n      <ColorPickerDialog\n        defaultValue={color}\n        onChange={newColor => {\n          setValue(`colors.${name}`, newColor);\n        }}\n      />\n    </DialogTrigger>\n  );\n}\n\nfunction StyleFields() {\n  return (\n    <Fragment>\n      <FileUploadProvider>\n        <BackgroundField />\n      </FileUploadProvider>\n      {LinkOverlayColors.map(({key, label}) => (\n        <ColorField name={key} key={key}>\n          <Trans {...label} />\n        </ColorField>\n      ))}\n    </Fragment>\n  );\n}\n\nfunction GeneralFields() {\n  return (\n    <Fragment>\n      <FormTextField\n        name=\"name\"\n        label={<Trans message=\"Name\" />}\n        className=\"mb-24\"\n        required\n      />\n      <FormSelect\n        name=\"position\"\n        selectionMode=\"single\"\n        label={<Trans message=\"Position\" />}\n        className=\"mb-24\"\n      >\n        {LinkOverlayPositions.map(position => (\n          <Item key={position.key} value={position.key}>\n            <Trans {...position.label} />\n          </Item>\n        ))}\n      </FormSelect>\n      <FormSelect\n        name=\"theme\"\n        selectionMode=\"single\"\n        label={<Trans message=\"Theme\" />}\n        className=\"mb-24\"\n      >\n        {LinkOverlayThemes.map(theme => (\n          <Item key={theme.key} value={theme.key}>\n            <Trans {...theme.label} />\n          </Item>\n        ))}\n      </FormSelect>\n      <FormTextField\n        name=\"message\"\n        label={<Trans message=\"Message\" />}\n        inputElementType=\"textarea\"\n        maxLength={200}\n        rows={2}\n        className=\"mb-24\"\n      />\n      <FormTextField\n        name=\"label\"\n        label={<Trans message=\"Label\" />}\n        maxLength={8}\n        className=\"mb-24\"\n      />\n      <FormTextField\n        type=\"url\"\n        name=\"btn_link\"\n        label={<Trans message=\"Button link\" />}\n        className=\"mb-24\"\n      />\n      <FormTextField\n        name=\"btn_text\"\n        label={<Trans message=\"Button text\" />}\n        maxLength={30}\n        className=\"mb-24\"\n      />\n    </Fragment>\n  );\n}\n\nfunction OverlayPreview() {\n  const {watch} = useFormContext<CrupdateLinkOverlayPayload>();\n  const values = watch();\n  return <FloatingLinkOverlay overlay={values} />;\n}\n","import {useForm} from 'react-hook-form';\nimport {useCreateLinkOverlay} from '@app/dashboard/link-overlays/requests/use-create-link-overlay';\nimport {CrupdateLinkOverlayForm} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\n\nexport function CreateLinkOverlayPage() {\n  const {trans} = useTrans();\n  const navigate = useNavigate();\n  const form = useForm<CrupdateLinkOverlayPayload>({\n    defaultValues: {\n      position: 'bottom-left',\n      theme: 'default',\n      label: trans(message('Label')),\n      message: trans(message('Your message here')),\n      btn_text: trans(message('Button text')),\n      btn_link: 'https://google.com',\n      colors: {\n        'bg-color': 'rgb(61, 75, 101)',\n        'text-color': 'rgb(255, 255, 255)',\n        'label-bg-color': 'rgb(255, 255, 255)',\n        'label-color': 'rgb(0, 0, 0)',\n      },\n    },\n  });\n  const createOverlay = useCreateLinkOverlay(form);\n  return (\n    <CrupdateLinkOverlayForm\n      form={form}\n      isLoading={createOverlay.isPending}\n      onSubmit={values => {\n        createOverlay.mutate(values, {\n          onSuccess: () => navigate('..', {relative: 'path'}),\n        });\n      }}\n    />\n  );\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 {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\n\nexport const linkOverlayEndpoint = (overlayId: number | string) =>\n  `link-overlay/${overlayId}`;\n\nexport interface GetLinkOverlayResponse extends BackendResponse {\n  linkOverlay: LinkOverlay;\n}\n\nexport function useLinkOverlay(overlayId: number | string) {\n  return useQuery({\n    queryKey: [linkOverlayEndpoint(overlayId)],\n    queryFn: () => getLinkOverlay(overlayId),\n  });\n}\n\nfunction getLinkOverlay(\n  overlayId: number | string,\n): Promise<GetLinkOverlayResponse> {\n  return apiClient\n    .get(linkOverlayEndpoint(overlayId))\n    .then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\nimport {linkOverlayEndpoint} from '@app/dashboard/link-overlays/requests/use-link-overlay';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdateLinkOverlay(\n  overlayId: number | string,\n  form: UseFormReturn<CrupdateLinkOverlayPayload>,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: CrupdateLinkOverlayPayload) =>\n      createOverlay(overlayId, payload),\n    onSuccess: () => {\n      toast.positive(trans(message('Overlay updated')));\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link-overlay'),\n      });\n      queryClient.invalidateQueries({\n        queryKey: [linkOverlayEndpoint(overlayId)],\n      });\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createOverlay(\n  overlayId: number | string,\n  payload: CrupdateLinkOverlayPayload,\n): Promise<Response> {\n  return apiClient.put(`link-overlay/${overlayId}`, payload).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {CrupdateLinkOverlayForm} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-form';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {CrupdateLinkOverlayPayload} from '@app/dashboard/link-overlays/crupdate/crupdate-link-overlay-payload';\nimport {useParams} from 'react-router-dom';\nimport {useLinkOverlay} from '@app/dashboard/link-overlays/requests/use-link-overlay';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {LinkOverlay} from '@app/dashboard/link-overlays/link-overlay';\nimport {useUpdateLinkOverlay} from '@app/dashboard/link-overlays/requests/use-update-link-overlay';\n\nexport function UpdateLinkOverlayPage() {\n  const {overlayId} = useParams();\n  const {data, isLoading, isError} = useLinkOverlay(overlayId!);\n\n  if (data) {\n    return <PageContent overlay={data.linkOverlay} />;\n  }\n\n  if (isLoading) {\n    return <FullPageLoader />;\n  }\n\n  if (isError) {\n    return null;\n  }\n}\n\ninterface PageContentProps {\n  overlay: LinkOverlay;\n}\nfunction PageContent({overlay}: PageContentProps) {\n  const navigate = useNavigate();\n  const form = useForm<CrupdateLinkOverlayPayload>({\n    defaultValues: {\n      name: overlay.name,\n      position: overlay.position,\n      theme: overlay.theme,\n      label: overlay.label,\n      message: overlay.message,\n      btn_text: overlay.btn_text,\n      btn_link: overlay.btn_link,\n      colors: overlay.colors,\n    },\n  });\n  const updateOverlay = useUpdateLinkOverlay(overlay.id, form);\n  return (\n    <CrupdateLinkOverlayForm\n      form={form}\n      isLoading={updateOverlay.isPending}\n      onSubmit={values => {\n        updateOverlay.mutate(values, {\n          onSuccess: () => navigate('../..', {relative: 'path'}),\n        });\n      }}\n    />\n  );\n}\n","export default \"__VITE_ASSET__a9c0e6fa__\"","import {ColumnConfig} from '@common/datatable/column-config';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Link, Link as RouterLink} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport React, {Fragment} from 'react';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {CustomDomain} from '@common/custom-domains/custom-domain';\nimport {useDefaultCustomDomainHost} from '@common/custom-domains/use-default-custom-domain-host';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {useLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\n\nexport const BiolinksDatatableColumns: ColumnConfig<Biolink>[] = [\n  {\n    key: 'name',\n    allowsSorting: true,\n    header: () => <Trans message=\"Name\" />,\n    width: 'flex-3 min-w-200',\n    visibleInMode: 'all',\n    body: biolink => (\n      <a\n        className={LinkStyle}\n        href={biolink.short_url}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n      >\n        {biolink.name}\n      </a>\n    ),\n  },\n  {\n    key: 'clicks_count',\n    allowsSorting: true,\n    header: () => <Trans message=\"Clicks\" />,\n    body: biolink =>\n      biolink.clicks_count ? (\n        <FormattedNumber value={biolink.clicks_count} />\n      ) : (\n        '-'\n      ),\n  },\n  {\n    key: 'domain_id',\n    allowsSorting: true,\n    header: () => <Trans message=\"Domain\" />,\n    body: biolink => <DomainColumn model={biolink} />,\n  },\n  {\n    key: 'user_id',\n    allowsSorting: true,\n    header: () => <Trans message=\"Owner\" />,\n    width: 'flex-2 min-w-140',\n    body: biolink => {\n      if (!biolink.user) return '';\n      return (\n        <NameWithAvatar\n          image={biolink.user.avatar}\n          label={biolink.user.display_name}\n          description={biolink.user.email}\n        />\n      );\n    },\n  },\n  {\n    key: 'links_count',\n    allowsSorting: true,\n    header: () => <Trans message=\"Links\" />,\n    body: biolink =>\n      biolink.links_count ? (\n        <FormattedNumber value={biolink.links_count} />\n      ) : (\n        '-'\n      ),\n  },\n  {\n    key: 'active',\n    allowsSorting: true,\n    header: () => <Trans message=\"Active\" />,\n    body: biolink =>\n      biolink.active ? (\n        <CheckIcon className=\"icon-md text-positive\" />\n      ) : (\n        <CloseIcon className=\"icon-md text-danger\" />\n      ),\n  },\n  {\n    key: 'updated_at',\n    allowsSorting: true,\n    header: () => <Trans message=\"Last updated\" />,\n    body: link =>\n      link.updated_at ? <FormattedDate date={link.updated_at} /> : '',\n  },\n  {\n    key: 'actions',\n    header: () => <Trans message=\"Actions\" />,\n    hideHeader: true,\n    align: 'end',\n    width: 'w-128 flex-shrink-0',\n    visibleInMode: 'all',\n    body: biolink => (\n      <div className=\"text-muted\">\n        <Tooltip label={<Trans message=\"Clicks report\" />}>\n          <RouterLink to={`${biolink.id}`}>\n            <IconButton size=\"md\">\n              <BarChartIcon />\n            </IconButton>\n          </RouterLink>\n        </Tooltip>\n        <ShareLinkButton link={biolink} />\n        <PermissionAwareButton resource={biolink} action=\"update\">\n          <Link to={`${biolink.id}/edit/content`}>\n            <IconButton size=\"md\">\n              <EditIcon />\n            </IconButton>\n          </Link>\n        </PermissionAwareButton>\n      </div>\n    ),\n  },\n];\n\ninterface DomainColumnProps {\n  model: {\n    domain_id?: number;\n    domain?: CustomDomain;\n  };\n}\nexport function DomainColumn({model}: DomainColumnProps) {\n  const {data} = useLinkFormValueLists();\n  const defaultHost = useDefaultCustomDomainHost(data?.domains);\n  if (model.domain_id === 0 && defaultHost) {\n    return <Fragment>{defaultHost}</Fragment>;\n  }\n  if (model.domain_id && model.domain) {\n    return <Fragment>{removeProtocol(model.domain.host)}</Fragment>;\n  }\n  return <Trans message=\"All domains\" />;\n}\n","import {\n  ALL_PRIMITIVE_OPERATORS,\n  BackendFilter,\n  FilterControlType,\n  FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {\n  createdAtFilter,\n  updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\nimport {USER_MODEL} from '@common/auth/user';\n\nexport const BiolinksDatatableFilters: BackendFilter[] = [\n  {\n    key: 'active',\n    label: message('Status'),\n    description: message('Whether biolink is disabled or not'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.Select,\n      defaultValue: '01',\n      options: [\n        {\n          key: '01',\n          label: message('Enabled'),\n          value: true,\n        },\n        {\n          key: '02',\n          label: message('Disabled'),\n          value: false,\n        },\n      ],\n    },\n  },\n  {\n    key: 'clicks_count',\n    label: message('Clicks count'),\n    description: message('Number of times this biolink was visited'),\n    defaultOperator: FilterOperator.gte,\n    operators: ALL_PRIMITIVE_OPERATORS,\n    control: {\n      type: FilterControlType.Input,\n      inputType: 'number',\n      defaultValue: 1,\n    },\n  },\n  {\n    key: 'links_count',\n    label: message('Link count'),\n    description: message('Number of links in the biolink'),\n    defaultOperator: FilterOperator.gte,\n    operators: ALL_PRIMITIVE_OPERATORS,\n    control: {\n      type: FilterControlType.Input,\n      inputType: 'number',\n      defaultValue: 1,\n    },\n  },\n  createdAtFilter({\n    description: message('Date biolink was created'),\n  }),\n  updatedAtFilter({\n    description: message('Date biolink was last updated'),\n  }),\n  {\n    key: 'user_id',\n    label: message('Owner'),\n    description: message('User biolink was created by'),\n    defaultOperator: FilterOperator.eq,\n    control: {\n      type: FilterControlType.SelectModel,\n      model: USER_MODEL,\n    },\n  },\n];\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CrupdateBiolinkFormValues} from '../crupdate/crupdate-biolink-form-values';\nimport {buildLinkeablePayload} from '@app/dashboard/links/utils/build-linkeable-payload';\nimport {CrupdateBiolinkPayload} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\ninterface Response extends BackendResponse {\n  biolink: Biolink;\n}\n\nexport function useCreateBiolink(\n  form: UseFormReturn<CrupdateBiolinkFormValues>,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (props: CrupdateBiolinkFormValues) => createLinkGroup(props),\n    onSuccess: () => {\n      toast.positive(trans(message('Biolink created')));\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('biolink'),\n      });\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createLinkGroup(\n  payload: CrupdateBiolinkFormValues,\n): Promise<Response> {\n  return apiClient\n    .post('biolink', buildLinkeablePayload<CrupdateBiolinkPayload>(payload))\n    .then(r => r.data);\n}\n","import {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {CrupdateBiolinkFormValues} from './crupdate-biolink-form-values';\nimport {useForm} from 'react-hook-form';\nimport {useCreateBiolink} from '../requests/use-create-biolink';\nimport {nanoid} from 'nanoid';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useRecaptcha} from '@common/recaptcha/use-recaptcha';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {AliasField} from '@app/dashboard/links/forms/alias-field';\nimport {LinkDomainSelect} from '@app/dashboard/links/forms/link-domain-select';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\n\nexport function CreateBiolinkDialog() {\n  const navigate = useNavigate();\n  const {formId, close} = useDialogContext();\n  const {custom_domains} = useSettings();\n  const {verify, isVerifying} = useRecaptcha('link_creation');\n\n  const form = useForm<CrupdateBiolinkFormValues>({\n    defaultValues: {\n      active: true,\n      hash: nanoid(6),\n      domain_id: custom_domains?.allow_all_option ? undefined : 0,\n    },\n  });\n  const createBiolink = useCreateBiolink(form);\n\n  const handleSubmit = async (values: CrupdateBiolinkFormValues) => {\n    const isValid = await verify();\n    if (isValid) {\n      createBiolink.mutate(values, {\n        onSuccess: response => {\n          close();\n          navigate(`${response.biolink.id}/edit`);\n        },\n      });\n    }\n  };\n\n  return (\n    <Dialog size=\"md\">\n      <DialogHeader>\n        <Trans message=\"Create biolink\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          form={form}\n          id={formId}\n          onBeforeSubmit={() => {\n            // hook form won't clear errors for fields that are not bound to input\n            form.clearErrors('hash');\n          }}\n          onSubmit={handleSubmit}\n        >\n          <div className=\"mb-24\">\n            <FormTextField\n              name=\"name\"\n              label={<Trans message=\"Name\" />}\n              minLength={3}\n              className=\"mb-8\"\n              autoFocus\n            />\n            <AliasField form={form} name=\"hash\" />\n          </div>\n          <LinkDomainSelect name=\"domain_id\" className=\"mb-24\" />\n          <FormTextField\n            name=\"description\"\n            className=\"mb-24\"\n            label={<Trans message=\"Description\" />}\n            inputElementType=\"textarea\"\n            rows={2}\n          />\n          <FormSwitch\n            name=\"active\"\n            description={\n              <Trans message=\"Whether this biolink is viewable publicly.\" />\n            }\n            className=\"mb-24\"\n          >\n            <Trans message=\"Active\" />\n          </FormSwitch>\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={createBiolink.isPending || isVerifying}\n        >\n          <Trans message=\"Create\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport React, {useEffect, useMemo} from 'react';\nimport {DataTablePage} from '@common/datatable/page/data-table-page';\nimport {Trans} from '@common/i18n/trans';\nimport {DeleteSelectedItemsAction} from '@common/datatable/page/delete-selected-items-action';\nimport {DataTableEmptyStateMessage} from '@common/datatable/page/data-table-emty-state-message';\nimport marketing from './marketing.svg';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DataTableAddItemButton} from '@common/datatable/data-table-add-item-button';\nimport {BiolinksDatatableColumns} from './biolinks-datatable-columns';\nimport {BiolinksDatatableFilters} from './biolinks-datatable-filters';\nimport {CreateBiolinkDialog} from './crupdate/create-biolink-dialog';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {prefetchLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {PermissionAwareButton} from '@app/dashboard/upgrade/permission-aware-button';\n\ninterface LinkGroupsDatatablePageProps {\n  forCurrentUser?: boolean;\n}\nexport function BioLinksDatatablePage({\n  forCurrentUser,\n}: LinkGroupsDatatablePageProps) {\n  const {user} = useAuth();\n  const {workspaceId} = useActiveWorkspaceId();\n  const {filters, columns} = useMemo(() => {\n    const columns = !forCurrentUser\n      ? BiolinksDatatableColumns\n      : BiolinksDatatableColumns.filter(col => col.key !== 'user_id');\n\n    const filters = !forCurrentUser\n      ? BiolinksDatatableFilters\n      : BiolinksDatatableFilters.filter(filter => filter.key !== 'user_id');\n\n    return {filters, columns};\n  }, [forCurrentUser]);\n\n  useEffect(() => {\n    prefetchLinkFormValueLists();\n  }, []);\n\n  const userId = forCurrentUser ? user?.id : '';\n  return (\n    <DataTablePage\n      endpoint=\"biolink\"\n      queryParams={{\n        userId,\n        withCount: 'links',\n        with: 'user,domain',\n        workspaceId,\n      }}\n      title={<Trans message=\"Biolinks\" />}\n      headerContent={<InfoTrigger />}\n      filters={filters}\n      columns={columns}\n      actions={<Actions />}\n      selectedActions={\n        <PermissionAwareButton resource=\"biolink\" action=\"delete\">\n          <DeleteSelectedItemsAction />\n        </PermissionAwareButton>\n      }\n      emptyStateMessage={\n        <DataTableEmptyStateMessage\n          image={marketing}\n          title={<Trans message=\"No biolinks have been created yet\" />}\n          filteringTitle={<Trans message=\"No matching biolinks\" />}\n        />\n      }\n    />\n  );\n}\n\nfunction InfoTrigger() {\n  return (\n    <InfoDialogTrigger\n      title={<Trans message=\"Link in bio\" />}\n      body={\n        <Trans message=\"Offer multiple choices to your followers when they click on your Biolink. Share all your Social Media profiles, videos, songs, articles and other important links with just one url.\" />\n      }\n    />\n  );\n}\n\nfunction Actions() {\n  return (\n    <PermissionAwareButton resource=\"biolink\" action=\"create\">\n      <DialogTrigger type=\"modal\">\n        <DataTableAddItemButton>\n          <Trans message=\"New biolink\" />\n        </DataTableAddItemButton>\n        <CreateBiolinkDialog />\n      </DialogTrigger>\n    </PermissionAwareButton>\n  );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {useParams} from 'react-router-dom';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\nexport interface FetchBiolinkResponse extends BackendResponse {\n  biolink: Biolink;\n}\n\ninterface FetchBiolinkParams {\n  loadContent?: boolean;\n}\n\nexport const biolinkQueryKey = (\n  biolinkId: string | number,\n  params?: FetchBiolinkParams,\n) => {\n  return DatatableDataQueryKey(\n    `biolink/${biolinkId}`,\n    params as Record<string, string | boolean> | undefined,\n  );\n};\n\nexport function useBiolink() {\n  const {biolinkId} = useParams();\n  return useQuery({\n    queryKey: biolinkQueryKey(biolinkId!),\n    queryFn: () => fetchBiolink(biolinkId!),\n    initialData: seedInitialDataFromPaginatedList(biolinkId!),\n  });\n}\n\nexport async function fetchBiolink(\n  biolinkId: number | string,\n  params?: FetchBiolinkParams,\n  onLoad?: (data: FetchBiolinkResponse) => void,\n): Promise<FetchBiolinkResponse> {\n  const response = await apiClient\n    .get(`biolink/${biolinkId}`, {params})\n    .then(response => response.data);\n  onLoad?.(response);\n  return response;\n}\n\nfunction seedInitialDataFromPaginatedList(biolinkId: number | string) {\n  const biolink = queryClient\n    .getQueryData<PaginatedBackendResponse<Biolink>>(\n      DatatableDataQueryKey('biolink'),\n    )\n    ?.pagination?.data.find(link => link.id === +biolinkId);\n  return biolink ? {biolink} : undefined;\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ClicksReportPageLayout} from '@app/dashboard/reports/clicks/clicks-report-page-layout';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useParams} from 'react-router-dom';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\nimport clsx from 'clsx';\nimport {useBiolink} from '@app/dashboard/biolink/biolinks-datatable-page/requests/use-biolink';\n\nexport function BiolinkClicksReportPage() {\n  const navigate = useNavigate();\n  const {biolinkId} = useParams();\n  const query = useBiolink();\n  const biolink = query.data?.biolink;\n\n  return (\n    <ClicksReportPageLayout\n      model={`biolink=${biolinkId}`}\n      title={\n        <Breadcrumb size=\"xl\" className={clsx(query.isLoading && 'invisible')}>\n          <BreadcrumbItem\n            onSelected={() => {\n              navigate('..', {relative: 'path'});\n            }}\n          >\n            <Trans message=\"Biolinks\" />\n          </BreadcrumbItem>\n          <BreadcrumbItem className=\"first-letter:capitalize\">\n            <Trans message=\"“:name“ clicks\" values={{name: biolink?.name}} />\n          </BreadcrumbItem>\n        </Breadcrumb>\n      }\n      actions={\n        biolink && (\n          <ShareLinkButton\n            className=\"flex-shrink-0 text-muted\"\n            link={biolink}\n          />\n        )\n      }\n    />\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const WidgetsIcon = createSvgIcon(\n  <path d=\"m16.66 4.52 2.83 2.83-2.83 2.83-2.83-2.83 2.83-2.83M9 5v4H5V5h4m10 10v4h-4v-4h4M9 15v4H5v-4h4m7.66-13.31L11 7.34 16.66 13l5.66-5.66-5.66-5.65zM11 3H3v8h8V3zm10 10h-8v8h8v-8zm-10 0H3v8h8v-8z\" />\n, 'WidgetsOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AnimationIcon = createSvgIcon(\n  <path d=\"M15 2c-2.71 0-5.05 1.54-6.22 3.78-1.28.67-2.34 1.72-3 3C3.54 9.95 2 12.29 2 15c0 3.87 3.13 7 7 7 2.71 0 5.05-1.54 6.22-3.78 1.28-.67 2.34-1.72 3-3C20.46 14.05 22 11.71 22 9c0-3.87-3.13-7-7-7zM9 20c-2.76 0-5-2.24-5-5 0-1.12.37-2.16 1-3 0 3.87 3.13 7 7 7-.84.63-1.88 1-3 1zm3-3c-2.76 0-5-2.24-5-5 0-1.12.37-2.16 1-3 0 3.86 3.13 6.99 7 7-.84.63-1.88 1-3 1zm4.7-3.3c-.53.19-1.1.3-1.7.3-2.76 0-5-2.24-5-5 0-.6.11-1.17.3-1.7.53-.19 1.1-.3 1.7-.3 2.76 0 5 2.24 5 5 0 .6-.11 1.17-.3 1.7zM19 12c0-3.86-3.13-6.99-7-7 .84-.63 1.87-1 3-1 2.76 0 5 2.24 5 5 0 1.12-.37 2.16-1 3z\" />\n, 'AnimationOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ShortcutIcon = createSvgIcon(\n  <path d=\"m15 5-1.41 1.41L15 7.83 17.17 10H8c-2.76 0-5 2.24-5 5v4h2v-4c0-1.65 1.35-3 3-3h9.17L15 14.17l-1.41 1.41L15 17l6-6-6-6z\" />\n, 'ShortcutOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoreTimeIcon = createSvgIcon(\n  [<path d=\"M10 8v6l4.7 2.9.8-1.2-4-2.4V8z\" key=\"0\" />,<path d=\"M17.92 12c.05.33.08.66.08 1 0 3.9-3.1 7-7 7s-7-3.1-7-7 3.1-7 7-7c.7 0 1.37.1 2 .29V4.23c-.64-.15-1.31-.23-2-.23-5 0-9 4-9 9s4 9 9 9 9-4 9-9c0-.34-.02-.67-.06-1h-2.02z\" key=\"1\" />,<path d=\"M20 5V2h-2v3h-3v2h3v3h2V7h3V5z\" key=\"2\" />,]\n, 'MoreTimeOutlined');\n","import {create} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport {Biolink, BiolinkAppearance} from '@app/dashboard/biolink/biolink';\n\ninterface BiolinkEditorState {\n  appearance: BiolinkAppearance | null;\n  appearanceIsDirty: boolean;\n  setAppearanceIsDirty: (isDirty: boolean) => void;\n  biolink: Omit<Biolink, 'appearance'> | null;\n  updateAppearance: (payload: BiolinkAppearance) => void;\n  setBiolink: (biolink: Biolink) => void;\n}\n\nexport const useBiolinkEditorStore = create<BiolinkEditorState>()(\n  immer((set, get) => ({\n    appearance: null,\n    appearanceIsDirty: false,\n    setAppearanceIsDirty: (isDirty: boolean) => {\n      set(state => {\n        state.appearanceIsDirty = isDirty;\n      });\n    },\n    biolink: null,\n    setBiolink: biolink => {\n      set(state => {\n        state.biolink = biolink;\n        // don't override user appearance changes in the editor when biolink reloads from backend\n        if (!state.appearanceIsDirty) {\n          state.appearance = biolink.appearance?.config || null;\n        }\n      });\n    },\n    updateAppearance(payload: BiolinkAppearance) {\n      set(state => {\n        state.appearanceIsDirty = true;\n        state.appearance = {\n          ...state.appearance,\n          ...payload,\n        };\n      });\n    },\n  }))\n);\n\nexport function biolinkEditorState() {\n  return useBiolinkEditorStore.getState();\n}\n","import {useParams} from 'react-router-dom';\nimport {useQuery} from '@tanstack/react-query';\nimport {\n  biolinkQueryKey,\n  fetchBiolink,\n  FetchBiolinkResponse,\n} from '@app/dashboard/biolink/biolinks-datatable-page/requests/use-biolink';\nimport {\n  biolinkEditorState,\n  useBiolinkEditorStore,\n} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {queryClient} from '@common/http/query-client';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\n\nconst params = {\n  loadContent: true,\n};\n\nexport function useEditorBiolink() {\n  const biolinkId = useEditorBiolinkId();\n  const biolink = useBiolinkEditorStore(s => s.biolink);\n  const query = useQuery({\n    queryKey: biolinkQueryKey(biolinkId, params),\n    queryFn: () =>\n      fetchBiolink(biolinkId, params, data => {\n        biolinkEditorState().setBiolink(data.biolink);\n      }),\n  });\n\n  return {isLoading: query.isLoading, biolink, status: query.status, biolinkId};\n}\n\nexport function useEditorBiolinkId(): number {\n  const {biolinkId} = useParams();\n  return +biolinkId!;\n}\n\nexport function setEditorBiolink(biolink: Biolink) {\n  biolinkEditorState().setBiolink(biolink);\n  queryClient.setQueryData<FetchBiolinkResponse>(\n    biolinkQueryKey(biolink.id, params),\n    {biolink},\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 {message} from '@common/i18n/message';\nimport {\n  Biolink,\n  BiolinkLink,\n  BiolinkWidget,\n} from '@app/dashboard/biolink/biolink';\nimport {\n  setEditorBiolink,\n  useEditorBiolinkId,\n} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n  biolink: Biolink;\n}\n\ninterface Payload {\n  item: BiolinkLink | BiolinkWidget;\n  values: BiolinkItemPayload;\n}\n\nexport function useUpdateBiolinkContentItem() {\n  const biolinkId = useEditorBiolinkId();\n  return useMutation({\n    mutationFn: ({item, values}: Payload) =>\n      updateItem(biolinkId, item, values),\n    onSuccess: response => {\n      setEditorBiolink(response.biolink);\n    },\n    onError: err =>\n      showHttpErrorToast(err, message('Could not update content item')),\n  });\n}\n\nfunction updateItem(\n  biolinkId: number,\n  item: BiolinkLink | BiolinkWidget,\n  editorPayload: BiolinkItemPayload,\n): Promise<Response> {\n  const backendPayload: BiolinkItemPayload & {\n    item_id: number;\n    item_model_type: string;\n  } = {\n    ...editorPayload,\n    item_id: item.id,\n    item_model_type: item.model_type,\n  };\n  return apiClient\n    .put(`biolink/${biolinkId}/content-item`, backendPayload)\n    .then(r => r.data);\n}\n","import {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\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 {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {Fragment, ReactNode, useMemo} from 'react';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useForm} from 'react-hook-form';\nimport {BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Form} from '@common/ui/forms/form';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\nimport {parseAbsolute} from '@internationalized/date';\nimport {useUserTimezone} from '@common/i18n/use-user-timezone';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\n\ninterface LinkScheduleDialogProps {\n  link: BiolinkLink;\n}\nexport function LinkScheduleDialog({link}: LinkScheduleDialogProps) {\n  const now = useCurrentDateTime();\n  const timezone = useUserTimezone();\n  const {close, formId} = useDialogContext();\n  const form = useForm<BiolinkItemPayload>({\n    defaultValues: {\n      activates_at: link.activates_at,\n      expires_at: link.expires_at,\n    },\n  });\n  const updateItem = useUpdateBiolinkContentItem();\n  const activationDate = form.watch('activates_at');\n\n  const expirationMinDate = useMemo(() => {\n    if (activationDate) {\n      return parseAbsolute(activationDate, timezone);\n    }\n    return now;\n  }, [activationDate, now, timezone]);\n\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Schedule\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          id={formId}\n          form={form}\n          onSubmit={async values => {\n            updateItem.mutate(\n              {\n                item: link,\n                values,\n              },\n              {\n                onSuccess: () => {\n                  toast.positive(message('Schedule updated'));\n                  close();\n                },\n              },\n            );\n          }}\n        >\n          <FormDatePicker\n            name=\"activates_at\"\n            min={now}\n            className=\"mb-24\"\n            label={<Trans message=\"Start date\" />}\n            showCalendarFooter\n          />\n          <FormDatePicker\n            name=\"expires_at\"\n            min={expirationMinDate}\n            className=\"mb-24\"\n            label={<Trans message=\"End date\" />}\n            showCalendarFooter\n          />\n        </Form>\n        <InfoSection />\n      </DialogBody>\n      <DialogFooter dividerTop>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={updateItem.isPending || !form.formState.isDirty}\n        >\n          <Trans message=\"Save\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n\nfunction InfoSection() {\n  const values = {\n    b: (parts: ReactNode) => <span className=\"font-bold\">{parts}</span>,\n  };\n\n  return (\n    <SectionHelper\n      description={\n        <Fragment>\n          <div>\n            <Trans\n              message=\"Leave <b>start date</b> blank to display this link immediately.\"\n              values={values}\n            />\n          </div>\n          <div>\n            <Trans\n              message=\"Leave <b>end date</b> blank to display this link forever.\"\n              values={values}\n            />\n          </div>\n        </Fragment>\n      }\n    />\n  );\n}\n","import {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\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 {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useForm} from 'react-hook-form';\nimport {BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Form} from '@common/ui/forms/form';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\n\ninterface LinkScheduleDialogProps {\n  link: BiolinkLink;\n}\nexport function LeapLinkDialog({link}: LinkScheduleDialogProps) {\n  const now = useCurrentDateTime();\n  const {close, formId} = useDialogContext();\n  const form = useForm<BiolinkItemPayload>({\n    defaultValues: {\n      leap_until: link.leap_until,\n    },\n  });\n  const isDirty = form.formState.isDirty;\n  const updateItem = useUpdateBiolinkContentItem();\n\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Redirect link\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          id={formId}\n          form={form}\n          onSubmit={async values => {\n            updateItem.mutate(\n              {\n                item: link,\n                values,\n              },\n              {\n                onSuccess: () => {\n                  toast.positive(message('Redirect link updated'));\n                  close();\n                },\n              },\n            );\n          }}\n        >\n          <FormDatePicker\n            required\n            name=\"leap_until\"\n            min={now}\n            className=\"mb-24\"\n            label={<Trans message=\"Redirect until\" />}\n            showCalendarFooter\n          />\n        </Form>\n        <InfoSection />\n      </DialogBody>\n      <DialogFooter dividerTop>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={!isDirty || updateItem.isPending}\n        >\n          <Trans message=\"Save\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n\nfunction InfoSection() {\n  return (\n    <SectionHelper\n      description={\n        <Trans message=\"Send all visitors straight to this link, instead of your Biolink, until the specified date. After that date, Biolink will resume to showing normally.\" />\n      }\n    />\n  );\n}\n","import {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\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 {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useForm} from 'react-hook-form';\nimport {BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Form} from '@common/ui/forms/form';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\n\ninterface LinkThumbnailDialogProps {\n  link: BiolinkLink;\n}\nexport function LinkThumbnailDialog({link}: LinkThumbnailDialogProps) {\n  const {close, formId} = useDialogContext();\n  const form = useForm<BiolinkItemPayload>({\n    defaultValues: {\n      image: link.image,\n    },\n  });\n  const updateItem = useUpdateBiolinkContentItem();\n  const isDirty = form.formState.isDirty;\n\n  return (\n    <Dialog size=\"sm\">\n      <DialogHeader>\n        <Trans message=\"Link thumbnail\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          id={formId}\n          form={form}\n          onSubmit={async values => {\n            updateItem.mutate(\n              {\n                item: link,\n                values,\n              },\n              {\n                onSuccess: () => {\n                  toast.positive(message('Thumbnail updated'));\n                  close();\n                },\n              },\n            );\n          }}\n        >\n          <FileUploadProvider>\n            <FormImageSelector\n              showRemoveButton\n              name=\"image\"\n              diskPrefix=\"links\"\n            />\n          </FileUploadProvider>\n        </Form>\n      </DialogBody>\n      <DialogFooter dividerTop>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={updateItem.isPending || !isDirty}\n        >\n          <Trans message=\"Save\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","export const LinkAnimationList = [\n  'none',\n  'bounce',\n  'flash',\n  'pulse',\n  'rubberBand',\n  'shakeX',\n  'shakeY',\n  'headShake',\n  'swing',\n  'tada',\n  'wobble',\n  'jello',\n  'heartBeat',\n];\n","import {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\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 {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useForm, useFormContext} from 'react-hook-form';\nimport {BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Form} from '@common/ui/forms/form';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {LinkAnimationList} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-animation-list';\nimport {useEffect, useState} from 'react';\nimport clsx from 'clsx';\nimport {SectionHelper} from '@common/ui/section-helper';\nimport {BiolinkItemPayload} from '@app/dashboard/biolink/biolink-editor/content/biolink-item-payload';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\n\ninterface LinkAnimationDialogProps {\n  link: BiolinkLink;\n}\nexport function LinkAnimationDialog({link}: LinkAnimationDialogProps) {\n  const {close, formId} = useDialogContext();\n  const form = useForm<BiolinkItemPayload>({\n    defaultValues: {\n      animation: link.animation,\n    },\n  });\n  const isDirty = form.formState.isDirty;\n  const updateItem = useUpdateBiolinkContentItem();\n\n  useEffect(() => {\n    import('./animate.min.css');\n  }, []);\n\n  return (\n    <Dialog size=\"md\">\n      <DialogHeader>\n        <Trans message=\"Link animation\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          id={formId}\n          form={form}\n          onSubmit={async values => {\n            updateItem.mutate(\n              {\n                item: link,\n                values,\n              },\n              {\n                onSuccess: () => {\n                  toast.positive(message('Animation updated'));\n                  close();\n                },\n              },\n            );\n          }}\n        >\n          <SectionHelper\n            className=\"mb-24\"\n            description={\n              <Trans\n                message=\"Add animation to draw attention to this link. :br Selected animation will repeat five times by default.\"\n                values={{br: <br />}}\n              />\n            }\n          />\n          <div className=\"grid gap-14 grid-cols-[repeat(auto-fill,minmax(95px,1fr))]\">\n            {LinkAnimationList.map((animation, index) => (\n              <AnimationItem key={index} animationName={animation} />\n            ))}\n          </div>\n        </Form>\n      </DialogBody>\n      <DialogFooter dividerTop>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={updateItem.isPending || !isDirty}\n        >\n          <Trans message=\"Save\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n\ninterface AnimationItemProps {\n  animationName: string;\n}\nfunction AnimationItem({animationName}: AnimationItemProps) {\n  const [isAnimating, setIsAnimating] = useState(false);\n  const {watch, setValue} = useFormContext<BiolinkItemPayload>();\n  const animation: string | null =\n    animationName === 'none' ? null : animationName;\n  const selectedAnimation = watch('animation');\n\n  return (\n    <button\n      type=\"button\"\n      onClick={() => {\n        setValue('animation', animation, {shouldDirty: true});\n      }}\n      onPointerEnter={() => {\n        setIsAnimating(true);\n      }}\n      onPointerLeave={() => {\n        setIsAnimating(false);\n      }}\n      className={clsx(\n        'border border-2 px-10 h-64 uppercase font-medium rounded flex items-center justify-center animate__animated',\n        isAnimating && `animate__${animationName}`,\n        selectedAnimation === animation && 'border-primary',\n      )}\n    >\n      {animationName}\n    </button>\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 {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {\n  Biolink,\n  BiolinkLink,\n  BiolinkWidget,\n} from '@app/dashboard/biolink/biolink';\nimport {\n  setEditorBiolink,\n  useEditorBiolinkId,\n} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\n\ninterface Response extends BackendResponse {\n  biolink: Biolink;\n}\n\ninterface Payload {\n  item: BiolinkLink | BiolinkWidget;\n}\n\nexport function useDetachBiolinkContentItem() {\n  const biolinkId = useEditorBiolinkId();\n  return useMutation({\n    mutationFn: (payload: Payload) => detachItem(biolinkId, payload),\n    onSuccess: response => {\n      setEditorBiolink(response.biolink);\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction detachItem(biolinkId: number, payload: Payload): Promise<Response> {\n  return apiClient\n    .post(`biolink/${biolinkId}/content-item/detach`, payload)\n    .then(r => r.data);\n}\n","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport {BiolinkLink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {useDetachBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-detach-biolink-content-item';\n\ninterface DetachItemButtonProps {\n  item: BiolinkLink | BiolinkWidget;\n}\nexport function DetachContentItemButton({item}: DetachItemButtonProps) {\n  const detachItem = useDetachBiolinkContentItem();\n  return (\n    <DialogTrigger type=\"modal\">\n      <IconButton\n        className=\"text-muted flex-shrink-0\"\n        disabled={detachItem.isPending}\n      >\n        <CloseIcon />\n      </IconButton>\n      <ConfirmationDialog\n        isDanger\n        onConfirm={() => {\n          detachItem.mutate({item});\n        }}\n        title={<Trans message=\"Remove item\" />}\n        body={\n          <Trans message=\"Are you sure you want to remove this item from the biolink?\" />\n        }\n        confirm={<Trans message=\"Remove\" />}\n      />\n    </DialogTrigger>\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 {Biolink} from '@app/dashboard/biolink/biolink';\nimport {moveItemInNewArray} from '@common/utils/array/move-item-in-new-array';\nimport {biolinkEditorState} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {useEditorBiolinkId} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\n\ninterface Response extends BackendResponse {\n  biolink: Biolink;\n}\n\ninterface Payload {\n  oldIndex: number;\n  newIndex: number;\n  // id of widget that should be pinned to top\n  widgetToPin?: number;\n}\n\nexport function useSortBiolinkContent() {\n  const biolinkId = useEditorBiolinkId();\n  return useMutation({\n    mutationFn: (payload: Payload) => sortContent(biolinkId, payload),\n  });\n}\n\nfunction sortContent(\n  biolinkId: number,\n  {oldIndex, newIndex, widgetToPin}: Payload,\n): Promise<Response> {\n  const biolink = biolinkEditorState().biolink!;\n  const content = moveItemInNewArray(biolink.content, oldIndex, newIndex);\n  if (widgetToPin) {\n    content[newIndex] = {...content[newIndex], pinned: 'top'};\n  }\n  biolinkEditorState().setBiolink({...biolink, content});\n\n  const order = content.map(item => ({\n    id: item.id,\n    model_type: item.model_type,\n  }));\n\n  return apiClient.post(`biolink/${biolinkId}/change-order`, {\n    order,\n    widgetToPin,\n  });\n}\n","import {DragIndicatorIcon} from '@common/icons/material/DragIndicator';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {Trans} from '@common/i18n/trans';\nimport {DetachContentItemButton} from '@app/dashboard/biolink/biolink-editor/content/detach-content-item-button';\nimport {ReactNode, useRef} from 'react';\nimport {\n  Biolink,\n  BiolinkLink,\n  BiolinkWidget,\n} from '@app/dashboard/biolink/biolink';\nimport {useSortable} from '@common/ui/interactions/dnd/use-sortable';\nimport {useSortBiolinkContent} from '@app/dashboard/biolink/biolink-editor/requests/use-sort-biolink-content';\nimport clsx from 'clsx';\n\ninterface BiolinkContentItemLayoutProps {\n  item?: BiolinkLink | BiolinkWidget;\n  biolink?: Biolink;\n  title?: ReactNode;\n  updateDialog?: ReactNode;\n  children: ReactNode;\n  actionRow?: ReactNode;\n}\nexport function BiolinkContentItemLayout({\n  item,\n  biolink,\n  title,\n  updateDialog,\n  children,\n  actionRow,\n}: BiolinkContentItemLayoutProps) {\n  const sortContent = useSortBiolinkContent();\n  const itemRef = useRef<HTMLDivElement>(null);\n  const sortDisabled = !item || item.pinned != null;\n\n  const {sortableProps, dragHandleRef} = useSortable({\n    item: item || 'noop',\n    items: biolink?.content || [],\n    type: 'biolinkEditorSortable',\n    ref: itemRef,\n    onSortEnd: (oldIndex, newIndex) => {\n      sortContent.mutate({oldIndex, newIndex});\n    },\n    disabled: sortDisabled,\n  });\n\n  return (\n    <div\n      className=\"mb-20 flex h-172 items-stretch rounded-panel border bg-paper shadow\"\n      ref={itemRef}\n      {...sortableProps}\n    >\n      <button\n        type=\"button\"\n        className={clsx(\n          'flex-shrink-0 border-r px-10 text-muted',\n          !sortDisabled && 'hover:text-primary',\n        )}\n        disabled={sortDisabled}\n        ref={dragHandleRef}\n      >\n        <DragIndicatorIcon />\n      </button>\n      <div className=\"min-w-0 flex-auto p-24\">\n        <div className=\"flex items-center\">\n          {title && (\n            <div className=\"mb-4 mr-auto flex-auto overflow-hidden overflow-ellipsis whitespace-nowrap font-medium\">\n              {title}\n            </div>\n          )}\n          {updateDialog && (\n            <DialogTrigger type=\"modal\">\n              <Button\n                className=\"ml-20 flex-shrink-0\"\n                variant=\"text\"\n                color=\"primary\"\n                startIcon={<EditIcon />}\n              >\n                <Trans message=\"Edit\" />\n              </Button>\n              {updateDialog}\n            </DialogTrigger>\n          )}\n          {biolink && item && <DetachContentItemButton item={item} />}\n        </div>\n        <div className=\"mb-20\">{children}</div>\n        {actionRow}\n      </div>\n    </div>\n  );\n}\n","import {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {Trans} from '@common/i18n/trans';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {Biolink, BiolinkLink} from '@app/dashboard/biolink/biolink';\nimport {Button} from '@common/ui/buttons/button';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ImageIcon} from '@common/icons/material/Image';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {AnimationIcon} from '@common/icons/material/Animation';\nimport {ShortcutIcon} from '@common/icons/material/Shortcut';\nimport {MoreTimeIcon} from '@common/icons/material/MoreTime';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {LinkScheduleDialog} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-schedule-dialog';\nimport {LeapLinkDialog} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/leap-link-dialog';\nimport {UpdateLinkDialog} from '@app/dashboard/links/dialogs/update-link-dialog';\nimport {HidableLinkSettingsField} from '@app/dashboard/links/forms/link-settings-form';\nimport {LinkThumbnailDialog} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-thumbnail-dialog';\nimport {LinkAnimationDialog} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-animation-dialog';\nimport {BarChartIcon} from '@common/icons/material/BarChart';\nimport {BiolinkContentItemLayout} from '@app/dashboard/biolink/biolink-editor/content/biolink-content-item-layout';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport {Link} from 'react-router-dom';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\nimport {\n  setEditorBiolink,\n  useEditorBiolinkId,\n} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {useMediaQuery} from '@common/utils/hooks/use-media-query';\n\nexport const linkDialogHiddenFields: HidableLinkSettingsField[] = [\n  'groups',\n  'seo',\n  'enabled',\n  'alias',\n];\n\ninterface LinkContentItemProps {\n  item: BiolinkLink;\n  biolink: Biolink;\n}\nexport function LinkContentItem({item: link, biolink}: LinkContentItemProps) {\n  const biolinkId = useEditorBiolinkId();\n  const endpoint = `biolink/${biolinkId}/link/${link.id}`;\n\n  return (\n    <BiolinkContentItemLayout\n      item={link}\n      biolink={biolink}\n      title={link.name}\n      actionRow={<ActionRow link={link} biolink={biolink} />}\n      updateDialog={\n        <UpdateLinkDialog\n          endpoint={endpoint}\n          link={link}\n          showButtonLabelField\n          hiddenFields={linkDialogHiddenFields}\n          onSuccess={(response: {biolink: Biolink}) => {\n            setEditorBiolink(response.biolink);\n          }}\n        />\n      }\n    >\n      <div className=\"flex items-center gap-6\">\n        <RemoteFavicon url={link.long_url} />\n        <a\n          href={link.short_url}\n          target=\"_blank\"\n          className=\"hover:underline whitespace-nowrap overflow-hidden overflow-ellipsis text-muted text-sm\"\n          rel=\"noreferrer\"\n        >\n          {removeProtocol(link.long_url)}\n        </a>\n      </div>\n    </BiolinkContentItemLayout>\n  );\n}\n\ninterface ActionRowProps {\n  link: BiolinkLink;\n  biolink: Biolink;\n}\nfunction ActionRow({link, biolink}: ActionRowProps) {\n  const updateItem = useUpdateBiolinkContentItem();\n\n  return (\n    <div className=\"flex md:gap-24 md:justify-between h-42 items-center\">\n      <div className=\"flex items-center text-muted\">\n        <Switch\n          checked={link.active}\n          disabled={link.active_locked || updateItem.isPending}\n          onChange={() => {\n            updateItem.mutate({\n              item: link,\n              values: {active: !link.active},\n            });\n          }}\n        />\n        <DialogTrigger type=\"popover\">\n          <Tooltip label={<Trans message=\"Change thumbnail\" />}>\n            <IconButton className=\"ml-10\" color={link.image ? 'primary' : null}>\n              <ImageIcon />\n            </IconButton>\n          </Tooltip>\n          <LinkThumbnailDialog link={link} />\n        </DialogTrigger>\n        <DialogTrigger type=\"popover\">\n          <Tooltip label={<Trans message=\"Animation\" />}>\n            <IconButton color={link.animation ? 'primary' : null}>\n              <AnimationIcon />\n            </IconButton>\n          </Tooltip>\n          <LinkAnimationDialog link={link} />\n        </DialogTrigger>\n        <DialogTrigger type=\"popover\">\n          <Tooltip label={<Trans message=\"Redirect\" />}>\n            <IconButton color={link.leap_until ? 'primary' : null}>\n              <ShortcutIcon />\n            </IconButton>\n          </Tooltip>\n          <LeapLinkDialog link={link} />\n        </DialogTrigger>\n        <DialogTrigger type=\"popover\">\n          <Tooltip label={<Trans message=\"Schedule\" />}>\n            <IconButton\n              color={link.expires_at || link.activates_at ? 'primary' : null}\n            >\n              <MoreTimeIcon />\n            </IconButton>\n          </Tooltip>\n          <LinkScheduleDialog link={link} />\n        </DialogTrigger>\n      </div>\n      <ClicksButton link={link} />\n    </div>\n  );\n}\n\ninterface ClicksButtonProps {\n  link: BiolinkLink;\n}\nfunction ClicksButton({link}: ClicksButtonProps) {\n  const isMobile = useIsMobileMediaQuery();\n  const isVerySmallScreen = useMediaQuery('(max-width: 380px)');\n  if (isVerySmallScreen) {\n    return null;\n  }\n\n  const clicksReportPath = `../../../../links/${link.id}`;\n\n  const button = isMobile ? (\n    <IconButton\n      className=\"text-muted flex-shrink-0\"\n      elementType={Link}\n      to={clicksReportPath}\n      relative=\"path\"\n    >\n      <BarChartIcon />\n    </IconButton>\n  ) : (\n    <Button\n      variant=\"text\"\n      className=\"text-muted\"\n      startIcon={<BarChartIcon />}\n      elementType={Link}\n      to={clicksReportPath}\n      relative=\"path\"\n    >\n      <Trans message=\":count clicks\" values={{count: link.clicks_count}} />\n    </Button>\n  );\n\n  return (\n    <Tooltip\n      label={\n        <Trans\n          message=\":count lifetime clicks\"\n          values={{count: link.clicks_count}}\n        />\n      }\n    >\n      {button}\n    </Tooltip>\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CrupdateBiolinkFormValues} from '@app/dashboard/biolink/biolinks-datatable-page/crupdate/crupdate-biolink-form-values';\nimport {\n  buildLinkeablePayload,\n  CrupdateLinkeablePayload,\n} from '@app/dashboard/links/utils/build-linkeable-payload';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\n\nexport interface CrupdateBiolinkPayload\n  extends Omit<CrupdateBiolinkFormValues, 'utm' | 'groups' | 'pixels' | 'tags'>,\n    CrupdateLinkeablePayload {}\n\ninterface Response extends BackendResponse {}\n\nexport function useUpdateBiolink(\n  form: UseFormReturn<CrupdateBiolinkFormValues>,\n  biolinkId: number,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: CrupdateBiolinkFormValues) =>\n      updateBiolink(biolinkId, payload),\n    onSuccess: () => {\n      toast.positive(trans(message('Biolink updated')));\n      queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('biolink'),\n      });\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction updateBiolink(\n  biolinkId: number,\n  payload: CrupdateBiolinkFormValues,\n): Promise<Response> {\n  return apiClient\n    .put(\n      `biolink/${biolinkId}`,\n      buildLinkeablePayload<CrupdateBiolinkPayload>(payload),\n    )\n    .then(r => r.data);\n}\n","import {\n  HidableLinkSettingsField,\n  LinkSettingsForm,\n} from '@app/dashboard/links/forms/link-settings-form';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {useForm} from 'react-hook-form';\nimport {CrupdateBiolinkFormValues} from '@app/dashboard/biolink/biolinks-datatable-page/crupdate/crupdate-biolink-form-values';\nimport {Form} from '@common/ui/forms/form';\nimport {Trans} from '@common/i18n/trans';\nimport {buildLinkeableDefaultFormValues} from '@app/dashboard/links/utils/build-linkeable-default-form-values';\nimport {useUpdateBiolink} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink';\nimport {Button} from '@common/ui/buttons/button';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {useEditorBiolink} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {AliasField} from '@app/dashboard/links/forms/alias-field';\n\nconst hiddenLinkSettingsFields: HidableLinkSettingsField[] = [\n  'type',\n  'groups',\n  'title',\n];\n\nexport function BiolinkSettingsForm() {\n  const {biolink} = useEditorBiolink();\n\n  if (!biolink) {\n    return (\n      <div className=\"py-24\">\n        <FullPageLoader />\n      </div>\n    );\n  }\n\n  return <SettingsForm biolink={biolink} />;\n}\n\ninterface SettingsFormProps {\n  biolink: Biolink;\n}\nfunction SettingsForm({biolink}: SettingsFormProps) {\n  const form = useForm<CrupdateBiolinkFormValues>({\n    defaultValues: buildLinkeableDefaultFormValues(biolink),\n  });\n  const updateSettings = useUpdateBiolink(form, biolink.id);\n\n  return (\n    <Form\n      form={form}\n      onBeforeSubmit={() => {\n        // hook form won't clear errors for fields that are not bound to input\n        form.clearErrors('hash');\n      }}\n      onSubmit={values => {\n        updateSettings.mutate(values);\n      }}\n    >\n      <div className=\"mb-24\">\n        <Button\n          type=\"submit\"\n          variant=\"flat\"\n          color=\"primary\"\n          disabled={updateSettings.isPending || !form.formState.isDirty}\n        >\n          <Trans message=\"Update\" />\n        </Button>\n      </div>\n      <div className=\"mb-24\">\n        <FormTextField\n          name=\"name\"\n          label={<Trans message=\"Name\" />}\n          minLength={3}\n          className=\"mb-8\"\n          autoFocus\n        />\n        <AliasField form={form} name=\"hash\" />\n      </div>\n      <LinkSettingsForm\n        hiddenFields={hiddenLinkSettingsFields}\n        linkName={<Trans message=\"biolink\" />}\n      />\n    </Form>\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {setEditorBiolink} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\n\ninterface Response extends BackendResponse {\n  biolink: Biolink;\n}\n\ninterface Payload {\n  widgetId?: number;\n  type: WidgetType;\n  position?: number;\n  config: BiolinkWidget['config'] | null;\n}\n\nexport function useCrupdateBiolinkWidget(\n  biolinkId: number,\n  form: UseFormReturn<BiolinkWidget['config']>,\n) {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: Payload) => createWidget(biolinkId, payload),\n    onSuccess: (response, payload) => {\n      toast.positive(\n        trans(\n          !payload.widgetId\n            ? message('Widget updated')\n            : message('Widget added'),\n        ),\n      );\n      setEditorBiolink(response.biolink);\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction createWidget(\n  biolinkId: number,\n  {widgetId, ...payload}: Payload,\n): Promise<Response> {\n  const request = widgetId\n    ? apiClient.put(`biolink/${biolinkId}/widget/${widgetId}`, payload)\n    : apiClient.post(`biolink/${biolinkId}/widget`, payload);\n  return request.then(r => r.data);\n}\n","import {useForm, UseFormReturn} from 'react-hook-form';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Form} from '@common/ui/forms/form';\nimport {Trans} from '@common/i18n/trans';\nimport {useCrupdateBiolinkWidget} from '@app/dashboard/biolink/biolink-editor/requests/use-crupdate-biolink-widget';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {ReactNode, useMemo} from 'react';\nimport {\n  WidgetList,\n  WidgetType,\n} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\n\ninterface CrupdateWidgetDialogProps {\n  biolink: Biolink;\n  type: WidgetType;\n  widget?: BiolinkWidget;\n  children?: ReactNode;\n  defaultValues?: BiolinkWidget['config'];\n  // allow children to transform or validate values before submitting\n  onSubmit?: (\n    values: BiolinkWidget['config'],\n    form: UseFormReturn<BiolinkWidget['config']>,\n  ) => Promise<BiolinkWidget['config'] | undefined> | void;\n}\nexport function CrupdateWidgetDialog({\n  biolink,\n  widget,\n  type,\n  defaultValues,\n  children,\n  onSubmit,\n}: CrupdateWidgetDialogProps) {\n  const widgetListItem = WidgetList[type];\n\n  // make sure we are not using empty array or string for defaultValues, it will cause errors\n  const cleanedValues = useMemo(() => {\n    const values = widget?.config || defaultValues;\n    const isEmpty = (Array.isArray(values) && values.length === 0) || !values;\n    return isEmpty ? undefined : values;\n  }, [widget?.config, defaultValues]);\n\n  const form = useForm<BiolinkWidget['config']>({\n    defaultValues: cleanedValues,\n  });\n  const {formId, close} = useDialogContext();\n  const addWidget = useCrupdateBiolinkWidget(biolink.id, form);\n\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans {...widgetListItem.name} />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          form={form}\n          id={formId}\n          onSubmit={async values => {\n            const transformedValues = onSubmit\n              ? await onSubmit(values, form)\n              : values;\n            // \"null\" is needed to clear selected value for widget (socials for example)\n            if (transformedValues === undefined) {\n              return;\n            }\n            addWidget.mutate(\n              {\n                widgetId: widget?.id,\n                config: transformedValues,\n                type,\n                // put socials widget at the end (when creating a new widget), everything else at the start\n                position:\n                  !widget && type === WidgetType.Socials\n                    ? biolink.content.length + 1\n                    : undefined,\n              },\n              {onSuccess: () => close()},\n            );\n          }}\n        >\n          {children}\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          variant=\"text\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          form={formId}\n          disabled={addWidget.isPending || !form.formState.isDirty}\n        >\n          {widget ? <Trans message=\"Update\" /> : <Trans message=\"Add\" />}\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {WidgetDialogProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-dialog-props';\n\nexport interface ImageWidget extends BiolinkWidget {\n  type: WidgetType.Image;\n  config: {\n    url: string;\n    destinationUrl?: string;\n    type: 'default' | 'avatar';\n  };\n}\n\nexport function ImageWidgetDialog({\n  biolink,\n  widget,\n}: WidgetDialogProps<ImageWidget>) {\n  const {trans} = useTrans();\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Image}\n      widget={widget}\n    >\n      <FileUploadProvider>\n        <FormImageSelector name=\"url\" diskPrefix=\"widgets\" required />\n      </FileUploadProvider>\n      <FormSelect\n        className=\"my-24\"\n        name=\"type\"\n        label={<Trans message=\"Style\" />}\n        selectionMode=\"single\"\n      >\n        <Item value=\"default\">\n          <Trans message=\"Default\" />\n        </Item>\n        <Item value=\"avatar\">\n          <Trans message=\"Avatar\" />\n        </Item>\n      </FormSelect>\n      <FormTextField\n        placeholder={trans(message('Optional'))}\n        name=\"destinationUrl\"\n        type=\"url\"\n        label={<Trans message=\"Destination url\" />}\n        description={\n          <Trans message=\"Redirect user to this url when clicking the image.\" />\n        }\n      />\n    </CrupdateWidgetDialog>\n  );\n}\n","export default \"__VITE_ASSET__4ee84a82__\"","export default \"__VITE_ASSET__6f43011e__\"","export default \"__VITE_ASSET__c2cfbca9__\"","export default \"__VITE_ASSET__9e836dc6__\"","export default \"__VITE_ASSET__e9c6ece7__\"","export default \"__VITE_ASSET__5ee3b190__\"","export default \"__VITE_ASSET__f117f6fb__\"","export default \"__VITE_ASSET__36c11155__\"","export default \"__VITE_ASSET__113bafd9__\"","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport getVideoId from 'get-video-id';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport interface YoutubeWidget extends BiolinkWidget {\n  type: WidgetType.Youtube;\n  config: {\n    url: string;\n  };\n}\n\ninterface YoutubeWidgetDialogProps {\n  biolink: Biolink;\n  widget?: YoutubeWidget;\n}\nexport function YoutubeWidgetDialog({\n  biolink,\n  widget,\n}: YoutubeWidgetDialogProps) {\n  const {trans} = useTrans();\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Youtube}\n      widget={widget}\n      onSubmit={(values, form) => {\n        const youtubeId = getVideoId(values.url).id;\n        if (!youtubeId) {\n          form.setError('url', {\n            message: trans(message('Invalid youtube url')),\n          });\n        } else {\n          return Promise.resolve(values);\n        }\n      }}\n    >\n      <FormTextField\n        required\n        autoFocus\n        placeholder=\"https://www.youtube.com/watch?v=YE7VzlLtp-4\"\n        name=\"url\"\n        type=\"url\"\n        label={<Trans message=\"Youtube video url\" />}\n        description={\n          <Trans message=\"Embed this youtube video within biolink.\" />\n        }\n      />\n    </CrupdateWidgetDialog>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\n\nexport interface TextWidget extends BiolinkWidget {\n  type: WidgetType.Text;\n  config: {\n    title: string;\n    description?: string;\n  };\n}\n\ninterface TextWidgetDialogProps {\n  biolink: Biolink;\n  widget?: TextWidget;\n}\nexport function TextWidgetDialog({biolink, widget}: TextWidgetDialogProps) {\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Text}\n      widget={widget}\n    >\n      <FormTextField\n        className=\"mb-24\"\n        required\n        autoFocus\n        name=\"title\"\n        label={<Trans message=\"Title\" />}\n      />\n      <FormTextField\n        name=\"description\"\n        inputElementType=\"textarea\"\n        rows={2}\n        label={<Trans message=\"Description\" />}\n      />\n    </CrupdateWidgetDialog>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {\n  SocialsList,\n  SocialsType,\n} from '@app/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-list';\nimport {removeEmptyValuesFromObject} from '@common/utils/objects/remove-empty-values-from-object';\n\nexport interface SocialsWidget extends BiolinkWidget {\n  type: WidgetType.Text;\n  config: Record<SocialsType, string>;\n}\n\ninterface TextWidgetDialogProps {\n  biolink: Biolink;\n  widget?: SocialsWidget;\n}\nexport function SocialsWidgetDialog({biolink, widget}: TextWidgetDialogProps) {\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Socials}\n      widget={widget}\n      onSubmit={values => {\n        // remove key from object, if user empties social's input\n        return Promise.resolve(removeEmptyValuesFromObject(values));\n      }}\n    >\n      {Object.entries(SocialsList).map(([type, social], index) => {\n        const Icon = social.icon;\n        return (\n          <FormTextField\n            autoFocus={index === 0}\n            key={type}\n            className=\"mb-24\"\n            name={type}\n            placeholder={social.placeholder}\n            label={<Trans {...social.name} />}\n            pattern={social.pattern}\n            type={social.inputType}\n            autoComplete=\"off\"\n            startAdornment={Icon && <Icon />}\n          />\n        );\n      })}\n    </CrupdateWidgetDialog>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\n\nexport interface TwitchWidget extends BiolinkWidget {\n  type: WidgetType.Image;\n  config: {\n    url: string;\n  };\n}\n\ninterface YoutubeWidgetDialogProps {\n  biolink: Biolink;\n  widget?: TwitchWidget;\n}\nexport function TwitchWidgetDialog({\n  biolink,\n  widget,\n}: YoutubeWidgetDialogProps) {\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Twitch}\n      widget={widget}\n    >\n      <FormTextField\n        required\n        autoFocus\n        placeholder=\"https://www.twitch.tv/kasparovchess\"\n        name=\"url\"\n        type=\"url\"\n        pattern=\"https://(www.)?twitch.tv/.*\"\n        label={<Trans message=\"Twitch channel or clip url\" />}\n        description={\n          <Trans message=\"Embed this twitch channel or clip within biolink.\" />\n        }\n      />\n    </CrupdateWidgetDialog>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport interface SoundcloudWidget extends BiolinkWidget {\n  type: WidgetType.Soundcloud;\n  config: {\n    url: string;\n    embedUrl: string;\n  };\n}\n\ninterface SoundcloudWidgetDialogProps {\n  biolink: Biolink;\n  widget?: SoundcloudWidget;\n}\nexport function SoundcloudWidgetDialog({\n  biolink,\n  widget,\n}: SoundcloudWidgetDialogProps) {\n  const {trans} = useTrans();\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Soundcloud}\n      widget={widget}\n      onSubmit={async (values, form) => {\n        const encodedUrl = encodeURIComponent(values.url);\n        const response = await fetch(\n          `https://soundcloud.com/oembed?format=json&url=${encodedUrl}`\n        ).then(res => res.json());\n        const embedCode = response.html;\n\n        const div = document.createElement('div');\n        div.innerHTML = embedCode;\n        const embedUrl = div.querySelector('iframe')?.src;\n\n        if (embedUrl) {\n          return {\n            ...values,\n            embedUrl,\n          };\n        }\n\n        form.setError('url', {\n          message: trans(message('Invalid soundcloud url')),\n        });\n      }}\n    >\n      <FormTextField\n        required\n        autoFocus\n        placeholder=\"https://soundcloud.com/artist/track\"\n        name=\"url\"\n        type=\"url\"\n        label={<Trans message=\"Soundcloud track url\" />}\n        description={\n          <Trans message=\"Embed this soundcloud track within biolink.\" />\n        }\n      />\n    </CrupdateWidgetDialog>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport getVideoId from 'get-video-id';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport interface VimeoWidget extends BiolinkWidget {\n  type: WidgetType.Vimeo;\n  config: {\n    url: string;\n  };\n}\n\ninterface VimeoWidgetDialogProps {\n  biolink: Biolink;\n  widget?: VimeoWidget;\n}\nexport function VimeoWidgetDialog({biolink, widget}: VimeoWidgetDialogProps) {\n  const {trans} = useTrans();\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Vimeo}\n      widget={widget}\n      onSubmit={(values, form) => {\n        const vimeoId = getVideoId(values.url).id;\n        if (!vimeoId) {\n          form.setError('url', {\n            message: trans(message('Invalid vimeo url')),\n          });\n        } else {\n          return Promise.resolve(values);\n        }\n      }}\n    >\n      <FormTextField\n        required\n        autoFocus\n        placeholder=\"https://vimeo.com/1084537\"\n        name=\"url\"\n        type=\"url\"\n        label={<Trans message=\"Vimeo video url\" />}\n        description={<Trans message=\"Embed this vimeo video within biolink.\" />}\n      />\n    </CrupdateWidgetDialog>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {parse} from '@app/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-uri';\n\nexport interface SpotifyWidget extends BiolinkWidget {\n  type: WidgetType.Vimeo;\n  config: {\n    url: string;\n    type?: string;\n  };\n}\n\ninterface SpotifyWidgetDialogProps {\n  biolink: Biolink;\n  widget?: SpotifyWidget;\n}\nexport function SpotifyWidgetDialog({\n  biolink,\n  widget,\n}: SpotifyWidgetDialogProps) {\n  const {trans} = useTrans();\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Spotify}\n      widget={widget}\n      onSubmit={(values, form) => {\n        const spotifyInfo = parse(values.url);\n        if (!('id' in spotifyInfo)) {\n          form.setError('url', {\n            message: trans(message('Invalid spotify url')),\n          });\n        } else {\n          return Promise.resolve({\n            ...values,\n            type: spotifyInfo.type,\n          });\n        }\n      }}\n    >\n      <FormTextField\n        required\n        autoFocus\n        placeholder=\"https://open.spotify.com/track/2sqfLwGKXDw1nGjFhH3GGX?si=f329040f45804ec5\"\n        name=\"url\"\n        type=\"url\"\n        label={<Trans message=\"Spotify share url\" />}\n        description={\n          <Trans message=\"Any share url from spotify can be used, including artist, album, track, playlist etc.\" />\n        }\n      />\n    </CrupdateWidgetDialog>\n  );\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {CrupdateWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/crupdate-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\nexport interface TiktokWidget extends BiolinkWidget {\n  type: WidgetType.Vimeo;\n  config: {\n    url: string;\n  };\n}\n\ninterface TiktokWidgetDialogProps {\n  biolink: Biolink;\n  widget?: TiktokWidget;\n}\nexport function TiktokWidgetDialog({biolink, widget}: TiktokWidgetDialogProps) {\n  const {trans} = useTrans();\n  return (\n    <CrupdateWidgetDialog\n      biolink={biolink}\n      type={WidgetType.Tiktok}\n      widget={widget}\n      onSubmit={(values, form) => {\n        if (!values.url.includes('tiktok.com/')) {\n          form.setError('url', {\n            message: trans(message('Invalid tiktok url')),\n          });\n        } else {\n          return Promise.resolve(values);\n        }\n      }}\n    >\n      <FormTextField\n        required\n        autoFocus\n        placeholder=\"https://www.tiktok.com/@bts_official_bighit/video/6964945720885464322\"\n        name=\"url\"\n        type=\"url\"\n        label={<Trans message=\"Tiktok url\" />}\n        description={\n          <Trans message=\"Embed this tiktok video within biolink.\" />\n        }\n      />\n    </CrupdateWidgetDialog>\n  );\n}\n","import {ImageWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/image-widget/image-widget-dialog';\nimport {JSXElementConstructor} from 'react';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\nimport imageThumbnail from './widget-selector/widget-images/image.png';\nimport textImage from './widget-selector/widget-images/text.png';\nimport socialsImage from './widget-selector/widget-images/socials.png';\nimport youtubeImage from './widget-selector/widget-images/youtube.png';\nimport soundcloudImage from './widget-selector/widget-images/soundcloud.png';\nimport vimeoImage from './widget-selector/widget-images/vimeo.jpeg';\nimport spotifyImage from './widget-selector/widget-images/spotify.png';\nimport twitchImage from './widget-selector/widget-images/twitch.svg';\nimport tiktokImage from './widget-selector/widget-images/tiktok.png';\nimport {WidgetDialogProps} from '@app/dashboard/biolink/biolink-editor/content/widgets/types/widget-dialog-props';\nimport {YoutubeWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/youtube-widget/youtube-widget-dialog';\nimport {TextWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/text-widget/text-widget-dialog';\nimport {SocialsWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/socials-widget/socials-widget-dialog';\nimport {TwitchWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/twitch-widget/twitch-widget-dialog';\nimport {SoundcloudWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/soundcloud-widget/soundcloud-widget-dialog';\nimport {VimeoWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/vimeo-widget/vimeo-widget-dialog';\nimport {SpotifyWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/spotify-widget/spotify-widget-dialog';\nimport {TiktokWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/tiktok-widget/tiktok-widget-dialog';\n\nexport interface WidgetListItem {\n  name: MessageDescriptor;\n  description: MessageDescriptor;\n  image?: string;\n  dialog: JSXElementConstructor<WidgetDialogProps<any>>;\n}\n\nexport 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\nexport const WidgetList: Record<WidgetType, WidgetListItem> = {\n  [WidgetType.Image]: {\n    name: message('Image'),\n    image: imageThumbnail,\n    description: message(\n      'Upload an image and optionally add a link it will redirect to when clicked.'\n    ),\n    dialog: ImageWidgetDialog,\n  },\n  [WidgetType.Text]: {\n    name: message('Text'),\n    image: textImage,\n    description: message(\n      'Add title and optional description. Can be used as a header for the whole biolink or a group of multiple widgets.'\n    ),\n    dialog: TextWidgetDialog,\n  },\n  [WidgetType.Socials]: {\n    name: message('Social Links'),\n    image: socialsImage,\n    description: message(\n      'Add your socials links to display them as icon buttons.'\n    ),\n    dialog: SocialsWidgetDialog,\n  },\n  [WidgetType.Youtube]: {\n    name: message('Youtube Video'),\n    image: youtubeImage,\n    description: message(\n      'Paste a YouTube video URL to show it as a video embed in your profile.'\n    ),\n    dialog: YoutubeWidgetDialog,\n  },\n  [WidgetType.Soundcloud]: {\n    name: message('Soundcloud Audio'),\n    image: soundcloudImage,\n    description: message(\n      'Paste a SoundCloud URL to show it as a playable song in your profile.'\n    ),\n    dialog: SoundcloudWidgetDialog,\n  },\n  [WidgetType.Vimeo]: {\n    name: message('Vimeo Video'),\n    image: vimeoImage,\n    description: message(\n      'Paste a vimeo URL to show it as a video embed in your profile.'\n    ),\n    dialog: VimeoWidgetDialog,\n  },\n  [WidgetType.Spotify]: {\n    name: message('Spotify Embed'),\n    image: spotifyImage,\n    description: message(\n      'Paste a spotify song, album, artist, playlist, podcast or episode url to show it as an embed in your profile.'\n    ),\n    dialog: SpotifyWidgetDialog,\n  },\n  [WidgetType.Twitch]: {\n    name: message('Twitch Embed'),\n    image: twitchImage,\n    description: message(\n      'Paste twitch profile or clip url to show it as an embed in your profile.'\n    ),\n    dialog: TwitchWidgetDialog,\n  },\n  [WidgetType.Tiktok]: {\n    name: message('TikTok Embed'),\n    image: tiktokImage,\n    description: message(\n      'Paste TikTok video url to show it as an embed in your profile.'\n    ),\n    dialog: TiktokWidgetDialog,\n  },\n};\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\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 {WidgetList} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\nexport function SelectWidgetDialog() {\n  const {close} = useDialogContext();\n  return (\n    <Dialog size=\"xl\">\n      <DialogHeader titleTextSize=\"text-md\" padding=\"px-24 pt-14 pb-4\">\n        <Trans message=\"Add widget\" />\n      </DialogHeader>\n      <DialogBody padding=\"p-24\">\n        <div className=\"grid gap-14 grid-cols-1 md:grid-cols-2 lg:grid-cols-3\">\n          {Object.entries(WidgetList).map(([widgetType, widget]) => (\n            <div\n              key={widgetType}\n              className=\"bg-paper border rounded p-14 shadow cursor-pointer hover:bg-primary/hover\"\n              role=\"button\"\n              tabIndex={0}\n              onClick={() => {\n                close(widgetType);\n              }}\n            >\n              <img\n                src={widget.image}\n                alt=\"\"\n                className=\"block w-54 h-54 mb-20 mr-auto\"\n              />\n              <div className=\"text-primary text-lg font-semibold whitespace-nowrap overflow-hidden overflow-ellipsis\">\n                <Trans {...widget.name} />\n              </div>\n              <div className=\"text-muted\">\n                <Trans {...widget.description} />\n              </div>\n            </div>\n          ))}\n        </div>\n      </DialogBody>\n    </Dialog>\n  );\n}\n","import {\n  WidgetList,\n  WidgetType,\n} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\n\ninterface WidgetDialogContainerProps {\n  biolink: Biolink;\n  activeWidget: WidgetType | null;\n  onOpenChange: (isOpen: boolean) => void;\n}\nexport function NewWidgetDialogContainer({\n  activeWidget,\n  biolink,\n  onOpenChange,\n}: WidgetDialogContainerProps) {\n  const Dialog = activeWidget ? WidgetList[activeWidget].dialog : null;\n  return (\n    <DialogTrigger\n      type=\"modal\"\n      isOpen={activeWidget != null}\n      onOpenChange={onOpenChange}\n    >\n      {Dialog && <Dialog biolink={biolink} />}\n    </DialogTrigger>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowUpwardIcon = createSvgIcon(\n  <path d=\"m4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n, 'ArrowUpwardOutlined');\n","import {Biolink, BiolinkWidget} from '@app/dashboard/biolink/biolink';\nimport {WidgetList} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {Trans} from '@common/i18n/trans';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {BiolinkContentItemLayout} from '@app/dashboard/biolink/biolink-editor/content/biolink-content-item-layout';\nimport {useUpdateBiolinkContentItem} from '@app/dashboard/biolink/biolink-editor/requests/use-update-biolink-content-item';\nimport {Button} from '@common/ui/buttons/button';\nimport {ArrowUpwardIcon} from '@common/icons/material/ArrowUpward';\nimport {useSortBiolinkContent} from '@app/dashboard/biolink/biolink-editor/requests/use-sort-biolink-content';\nimport {biolinkEditorState} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {ArrowDownwardIcon} from '@common/icons/material/ArrowDownward';\nimport {WidgetRenderers} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-renderers';\n\ninterface WidgetContentItemProps {\n  item: BiolinkWidget;\n  biolink: Biolink;\n}\nexport function WidgetContentItem({\n  item: widget,\n  biolink,\n}: WidgetContentItemProps) {\n  const config = WidgetList[widget.type];\n  const WidgetRenderer = WidgetRenderers[widget.type];\n  const WidgetDialog = config.dialog;\n\n  return (\n    <BiolinkContentItemLayout\n      biolink={biolink}\n      item={widget}\n      title={<Trans {...config.name} />}\n      updateDialog={<WidgetDialog widget={widget} biolink={biolink} />}\n      actionRow={<ActionRow widget={widget} />}\n    >\n      <WidgetRenderer widget={widget} variant=\"editor\" />\n    </BiolinkContentItemLayout>\n  );\n}\n\ninterface ActionRowProps {\n  widget: BiolinkWidget;\n}\nfunction ActionRow({widget}: ActionRowProps) {\n  const updateItem = useUpdateBiolinkContentItem();\n  const sortContent = useSortBiolinkContent();\n\n  const handlePinToTop = () => {\n    const biolink = biolinkEditorState().biolink;\n    if (!biolink) return;\n\n    const pinnedCount = biolink.content.filter(x => x.pinned === 'top').length;\n\n    if (!widget.pinned) {\n      const oldIndex = biolink.content.findIndex(\n        x => x.model_type === widget.model_type && x.id === widget.id,\n      );\n      sortContent.mutate({\n        oldIndex,\n        // pinned widget after any other widgets that are already pinned to top\n        newIndex: pinnedCount,\n        widgetToPin: widget.id,\n      });\n    } else {\n      updateItem.mutate({item: widget, values: {pinned: null}});\n    }\n  };\n\n  return (\n    <div className=\"flex items-center gap-24 justify-between text-muted h-42\">\n      <Switch\n        checked={widget.active}\n        disabled={updateItem.isPending}\n        onChange={() => {\n          updateItem.mutate({\n            item: widget,\n            values: {\n              active: !widget.active,\n            },\n          });\n        }}\n      />\n      <Button\n        variant=\"outline\"\n        size=\"2xs\"\n        radius=\"rounded-full\"\n        color={widget.pinned === 'top' ? 'primary' : undefined}\n        startIcon={\n          widget.pinned === 'top' ? <ArrowDownwardIcon /> : <ArrowUpwardIcon />\n        }\n        disabled={sortContent.isPending}\n        onClick={handlePinToTop || updateItem.isPending}\n      >\n        {widget.pinned === 'top' ? (\n          <Trans message=\"Unpin from top\" />\n        ) : (\n          <Trans message=\"Pin to top\" />\n        )}\n      </Button>\n    </div>\n  );\n}\n","import {ReactNode} from 'react';\nimport {BiolinkLayout} from '@app/short-links/renderers/biolink-renderer/biolink-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {useBiolinkEditorStore} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {useIsTabletMediaQuery} from '@common/utils/hooks/is-tablet-media-query';\nimport {useEditorBiolink} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\n\nexport function LivePreview() {\n  const {biolink} = useEditorBiolink();\n  const appearance = useBiolinkEditorStore(s => s.appearance);\n  const isTablet = useIsTabletMediaQuery();\n\n  if (isTablet) {\n    return null;\n  }\n\n  return (\n    <div className=\"flex-shrink-0 sticky top-24 h-max\">\n      <Chip\n        size=\"sm\"\n        color=\"positive\"\n        radius=\"rounded\"\n        className=\"w-max m-auto mb-24\"\n      >\n        <Trans message=\"Live preview\" />\n      </Chip>\n      <PhoneSkeleton>\n        {biolink ? (\n          <BiolinkLayout biolink={biolink} appearance={appearance} />\n        ) : null}\n      </PhoneSkeleton>\n      <div className=\"text-sm text-muted text-center mt-14\">\n        <Trans message=\"Scheduled and disabled content is not shown\" />\n      </div>\n    </div>\n  );\n}\n\ninterface PhoneSkeletonProps {\n  children: ReactNode;\n}\nfunction PhoneSkeleton({children}: PhoneSkeletonProps) {\n  return (\n    <div className=\"w-350 h-[724px] rounded-[64px] shadow-lg border border-[#444546] border-[12px] overflow-hidden\">\n      <div className=\"overflow-y-auto h-full compact-scrollbar\">{children}</div>\n    </div>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatColorFillIcon = createSvgIcon(\n  <path d=\"M16.56 8.94 7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10 10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5zM2 20h20v4H2v-4z\" />\n, 'FormatColorFillOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const GradientIcon = createSvgIcon(\n  <path d=\"M11 9h2v2h-2V9zm-2 2h2v2H9v-2zm4 0h2v2h-2v-2zm2-2h2v2h-2V9zM7 9h2v2H7V9zm12-6H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 18H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2H9v-2H7v2H5v-2h2v-2H5V5h14v6z\" />\n, 'GradientOutlined');\n","import clsx from 'clsx';\nimport {ComponentProps, forwardRef, ReactNode} from 'react';\n\ninterface BackgroundSelectorButtonProps extends ComponentProps<'button'> {\n  isActive?: boolean;\n  children?: ReactNode;\n  label: ReactNode;\n}\nexport const BackgroundSelectorButton = forwardRef<\n  HTMLButtonElement,\n  BackgroundSelectorButtonProps\n>(({isActive, children, className, style, label, ...buttonProps}, ref) => {\n  return (\n    <button type=\"button\" {...buttonProps} ref={ref}>\n      <span\n        className={clsx(\n          'flex aspect-square items-center justify-center overflow-hidden rounded-panel border border-[#c3cbdc] outline-none focus-visible:ring',\n          isActive && 'ring-2 ring-primary ring-offset-2',\n          className,\n        )}\n        style={style}\n      >\n        {children}\n      </span>\n      <span className=\"mt-10 block overflow-hidden overflow-ellipsis text-xs\">\n        {label}\n      </span>\n    </button>\n  );\n});\n","import {ColorPresets} from '@common/ui/color-picker/color-presets';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nexport interface ColorBackground {\n  type: 'color';\n  id: string;\n  backgroundColor?: string;\n  color?: string;\n  label: MessageDescriptor;\n}\nexport const BaseColorBg: ColorBackground = {\n  type: 'color',\n  id: 'c-custom',\n  label: message('Custom color'),\n};\n\nexport const ColorBackgrounds: ColorBackground[] = ColorPresets.map(\n  (preset, index) => {\n    return {\n      ...BaseColorBg,\n      id: `c${index}`,\n      backgroundColor: preset.color,\n      label: preset.name,\n      color: preset.foreground,\n    };\n  }\n);\n","import {Trans} from '@common/i18n/trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {BackgroundSelectorButton} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector-button';\nimport {FormatColorFillIcon} from '@common/icons/material/FormatColorFill';\nimport {BgSelectorTabProps} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport {\n  BaseColorBg,\n  ColorBackground,\n  ColorBackgrounds,\n} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/color-backgrounds';\n\nexport function ColorBackgroundTab({\n  value,\n  onChange,\n  className,\n}: BgSelectorTabProps<ColorBackground>) {\n  return (\n    <div className={className}>\n      <CustomColorButton value={value} onChange={onChange} />\n      {ColorBackgrounds.map(background => (\n        <BackgroundSelectorButton\n          key={background.id}\n          label={<Trans {...background.label} />}\n          isActive={value?.id === background.id}\n          style={{backgroundColor: background.backgroundColor}}\n          onClick={() => {\n            onChange?.({\n              ...BaseColorBg,\n              ...background,\n            });\n          }}\n        />\n      ))}\n    </div>\n  );\n}\n\nfunction CustomColorButton({\n  value,\n  onChange,\n}: BgSelectorTabProps<ColorBackground>) {\n  const isCustomColor = value?.id === BaseColorBg.id;\n  return (\n    <DialogTrigger\n      currentValue={value}\n      type=\"popover\"\n      onClose={(newValue: ColorBackground | string) => {\n        // apply color or revert to original\n        onChange?.(\n          typeof newValue === 'string'\n            ? {...BaseColorBg, backgroundColor: newValue}\n            : newValue\n        );\n      }}\n    >\n      <BackgroundSelectorButton\n        label={<Trans {...BaseColorBg.label} />}\n        className=\"border-dashed border-2\"\n        style={{\n          backgroundColor: isCustomColor ? value?.backgroundColor : undefined,\n        }}\n      >\n        <span className=\"inline-block text-white bg-black/20 rounded p-10\">\n          <FormatColorFillIcon size=\"lg\" />\n        </span>\n      </BackgroundSelectorButton>\n      <ColorPickerDialog\n        defaultValue={value?.backgroundColor}\n        onChange={newColor => {\n          // set color on color picker interaction\n          onChange?.({\n            ...BaseColorBg,\n            backgroundColor: newColor,\n          });\n        }}\n      />\n    </DialogTrigger>\n  );\n}\n","import {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport interface GradientBackground {\n  type: 'gradient';\n  id: string;\n  backgroundImage?: string;\n  color?: string;\n  label: MessageDescriptor;\n}\nexport const BaseGradientBg: GradientBackground = {\n  type: 'gradient',\n  id: 'g-custom',\n  label: message('Custom gradient'),\n};\n\nexport const GradientBackgrounds: GradientBackground[] = [\n  {\n    ...BaseGradientBg,\n    ...BaseGradientBg,\n    id: 'g1',\n    backgroundImage: 'linear-gradient(45deg, #ff9a9e, #fad0c4)',\n    label: message('Worm flame'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g2',\n    backgroundImage: 'linear-gradient(0deg, #a18cd1, #fbc2eb)',\n    label: message('Night fade'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g3',\n    backgroundImage: 'linear-gradient(120deg, #a1c4fd, #c2e9fb)',\n    label: message('Winter nova'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g4',\n    backgroundImage: 'linear-gradient(0deg, #cfd9df, #e2ebf0)',\n    label: message('Heavy rain'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g5',\n    backgroundImage: 'linear-gradient(120deg, #fdfbfb, #ebedee)',\n    label: message('Cloudy knoxville'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g6',\n    backgroundImage: 'linear-gradient(0deg, #a8edea, #fed6e3)',\n    label: message('Rare wind'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g7',\n    backgroundImage: 'linear-gradient(135deg, #f5f7fa, #c3cfe2)',\n    label: message('Saint petersburg'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g8',\n    backgroundImage: 'linear-gradient(135deg, #fdfcfb, #e2d1c3)',\n    label: message('Everlasting sky'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g9',\n    backgroundImage: 'linear-gradient(0deg, #c1dfc4, #deecdd)',\n    label: message('Soft grass'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g10',\n    backgroundImage: 'linear-gradient(90deg, #E9E4F0, #D3CCE3)',\n    label: message('Delicate'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g11',\n    backgroundImage: 'linear-gradient(90deg, #fffcdc, #d9a7c7)',\n    label: message('Broken hearts'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g12',\n    backgroundImage: 'linear-gradient(90deg, #56ab2f, #a8e063)',\n    label: message('Lush'),\n    color: 'rgb(255, 255, 255)',\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g13',\n    backgroundImage: 'linear-gradient(90deg, #606c88, #3f4c6b)',\n    label: message('Ash'),\n    color: 'rgb(255, 255, 255)',\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g14',\n    backgroundImage: 'linear-gradient(90deg, #ece9e6, #ffffff)',\n    label: message('Clouds'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g15',\n    backgroundImage: 'linear-gradient(90deg, #f09819, #edde5d)',\n    label: message('Mango pulp'),\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g16',\n    backgroundImage: 'linear-gradient(90deg, #b79891, #94716b)',\n    label: message('Cooper'),\n    color: 'rgb(255, 255, 255)',\n  },\n  {\n    ...BaseGradientBg,\n    id: 'g17',\n    backgroundImage: 'linear-gradient(60deg, #29323c, #485563)',\n    label: message('Vicious stance'),\n    color: 'rgb(255, 255, 255)',\n  },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowForwardIcon = createSvgIcon(\n  <path d=\"m12 4-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z\" />\n, 'ArrowForwardOutlined');\n","import {Trans} from '@common/i18n/trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {BackgroundSelectorButton} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector-button';\nimport {\n  BaseGradientBg,\n  GradientBackground,\n  GradientBackgrounds,\n} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/gradient-backgrounds';\nimport {GradientIcon} from '@common/icons/material/Gradient';\nimport {BgSelectorTabProps} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {useCallback, useState} from 'react';\nimport clsx from 'clsx';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ArrowDownwardIcon} from '@common/icons/material/ArrowDownward';\nimport {ArrowForwardIcon} from '@common/icons/material/ArrowForward';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {ArrowUpwardIcon} from '@common/icons/material/ArrowUpward';\n\nexport function GradientBackgroundTab({\n  value,\n  onChange,\n  className,\n}: BgSelectorTabProps<GradientBackground>) {\n  return (\n    <div className={className}>\n      <CustomGradientButton value={value} onChange={onChange} />\n      {GradientBackgrounds.map(gradient => (\n        <BackgroundSelectorButton\n          key={gradient.backgroundImage}\n          label={gradient.label && <Trans {...gradient.label} />}\n          isActive={value?.id === gradient.id}\n          style={{backgroundImage: gradient.backgroundImage}}\n          onClick={() => {\n            onChange?.({\n              ...BaseGradientBg,\n              ...gradient,\n            });\n          }}\n        />\n      ))}\n    </div>\n  );\n}\n\nfunction CustomGradientButton({\n  value,\n  onChange,\n}: BgSelectorTabProps<GradientBackground>) {\n  const isCustomGradient = value?.id === BaseGradientBg.id;\n  return (\n    <DialogTrigger\n      type=\"popover\"\n      currentValue={value}\n      onOpenChange={isOpen => {\n        // on dialog open set default gradient as active, if no other gradient is selected\n        if (isOpen && !value) {\n          onChange?.(GradientBackgrounds[0]);\n        }\n      }}\n      onClose={gradient => {\n        // apply gradient or revert to original\n        onChange?.(gradient);\n      }}\n    >\n      <BackgroundSelectorButton\n        label={<Trans {...BaseGradientBg.label} />}\n        className=\"border-2 border-dashed\"\n        style={{\n          backgroundImage: isCustomGradient\n            ? value?.backgroundImage\n            : undefined,\n        }}\n      >\n        <span className=\"inline-block rounded bg-black/20 p-10 text-white\">\n          <GradientIcon size=\"lg\" />\n        </span>\n      </BackgroundSelectorButton>\n      <CustomGradientDialog\n        defaultValue={value}\n        onChange={newValue => {\n          onChange?.(newValue);\n        }}\n      />\n    </DialogTrigger>\n  );\n}\n\ninterface CustomGradientState {\n  colorOne: string;\n  colorTwo: string;\n  angle: string;\n}\ninterface CustomGradientDialogProps {\n  defaultValue?: GradientBackground;\n  onChange: (value: GradientBackground) => void;\n}\nfunction CustomGradientDialog({\n  defaultValue = GradientBackgrounds[0],\n  onChange,\n}: CustomGradientDialogProps) {\n  const {close} = useDialogContext();\n  const [state, setLocalState] = useState<CustomGradientState>(() => {\n    const parts =\n      defaultValue?.backgroundImage?.match(/\\(([0-9]+deg),.?(.+?),.?(.+?)\\)/) ||\n      [];\n    return {\n      angle: parts[1] || '45deg',\n      colorOne: parts[2] || '#ff9a9e',\n      colorTwo: parts[3] || '#fad0c4',\n    };\n  });\n\n  const buildGradientBackground = (s: CustomGradientState) => {\n    return {\n      ...BaseGradientBg,\n      backgroundImage: `linear-gradient(${s.angle}, ${s.colorOne}, ${s.colorTwo})`,\n    };\n  };\n\n  const setState = useCallback(\n    (newValues: Partial<CustomGradientState>) => {\n      const newState = {\n        ...state,\n        ...newValues,\n      };\n      setLocalState(newState);\n      onChange(buildGradientBackground(newState));\n    },\n    [state, onChange],\n  );\n\n  return (\n    <Dialog size=\"sm\">\n      <DialogHeader>\n        <Trans message=\"Custom gradient\" />\n      </DialogHeader>\n      <DialogBody>\n        <div className=\"mb-6\">\n          <Trans message=\"Colors\" />\n        </div>\n        <div className=\"mb-20 flex h-40 items-stretch\">\n          <ColorPickerButton\n            className=\"rounded-input\"\n            value={state.colorOne}\n            onChange={value => setState({colorOne: value})}\n          />\n          <div\n            className=\"flex-auto border-y border-[#c3cbdc]\"\n            style={{\n              backgroundImage: buildGradientBackground(state).backgroundImage,\n            }}\n          />\n          <ColorPickerButton\n            className=\"rounded-r-input\"\n            value={state.colorTwo}\n            onChange={value => setState({colorTwo: value})}\n          />\n        </div>\n        <div className=\"mb-6\">\n          <Trans message=\"Direction\" />\n        </div>\n        <DirectionButtons\n          value={state.angle}\n          onChange={value => setState({angle: value})}\n        />\n      </DialogBody>\n      <DialogFooter dividerTop>\n        <Button onClick={() => close()}>\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          onClick={() => {\n            close(buildGradientBackground(state));\n          }}\n        >\n          <Trans message=\"Apply\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n\ninterface ColorPickerButtonProps {\n  className: string;\n  value: string;\n  onChange: (value: string) => void;\n}\nfunction ColorPickerButton({\n  className,\n  value,\n  onChange,\n}: ColorPickerButtonProps) {\n  return (\n    <DialogTrigger type=\"popover\">\n      <Tooltip label={<Trans message=\"Click to change color\" />}>\n        <button\n          type=\"button\"\n          className={clsx(\n            'w-40 flex-shrink-0 border border-[#c3cbdc]',\n            className,\n          )}\n          style={{backgroundColor: value}}\n        />\n      </Tooltip>\n      <ColorPickerDialog defaultValue={value} onChange={onChange} hideFooter />\n    </DialogTrigger>\n  );\n}\n\ninterface DirectionButtonsProps {\n  value: string;\n  onChange: (value: string) => void;\n}\nfunction DirectionButtons({value, onChange}: DirectionButtonsProps) {\n  const activeStyle = 'text-primary border-primary';\n  return (\n    <div className=\"flex flex-wrap items-center gap-8 text-muted\">\n      <IconButton\n        variant=\"outline\"\n        className={value === '0deg' ? activeStyle : undefined}\n        onClick={() => onChange('0deg')}\n      >\n        <ArrowUpwardIcon />\n      </IconButton>\n      <IconButton\n        variant=\"outline\"\n        className={value === '180deg' ? activeStyle : undefined}\n        onClick={() => onChange('180deg')}\n      >\n        <ArrowDownwardIcon />\n      </IconButton>\n      <IconButton\n        variant=\"outline\"\n        className={value === '90deg' ? activeStyle : undefined}\n        onClick={() => onChange('90deg')}\n      >\n        <ArrowForwardIcon />\n      </IconButton>\n      <IconButton\n        variant=\"outline\"\n        className={value === '135deg' ? activeStyle : undefined}\n        onClick={() => onChange('135deg')}\n      >\n        <ArrowDownwardIcon className=\"-rotate-45\" />\n      </IconButton>\n      <IconButton\n        variant=\"outline\"\n        className={value === '225deg' ? activeStyle : undefined}\n        onClick={() => onChange('225deg')}\n      >\n        <ArrowDownwardIcon className=\"rotate-45\" />\n      </IconButton>\n      <IconButton\n        variant=\"outline\"\n        className={value === '45deg' ? activeStyle : undefined}\n        onClick={() => onChange('45deg')}\n      >\n        <ArrowUpwardIcon className=\"rotate-45\" />\n      </IconButton>\n      <IconButton\n        variant=\"outline\"\n        className={value === '325deg' ? activeStyle : undefined}\n        onClick={() => onChange('325deg')}\n      >\n        <ArrowUpwardIcon className=\"-rotate-45\" />\n      </IconButton>\n    </div>\n  );\n}\n","export default \"__VITE_ASSET__8bc67d0f__\"","export default \"__VITE_ASSET__41b0e93f__\"","export default \"__VITE_ASSET__b1b6f181__\"","export default \"__VITE_ASSET__4a88b941__\"","export default \"__VITE_ASSET__f6e1169b__\"","export default \"__VITE_ASSET__3293a920__\"","export default \"__VITE_ASSET__6535cdc4__\"","export default \"__VITE_ASSET__f278b47e__\"","export default \"__VITE_ASSET__bcc1c32b__\"","export default \"__VITE_ASSET__2880686e__\"","export default \"__VITE_ASSET__064759e5__\"","export default \"__VITE_ASSET__75287c80__\"","export default \"__VITE_ASSET__de4884cd__\"","export default \"__VITE_ASSET__f68020ea__\"","export default \"__VITE_ASSET__92c4c0e5__\"","export default \"__VITE_ASSET__dfa556bd__\"","export default \"__VITE_ASSET__1fa4c498__\"","import angledFocus from './svg-bgs/Angled-Focus.svg';\nimport circularFocus from './svg-bgs/Circular-Focus.svg';\nimport farseeingEyeball from './svg-bgs/Farseeing-Eyeball.svg';\nimport canyonFunnel from './svg-bgs/Canyon-Funnel.svg';\nimport looneyLoops from './svg-bgs/Looney-Loops.svg';\nimport hurricaneAperture from './svg-bgs/Hurricane-Aperture.svg';\nimport icyExplosion from './svg-bgs/Icy-Explosion.svg';\nimport protrudingSquares from './svg-bgs/Protruding-Squares.svg';\nimport alternatingTriangles from './svg-bgs/Alternating-Triangles.svg';\nimport monsteraPatch from './svg-bgs/Monstera-Patch.svg';\nimport confettiDoodles from './svg-bgs/Confetti-Doodles.svg';\nimport threadsAhead from './svg-bgs/Threads-Ahead.svg';\nimport launchDay from './svg-bgs/Launch-Day.svg';\nimport sprinkle from './svg-bgs/Sprinkle.svg';\nimport circuitBoard from './svg-bgs/Circuit-Board.svg';\nimport nuclearFocalPoint from './svg-bgs/nuclear-focalpoint.svg';\nimport snow from './svg-bgs/Snow.svg';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nexport interface ImageBackground {\n  type: 'image';\n  id: string;\n  backgroundColor?: string;\n  backgroundAttachment?: string;\n  backgroundSize?: string;\n  backgroundRepeat?: string;\n  backgroundPosition?: string;\n  backgroundImage?: string;\n  color?: string;\n  label: MessageDescriptor;\n}\nexport const BaseImageBg: ImageBackground = {\n  type: 'image',\n  id: 'i-custom',\n  label: message('Custom image'),\n};\n\nexport const ImageBackgrounds: ImageBackground[] = [\n  {\n    ...BaseImageBg,\n    id: 'img0',\n    backgroundColor: '#ee5522',\n    backgroundImage: `url(${protrudingSquares})`,\n    backgroundRepeat: 'repeat',\n    label: message('Protruding squares'),\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img1',\n    backgroundColor: '#00bbff',\n    backgroundImage: `url(${launchDay})`,\n    label: message('Launch day'),\n    backgroundSize: 'contain',\n    backgroundPosition: 'bottom',\n    backgroundRepeat: 'no-repeat',\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img2',\n    backgroundColor: '#fff',\n    backgroundImage: `url(${alternatingTriangles})`,\n    label: message('Alternating triangles'),\n    color: '#000',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img3',\n    backgroundColor: '#002200',\n    backgroundImage: `url(${monsteraPatch})`,\n    label: message('Monstera patch'),\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img4',\n    backgroundColor: '#aa3333',\n    backgroundImage: `url(${confettiDoodles})`,\n    label: message('Confetti doodles'),\n    color: '#fff',\n    backgroundRepeat: 'repeat',\n    backgroundPosition: 'center center',\n    backgroundSize: 'contain',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img5',\n    backgroundColor: '#070014',\n    backgroundImage: `url(${hurricaneAperture})`,\n    label: message('Hurricane aperture'),\n    backgroundSize: 'cover',\n    backgroundRepeat: 'no-repeat',\n    backgroundPosition: 'center center',\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img6',\n    backgroundColor: '#11ddaa',\n    backgroundImage: `url(${looneyLoops})`,\n    label: message('Looney loops'),\n    backgroundPosition: 'center center',\n    backgroundSize: 'cover',\n    color: '#000',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img7',\n    backgroundColor: '#ccffff',\n    backgroundImage: `url(${icyExplosion})`,\n    label: message('Icy explosion'),\n    backgroundSize: 'cover',\n    backgroundRepeat: 'no-repeat',\n    backgroundPosition: 'center center',\n    color: '#000',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img8',\n    backgroundColor: '#442233',\n    backgroundImage: `url(${nuclearFocalPoint})`,\n    label: message('Nuclear point'),\n    backgroundSize: 'cover',\n    backgroundRepeat: 'no-repeat',\n    backgroundPosition: 'center center',\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img9',\n    backgroundColor: '#ffdd55',\n    backgroundImage: `url(${angledFocus})`,\n    label: message('Angled focus'),\n    backgroundPosition: 'center center',\n    backgroundSize: 'cover',\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img10',\n    backgroundColor: '#220044',\n    backgroundImage: `url(${circularFocus})`,\n    label: message('Circular focus'),\n    backgroundPosition: 'center center',\n    backgroundSize: 'cover',\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img11',\n    backgroundColor: '#000000',\n    backgroundImage: `url(${farseeingEyeball})`,\n    label: message('Farseeing eyeball'),\n    backgroundPosition: 'center center',\n    backgroundSize: 'cover',\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img12',\n    backgroundColor: '#ff0000',\n    backgroundImage: `url(${canyonFunnel})`,\n    label: message('Canyon funnel'),\n    backgroundPosition: 'center center',\n    backgroundSize: 'cover',\n    color: '#fff',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img13',\n    backgroundColor: '#ffdd99',\n    backgroundImage: `url(${threadsAhead})`,\n    label: message('Threads ahead'),\n    color: '#000',\n    backgroundRepeat: 'no-repeat',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img14',\n    backgroundImage: `url(${sprinkle})`,\n    label: message('Sprinkle'),\n    backgroundRepeat: 'repeat',\n    backgroundPosition: 'center center',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img15',\n    backgroundImage: `url(${circuitBoard})`,\n    label: message('Circuit board'),\n    backgroundRepeat: 'repeat',\n    backgroundPosition: 'center center',\n  },\n  {\n    ...BaseImageBg,\n    id: 'img16',\n    backgroundImage: `url(${snow})`,\n    label: message('Snow'),\n    backgroundRepeat: 'repeat',\n    backgroundPosition: 'center center',\n  },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UploadIcon = createSvgIcon(\n  <path d=\"M9 16h6v-6h4l-7-7-7 7h4v6zm3-10.17L14.17 8H13v6h-2V8H9.83L12 5.83zM5 18h14v2H5z\" />\n, 'UploadOutlined');\n","import {BgSelectorTabProps} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport {ImageBackground} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-backgrounds';\nimport {RadioGroup} from '@common/ui/forms/radio-group/radio-group';\nimport {Radio} from '@common/ui/forms/radio-group/radio';\nimport {Trans} from '@common/i18n/trans';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nconst BackgroundPositions: Record<\n  'cover' | 'contain' | 'repeat',\n  {\n    label: MessageDescriptor;\n    bgConfig: Partial<ImageBackground>;\n  }\n> = {\n  cover: {\n    label: message('Stretch to fit'),\n    bgConfig: {\n      backgroundRepeat: 'no-repeat',\n      backgroundSize: 'cover',\n    },\n  },\n  contain: {\n    label: message('Fit image'),\n    bgConfig: {\n      backgroundRepeat: 'no-repeat',\n      backgroundSize: 'contain',\n      backgroundPosition: 'center top',\n    },\n  },\n  repeat: {\n    label: message('Repeat image'),\n    bgConfig: {\n      backgroundRepeat: 'repeat',\n      backgroundSize: undefined,\n      backgroundPosition: 'left top',\n    },\n  },\n};\n\nexport function BackgroundPositionSelector({\n  value: imageBgValue,\n  onChange,\n}: Omit<BgSelectorTabProps<ImageBackground>, 'className'>) {\n  const selectedPosition = positionKeyFromValue(imageBgValue);\n  return (\n    <div className=\"border-t mt-20 pt-14\">\n      <RadioGroup size=\"sm\" disabled={!imageBgValue}>\n        {Object.entries(BackgroundPositions).map(([key, position]) => {\n          return (\n            <Radio\n              key={key}\n              name=\"background-position\"\n              value={key}\n              checked={key === selectedPosition}\n              onChange={e => {\n                if (imageBgValue) {\n                  onChange?.({\n                    ...imageBgValue,\n                    ...position.bgConfig,\n                  });\n                }\n              }}\n            >\n              <Trans {...position.label} />\n            </Radio>\n          );\n        })}\n      </RadioGroup>\n    </div>\n  );\n}\n\nfunction positionKeyFromValue(\n  value?: ImageBackground\n): keyof typeof BackgroundPositions {\n  if (value?.backgroundSize === 'cover') {\n    return 'cover';\n  } else if (value?.backgroundSize === 'contain') {\n    return 'contain';\n  } else {\n    return 'repeat';\n  }\n}\n","import {\n  BaseImageBg,\n  ImageBackground,\n  ImageBackgrounds,\n} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-backgrounds';\nimport {BackgroundSelectorButton} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector-button';\nimport {BgSelectorTabProps} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Trans} from '@common/i18n/trans';\nimport {UploadIcon} from '@common/icons/material/Upload';\nimport {useForm} from 'react-hook-form';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Form} from '@common/ui/forms/form';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {BackgroundPositionSelector} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-background-tab/background-position-selector';\nimport {cssPropsFromBgConfig} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/css-props-from-bg-config';\n\nexport function ImageBackgroundTab({\n  value,\n  onChange,\n  className,\n}: BgSelectorTabProps<ImageBackground>) {\n  return (\n    <div>\n      <div className={className}>\n        <CustomImageTrigger value={value} onChange={onChange} />\n        {ImageBackgrounds.map(background => (\n          <BackgroundSelectorButton\n            key={background.id}\n            onClick={() =>\n              onChange?.({\n                ...BaseImageBg,\n                ...background,\n              })\n            }\n            isActive={value?.id === background.id}\n            style={{\n              ...cssPropsFromBgConfig(background),\n              backgroundAttachment: 'initial',\n            }}\n            label={<Trans {...background.label} />}\n          />\n        ))}\n      </div>\n      <BackgroundPositionSelector value={value} onChange={onChange} />\n    </div>\n  );\n}\n\ninterface CustomImageTrigger {\n  value?: ImageBackground;\n  onChange?: (value: ImageBackground | null) => void;\n}\nfunction CustomImageTrigger({value, onChange}: CustomImageTrigger) {\n  // only seed form with custom uploaded image\n  value = value?.id === BaseImageBg.id ? value : undefined;\n  return (\n    <DialogTrigger\n      type=\"popover\"\n      onClose={(imageUrl?: string) => {\n        onChange?.(\n          imageUrl\n            ? {\n                ...BaseImageBg,\n                backgroundImage: `url(${imageUrl})`,\n              }\n            : null\n        );\n      }}\n    >\n      <BackgroundSelectorButton\n        label={<Trans {...BaseImageBg.label} />}\n        isActive={value?.id === BaseImageBg.id}\n        className=\"border-dashed border-2\"\n        style={cssPropsFromBgConfig(value)}\n      >\n        <span className=\"inline-block text-white bg-black/20 rounded p-10\">\n          <UploadIcon size=\"lg\" />\n        </span>\n      </BackgroundSelectorButton>\n      <CustomImageDialog value={value} />\n    </DialogTrigger>\n  );\n}\n\ninterface CustomImageDialogProps {\n  value?: ImageBackground;\n}\nexport function CustomImageDialog({value}: CustomImageDialogProps) {\n  const defaultValue = value?.backgroundImage\n    ?.replace('url(', '')\n    .replace(')', '');\n  const form = useForm<{imageUrl: string}>({\n    defaultValues: {imageUrl: defaultValue},\n  });\n  const {close, formId} = useDialogContext();\n  return (\n    <Dialog size=\"sm\">\n      <DialogHeader>\n        <Trans message=\"Upload image\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          id={formId}\n          form={form}\n          onSubmit={values => {\n            close(values.imageUrl);\n          }}\n        >\n          <FileUploadProvider>\n            <FormImageSelector\n              autoFocus\n              name=\"imageUrl\"\n              diskPrefix=\"biolinks\"\n              showRemoveButton\n            />\n          </FileUploadProvider>\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button variant=\"flat\" color=\"primary\" type=\"submit\" form={formId}>\n          <Trans message=\"Select\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","export const appearanceHeaderClassnames = {\n  h2: 'text-xl font-semibold mb-20',\n  h3: 'my-12 font-semibold',\n};\n","import clsx from 'clsx';\nimport {Trans} from '@common/i18n/trans';\nimport {ImageIcon} from '@common/icons/material/Image';\nimport {FormatColorFillIcon} from '@common/icons/material/FormatColorFill';\nimport {GradientIcon} from '@common/icons/material/Gradient';\nimport {ReactElement, ReactNode, useState} from 'react';\nimport {ColorBackgroundTab} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/color-background-tab';\nimport {GradientBackgroundTab} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/gradient-background-tab';\nimport {ImageBackgroundTab} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/image-background-tab/image-background-tab';\nimport {SelectedBackground} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/selected-background';\nimport {\n  biolinkEditorState,\n  useBiolinkEditorStore,\n} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {appearanceHeaderClassnames} from '@app/dashboard/biolink/biolink-editor/appearance/header-classnames';\n\nexport interface BgSelectorTabProps<T extends SelectedBackground> {\n  value?: T;\n  onChange?: (value: T | null) => void;\n  className?: string;\n}\n\nconst TabMap: Record<\n  'color' | 'gradient' | 'image',\n  (value: BgSelectorTabProps<any>) => ReactElement\n> = {\n  color: ColorBackgroundTab,\n  gradient: GradientBackgroundTab,\n  image: ImageBackgroundTab,\n};\ntype TabName = keyof typeof TabMap;\n\ninterface BackgroundSelectorProps {\n  className?: string;\n}\nexport function BackgroundSelector({className}: BackgroundSelectorProps) {\n  const value = useBiolinkEditorStore(s => s.appearance?.bgConfig);\n\n  const [activeTab, setActiveTab] = useState<TabName>(() => {\n    if (value?.type === 'color') return 'color';\n    if (value?.type === 'gradient') return 'gradient';\n    return 'color';\n  });\n\n  const Tab = TabMap[activeTab];\n\n  return (\n    <div className={className}>\n      <h2 className={appearanceHeaderClassnames.h2}>\n        <Trans message=\"Background\" />\n      </h2>\n      <TypeSelector activeTab={activeTab} onTabChange={setActiveTab} />\n      <Tab\n        value={activeTab === value?.type ? value : undefined}\n        onChange={newValue => {\n          biolinkEditorState().updateAppearance({bgConfig: newValue});\n        }}\n        className=\"grid grid-cols-[repeat(auto-fill,minmax(90px,1fr))] items-start gap-14\"\n      />\n    </div>\n  );\n}\n\ninterface TypeSelectorProps {\n  activeTab: TabName;\n  onTabChange: (tab: TabName) => void;\n}\nfunction TypeSelector({activeTab, onTabChange}: TypeSelectorProps) {\n  return (\n    <div className=\"my-20 flex items-center gap-20 border-b pb-20\">\n      <TypeButton\n        isActive={activeTab === 'color'}\n        icon={<FormatColorFillIcon />}\n        title={<Trans message=\"Flat color\" />}\n        onClick={() => {\n          onTabChange('color');\n        }}\n      />\n      <TypeButton\n        isActive={activeTab === 'gradient'}\n        icon={<GradientIcon />}\n        title={<Trans message=\"Gradient\" />}\n        onClick={() => {\n          onTabChange('gradient');\n        }}\n      />\n      <TypeButton\n        isActive={activeTab === 'image'}\n        icon={<ImageIcon />}\n        title={<Trans message=\"Image\" />}\n        onClick={() => {\n          onTabChange('image');\n        }}\n      />\n    </div>\n  );\n}\n\ninterface TypeButtonProps {\n  isActive: boolean;\n  icon: ReactNode;\n  title: ReactNode;\n  onClick?: () => void;\n}\nfunction TypeButton({isActive, icon, title, onClick}: TypeButtonProps) {\n  return (\n    <div role=\"button\" className=\"block\" onClick={onClick}>\n      <div\n        className={clsx(\n          'mx-auto mb-8 flex h-50 w-50 items-center justify-center rounded-panel border text-muted',\n          isActive && 'border-primary ring',\n        )}\n      >\n        {icon}\n      </div>\n      <div className=\"text-center text-sm text-primary\">{title}</div>\n    </div>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport {BiolinkBtnConfig} from '@app/dashboard/biolink/biolink';\nimport {Button} from '@common/ui/buttons/button';\nimport clsx from 'clsx';\nimport {message} from '@common/i18n/message';\nimport {ButtonVariant} from '@common/ui/buttons/get-shared-button-style';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {\n  biolinkEditorState,\n  useBiolinkEditorStore,\n} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport React, {useCallback} from 'react';\nimport {appearanceHeaderClassnames} from '@app/dashboard/biolink/biolink-editor/appearance/header-classnames';\n\nconst AvailableVariants: Record<\n  NonNullable<Exclude<ButtonVariant, 'text' | 'raised' | 'link'>>,\n  MessageDescriptor\n> = {\n  flat: message('Fill'),\n  outline: message('Outline'),\n} as const;\n\nconst AvailableRadius: Record<\n  NonNullable<BiolinkBtnConfig['radius']>,\n  MessageDescriptor\n> = {\n  'rounded-none': message('Square'),\n  rounded: message('Rounded'),\n  'rounded-full': message('Pill'),\n} as const;\n\ninterface ButtonStyleSelectorProps {\n  className?: string;\n}\nexport function ButtonStyleSelector({className}: ButtonStyleSelectorProps) {\n  const value = useBiolinkEditorStore(s => s.appearance?.btnConfig);\n\n  const setValue = useCallback(\n    (newValue: Partial<BiolinkBtnConfig>) => {\n      biolinkEditorState().updateAppearance({\n        btnConfig: {\n          ...value,\n          ...newValue,\n        },\n      });\n    },\n    [value],\n  );\n\n  return (\n    <div className={className}>\n      <h2 className={appearanceHeaderClassnames.h2}>\n        <Trans message=\"Buttons\" />\n      </h2>\n      <StyleSelector value={value} onChange={setValue} />\n      <ShadowSelector value={value} onChange={setValue} />\n    </div>\n  );\n}\n\ninterface StyleSelectorProps {\n  value?: BiolinkBtnConfig;\n  onChange: (newValue: BiolinkBtnConfig) => void;\n}\nfunction StyleSelector({value, onChange}: StyleSelectorProps) {\n  const selectedVariant = value?.variant ?? 'flat';\n  const selectedRadius = value?.radius ?? 'rounded';\n\n  return (\n    <div>\n      {Object.entries(AvailableVariants).map(([variant, variantLabel]) => (\n        <div key={variant}>\n          <h3 className={appearanceHeaderClassnames.h3}>\n            <Trans {...variantLabel} />\n          </h3>\n          <div className=\"grid grid-cols-2 gap-24 md:grid-cols-3\">\n            {Object.entries(AvailableRadius).map(([radius, radiusLabel]) => (\n              <div\n                key={radius}\n                className={clsx(\n                  'rounded',\n                  variant === selectedVariant &&\n                    selectedRadius === radius &&\n                    'ring ring-primary-light ring-offset-4',\n                )}\n              >\n                <Button\n                  variant={variant as ButtonVariant}\n                  color=\"primary\"\n                  radius={radius}\n                  className=\"w-full\"\n                  onClick={() => {\n                    onChange({\n                      variant: variant as ButtonVariant,\n                      radius: radius as BiolinkBtnConfig['radius'],\n                    });\n                  }}\n                >\n                  <Trans {...radiusLabel} />\n                </Button>\n              </div>\n            ))}\n          </div>\n        </div>\n      ))}\n    </div>\n  );\n}\n\nconst AvailableShadows: Record<string, MessageDescriptor> = {\n  'shadow-none': message('No shadow'),\n  'rgb(0 0 0 / 20%) 0.2rem 0.2rem 0.4rem 0px': message('Light shadow'),\n  'rgb(0 0 0 / 75%) 0.3rem 0.4rem 0px': message('Hard shadow'),\n} as const;\nfunction ShadowSelector({value, onChange}: StyleSelectorProps) {\n  const selectedShadow = value?.shadow ?? 'shadow-none';\n  return (\n    <div>\n      <h3 className=\"my-12 font-semibold\">\n        <Trans message=\"Shadow\" />\n      </h3>\n      <div className=\"flex gap-24\">\n        {Object.entries(AvailableShadows).map(([shadow, shadowLabel]) => (\n          <div\n            key={shadow}\n            style={{boxShadow: shadow}}\n            className=\"h-40 w-70 overflow-hidden rounded-button\"\n          >\n            <ButtonBase\n              display=\"block\"\n              radius=\"rounded-button\"\n              className={clsx(\n                'h-full w-full border',\n                selectedShadow === shadow && 'border-primary',\n              )}\n              onClick={() => {\n                onChange({\n                  shadow: shadow === 'shadow-none' ? undefined : shadow,\n                });\n              }}\n            >\n              <span className=\"sr-only\">\n                <Trans {...shadowLabel} />\n              </span>\n            </ButtonBase>\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n","export default \"__VITE_ASSET__03cbd387__\"","import {useTrans} from '@common/i18n/use-trans';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {message} from '@common/i18n/message';\nimport {Select} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {FontSelectorState} from '@common/ui/font-selector/font-selector-state';\n\nexport interface FontSelectorFilterValue {\n  query: string;\n  category: string;\n}\n\ninterface FiltersHeaderProps {\n  state: FontSelectorState;\n}\nexport function FontSelectorFilters({\n  state: {filters, setFilters},\n}: FiltersHeaderProps) {\n  const {trans} = useTrans();\n  return (\n    <div className=\"mb-24 items-center gap-24 @xs:flex\">\n      <TextField\n        className=\"mb-12 flex-auto @xs:mb-0\"\n        value={filters.query}\n        onChange={e => {\n          setFilters({\n            ...filters,\n            query: e.target.value,\n          });\n        }}\n        startAdornment={<SearchIcon />}\n        placeholder={trans(message('Search fonts'))}\n      />\n      <Select\n        className=\"flex-auto\"\n        selectionMode=\"single\"\n        selectedValue={filters.category}\n        onSelectionChange={value => {\n          setFilters({\n            ...filters,\n            category: value as string,\n          });\n        }}\n      >\n        <Item value=\"\">\n          <Trans message=\"All categories\" />\n        </Item>\n        <Item value=\"serif\">\n          <Trans message=\"Serif\" />\n        </Item>\n        <Item value=\"sans-serif\">\n          <Trans message=\"Sans serif\" />\n        </Item>\n        <Item value=\"display\">\n          <Trans message=\"Display\" />\n        </Item>\n        <Item value=\"handwriting\">\n          <Trans message=\"Handwriting\" />\n        </Item>\n        <Item value=\"monospace\">\n          <Trans message=\"Monospace\" />\n        </Item>\n      </Select>\n    </div>\n  );\n}\n","import {useCollator} from './use-collator';\n\ninterface Filter {\n  /** Returns whether a string starts with a given substring. */\n  startsWith(string: string, substring: string): boolean;\n  /** Returns whether a string ends with a given substring. */\n  endsWith(string: string, substring: string): boolean;\n  /** Returns whether a string contains a given substring. */\n  contains(string: string, substring: string): boolean;\n}\n\nexport function useFilter(options?: Intl.CollatorOptions): Filter {\n  const collator = useCollator({\n    usage: 'search',\n    ...options,\n  });\n\n  return {\n    startsWith(string, substring) {\n      if (substring.length === 0) {\n        return true;\n      }\n\n      string = string.normalize('NFC');\n      substring = substring.normalize('NFC');\n      return (\n        collator.compare(string.slice(0, substring.length), substring) === 0\n      );\n    },\n    endsWith(string, substring) {\n      if (substring.length === 0) {\n        return true;\n      }\n\n      string = string.normalize('NFC');\n      substring = substring.normalize('NFC');\n      return collator.compare(string.slice(-substring.length), substring) === 0;\n    },\n    contains(string, substring) {\n      if (substring.length === 0) {\n        return true;\n      }\n\n      string = string.normalize('NFC');\n      substring = substring.normalize('NFC');\n\n      let scan = 0;\n      const sliceLen = substring.length;\n      for (; scan + sliceLen <= string.length; scan++) {\n        const slice = string.slice(scan, scan + sliceLen);\n        if (collator.compare(substring, slice) === 0) {\n          return true;\n        }\n      }\n\n      return false;\n    },\n  };\n}\n","import {FontConfig} from '@common/http/value-lists';\nimport {message} from '@common/i18n/message';\n\nexport const BrowserSafeFonts: FontConfig[] = [\n  {\n    label: message('System'),\n    family:\n      'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"',\n    category: 'sans-serif',\n  },\n  {family: 'Impact, Charcoal, sans-serif', category: 'sans-serif'},\n  {family: 'Arial, Helvetica Neue, Helvetica, sans-serif', category: 'serif'},\n  {family: '\"Comic Sans MS\", cursive, sans-serif', category: 'Handwriting'},\n  {family: 'Century Gothic, sans-serif', category: 'sans-serif'},\n  {family: '\"Courier New\", Courier, monospace', category: 'monospace'},\n  {\n    family: '\"Lucida Sans Unicode\", \"Lucida Grande\", sans-serif',\n    category: 'sans-serif',\n  },\n  {family: '\"Times New Roman\", Times, serif', category: 'serif'},\n  {family: '\"Lucida Console\", Monaco, monospace', category: 'monospace'},\n  {family: '\"Andele Mono\", monospace, sans-serif', category: 'sans-serif'},\n  {family: 'Verdana, Geneva, sans-serif', category: 'sans-serif'},\n  {\n    family: '\"Helvetica Neue\", Helvetica, Arial, sans-serif',\n    category: 'sans-serif',\n  },\n];\n","import {useCallback, useEffect, useMemo, useState} from 'react';\nimport {FontSelectorFilterValue} from '@common/ui/font-selector/font-selector-filters';\nimport {FontConfig, useValueLists} from '@common/http/value-lists';\nimport {useFilter} from '@common/i18n/use-filter';\nimport {BrowserSafeFonts} from '@common/ui/font-picker/browser-safe-fonts';\nimport {chunkArray} from '@common/utils/array/chunk-array';\nimport {loadFonts} from '@common/ui/font-picker/load-fonts';\n\nexport interface FontSelectorState extends UseFontSelectorProps {\n  fonts: FontConfig[];\n  filteredFonts: FontConfig[];\n  pages: FontConfig[][];\n  isLoading: boolean;\n  filters: FontSelectorFilterValue;\n  setFilters: (filters: FontSelectorFilterValue) => void;\n  currentPage: number;\n  setCurrentPage: (page: number) => void;\n}\n\nexport interface UseFontSelectorProps {\n  value?: FontConfig;\n  onChange: (value: FontConfig) => void;\n}\nexport function useFontSelectorState({\n  value,\n  onChange,\n}: UseFontSelectorProps): FontSelectorState {\n  const {data, isLoading} = useValueLists(['googleFonts']);\n  const [currentPage, setCurrentPage] = useState(0);\n\n  const [filters, setFilterState] = useState<FontSelectorFilterValue>({\n    query: '',\n    category: value?.category ?? '',\n  });\n  const {contains} = useFilter({\n    sensitivity: 'base',\n  });\n\n  const setFilters = useCallback((filters: FontSelectorFilterValue) => {\n    setFilterState(filters);\n    // reset to first page when searching or changing category\n    setCurrentPage(0);\n  }, []);\n\n  const allFonts = useMemo(() => {\n    return BrowserSafeFonts.concat(data?.googleFonts ?? []);\n  }, [data?.googleFonts]);\n\n  const filteredFonts = useMemo(() => {\n    return allFonts.filter(font => {\n      return (\n        contains(font.family, filters.query) &&\n        (!filters.category ||\n          font.category?.toLowerCase() === filters.category.toLowerCase())\n      );\n    });\n  }, [allFonts, filters, contains]);\n\n  const pages = useMemo(() => {\n    return chunkArray(filteredFonts, 20);\n  }, [filteredFonts]);\n  const fonts = pages[currentPage];\n\n  useEffect(() => {\n    const id = 'font-selector';\n    if (fonts?.length) {\n      loadFonts(fonts, {id});\n    }\n  }, [fonts, currentPage]);\n\n  return {\n    fonts: fonts || [],\n    currentPage,\n    filteredFonts: filteredFonts || [],\n    setCurrentPage,\n    isLoading,\n    filters,\n    setFilters,\n    value,\n    onChange,\n    pages,\n  };\n}\n","import {Trans} from '@common/i18n/trans';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport React from 'react';\nimport {FontSelectorState} from '@common/ui/font-selector/font-selector-state';\n\ninterface FontSelectorPaginationProps {\n  state: FontSelectorState;\n}\nexport function FontSelectorPagination({\n  state: {currentPage = 0, setCurrentPage, filteredFonts, pages},\n}: FontSelectorPaginationProps) {\n  const total = filteredFonts?.length || 0;\n\n  return (\n    <div className=\"flex items-center justify-end gap-24 text-sm mt-30 pt-14 border-t\">\n      {total > 0 && (\n        <div>\n          <Trans\n            message=\":from - :to of :total\"\n            values={{\n              from: currentPage * 20 + 1,\n              to: Math.min((currentPage + 1) * 20, total),\n              total,\n            }}\n          />\n        </div>\n      )}\n      <div className=\"text-muted\">\n        <IconButton\n          disabled={currentPage < 1}\n          onClick={() => {\n            setCurrentPage(Math.max(0, currentPage - 1));\n          }}\n        >\n          <KeyboardArrowLeftIcon />\n        </IconButton>\n        <IconButton\n          disabled={currentPage >= pages.length - 1}\n          onClick={() => {\n            setCurrentPage(currentPage + 1);\n          }}\n        >\n          <KeyboardArrowRightIcon />\n        </IconButton>\n      </div>\n    </div>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport clsx from 'clsx';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport fontImage from './font.svg';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {FontSelectorFilters} from '@common/ui/font-selector/font-selector-filters';\nimport {\n  FontSelectorState,\n  UseFontSelectorProps,\n  useFontSelectorState,\n} from '@common/ui/font-selector/font-selector-state';\nimport {FontSelectorPagination} from '@common/ui/font-selector/font-selector-pagination';\nimport {FontConfig} from '@common/http/value-lists';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\n\ninterface FontSelectorProps extends UseFontSelectorProps {\n  className?: string;\n}\nexport function FontSelector(props: FontSelectorProps) {\n  const state = useFontSelectorState(props);\n  return (\n    <div className={props.className}>\n      <FontSelectorFilters state={state} />\n      <AnimatePresence initial={false} mode=\"wait\">\n        <FontList state={state} />\n      </AnimatePresence>\n      <FontSelectorPagination state={state} />\n    </div>\n  );\n}\n\ninterface FontListProps {\n  state: FontSelectorState;\n}\nfunction FontList({state}: FontListProps) {\n  const {isLoading, fonts} = state;\n\n  const gridClassName =\n    'grid gap-24 grid-cols-[repeat(auto-fill,minmax(90px,1fr))] items-start';\n\n  if (isLoading) {\n    return <FontListSkeleton className={gridClassName} />;\n  }\n\n  if (!fonts?.length) {\n    return (\n      <IllustratedMessage\n        className=\"mt-60\"\n        size=\"sm\"\n        image={<SvgImage src={fontImage} />}\n        title={<Trans message=\"No matching fonts\" />}\n        description={\n          <Trans message=\"Try another search query or different category\" />\n        }\n      />\n    );\n  }\n\n  return (\n    <m.div key=\"font-list\" {...opacityAnimation} className={gridClassName}>\n      {fonts?.map(font => (\n        <FontButton key={font.family} font={font} state={state} />\n      ))}\n    </m.div>\n  );\n}\n\ninterface FontButtonProps {\n  font: FontConfig;\n  state: FontSelectorState;\n}\nfunction FontButton({font, state: {value, onChange}}: FontButtonProps) {\n  const isActive = value?.family === font.family;\n  const displayName = font.family.split(',')[0].replace(/\"/g, '');\n\n  return (\n    <ButtonBase\n      key={font.family}\n      display=\"block\"\n      onClick={() => {\n        onChange(font);\n      }}\n    >\n      <span\n        className={clsx(\n          'flex aspect-square items-center justify-center rounded-panel border text-4xl transition-bg-color hover:bg-hover md:text-5xl',\n          isActive && 'ring-2 ring-primary ring-offset-2',\n        )}\n      >\n        <span style={{fontFamily: font.family}}>Aa</span>\n      </span>\n      <span\n        className={clsx(\n          'mt-6 block overflow-hidden overflow-ellipsis whitespace-nowrap text-sm',\n          isActive && 'text-primary',\n        )}\n      >\n        {font.label ? <Trans {...font.label} /> : displayName}\n      </span>\n    </ButtonBase>\n  );\n}\n\ninterface FontListSkeletonProps {\n  className: string;\n}\nfunction FontListSkeleton({className}: FontListSkeletonProps) {\n  const items = Array.from(Array(20).keys());\n  return (\n    <m.div key=\"font-list-skeleton\" {...opacityAnimation} className={className}>\n      {items.map(index => (\n        <div key={index}>\n          <div className=\"aspect-square\">\n            <Skeleton display=\"block\" variant=\"rect\" />\n          </div>\n          <Skeleton className=\"mt-6 text-sm\" />\n        </div>\n      ))}\n    </m.div>\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 {message} from '@common/i18n/message';\nimport {toast} from '@common/ui/toast/toast';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {biolinkEditorState} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {useEditorBiolinkId} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n  appearance: Biolink['appearance'];\n}\n\nexport function useSaveBiolinkAppearance() {\n  const biolinkId = useEditorBiolinkId();\n  return useMutation({\n    mutationFn: () => {\n      const appearance = biolinkEditorState().appearance!;\n      return saveAppearance(biolinkId, {config: appearance});\n    },\n    onSuccess: () => {\n      biolinkEditorState().setAppearanceIsDirty(false);\n      toast.positive(message('Appearance saved'));\n    },\n    onError: err =>\n      showHttpErrorToast(err, message('Could not save appearance')),\n  });\n}\n\nfunction saveAppearance(\n  biolinkId: number,\n  appearance: Biolink['appearance'],\n): Promise<Response> {\n  return apiClient\n    .post(`biolink/${biolinkId}/appearance`, appearance)\n    .then(r => r.data);\n}\n","import {getInputFieldClassNames} from '@common/ui/forms/input-field/get-input-field-class-names';\nimport React, {Fragment, ReactNode, useId} from 'react';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {ColorPickerDialog} from '@common/ui/color-picker/color-picker-dialog';\nimport {HexColorInput} from 'react-colorful';\n\ninterface ColorInputProps {\n  value: string;\n  onChange: (newValue: string) => void;\n  label: ReactNode;\n}\nexport function ColorInput({value, onChange, label}: ColorInputProps) {\n  const style = getInputFieldClassNames({\n    size: 'md',\n    startAppend: <Fragment />,\n  });\n  const id = useId();\n\n  return (\n    <div>\n      <label className={style.label} htmlFor={id}>\n        {label}\n      </label>\n      <div className=\"flex\">\n        <DialogTrigger type=\"popover\">\n          <ButtonBase\n            className=\"h-42 w-42 flex-shrink-0 rounded-input border bg-black\"\n            style={{backgroundColor: value}}\n          />\n          <ColorPickerDialog\n            showInput={false}\n            defaultValue={value}\n            onChange={onChange}\n          />\n        </DialogTrigger>\n        <HexColorInput\n          id={id}\n          autoComplete=\"off\"\n          role=\"textbox\"\n          autoCorrect=\"off\"\n          spellCheck=\"false\"\n          required\n          prefixed\n          className={style.input}\n          color={value}\n          onChange={onChange}\n        />\n      </div>\n    </div>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {BackgroundSelector} from '@app/dashboard/biolink/biolink-editor/appearance/background-selector/background-selector';\nimport React, {Fragment} from 'react';\nimport {\n  biolinkEditorState,\n  useBiolinkEditorStore,\n} from '@app/dashboard/biolink/biolink-editor/biolink-editor-store';\nimport {ButtonStyleSelector} from '@app/dashboard/biolink/biolink-editor/appearance/button-style-selector';\nimport {FontSelector as CommonFontSelector} from '@common/ui/font-selector/font-selector';\nimport {useSaveBiolinkAppearance} from '@app/dashboard/biolink/biolink-editor/requests/use-save-biolink-appearance';\nimport {BrowserSafeFonts} from '@common/ui/font-picker/browser-safe-fonts';\nimport {ColorInput} from '@app/dashboard/biolink/biolink-editor/appearance/color-input';\nimport {appearanceHeaderClassnames} from '@app/dashboard/biolink/biolink-editor/appearance/header-classnames';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {LockIcon} from '@common/icons/material/Lock';\nimport {FeatureLockedDialog} from '@app/dashboard/upgrade/feature-locked-dialog';\nimport {useAuth} from '@common/auth/use-auth';\n\nexport function BiolinkAppearanceEditor() {\n  const saveAppearance = useSaveBiolinkAppearance();\n  const isDirty = useBiolinkEditorStore(s => s.appearanceIsDirty);\n\n  return (\n    <Fragment>\n      <header className=\"mb-40\">\n        <h1 className=\"mb-4 text-2xl\">\n          <Trans message=\"Custom appearance\" />\n        </h1>\n        <div className=\"mb-20 text-sm\">\n          <Trans message=\"Fully customize your Biolink. Change background color or select gradients and images. Choose button style, text color, typeface and more.\" />\n        </div>\n        <Button\n          variant=\"flat\"\n          color=\"primary\"\n          type=\"submit\"\n          onClick={() => saveAppearance.mutate()}\n          disabled={!isDirty || saveAppearance.isPending}\n        >\n          <Trans message=\"Save changes\" />\n        </Button>\n      </header>\n      <BackgroundSelector />\n      <ColorSelector />\n      <ButtonStyleSelector className=\"my-60\" />\n      <FontSelector />\n      <BrandingSelector />\n    </Fragment>\n  );\n}\n\nfunction ColorSelector() {\n  const btnConfig = useBiolinkEditorStore(s => s.appearance?.btnConfig);\n  const bgConfig = useBiolinkEditorStore(s => s.appearance?.bgConfig);\n\n  return (\n    <div className=\"my-60\">\n      <h2 className={appearanceHeaderClassnames.h2}>\n        <Trans message=\"Colors\" />\n      </h2>\n      <div className=\"grid-cols-3 items-center gap-24 md:grid\">\n        <ColorInput\n          label={<Trans message=\"Text color\" />}\n          value={bgConfig?.color || '#000'}\n          onChange={newValue => {\n            biolinkEditorState().updateAppearance({\n              bgConfig: {\n                ...bgConfig,\n                color: newValue,\n              },\n            });\n          }}\n        />\n        <ColorInput\n          label={<Trans message=\"Button color\" />}\n          value={btnConfig?.color || '#000'}\n          onChange={newValue => {\n            biolinkEditorState().updateAppearance({\n              btnConfig: {\n                ...btnConfig,\n                color: newValue,\n              },\n            });\n          }}\n        />\n        <ColorInput\n          label={<Trans message=\"Button text color\" />}\n          value={btnConfig?.textColor || '#000'}\n          onChange={newValue => {\n            biolinkEditorState().updateAppearance({\n              btnConfig: {\n                ...btnConfig,\n                textColor: newValue,\n              },\n            });\n          }}\n        />\n      </div>\n    </div>\n  );\n}\n\nfunction FontSelector() {\n  const currentValue =\n    useBiolinkEditorStore(s => s.appearance?.fontConfig) || BrowserSafeFonts[0];\n  return (\n    <div>\n      <h2 className={appearanceHeaderClassnames.h2}>\n        <Trans message=\"Font\" />\n      </h2>\n      <CommonFontSelector\n        value={currentValue}\n        onChange={newValue => {\n          biolinkEditorState().updateAppearance({\n            fontConfig: {\n              ...currentValue,\n              ...newValue,\n            },\n          });\n        }}\n      />\n    </div>\n  );\n}\n\nfunction BrandingSelector() {\n  const {branding, biolink} = useSettings();\n  const {isSubscribed} = useAuth();\n  const {billing} = useSettings();\n  const currentValue =\n    useBiolinkEditorStore(s => s.appearance?.hideBranding) || false;\n\n  return (\n    <div className=\"my-60\">\n      <h2 className={appearanceHeaderClassnames.h2}>\n        <Trans message=\"Branding\" />\n      </h2>\n      {billing.enable && (\n        <div className=\"mb-14\">\n          <DialogTrigger type=\"popover\">\n            <Button\n              variant=\"flat\"\n              color=\"primary\"\n              size=\"2xs\"\n              startIcon={<LockIcon />}\n            >\n              <Trans message=\"Upgrade\" />\n            </Button>\n            <FeatureLockedDialog\n              message={\n                <Trans\n                  message=\"Upgrade to remove :site logo.\"\n                  values={{site: branding.site_name}}\n                />\n              }\n              messageSuffix={null}\n            />\n          </DialogTrigger>\n        </div>\n      )}\n      {biolink.show_branding && (\n        <Switch\n          disabled={!isSubscribed}\n          checked={currentValue}\n          onChange={e => {\n            biolinkEditorState().updateAppearance({\n              hideBranding: e.target.checked,\n            });\n          }}\n        >\n          <Trans\n            message=\"Hide :site logo\"\n            values={{site: branding.site_name}}\n          />\n        </Switch>\n      )}\n    </div>\n  );\n}\n","import {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {Trans} from '@common/i18n/trans';\nimport {TabPanel, TabPanels} from '@common/ui/tabs/tab-panels';\nimport {Fragment, ReactElement, useEffect, useState} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {WidgetsIcon} from '@common/icons/material/Widgets';\nimport {\n  LinkContentItem,\n  linkDialogHiddenFields,\n} from '@app/dashboard/biolink/biolink-editor/content/link-content-item/link-content-item';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {CreateLinkDialog} from '@app/dashboard/links/dialogs/create-link-dialog';\nimport {BiolinkSettingsForm} from '@app/dashboard/biolink/biolink-editor/biolink-settings-form';\nimport {SelectWidgetDialog} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-selector/select-widget-dialog';\nimport {WidgetType} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-list';\nimport {NewWidgetDialogContainer} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-selector/new-widget-dialog-container';\nimport {WidgetContentItem} from '@app/dashboard/biolink/biolink-editor/content/widgets/widget-content-item';\nimport {LivePreview} from '@app/dashboard/biolink/biolink-editor/live-preview';\nimport {BiolinkAppearanceEditor} from '@app/dashboard/biolink/biolink-editor/appearance/biolink-appearance-editor';\nimport {Link, useParams} from 'react-router-dom';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {BiolinkContentItemLayout} from '@app/dashboard/biolink/biolink-editor/content/biolink-content-item-layout';\nimport {prefetchLinkFormValueLists} from '@app/dashboard/links/requests/use-link-form-value-lists';\nimport {\n  setEditorBiolink,\n  useEditorBiolink,\n} from '@app/dashboard/biolink/biolink-editor/requests/use-editor-biolink';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport notifySvg from '@common/notifications/empty-state/notify.svg';\nimport {Biolink} from '@app/dashboard/biolink/biolink';\nimport {LinkIcon} from '@common/icons/material/Link';\nimport {removeProtocol} from '@common/utils/urls/remove-protocol';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {ShareLinkButton} from '@app/dashboard/links/sharing/share-link-button';\n\nconst TabsMap: Record<string, number> = {\n  content: 0,\n  appearance: 1,\n  settings: 2,\n};\n\nexport function BiolinkEditorPage() {\n  return (\n    <div>\n      <BiolinkEditorHeader />\n      <div className=\"flex gap-60 p-24 container mx-auto\">\n        <BiolinkEditor />\n        <LivePreview />\n      </div>\n    </div>\n  );\n}\n\nfunction BiolinkEditorHeader() {\n  const {biolink} = useEditorBiolink();\n  return (\n    <header className=\"border-b px-10 py-4 flex items-center gap-10 min-h-46\">\n      <LinkIcon className=\"text-muted\" />\n      <AnimatePresence>\n        {biolink && (\n          <m.a\n            key=\"link\"\n            className={LinkStyle}\n            href={biolink?.short_url}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            {...opacityAnimation}\n          >\n            {removeProtocol(biolink.short_url)}\n          </m.a>\n        )}\n        {biolink && (\n          <m.div {...opacityAnimation} key=\"share-button\" className=\"ml-auto\">\n            <ShareLinkButton variant=\"text\" link={biolink} />\n          </m.div>\n        )}\n      </AnimatePresence>\n    </header>\n  );\n}\n\nfunction BiolinkEditor() {\n  const {biolinkId} = useParams();\n  const {tabName = 'content'} = useParams();\n  const selectedTab = TabsMap[tabName] ?? TabsMap.content;\n  useEditorBiolink();\n\n  useEffect(() => {\n    prefetchLinkFormValueLists();\n  }, [biolinkId]);\n\n  return (\n    <div className=\"flex-auto min-w-0\">\n      <Tabs overflow=\"overflow-visible\" selectedTab={selectedTab} isLazy>\n        <TabList className=\"sticky top-0 bg dark:bg-alt z-10\">\n          <Tab\n            padding=\"w-140\"\n            elementType={Link}\n            to=\"../content\"\n            relative=\"path\"\n          >\n            <Trans message=\"Content\" />\n          </Tab>\n          <Tab\n            padding=\"w-140\"\n            elementType={Link}\n            to=\"../appearance\"\n            relative=\"path\"\n          >\n            <Trans message=\"Appearance\" />\n          </Tab>\n          <Tab\n            padding=\"w-140\"\n            elementType={Link}\n            to=\"../settings\"\n            relative=\"path\"\n          >\n            <Trans message=\"Settings\" />\n          </Tab>\n        </TabList>\n        <TabPanels className=\"py-20\">\n          <TabPanel>{<BiolinkContent />}</TabPanel>\n          <TabPanel>{<BiolinkAppearanceEditor />}</TabPanel>\n          <TabPanel>\n            <BiolinkSettingsForm />\n          </TabPanel>\n        </TabPanels>\n      </Tabs>\n    </div>\n  );\n}\n\nfunction BiolinkContent() {\n  const {isLoading, status, biolink} = useEditorBiolink();\n  const [activeWidgetDialog, setActiveWidgetDialog] =\n    useState<WidgetType | null>(null);\n\n  let renderedContent: ReactElement;\n\n  if (status === 'success' && !biolink?.content.length) {\n    renderedContent = (\n      <m.div {...opacityAnimation} key=\"no-results\">\n        <IllustratedMessage\n          className=\"mt-60\"\n          image={<SvgImage src={notifySvg} />}\n          title={<Trans message=\"This biolink does not have any content yet\" />}\n        />\n      </m.div>\n    );\n  } else if (isLoading) {\n    renderedContent = <LoadingSkeleton />;\n  } else {\n    renderedContent = <BiolinkItemList biolink={biolink!} />;\n  }\n\n  return (\n    <Fragment>\n      {biolink && (\n        <NewWidgetDialogContainer\n          biolink={biolink}\n          activeWidget={activeWidgetDialog}\n          onOpenChange={isOpen => {\n            if (!isOpen) {\n              setActiveWidgetDialog(null);\n            }\n          }}\n        />\n      )}\n      <div className=\"mb-20\">\n        <AddNewLinkButton />\n        <DialogTrigger\n          type=\"modal\"\n          onClose={(widgetType?: WidgetType) => {\n            if (widgetType) {\n              setActiveWidgetDialog(widgetType);\n            }\n          }}\n        >\n          <Button color=\"primary\" variant=\"outline\" startIcon={<WidgetsIcon />}>\n            <Trans message=\"Add widget\" />\n          </Button>\n          <SelectWidgetDialog />\n        </DialogTrigger>\n      </div>\n      <AnimatePresence initial={false} mode=\"wait\">\n        {renderedContent}\n      </AnimatePresence>\n    </Fragment>\n  );\n}\n\ninterface BiolinkItemListProps {\n  biolink: Biolink;\n}\nfunction BiolinkItemList({biolink}: BiolinkItemListProps) {\n  return (\n    <m.div key=\"content\" {...opacityAnimation}>\n      {biolink?.content.map(contentItem => {\n        const ContentItem =\n          contentItem.model_type === 'biolinkWidget'\n            ? WidgetContentItem\n            : LinkContentItem;\n        return (\n          <ContentItem\n            key={`${contentItem.model_type}-${contentItem.id}`}\n            item={contentItem as never}\n            biolink={biolink}\n          />\n        );\n      })}\n    </m.div>\n  );\n}\n\nfunction AddNewLinkButton() {\n  const {biolink, biolinkId} = useEditorBiolink();\n  const endpoint = `biolink/${biolinkId}/link`;\n\n  const position = biolink?.content.filter(x => x.pinned).length;\n\n  return (\n    <DialogTrigger type=\"modal\">\n      <Button color=\"primary\" variant=\"flat\" className=\"mr-14 min-w-144\">\n        <Trans message=\"Add a link\" />\n      </Button>\n      <CreateLinkDialog\n        endpoint={endpoint}\n        position={position}\n        group={biolink}\n        hiddenFields={linkDialogHiddenFields}\n        showButtonLabelField\n        invalidateQueries={false}\n        onSuccess={(response: {biolink: Biolink}) => {\n          setEditorBiolink(response.biolink);\n        }}\n      />\n    </DialogTrigger>\n  );\n}\n\nfunction LoadingSkeleton() {\n  return (\n    <m.div key=\"loading-skeleton\" {...opacityAnimation}>\n      {[...Array(4).keys()].map((value, index) => (\n        <BiolinkSkeleton key={index} />\n      ))}\n    </m.div>\n  );\n}\n\nfunction BiolinkSkeleton() {\n  return (\n    <BiolinkContentItemLayout\n      title={<Skeleton className=\"mb-14 text-sm max-w-192\" />}\n      actionRow={<Skeleton className=\"text-xs max-w-288\" />}\n    >\n      <Skeleton className=\"text-xs max-w-400\" />\n      <Skeleton className=\"text-xs max-w-400\" />\n    </BiolinkContentItemLayout>\n  );\n}\n","import React, {useState} from 'react';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useFormContext} from 'react-hook-form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport clsx from 'clsx';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\n\nexport function ArticleEditorTitle() {\n  const [editingTitle, setEditingTitle] = useState(false);\n  const {trans} = useTrans();\n  const form = useFormContext<CreateCustomPagePayload>();\n  const watchedTitle = form.watch('title');\n\n  const titlePlaceholder = trans({message: 'Title'});\n\n  if (editingTitle) {\n    return (\n      <FormTextField\n        placeholder={titlePlaceholder}\n        autoFocus\n        className=\"mb-30\"\n        onBlur={() => {\n          setEditingTitle(false);\n        }}\n        name=\"title\"\n        required\n      />\n    );\n  }\n  return (\n    <h1\n      tabIndex={0}\n      onClick={() => {\n        setEditingTitle(true);\n      }}\n      onFocus={() => {\n        setEditingTitle(true);\n      }}\n      className={clsx(\n        'hover:bg-primary/focus rounded cursor-pointer',\n        !watchedTitle && 'text-muted'\n      )}\n    >\n      {watchedTitle || titlePlaceholder}\n      <EditIcon className=\"icon-sm mx-8 mt-8 align-top text-muted\" />\n    </h1>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UndoIcon = createSvgIcon(\n  <path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\" />\n, 'UndoOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RedoIcon = createSvgIcon(\n  <path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\" />\n, 'RedoOutlined');\n","import React from 'react';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {UndoIcon} from '../../icons/material/Undo';\nimport {RedoIcon} from '../../icons/material/Redo';\nimport {MenubarButtonProps} from './menubar-button-props';\n\nexport function HistoryButtons({editor}: MenubarButtonProps) {\n  return (\n    <span>\n      <IconButton\n        size=\"md\"\n        disabled={!editor.can().undo()}\n        onClick={() => {\n          editor.commands.focus();\n          editor.commands.undo();\n        }}\n      >\n        <UndoIcon />\n      </IconButton>\n      <IconButton\n        size=\"md\"\n        disabled={!editor.can().redo()}\n        onClick={() => {\n          editor.commands.focus();\n          editor.commands.redo();\n        }}\n      >\n        <RedoIcon />\n      </IconButton>\n    </span>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CodeIcon = createSvgIcon(\n  <path d=\"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\" />\n, 'CodeOutlined');\n","import {Button} from '../../ui/buttons/button';\nimport {CodeIcon} from '../../icons/material/Code';\nimport {Trans} from '../../i18n/trans';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {AceDialog} from '../../ace-editor/ace-dialog';\nimport {Editor} from '@tiptap/react';\nimport React from 'react';\n\ninterface ModeButtonProps {\n  editor: Editor;\n}\nexport function ModeButton({editor}: ModeButtonProps) {\n  return (\n    <DialogTrigger\n      type=\"modal\"\n      onClose={newValue => {\n        if (newValue != null) {\n          editor?.commands.setContent(newValue);\n        }\n      }}\n    >\n      <Button variant=\"text\" startIcon={<CodeIcon />}>\n        <Trans message=\"Source\" />\n      </Button>\n      <AceDialog\n        title={<Trans message=\"Source code\" />}\n        defaultValue={editor.getHTML()}\n      />\n    </DialogTrigger>\n  );\n}\n","export function Divider() {\n  return <div className=\"self-stretch mx-4 w-1 bg-divider flex-shrink-0\" />;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatBoldIcon = createSvgIcon(\n  <path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\" />\n, 'FormatBoldOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatItalicIcon = createSvgIcon(\n  <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4h-8z\" />\n, 'FormatItalicOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatUnderlinedIcon = createSvgIcon(\n  <path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\" />\n, 'FormatUnderlinedOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormatBoldIcon} from '../../icons/material/FormatBold';\nimport {FormatItalicIcon} from '../../icons/material/FormatItalic';\nimport {FormatUnderlinedIcon} from '../../icons/material/FormatUnderlined';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function FontStyleButtons({editor, size}: MenubarButtonProps) {\n  return (\n    <span className={clsx('flex-shrink-0 whitespace-nowrap')}>\n      <Tooltip label={<Trans message=\"Bold\" />}>\n        <IconButton\n          size={size}\n          color={editor.isActive('bold') ? 'primary' : null}\n          onClick={() => {\n            editor.commands.focus();\n            editor.commands.toggleBold();\n          }}\n        >\n          <FormatBoldIcon />\n        </IconButton>\n      </Tooltip>\n      <Tooltip label={<Trans message=\"Italic\" />}>\n        <IconButton\n          size={size}\n          color={editor.isActive('italic') ? 'primary' : null}\n          onClick={() => {\n            editor.commands.focus();\n            editor.commands.toggleItalic();\n          }}\n        >\n          <FormatItalicIcon />\n        </IconButton>\n      </Tooltip>\n      <Tooltip label={<Trans message=\"Underline\" />}>\n        <IconButton\n          size={size}\n          color={editor.isActive('underline') ? 'primary' : null}\n          onClick={() => {\n            editor.commands.focus();\n            editor.commands.toggleUnderline();\n          }}\n        >\n          <FormatUnderlinedIcon />\n        </IconButton>\n      </Tooltip>\n    </span>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatListBulletedIcon = createSvgIcon(\n  <path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\" />\n, 'FormatListBulletedOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatListNumberedIcon = createSvgIcon(\n  <path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\" />\n, 'FormatListNumberedOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormatListBulletedIcon} from '../../icons/material/FormatListBulleted';\nimport {FormatListNumberedIcon} from '../../icons/material/FormatListNumbered';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ListButtons({editor, size}: MenubarButtonProps) {\n  const bulletActive = editor.isActive('bulletList');\n  const orderedActive = editor.isActive('orderedList');\n  return (\n    <span className={clsx('flex-shrink-0', 'whitespace-nowrap')}>\n      <Tooltip label={<Trans message=\"Bulleted list\" />}>\n        <IconButton\n          size={size}\n          color={bulletActive ? 'primary' : null}\n          onClick={() => {\n            editor.commands.focus();\n            editor.commands.toggleBulletList();\n          }}\n        >\n          <FormatListBulletedIcon />\n        </IconButton>\n      </Tooltip>\n      <Tooltip label={<Trans message=\"Numbered list\" />}>\n        <IconButton\n          size={size}\n          color={orderedActive ? 'primary' : null}\n          onClick={() => {\n            editor.commands.focus();\n            editor.commands.toggleOrderedList();\n          }}\n        >\n          <FormatListNumberedIcon />\n        </IconButton>\n      </Tooltip>\n    </span>\n  );\n}\n","import {Editor} from '@tiptap/react';\n\ninterface Props {\n  href: string;\n  target?: string;\n  text?: string;\n}\n\nexport function insertLinkIntoTextEditor(\n  editor: Editor,\n  {text, target, href}: Props\n) {\n  // no selection, insert new link with specified text\n  if (editor.state.selection.empty && text) {\n    editor.commands.insertContent(\n      `<a href=\"${href}\" target=\"${target}\">${text}</a>`\n    );\n  } else if (!editor.state.selection.empty) {\n    // no href provided, remove link from selection\n    if (!href) {\n      editor.chain().focus().extendMarkRange('link').unsetLink().run();\n    } else {\n      // add link to selection\n      editor\n        .chain()\n        .focus()\n        .extendMarkRange('link')\n        .setLink({href: href, target})\n        .run();\n    }\n  }\n}\n","import {useForm} from 'react-hook-form';\nimport React from 'react';\nimport clsx from 'clsx';\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 {IconButton} from '../../ui/buttons/icon-button';\nimport {LinkIcon} from '../../icons/material/Link';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {FormSelect, Option} from '../../ui/forms/select/select';\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 {Trans} from '../../i18n/trans';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {insertLinkIntoTextEditor} from '@common/text-editor/insert-link-into-text-editor';\n\ninterface FormValue {\n  href: string;\n  target?: string;\n  text?: string;\n}\n\nexport function LinkButton({editor, size}: MenubarButtonProps) {\n  return (\n    <DialogTrigger type=\"modal\">\n      <Tooltip label={<Trans message=\"Insert link\" />}>\n        <IconButton size={size} className={clsx('flex-shrink-0')}>\n          <LinkIcon />\n        </IconButton>\n      </Tooltip>\n      <LinkDialog editor={editor} />\n    </DialogTrigger>\n  );\n}\n\nfunction LinkDialog({editor}: MenubarButtonProps) {\n  const previousUrl = editor.getAttributes('link').href;\n  const previousText = editor.state.doc.textBetween(\n    editor.state.selection.from,\n    editor.state.selection.to,\n    '',\n  );\n\n  const form = useForm<FormValue>({\n    defaultValues: {href: previousUrl, text: previousText, target: '_blank'},\n  });\n  const {formId, close} = useDialogContext();\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Insert link\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          form={form}\n          id={formId}\n          onSubmit={value => {\n            insertLinkIntoTextEditor(editor, value);\n            close();\n          }}\n        >\n          <FormTextField\n            name=\"href\"\n            label={<Trans message=\"URL\" />}\n            autoFocus\n            type=\"url\"\n            className=\"mb-20\"\n          />\n          <FormTextField\n            name=\"text\"\n            label={<Trans message=\"Text to display\" />}\n            className=\"mb-20\"\n          />\n          <FormSelect\n            selectionMode=\"single\"\n            name=\"target\"\n            label={<Trans message=\"Open link in...\" />}\n          >\n            <Option value=\"_self\">\n              <Trans message=\"Current window\" />\n            </Option>\n            <Option value=\"_blank\">\n              <Trans message=\"New window\" />\n            </Option>\n          </FormSelect>\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button onClick={close} variant=\"text\">\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button type=\"submit\" form={formId} variant=\"flat\" color=\"primary\">\n          <Trans message=\"Save\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {ImageIcon} from '../../icons/material/Image';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {useActiveUpload} from '../../uploads/uploader/use-active-upload';\nimport {UploadInputType} from '../../uploads/types/upload-input-config';\nimport {Disk} from '../../uploads/types/backend-metadata';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nconst TwoMB = 2097152;\n\ninterface Props extends MenubarButtonProps {\n  diskPrefix?: string;\n}\n\nexport function ImageButton({editor, size, diskPrefix = 'page_media'}: Props) {\n  const {selectAndUploadFile} = useActiveUpload();\n\n  const handleUpload = () => {\n    selectAndUploadFile({\n      showToastOnRestrictionFail: true,\n      restrictions: {\n        allowedFileTypes: [UploadInputType.image],\n        maxFileSize: TwoMB,\n      },\n      metadata: {\n        diskPrefix: diskPrefix,\n        disk: Disk.public,\n      },\n      onSuccess: entry => {\n        editor.commands.focus();\n        editor.commands.setImage({\n          src: entry.url,\n        });\n      },\n    });\n  };\n\n  return (\n    <Tooltip label={<Trans message=\"Insert image\" />}>\n      <IconButton\n        size={size}\n        onClick={handleUpload}\n        className={clsx('flex-shrink-0')}\n      >\n        <ImageIcon />\n      </IconButton>\n    </Tooltip>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatClearIcon = createSvgIcon(\n  <path d=\"M20 8V5H6.39l3 3h1.83l-.55 1.28 2.09 2.1L14.21 8zM3.41 4.86 2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21l1.41-1.41z\" />\n, 'FormatClearOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {FormatClearIcon} from '../../icons/material/FormatClear';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ClearFormatButton({editor, size}: MenubarButtonProps) {\n  return (\n    <Tooltip label={<Trans message=\"Clear formatting\" />}>\n      <IconButton\n        className={clsx('flex-shrink-0')}\n        size={size}\n        onClick={() => {\n          editor.chain().focus().clearNodes().unsetAllMarks().run();\n        }}\n      >\n        <FormatClearIcon />\n      </IconButton>\n    </Tooltip>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HorizontalRuleIcon = createSvgIcon(\n  <path fillRule=\"evenodd\" d=\"M4 11h16v2H4z\" />\n, 'HorizontalRuleOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PriorityHighIcon = createSvgIcon(\n  [<circle cx=\"12\" cy=\"19\" r=\"2\" key=\"0\" />,<path d=\"M10 3h4v12h-4z\" key=\"1\" />,]\n, 'PriorityHighOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const NoteIcon = createSvgIcon(\n  <path d=\"M16 4H4c-1.1 0-2 .9-2 2v12.01c0 1.1.9 1.99 2 1.99h16c1.1 0 2-.9 2-2v-8l-6-6zM4 18.01V6h11v5h5v7.01H4z\" />\n, 'NoteOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SmartDisplayIcon = createSvgIcon(\n  [<path d=\"M9.5 7.5v9l7-4.5z\" key=\"0\" />,<path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14.01H4V5.99h16v12.02z\" key=\"1\" />,]\n, 'SmartDisplayOutlined');\n","import React, {useState} from 'react';\nimport {useForm} from 'react-hook-form';\nimport clsx from 'clsx';\nimport {HorizontalRuleIcon} from '../../icons/material/HorizontalRule';\nimport {PriorityHighIcon} from '../../icons/material/PriorityHigh';\nimport {WarningIcon} from '../../icons/material/Warning';\nimport {NoteIcon} from '../../icons/material/Note';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {MoreVertIcon} from '../../icons/material/MoreVert';\nimport {SmartDisplayIcon} from '../../icons/material/SmartDisplay';\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 {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '../../ui/navigation/menu/menu-trigger';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\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 {Trans} from '../../i18n/trans';\n\nexport function InsertMenuTrigger({editor, size}: MenubarButtonProps) {\n  const [dialog, setDialog] = useState<'embed' | false>(false);\n  return (\n    <>\n      <MenuTrigger\n        onItemSelected={key => {\n          if (key === 'hr') {\n            editor.commands.focus();\n            editor.commands.setHorizontalRule();\n          } else if (key === 'embed') {\n            setDialog('embed');\n          } else {\n            editor.commands.focus();\n            editor.commands.addInfo({type: key as any});\n          }\n        }}\n      >\n        <IconButton\n          variant=\"text\"\n          size={size}\n          className={clsx('flex-shrink-0')}\n        >\n          <MoreVertIcon />\n        </IconButton>\n        <Menu>\n          <MenuItem value=\"hr\" startIcon={<HorizontalRuleIcon />}>\n            <Trans message=\"Horizontal rule\" />\n          </MenuItem>\n          <MenuItem value=\"embed\" startIcon={<SmartDisplayIcon />}>\n            <Trans message=\"Embed\" />\n          </MenuItem>\n          <MenuItem value=\"important\" startIcon={<PriorityHighIcon />}>\n            <Trans message=\"Important\" />\n          </MenuItem>\n          <MenuItem value=\"warning\" startIcon={<WarningIcon />}>\n            <Trans message=\"Warning\" />\n          </MenuItem>\n          <MenuItem value=\"success\" startIcon={<NoteIcon />}>\n            <Trans message=\"Note\" />\n          </MenuItem>\n        </Menu>\n      </MenuTrigger>\n      <DialogTrigger\n        type=\"modal\"\n        isOpen={!!dialog}\n        onClose={() => {\n          setDialog(false);\n        }}\n      >\n        <EmbedDialog editor={editor} />\n      </DialogTrigger>\n    </>\n  );\n}\n\nfunction EmbedDialog({editor}: MenubarButtonProps) {\n  const previousSrc = editor.getAttributes('embed').src;\n  const form = useForm<{src: string}>({\n    defaultValues: {src: previousSrc},\n  });\n  const {formId, close} = useDialogContext();\n  return (\n    <Dialog>\n      <DialogHeader>\n        <Trans message=\"Insert link\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          form={form}\n          id={formId}\n          onSubmit={value => {\n            editor.commands.setEmbed(value);\n            close();\n          }}\n        >\n          <FormTextField\n            name=\"src\"\n            label={<Trans message=\"Embed URL\" />}\n            autoFocus\n            type=\"url\"\n            required\n          />\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button onClick={close} variant=\"text\">\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          type=\"submit\"\n          form={formId}\n          disabled={!form.formState.isValid}\n          variant=\"flat\"\n          color=\"primary\"\n        >\n          <Trans message=\"Add\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {ReactNode} from 'react';\nimport {isMac} from '@react-aria/utils';\n\ninterface Props {\n  children: ReactNode;\n  modifier?: boolean;\n  separator?: string;\n}\nexport function Keyboard({children, modifier, separator = '+'}: Props) {\n  const modKey = isMac() ? (\n    <span className=\"text-base align-middle\">⌘</span>\n  ) : (\n    'Ctrl'\n  );\n  return (\n    <kbd className=\"text-xs text-muted\">\n      {modifier && (\n        <>\n          {modKey}\n          {separator}\n        </>\n      )}\n      {children}\n    </kbd>\n  );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {Button} from '../../ui/buttons/button';\nimport {KeyboardArrowDownIcon} from '../../icons/material/KeyboardArrowDown';\nimport {Keyboard} from '../../ui/keyboard/keyboard';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '../../ui/navigation/menu/menu-trigger';\nimport {Trans} from '../../i18n/trans';\n\ntype Level = 1 | 2 | 3 | 4;\n\nexport function FormatMenuTrigger({editor, size}: MenubarButtonProps) {\n  return (\n    <MenuTrigger\n      floatingMinWidth=\"w-256\"\n      onItemSelected={key => {\n        editor.commands.focus();\n        if (typeof key === 'string' && key.startsWith('h')) {\n          editor.commands.toggleHeading({\n            level: parseInt(key.replace('h', '')) as Level,\n          });\n        } else if (key === 'code') {\n          editor.commands.toggleCode();\n        } else if (key === 'strike') {\n          editor.commands.toggleStrike();\n        } else if (key === 'super') {\n          editor.commands.toggleSuperscript();\n        } else if (key === 'sub') {\n          editor.commands.toggleSubscript();\n        } else if (key === 'blockquote') {\n          editor.commands.toggleBlockquote();\n        } else if (key === 'paragraph') {\n          editor.commands.setParagraph();\n        }\n      }}\n    >\n      <Button\n        className={clsx('flex-shrink-0')}\n        variant=\"text\"\n        size={size}\n        endIcon={<KeyboardArrowDownIcon />}\n      >\n        <Trans message=\"Format\" />\n      </Button>\n      <Menu>\n        <MenuItem value=\"h1\" endSection={<Keyboard modifier>Alt+1</Keyboard>}>\n          <Trans message=\"Heading :number\" values={{number: 1}} />\n        </MenuItem>\n        <MenuItem value=\"h2\" endSection={<Keyboard modifier>Alt+2</Keyboard>}>\n          <Trans message=\"Heading :number\" values={{number: 2}} />\n        </MenuItem>\n        <MenuItem value=\"h3\" endSection={<Keyboard modifier>Alt+3</Keyboard>}>\n          <Trans message=\"Heading :number\" values={{number: 3}} />\n        </MenuItem>\n        <MenuItem value=\"h4\" endSection={<Keyboard modifier>Alt+4</Keyboard>}>\n          <Trans message=\"Heading :number\" values={{number: 4}} />\n        </MenuItem>\n        <MenuItem value=\"code\" endSection={<Keyboard modifier>E</Keyboard>}>\n          <Trans message=\"Code\" />\n        </MenuItem>\n        <MenuItem\n          value=\"strike\"\n          endSection={<Keyboard modifier>Shift+X</Keyboard>}\n        >\n          <Trans message=\"Strikethrough\" />\n        </MenuItem>\n        <MenuItem\n          value=\"super\"\n          endSection={\n            <Keyboard modifier separator=\" \">\n              .\n            </Keyboard>\n          }\n        >\n          <Trans message=\"Superscript\" />\n        </MenuItem>\n        <MenuItem\n          value=\"sub\"\n          endSection={\n            <Keyboard modifier separator=\" \">\n              ,\n            </Keyboard>\n          }\n        >\n          <Trans message=\"Subscript\" />\n        </MenuItem>\n        <MenuItem\n          value=\"blockquote\"\n          endSection={<Keyboard modifier>Shift+B</Keyboard>}\n        >\n          <Trans message=\"Blockquote\" />\n        </MenuItem>\n        <MenuItem\n          value=\"paragraph\"\n          endSection={<Keyboard modifier>Alt+0</Keyboard>}\n        >\n          <Trans message=\"Paragraph\" />\n        </MenuItem>\n      </Menu>\n    </MenuTrigger>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatColorTextIcon = createSvgIcon(\n  <path d=\"M2 20h20v4H2v-4zm3.49-3h2.42l1.27-3.58h5.65L16.09 17h2.42L13.25 3h-2.5L5.49 17zm4.42-5.61 2.03-5.79h.12l2.03 5.79H9.91z\" />\n, 'FormatColorTextOutlined');\n","import React, {Fragment, useState} from 'react';\nimport clsx from 'clsx';\nimport {FormatColorTextIcon} from '../../icons/material/FormatColorText';\nimport {ColorPickerDialog} from '../../ui/color-picker/color-picker-dialog';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormatColorFillIcon} from '../../icons/material/FormatColorFill';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\n\nexport function ColorButtons({editor, size}: MenubarButtonProps) {\n  const [dialog, setDialog] = useState<'text' | 'bg' | false>(false);\n  const textActive = editor.getAttributes('textStyle').color;\n  const backgroundActive = editor.getAttributes('textStyle').backgroundColor;\n  return (\n    <Fragment>\n      <span className={clsx('flex-shrink-0 whitespace-nowrap')}>\n        <IconButton\n          size={size}\n          color={textActive ? 'primary' : null}\n          onClick={() => {\n            setDialog('text');\n          }}\n        >\n          <FormatColorTextIcon />\n        </IconButton>\n        <IconButton\n          size={size}\n          color={backgroundActive ? 'primary' : null}\n          onClick={() => {\n            setDialog('bg');\n          }}\n        >\n          <FormatColorFillIcon />\n        </IconButton>\n      </span>\n      <DialogTrigger\n        currentValue={dialog === 'text' ? '#000000' : '#FFFFFF'}\n        type=\"modal\"\n        isOpen={!!dialog}\n        onClose={newValue => {\n          if (newValue) {\n            if (dialog === 'text') {\n              editor.commands.setColor(newValue);\n            } else {\n              editor.commands.setBackgroundColor(newValue);\n            }\n          }\n          setDialog(false);\n        }}\n      >\n        <ColorPickerDialog\n          defaultValue={dialog === 'text' ? '#000000' : '#FFFFFF'}\n        />\n      </DialogTrigger>\n    </Fragment>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignLeftIcon = createSvgIcon(\n  <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\n, 'FormatAlignLeftOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignCenterIcon = createSvgIcon(\n  <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\n, 'FormatAlignCenterOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignRightIcon = createSvgIcon(\n  <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\n, 'FormatAlignRightOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignJustifyIcon = createSvgIcon(\n  <path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\" />\n, 'FormatAlignJustifyOutlined');\n","import clsx from 'clsx';\nimport {ComponentType} from 'react';\nimport {FormatAlignLeftIcon} from '../../icons/material/FormatAlignLeft';\nimport {FormatAlignCenterIcon} from '../../icons/material/FormatAlignCenter';\nimport {FormatAlignRightIcon} from '../../icons/material/FormatAlignRight';\nimport {FormatAlignJustifyIcon} from '../../icons/material/FormatAlignJustify';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '../../ui/navigation/menu/menu-trigger';\nimport {Trans} from '../../i18n/trans';\nimport {message} from '../../i18n/message';\n\nconst iconMap = {\n  left: {\n    icon: FormatAlignLeftIcon,\n    label: message('Align left'),\n  },\n  center: {\n    icon: FormatAlignCenterIcon,\n    label: message('Align center'),\n  },\n  right: {\n    icon: FormatAlignRightIcon,\n    label: message('Align right'),\n  },\n  justify: {\n    icon: FormatAlignJustifyIcon,\n    label: message('Justify'),\n  },\n};\n\nexport function AlignButtons({editor, size}: MenubarButtonProps) {\n  const activeKey = (Object.keys(iconMap).find(key => {\n    return editor.isActive({textAlign: key});\n  }) || 'left') as keyof typeof iconMap;\n  const ActiveIcon: ComponentType = activeKey\n    ? iconMap[activeKey].icon\n    : iconMap.left.icon;\n\n  return (\n    <MenuTrigger\n      floatingWidth=\"auto\"\n      selectionMode=\"single\"\n      selectedValue={activeKey}\n      onSelectionChange={key => {\n        editor.commands.focus();\n        editor.commands.setTextAlign(key as string);\n      }}\n    >\n      <IconButton\n        size={size}\n        color={activeKey ? 'primary' : null}\n        className={clsx('flex-shrink-0')}\n      >\n        <ActiveIcon />\n      </IconButton>\n      <Menu>\n        {Object.entries(iconMap).map(([name, config]) => {\n          const Icon = config.icon;\n          return (\n            <MenuItem\n              key={name}\n              value={name}\n              startIcon={<Icon size=\"md\" />}\n              capitalizeFirst\n            >\n              <Trans message={config.label.message} />\n            </MenuItem>\n          );\n        })}\n      </Menu>\n    </MenuTrigger>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatIndentDecreaseIcon = createSvgIcon(\n  <path d=\"M11 17h10v-2H11v2zm-8-5 4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\n, 'FormatIndentDecreaseOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatIndentIncreaseIcon = createSvgIcon(\n  <path d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\n, 'FormatIndentIncreaseOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {FormatIndentDecreaseIcon} from '../../icons/material/FormatIndentDecrease';\nimport {FormatIndentIncreaseIcon} from '../../icons/material/FormatIndentIncrease';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function IndentButtons({editor, size}: MenubarButtonProps) {\n  return (\n    <span className={clsx('flex-shrink-0', 'whitespace-nowrap')}>\n      <Tooltip label={<Trans message=\"Decrease indent\" />}>\n        <IconButton\n          size={size}\n          onClick={() => {\n            editor.commands.focus();\n            editor.commands.outdent();\n          }}\n        >\n          <FormatIndentDecreaseIcon />\n        </IconButton>\n      </Tooltip>\n      <Tooltip label={<Trans message=\"Increase indent\" />}>\n        <IconButton\n          size={size}\n          onClick={() => {\n            editor.commands.focus();\n            editor.commands.indent();\n          }}\n        >\n          <FormatIndentIncreaseIcon />\n        </IconButton>\n      </Tooltip>\n    </span>\n  );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {CodeIcon} from '../../icons/material/Code';\nimport {MenubarButtonProps} from './menubar-button-props';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '../../ui/navigation/menu/menu-trigger';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function CodeBlockMenuTrigger({editor, size}: MenubarButtonProps) {\n  const language = editor.getAttributes('codeBlock').language || '';\n  return (\n    <MenuTrigger\n      selectionMode=\"single\"\n      selectedValue={language}\n      onSelectionChange={key => {\n        editor.commands.toggleCodeBlock({language: key as string});\n      }}\n    >\n      <Tooltip label={<Trans message=\"Codeblock\" />}>\n        <IconButton\n          className={clsx('flex-shrink-0')}\n          size={size}\n          color={language ? 'primary' : null}\n        >\n          <CodeIcon />\n        </IconButton>\n      </Tooltip>\n      <Menu>\n        <MenuItem value=\"html\">HTML</MenuItem>\n        <MenuItem value=\"javascript\">JavaScript</MenuItem>\n        <MenuItem value=\"css\">CSS</MenuItem>\n        <MenuItem value=\"php\">PHP</MenuItem>\n        <MenuItem value=\"shell\">Shell</MenuItem>\n        <MenuItem value=\"bash\">Bash</MenuItem>\n        <MenuItem value=\"ruby\">Ruby</MenuItem>\n        <MenuItem value=\"python\">Python</MenuItem>\n        <MenuItem value=\"java\">Java</MenuItem>\n        <MenuItem value=\"c++\">C++</MenuItem>\n      </Menu>\n    </MenuTrigger>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UnfoldLessIcon = createSvgIcon(\n  <path d=\"M7.41 18.59 8.83 20 12 16.83 15.17 20l1.41-1.41L12 14l-4.59 4.59zm9.18-13.18L15.17 4 12 7.17 8.83 4 7.41 5.41 12 10l4.59-4.59z\" />\n, 'UnfoldLessOutlined');\n","import React, {Fragment, useState} from 'react';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {Divider} from '@common/text-editor/menubar/divider';\nimport {FontStyleButtons} from '@common/text-editor/menubar/font-style-buttons';\nimport {ListButtons} from '@common/text-editor/menubar/list-buttons';\nimport {LinkButton} from '@common/text-editor/menubar/link-button';\nimport {ImageButton} from '@common/text-editor/menubar/image-button';\nimport {ClearFormatButton} from '@common/text-editor/menubar/clear-format-button';\nimport {InsertMenuTrigger} from '@common/text-editor/menubar/insert-menu-trigger';\nimport {FormatMenuTrigger} from '@common/text-editor/menubar/format-menu-trigger';\nimport {ColorButtons} from '@common/text-editor/menubar/color-buttons';\nimport {AlignButtons} from '@common/text-editor/menubar/align-buttons';\nimport {IndentButtons} from '@common/text-editor/menubar/indent-buttons';\nimport {CodeBlockMenuTrigger} from '@common/text-editor/menubar/code-block-menu-trigger';\nimport {MenubarButtonProps} from '@common/text-editor/menubar/menubar-button-props';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {UnfoldMoreIcon} from '@common/icons/material/UnfoldMore';\nimport {UnfoldLessIcon} from '@common/icons/material/UnfoldLess';\n\nconst MenubarRowClassName =\n  'flex items-center px-4 h-42 text-muted border-b overflow-hidden';\n\ninterface Props extends MenubarButtonProps {\n  justify?: string;\n  hideInsertButton?: boolean;\n}\n\nexport function ArticleBodyEditorMenubar({\n  editor,\n  size = 'md',\n  justify = 'justify-center',\n  hideInsertButton = false,\n}: Props) {\n  const isMobile = useIsMobileMediaQuery();\n  const [extendedVisible, setExtendedVisible] = useState(false);\n  return (\n    <div className={clsx(extendedVisible ? 'h-84' : 'h-42')}>\n      <div className={clsx(MenubarRowClassName, justify, 'relative z-20')}>\n        <FormatMenuTrigger editor={editor} size={size} />\n        <Divider />\n        <FontStyleButtons editor={editor} size={size} />\n        <Divider />\n        <AlignButtons editor={editor} size={size} />\n        <IndentButtons editor={editor} size={size} />\n        <Divider />\n        {isMobile ? (\n          <IconButton\n            className=\"flex-shrink-0\"\n            color={extendedVisible ? 'primary' : null}\n            size={size}\n            onClick={() => {\n              setExtendedVisible(!extendedVisible);\n            }}\n          >\n            {extendedVisible ? <UnfoldLessIcon /> : <UnfoldMoreIcon />}\n          </IconButton>\n        ) : (\n          <ExtendedButtons\n            editor={editor}\n            size={size}\n            hideInsertButton={hideInsertButton}\n          />\n        )}\n      </div>\n      <AnimatePresence>\n        {extendedVisible && (\n          <m.div\n            className={clsx(\n              MenubarRowClassName,\n              justify,\n              'absolute flex h-full w-full',\n            )}\n            initial={{y: '-100%'}}\n            animate={{y: 0}}\n            exit={{y: '-100%'}}\n          >\n            <ExtendedButtons editor={editor} size={size} />\n          </m.div>\n        )}\n      </AnimatePresence>\n    </div>\n  );\n}\n\nfunction ExtendedButtons({editor, size = 'md', hideInsertButton}: Props) {\n  return (\n    <Fragment>\n      <ListButtons editor={editor} size={size} />\n      <Divider />\n      <LinkButton editor={editor} size={size} />\n      <ImageButton editor={editor} size={size} />\n      {!hideInsertButton && <InsertMenuTrigger editor={editor} size={size} />}\n      <Divider />\n      <ColorButtons editor={editor} size={size} />\n      <Divider />\n      <CodeBlockMenuTrigger editor={editor} size={size} />\n      <ClearFormatButton editor={editor} size={size} />\n    </Fragment>\n  );\n}\n","import {SlugEditor, SlugEditorProps} from '@common/ui/slug-editor';\nimport {useController, useFormContext} from 'react-hook-form';\nimport React, {Fragment, ReactNode, useEffect, useRef} from 'react';\nimport clsx from 'clsx';\nimport {useStickySentinel} from '@common/utils/hooks/sticky-sentinel';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport {Trans} from '@common/i18n/trans';\nimport {HistoryButtons} from '@common/text-editor/menubar/history-buttons';\nimport {ModeButton} from '@common/text-editor/menubar/mode-button';\nimport {ArticleBodyEditorMenubar} from './article-body-editor-menubar';\nimport {Editor} from '@tiptap/react';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\n\ninterface StickyHeaderProps {\n  editor: Editor;\n  allowSlugEditing?: boolean;\n  onSave?: (editorContent: string) => void;\n  saveButton?: ReactNode;\n  backLink: string;\n  isLoading?: boolean;\n  slugPrefix?: string;\n}\nexport function ArticleEditorStickyHeader({\n  editor,\n  allowSlugEditing = true,\n  onSave,\n  saveButton,\n  isLoading = false,\n  backLink,\n  slugPrefix = 'pages',\n}: StickyHeaderProps) {\n  const {isSticky, sentinelRef} = useStickySentinel();\n  const isMobile = useIsMobileMediaQuery();\n\n  return (\n    <Fragment>\n      <div ref={sentinelRef} />\n      <div\n        className={clsx(\n          'sticky top-0 z-10 mb-20 bg-paper',\n          isSticky && 'shadow',\n        )}\n      >\n        <div className=\"flex items-center justify-between gap-20 border-b px-20 py-10 text-muted sm:justify-start\">\n          {!isMobile && (\n            <Fragment>\n              <Button\n                variant=\"text\"\n                size=\"sm\"\n                elementType={Link}\n                to={backLink}\n                relative=\"path\"\n                startIcon={<ArrowBackIcon />}\n              >\n                <Trans message=\"Back\" />\n              </Button>\n              <div className=\"mr-auto\">\n                {allowSlugEditing && (\n                  <FormSlugEditor\n                    name=\"slug\"\n                    showLinkIcon={false}\n                    prefix={slugPrefix}\n                  />\n                )}\n              </div>\n            </Fragment>\n          )}\n          {editor && <HistoryButtons editor={editor} />}\n          {!isMobile && <ModeButton editor={editor} />}\n          {onSave && (\n            <SaveButton\n              onSave={() => {\n                onSave(editor.getHTML());\n              }}\n              isLoading={isLoading}\n            />\n          )}\n          {saveButton}\n        </div>\n        <ArticleBodyEditorMenubar editor={editor} size=\"sm\" />\n      </div>\n    </Fragment>\n  );\n}\n\ninterface SaveButtonProps {\n  onSave: () => void;\n  isLoading: boolean;\n}\nfunction SaveButton({onSave, isLoading}: SaveButtonProps) {\n  const form = useFormContext();\n  const title = form.watch('title');\n\n  return (\n    <Button\n      variant=\"flat\"\n      size=\"sm\"\n      color=\"primary\"\n      className=\"min-w-90\"\n      disabled={isLoading || !title}\n      onClick={() => onSave()}\n    >\n      <Trans message=\"Save\" />\n    </Button>\n  );\n}\n\ninterface FormSlugEditorProps extends SlugEditorProps {\n  name: string;\n}\nfunction FormSlugEditor({name, ...other}: FormSlugEditorProps) {\n  const {\n    field: {onChange, onBlur, value = '', ref},\n  } = useController({\n    name,\n  });\n  const manuallyChanged = useRef(false);\n\n  const {watch, setValue} = useFormContext<CreateCustomPagePayload>();\n\n  useEffect(() => {\n    const subscription = watch((formVal, {name: fieldName}) => {\n      // if user has not changed slug manually, set it based on page title field changes\n      if (fieldName === 'title' && !manuallyChanged.current) {\n        setValue('slug', formVal.title);\n      }\n    });\n    return () => subscription.unsubscribe();\n  }, [watch, setValue]);\n\n  return (\n    <SlugEditor\n      className={clsx(!value && 'invisible')}\n      onChange={e => {\n        manuallyChanged.current = true;\n        onChange(e);\n      }}\n      onInputBlur={onBlur}\n      value={value}\n      inputRef={ref}\n      {...other}\n    />\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\n\ninterface Response extends BackendResponse {\n  page: CustomPage;\n}\n\nexport function useCreateLinkPage() {\n  return useMutation({\n    mutationFn: (payload: CreateCustomPagePayload) => createPage(payload),\n    onError: err => showHttpErrorToast(err),\n    onSuccess: async () => {\n      await queryClient.invalidateQueries({queryKey: ['link-page']});\n      toast(message('Page created'));\n    },\n  });\n}\n\nfunction createPage(payload: CreateCustomPagePayload): Promise<Response> {\n  return apiClient.post('link-page', payload).then(r => r.data);\n}\n","import React, {Suspense} from 'react';\nimport {FormProvider, useForm} from 'react-hook-form';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {ArticleEditorTitle} from '@common/article-editor/article-editor-title';\nimport {ArticleEditorStickyHeader} from '@common/article-editor/article-editor-sticky-header';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {useCreateLinkPage} from '@app/dashboard/link-pages/requests/use-create-link-page';\n\nconst ArticleBodyEditor = React.lazy(\n  () => import('@common/article-editor/article-body-editor'),\n);\n\nexport function CreateLinkPage() {\n  const navigate = useNavigate();\n  const createPage = useCreateLinkPage();\n  const form = useForm<CreateCustomPagePayload>();\n\n  const handleSave = (editorContent: string) => {\n    createPage.mutate(\n      {\n        ...form.getValues(),\n        body: editorContent,\n      },\n      {\n        onSuccess: () => navigate('../', {relative: 'path'}),\n      },\n    );\n  };\n\n  return (\n    <Suspense fallback={<FullPageLoader />}>\n      <ArticleBodyEditor>\n        {(content, editor) => (\n          <FileUploadProvider>\n            <FormProvider {...form}>\n              <ArticleEditorStickyHeader\n                editor={editor}\n                isLoading={createPage.isPending}\n                onSave={handleSave}\n                backLink=\"../\"\n                allowSlugEditing={false}\n              />\n              <div className=\"mx-20\">\n                <div className=\"prose dark:prose-invert mx-auto flex-auto\">\n                  <ArticleEditorTitle />\n                  {content}\n                </div>\n              </div>\n            </FormProvider>\n          </FileUploadProvider>\n        )}\n      </ArticleBodyEditor>\n    </Suspense>\n  );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {useParams} from 'react-router-dom';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\n\nexport interface FetchCustomPageResponse extends BackendResponse {\n  page: CustomPage;\n}\n\nexport function useLinkPage(pageId?: number | string) {\n  const params = useParams();\n  if (!pageId) {\n    pageId = params.pageId;\n  }\n  return useQuery({\n    queryKey: ['link-page', `${pageId}`],\n    queryFn: () => fetchLinkPage(pageId!),\n  });\n}\n\nfunction fetchLinkPage(\n  slugOrId: number | string,\n): Promise<FetchCustomPageResponse> {\n  return apiClient.get(`link-page/${slugOrId}`).then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useParams} from 'react-router-dom';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\n\ninterface Response extends BackendResponse {\n  page: CustomPage;\n}\n\nexport function useUpdateLinkPage() {\n  const {pageId} = useParams();\n  return useMutation({\n    mutationFn: (payload: CreateCustomPagePayload) =>\n      updatePage(pageId!, payload),\n    onError: err => showHttpErrorToast(err),\n    onSuccess: async () => {\n      await queryClient.invalidateQueries({\n        queryKey: DatatableDataQueryKey('link-page'),\n      });\n      toast(message('Page updated'));\n    },\n  });\n}\n\nfunction updatePage(\n  pageId: number | string,\n  payload: CreateCustomPagePayload,\n): Promise<Response> {\n  return apiClient.put(`link-page/${pageId}`, payload).then(r => r.data);\n}\n","import React, {Fragment, Suspense} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {CustomPage} from '@common/admin/custom-pages/custom-page';\nimport {FormProvider, useForm} from 'react-hook-form';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {ArticleEditorTitle} from '@common/article-editor/article-editor-title';\nimport {ArticleEditorStickyHeader} from '@common/article-editor/article-editor-sticky-header';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {useLinkPage} from '@app/dashboard/link-pages/requests/use-link-page';\nimport {useUpdateLinkPage} from '@app/dashboard/link-pages/requests/use-update-link-page';\n\nconst ArticleBodyEditor = React.lazy(\n  () => import('@common/article-editor/article-body-editor'),\n);\n\nexport function EditLinkPage() {\n  const query = useLinkPage();\n\n  return query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent page={query.data.page} />\n    </Fragment>\n  ) : (\n    <div className=\"relative w-full h-full\">\n      <PageStatus query={query} />\n    </div>\n  );\n}\n\ninterface PageContentProps {\n  page: CustomPage;\n}\nfunction PageContent({page}: PageContentProps) {\n  const navigate = useNavigate();\n  const updatePage = useUpdateLinkPage();\n  const form = useForm<CreateCustomPagePayload>({\n    defaultValues: {\n      title: page.title,\n      slug: page.slug,\n      body: page.body,\n    },\n  });\n\n  const handleSave = (editorContent: string) => {\n    updatePage.mutate(\n      {\n        ...form.getValues(),\n        body: editorContent,\n      },\n      {\n        onSuccess: () => navigate('../..', {relative: 'path'}),\n      },\n    );\n  };\n\n  return (\n    <Suspense fallback={<FullPageLoader />}>\n      <ArticleBodyEditor initialContent={page.body}>\n        {(content, editor) => (\n          <FileUploadProvider>\n            <FormProvider {...form}>\n              <ArticleEditorStickyHeader\n                editor={editor}\n                backLink=\"../..\"\n                isLoading={updatePage.isPending}\n                onSave={handleSave}\n                allowSlugEditing={false}\n              />\n              <div className=\"mx-20\">\n                <div className=\"prose dark:prose-invert mx-auto flex-auto\">\n                  <ArticleEditorTitle />\n                  {content}\n                </div>\n              </div>\n            </FormProvider>\n          </FileUploadProvider>\n        )}\n      </ArticleBodyEditor>\n    </Suspense>\n  );\n}\n","import {Navigate, RouteObject, useRoutes} from 'react-router-dom';\nimport React from 'react';\nimport {AuthRoute} from '@common/auth/guards/auth-route';\nimport {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\nimport {BelinkDashboardLayout} from './layout/belink-dasbboard-layout';\nimport {AllClicksReportPage} from './all-clicks-report-page';\nimport {LinksDatablePage} from './links/links-datatable-page/links-datatable-page';\nimport {LinkGroupsLinksDatatablePage} from './link-groups/link-group-links-datatable-page/link-group-links-datatable-page';\nimport {LinkGroupsDatatablePage} from './link-groups/link-groups-datatable-page/link-groups-datatable-page';\nimport {LinkGroupClicksReportPage} from '@app/dashboard/link-groups/link-group-clicks-report-page';\nimport {LinkClicksReportPage} from '@app/dashboard/links/link-clicks-report-page';\nimport {DomainsDatatablePage} from '@app/dashboard/custom-domains/domains-datatable-page';\nimport {TrackingPixelsDatablePage} from '@app/dashboard/tracking-pixels/tracking-pixels-datatable-page';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {LinkPagesDatatablePage} from '@app/dashboard/link-pages/link-pages-datatable-page';\nimport {LinkOverlaysDatatablePage} from '@app/dashboard/link-overlays/link-overlays-datatable-page';\nimport {CreateLinkOverlayPage} from '@app/dashboard/link-overlays/crupdate/create-link-overlay-page';\nimport {UpdateLinkOverlayPage} from '@app/dashboard/link-overlays/crupdate/update-link-overlay-page';\nimport {BioLinksDatatablePage} from '@app/dashboard/biolink/biolinks-datatable-page/biolinks-datatable-page';\nimport {BiolinkClicksReportPage} from '@app/dashboard/biolink/biolink-clicks-report-page';\nimport {BiolinkEditorPage} from '@app/dashboard/biolink/biolink-editor/biolink-editor-page';\nimport {CreateLinkPage} from '@app/dashboard/link-pages/create-link-page';\nimport {EditLinkPage} from '@app/dashboard/link-pages/edit-link-page';\n\nexport const SharedDashboardRoutes = ({forCurrentUser = false}) => {\n  return [\n    // links\n    {\n      path: 'links',\n      element: <LinksDatablePage forCurrentUser={forCurrentUser} />,\n    },\n    {\n      path: 'links/:linkId',\n      element: <LinkClicksReportPage />,\n    },\n\n    // biolinks\n    {\n      path: 'biolinks',\n      element: <BioLinksDatatablePage forCurrentUser={forCurrentUser} />,\n    },\n    {\n      path: 'biolinks/:biolinkId',\n      element: <BiolinkClicksReportPage />,\n    },\n    {\n      path: 'biolinks/:biolinkId/edit',\n      element: <Navigate to=\"content\" replace />,\n    },\n    {\n      path: 'biolinks/:biolinkId/edit/:tabName',\n      element: <BiolinkEditorPage />,\n    },\n\n    // groups\n    {\n      path: 'link-groups',\n      element: <LinkGroupsDatatablePage forCurrentUser={forCurrentUser} />,\n    },\n    {\n      path: 'link-groups/:groupId',\n      element: <LinkGroupClicksReportPage />,\n    },\n    {\n      path: 'link-groups/:groupId/links',\n      element: <LinkGroupsLinksDatatablePage />,\n    },\n    {\n      path: 'link-groups/:groupId/links/:linkId',\n      element: <LinkClicksReportPage />,\n    },\n\n    // domains\n    {\n      path: 'custom-domains',\n      element: <DomainsDatatablePage forCurrentUser={forCurrentUser} />,\n    },\n\n    // tracking pixels\n    {\n      path: 'pixels',\n      element: <TrackingPixelsDatablePage forCurrentUser={forCurrentUser} />,\n    },\n\n    // overlays\n    {\n      path: 'link-overlays',\n      element: <LinkOverlaysDatatablePage forCurrentUser={forCurrentUser} />,\n    },\n    {\n      path: 'link-overlays/new',\n      element: <CreateLinkOverlayPage />,\n    },\n    {\n      path: 'link-overlays/:overlayId/edit',\n      element: <UpdateLinkOverlayPage />,\n    },\n  ];\n};\n\nexport default function DashboardRoutes() {\n  const {workspaceId} = useActiveWorkspaceId();\n  const DashboardRouteConfig: RouteObject[] = [\n    {\n      path: '/',\n      element: (\n        <AuthRoute>\n          <BelinkDashboardLayout />\n        </AuthRoute>\n      ),\n      children: [\n        {index: true, element: <AllClicksReportPage />},\n\n        // link pages\n        {\n          path: 'link-pages',\n          element: <LinkPagesDatatablePage forCurrentUser={!workspaceId} />,\n        },\n        {\n          path: 'link-pages/new',\n          element: <CreateLinkPage />,\n        },\n        {\n          path: 'link-pages/:pageId/edit',\n          element: <EditLinkPage />,\n        },\n\n        ...SharedDashboardRoutes({forCurrentUser: !workspaceId}),\n      ],\n    },\n    {path: '*', element: <NotFoundPage />},\n  ];\n\n  return useRoutes(DashboardRouteConfig);\n}\n"],"names":["FilterControlType","FilterOperator","_a","_b","now","isSameMonth","getSizeClassName","isHourSegment","encodedFilters","decodedFilters","endpoint","params","response","Select","lazy","LoadingSkeleton","value","FilterList","names","query","deleteSelectedRows","exportCsv","target","useLayoutEffect","m","options","createWorkspace","Fragment","removeMember","MenuItem","updateWorkspace","workspaceId","deleteWorkspace","Footer","locale","formattedData","InfoTrigger","message","RemoveButton","createLink","updateLink","RouterLink","columns","filters","Actions","moveLinks","linkSvg","useNavigate","createLinkGroup","seedInitialDataFromPaginatedList","link","deleteDomain","ConnectDomainStep","authorize","queryClient","connectDomain","createPixel","updatePage","createOverlay","SaveButton","PageContent","updateItem","InfoSection","detachItem","sortContent","ActionRow","WidgetType","Dialog","Tab","FontSelector","saveAppearance","CommonFontSelector","Option","ArticleBodyEditor","createPage"],"mappings":"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"}
Back to Directory File Manager