Bootstrap files and folders cleanup (#27692)

* Remove icons folder

* Create folders for badge, button, and dropdown components

* Remove Bootstrap 5 from test

* Rename `getBootstrap5Breakpoint` to `getBootstrapBreakpoint`

* Cleanup and update BS 5 comments

* Move components to the shared folder

* Rename `tooltips-bs5` to `tooltip`

* Remove `-bs5` suffix

* Fix path

* Delete BS3 version file

* Rename `_form_marketing-bootstrap-5` to `_form_marketing`

* Delete BS3 version file

* Rename `_contact_general_modal-marketing-bootstrap-5` to `_contact_general_modal-marketing`

* Delete BS3 version file

* Rename `_contact_modal-marketing-bootstrap-5` to `_contact_modal-marketing`

* Delete BS3 version file

* Rename `thin-footer-bootstrap-5` to `thin-footer`

* Delete BS3 version file

* Rename `language-picker-bootstrap-5` to `language-picker`

* Rename `fat-footer-react-bootstrap-5` to `fat-footer-react`

* Delete BS3 version file

* Rename `navbar-marketing-bootstrap-5` to `navbar-marketing`

* Rename `navbar-marketing-react-bootstrap-5` to `navbar-marketing-react`

* Delete BS3 version file

* Rename `layout-website-redesign-cms-bootstrap-5` to `layout-website-redesign-cms`

* Source format

* Fix path

GitOrigin-RevId: cf0f5db7c84cf545c69213dcc271d9ff17fe5db7
This commit is contained in:
Rebeka Dekany
2025-08-11 08:06:16 +00:00
committed by Copybot
parent bd8493dba6
commit d751b88e6b
516 changed files with 1507 additions and 1311 deletions
+3 -3
View File
@@ -8,20 +8,20 @@ block entrypointVar
block body
if typeof suppressNavbar === 'undefined'
include layout/navbar-marketing-bootstrap-5
include layout/navbar-marketing
block content
if typeof suppressFooter === 'undefined'
if showThinFooter
include layout/thin-footer-bootstrap-5
include layout/thin-footer
else
include layout/fat-footer
if typeof suppressPugCookieBanner == 'undefined'
include _cookie_banner
!= moduleIncludes('contactModal-marketing-bootstrap-5', locals)
!= moduleIncludes('contactModal-marketing', locals)
block prepend foot-scripts
+bootstrap-js
+5 -5
View File
@@ -1,5 +1,5 @@
//- This is used for pages that are migrated to Bootstrap 5 but don't use Bootstrap's own JS, instead using
//- react-bootstrap for all Bootstrap components
//- Avoids including Bootstrap's own JS to prevent conflicts with react-bootstrap,
//- since Bootstrap 5's JS and react-bootstrap should not be used together on the same page.
extends ./layout-base
include ./_mixins/formMessages
@@ -59,15 +59,15 @@ block append meta
block body
if typeof suppressNavbar === 'undefined'
include layout/navbar-marketing-react-bootstrap-5
include layout/navbar-marketing-react
block content
if typeof suppressFooter === 'undefined'
if showThinFooter
include layout/thin-footer-bootstrap-5
include layout/thin-footer
else
include layout/fat-footer-react-bootstrap-5
include layout/fat-footer-react
if typeof suppressPugCookieBanner === 'undefined'
include _cookie_banner
@@ -11,13 +11,13 @@ block append meta
block body
if typeof suppressNavbar == 'undefined'
include layout/navbar-marketing-bootstrap-5
include layout/navbar-marketing
block content
if typeof suppressFooter == 'undefined'
if showThinFooter
include layout/thin-footer-bootstrap-5
include layout/thin-footer
else
include layout/fat-footer-website-redesign
@@ -25,7 +25,7 @@ block body
include _cookie_banner
block contactModal
!= moduleIncludes('contactModal-marketing-bootstrap-5', locals)
!= moduleIncludes('contactModal-marketing', locals)
block prepend foot-scripts
+bootstrap-js
@@ -5,7 +5,7 @@
a(href='/legal') #{translate('privacy_and_terms')}
a(href='https://www.digital-science.com/security-certifications/') #{translate('compliance')}
ul.fat-footer-base-item.list-unstyled.fat-footer-base-language
include language-picker-bootstrap-5
include language-picker
.fat-footer-base-section.fat-footer-base-social
.fat-footer-base-item
a.fat-footer-social.x-logo(href='https://x.com/overleaf')
@@ -1,35 +0,0 @@
include ../_mixins/material_symbol
li.dropdown.dropup.subdued.language-picker(dropdown)
button#language-picker-toggle.btn.btn-link.btn-inline-link(
dropdown-toggle
data-ol-lang-selector-tooltip
data-bs-toggle='dropdown'
aria-haspopup='true'
aria-expanded='false'
aria-label='Select ' + translate('language')
tooltip=translate('language')
title=translate('language')
)
+material-symbol('translate')
|  
span.language-picker-text #{settings.translatedLanguages[currentLngCode]}
ul.dropdown-menu.dropdown-menu-sm-width(
role='menu'
aria-labelledby='language-picker-toggle'
)
li.dropdown-header #{translate("language")}
each subdomainDetails, subdomain in settings.i18n.subdomainLang
if !subdomainDetails.hide
- let isActive = subdomainDetails.lngCode === currentLngCode
li.lng-option
a.menu-indent(
href=subdomainDetails.url + currentUrlWithQueryParams
role='menuitem'
class=['dropdown-item', {active: isActive}]
aria-selected=isActive ? 'true' : 'false'
)
| #{settings.translatedLanguages[subdomainDetails.lngCode]}
if subdomainDetails.lngCode === currentLngCode
+material-symbol('check', 'dropdown-item-trailing-icon')
@@ -1,27 +1,35 @@
include ../_mixins/material_symbol
li.dropdown.dropup.subdued.language-picker(dropdown)
a#language-picker-toggle.dropdown-toggle(
href='#'
button#language-picker-toggle.btn.btn-link.btn-inline-link(
dropdown-toggle
data-ol-lang-selector-tooltip
data-toggle='dropdown'
role='button'
data-bs-toggle='dropdown'
aria-haspopup='true'
aria-expanded='false'
aria-label='Select ' + translate('language')
tooltip=translate('language')
title=translate('language')
)
i.fa.fa-fw.fa-language
|
| #{settings.translatedLanguages[currentLngCode]}
+material-symbol('translate')
|  
span.language-picker-text #{settings.translatedLanguages[currentLngCode]}
ul.dropdown-menu(role='menu' aria-labelledby='language-picker-toggle')
ul.dropdown-menu.dropdown-menu-sm-width(
role='menu'
aria-labelledby='language-picker-toggle'
)
li.dropdown-header #{translate("language")}
each subdomainDetails, subdomain in settings.i18n.subdomainLang
if !subdomainDetails.hide
- let isActive = subdomainDetails.lngCode === currentLngCode
li.lng-option
a.menu-indent(
href=subdomainDetails.url + currentUrlWithQueryParams
role='menuitem'
class=['dropdown-item', {active: isActive}]
aria-selected=isActive ? 'true' : 'false'
)
| #{settings.translatedLanguages[subdomainDetails.lngCode]}
if subdomainDetails.lngCode === currentLngCode
+material-symbol('check', 'dropdown-item-trailing-icon')
@@ -1,212 +0,0 @@
include ../_mixins/navbar
include ../_mixins/material_symbol
nav.navbar.navbar-default.navbar-main.navbar-expand-lg(
class={
'website-redesign-navbar': isWebsiteRedesign,
}
aria-label=translate('primary')
)
.container-fluid.navbar-container
.navbar-header
if settings.nav.custom_logo
a.navbar-brand(
href='/'
aria-label=settings.appName
style='background-image:url("' + settings.nav.custom_logo + '")'
)
else if nav.title
a.navbar-title(href='/' aria-label=settings.appName) #{nav.title}
else
a.navbar-brand(href='/' aria-label=settings.appName)
- var enableUpgradeButton = projectDashboardReact && usersBestSubscription && (usersBestSubscription.type === 'free' || usersBestSubscription.type === 'standalone-ai-add-on')
if enableUpgradeButton
a.btn.btn-primary.me-2.d-md-none(
href='/user/subscription/plans'
event-tracking='upgrade-button-click'
event-tracking-mb='true'
event-tracking-label='upgrade'
event-tracking-trigger='click'
event-segmentation={source: 'dashboard-top', projectDashboardReact: 'enabled', isDashboardSidebarHidden: 'true', isScreenWidthLessThan768px: 'true'}
) #{translate("upgrade")}
- var canDisplayAdminMenu = hasAdminAccess()
- var canDisplayAdminRedirect = canRedirectToAdminDomain()
- var canDisplaySplitTestMenu = hasFeature('saas') && (canDisplayAdminMenu || (getSessionUser() && getSessionUser().staffAccess && (getSessionUser().staffAccess.splitTestMetrics || getSessionUser().staffAccess.splitTestManagement)))
- var canDisplaySurveyMenu = hasFeature('saas') && canDisplayAdminMenu
- var canDisplayScriptLogMenu = hasFeature('saas') && hasAdminCapability('view-script-log') && canDisplayAdminMenu
if typeof suppressNavbarRight === 'undefined'
button#navbar-toggle-btn.navbar-toggler.collapsed(
type='button'
data-bs-toggle='collapse'
data-bs-target='#navbar-main-collapse'
aria-controls='navbar-main-collapse'
aria-expanded='false'
aria-label='Toggle ' + translate('navigation')
)
+material-symbol('menu')
#navbar-main-collapse.navbar-collapse.collapse
ul.nav.navbar-nav.navbar-right.ms-auto(role='menubar')
if canDisplayAdminMenu || canDisplayAdminRedirect || canDisplaySplitTestMenu
+nav-item.dropdown.subdued
button.dropdown-toggle(
aria-haspopup='true'
aria-expanded='false'
data-bs-toggle='dropdown'
role='menuitem'
event-tracking='menu-expand'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: 'admin', location: 'top-menu'}
)
| Admin
+dropdown-menu.dropdown-menu-end
if canDisplayAdminMenu
+dropdown-menu-link-item(href='/admin') Manage Site
+dropdown-menu-link-item(href='/admin/user') Manage Users
+dropdown-menu-link-item(href='/admin/project') Project URL Lookup
if canDisplayAdminRedirect
+dropdown-menu-link-item(href=settings.adminUrl) Switch to Admin
if canDisplaySplitTestMenu
+dropdown-menu-link-item(href='/admin/split-test') Manage Feature Flags
if canDisplaySurveyMenu
+dropdown-menu-link-item(href='/admin/survey') Manage Surveys
if canDisplayScriptLogMenu
+dropdown-menu-link-item(href='/admin/script-logs') View Script Logs
// loop over header_extras
each item in nav.header_extras
-
if ((item.only_when_logged_in && getSessionUser())
|| (item.only_when_logged_out && (!getSessionUser()))
|| (!item.only_when_logged_out && !item.only_when_logged_in && !item.only_content_pages)
|| (item.only_content_pages && (typeof suppressNavContentLinks === "undefined" || !suppressNavContentLinks))
){
var showNavItem = true
} else {
var showNavItem = false
}
if showNavItem
if item.dropdown
+nav-item.dropdown(class=item.class)
button.dropdown-toggle(
aria-haspopup='true'
aria-expanded='false'
data-bs-toggle='dropdown'
role='menuitem'
event-tracking='menu-expand'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: item.trackingKey, location: 'top-menu'}
)
| !{translate(item.text)}
+dropdown-menu.dropdown-menu-end
each child in item.dropdown
if child.divider
+dropdown-menu-divider
else if child.isContactUs
+dropdown-menu-link-item(
data-ol-open-contact-form-modal='contact-us'
data-bs-target='#contactUsModal'
href
data-bs-toggle='modal'
event-tracking='menu-click'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: 'contact', location: 'top-menu'}
)
span
| #{translate("contact_us")}
else
if child.url
+dropdown-menu-link-item(
href=child.url
class=child.class
event-tracking='menu-click'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: child.trackingKey, location: 'top-menu'}
) !{translate(child.text)}
else
+dropdown-menu-item
| !{translate(child.text)}
else
+nav-item(class=item.class)
if item.url
+nav-link(
href=item.url
class=item.class
event-tracking='menu-click'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: item.trackingKey, location: 'top-menu'}
) !{translate(item.text)}
else
| !{translate(item.text)}
// logged out
if !getSessionUser()
// register link
if hasFeature('registration-page')
+nav-item.primary
+nav-link(
href='/register'
event-tracking='menu-click'
event-tracking-action='clicked'
event-tracking-trigger='click'
event-tracking-mb='true'
event-segmentation={page: currentUrl, item: 'register', location: 'top-menu'}
) #{translate('sign_up')}
// login link
+nav-item
+nav-link(
href='/login'
event-tracking='menu-click'
event-tracking-action='clicked'
event-tracking-trigger='click'
event-tracking-mb='true'
event-segmentation={page: currentUrl, item: 'login', location: 'top-menu'}
) #{translate('log_in')}
// projects link and account menu
if getSessionUser()
+nav-item
+nav-link(href='/project') #{translate('Projects')}
+nav-item.dropdown
button.dropdown-toggle(
aria-haspopup='true'
aria-expanded='false'
data-bs-toggle='dropdown'
role='menuitem'
event-tracking='menu-expand'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: 'account', location: 'top-menu'}
)
| #{translate('Account')}
+dropdown-menu.dropdown-menu-end
+dropdown-menu-item
.disabled.dropdown-item #{getSessionUser().email}
+dropdown-menu-divider
+dropdown-menu-link-item(href='/user/settings') #{translate('account_settings')}
if nav.showSubscriptionLink
+dropdown-menu-link-item(href='/user/subscription') #{translate('subscription')}
+dropdown-menu-divider
+dropdown-menu-item
//-
The button is outside the form but still belongs to it via the form attribute. The reason to do
this is that if the button is inside the form, screen readers will not count it in the total
number of menu items.
button.btn-link.text-left.dropdown-menu-button.dropdown-item(
role='menuitem'
tabindex='-1'
form='logOutForm'
)
| #{translate('log_out')}
form(method='POST' action='/logout' id='logOutForm')
input(name='_csrf' type='hidden' value=csrfToken)
+100 -105
View File
@@ -1,35 +1,14 @@
nav.navbar.navbar-default.navbar-main(
include ../_mixins/navbar
include ../_mixins/material_symbol
nav.navbar.navbar-default.navbar-main.navbar-expand-lg(
class={
'website-redesign-navbar': isWebsiteRedesign,
}
aria-label=translate('primary')
)
.container-fluid
.container-fluid.navbar-container
.navbar-header
if typeof suppressNavbarRight == 'undefined'
button.navbar-toggle.collapsed(
type='button'
data-toggle='collapse'
data-target='#navbar-main-collapse'
aria-label='Toggle ' + translate('navigation')
)
i.fa.fa-bars(aria-hidden='true')
- var enableUpgradeButton = projectDashboardReact && usersBestSubscription && (usersBestSubscription.type === 'free' || usersBestSubscription.type === 'standalone-ai-add-on')
if enableUpgradeButton
//- prettier-ignore
a.btn.btn-primary.float-end.me-2.visible-xs(
href='/user/subscription/plans'
event-tracking='upgrade-button-click'
event-tracking-mb='true'
event-tracking-label='upgrade'
event-tracking-trigger='click'
event-segmentation={
source: "dashboard-top",
"project-dashboard-react": "enabled",
"is-dashboard-sidebar-hidden": "true",
"is-screen-width-less-than-768px": "true"
}
) #{translate("upgrade")}
if settings.nav.custom_logo
a.navbar-brand(
href='/'
@@ -41,50 +20,62 @@ nav.navbar.navbar-default.navbar-main(
else
a.navbar-brand(href='/' aria-label=settings.appName)
- var enableUpgradeButton = projectDashboardReact && usersBestSubscription && (usersBestSubscription.type === 'free' || usersBestSubscription.type === 'standalone-ai-add-on')
if enableUpgradeButton
a.btn.btn-primary.me-2.d-md-none(
href='/user/subscription/plans'
event-tracking='upgrade-button-click'
event-tracking-mb='true'
event-tracking-label='upgrade'
event-tracking-trigger='click'
event-segmentation={source: 'dashboard-top', projectDashboardReact: 'enabled', isDashboardSidebarHidden: 'true', isScreenWidthLessThan768px: 'true'}
) #{translate("upgrade")}
- var canDisplayAdminMenu = hasAdminAccess()
- var canDisplayAdminRedirect = canRedirectToAdminDomain()
- var canDisplaySplitTestMenu = hasFeature('saas') && (canDisplayAdminMenu || (getSessionUser() && getSessionUser().staffAccess && (getSessionUser().staffAccess.splitTestMetrics || getSessionUser().staffAccess.splitTestManagement)))
- var canDisplaySurveyMenu = hasFeature('saas') && canDisplayAdminMenu
- var canDisplayScriptLogMenu = hasFeature('saas') && hasAdminCapability('view-script-log') && canDisplayAdminMenu
if typeof suppressNavbarRight == 'undefined'
if typeof suppressNavbarRight === 'undefined'
button#navbar-toggle-btn.navbar-toggler.collapsed(
type='button'
data-bs-toggle='collapse'
data-bs-target='#navbar-main-collapse'
aria-controls='navbar-main-collapse'
aria-expanded='false'
aria-label='Toggle ' + translate('navigation')
)
+material-symbol('menu')
#navbar-main-collapse.navbar-collapse.collapse
ul.nav.navbar-nav.navbar-right
ul.nav.navbar-nav.navbar-right.ms-auto(role='menubar')
if canDisplayAdminMenu || canDisplayAdminRedirect || canDisplaySplitTestMenu
li.dropdown.subdued
a.dropdown-toggle(
href='#'
role='button'
+nav-item.dropdown.subdued
button.dropdown-toggle(
aria-haspopup='true'
aria-expanded='false'
data-toggle='dropdown'
data-bs-toggle='dropdown'
role='menuitem'
event-tracking='menu-expand'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: 'admin', location: 'top-menu'}
)
| Admin
span.caret
ul.dropdown-menu
+dropdown-menu.dropdown-menu-end
if canDisplayAdminMenu
li
a(href='/admin') Manage Site
li
a(href='/admin/user') Manage Users
li
a(href='/admin/project') Project URL Lookup
+dropdown-menu-link-item(href='/admin') Manage Site
+dropdown-menu-link-item(href='/admin/user') Manage Users
+dropdown-menu-link-item(href='/admin/project') Project URL Lookup
if canDisplayAdminRedirect
li
a(href=settings.adminUrl) Switch to Admin
+dropdown-menu-link-item(href=settings.adminUrl) Switch to Admin
if canDisplaySplitTestMenu
li
a(href='/admin/split-test') Manage Feature Flags
+dropdown-menu-link-item(href='/admin/split-test') Manage Feature Flags
if canDisplaySurveyMenu
li
a(href='/admin/survey') Manage Surveys
+dropdown-menu-link-item(href='/admin/survey') Manage Surveys
if canDisplayScriptLogMenu
li
a(href='/admin/script-logs') View Script Logs
+dropdown-menu-link-item(href='/admin/script-logs') View Script Logs
// loop over header_extras
each item in nav.header_extras
@@ -92,8 +83,8 @@ nav.navbar.navbar-default.navbar-main(
if ((item.only_when_logged_in && getSessionUser())
|| (item.only_when_logged_out && (!getSessionUser()))
|| (!item.only_when_logged_out && !item.only_when_logged_in && !item.only_content_pages)
|| (item.only_content_pages && (typeof (suppressNavContentLinks) == "undefined" || !suppressNavContentLinks))
) {
|| (item.only_content_pages && (typeof suppressNavContentLinks === "undefined" || !suppressNavContentLinks))
){
var showNavItem = true
} else {
var showNavItem = false
@@ -101,53 +92,52 @@ nav.navbar.navbar-default.navbar-main(
if showNavItem
if item.dropdown
li.dropdown(class=item.class)
a.dropdown-toggle(
href='#'
role='button'
+nav-item.dropdown(class=item.class)
button.dropdown-toggle(
aria-haspopup='true'
aria-expanded='false'
data-toggle='dropdown'
data-bs-toggle='dropdown'
role='menuitem'
event-tracking='menu-expand'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: item.trackingKey, location: 'top-menu'}
)
| !{translate(item.text)}
span.caret
ul.dropdown-menu
+dropdown-menu.dropdown-menu-end
each child in item.dropdown
if child.divider
li.divider
+dropdown-menu-divider
else if child.isContactUs
li
a(
data-ol-open-contact-form-modal='contact-us'
href
+dropdown-menu-link-item(
data-ol-open-contact-form-modal='contact-us'
data-bs-target='#contactUsModal'
href
data-bs-toggle='modal'
event-tracking='menu-click'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: 'contact', location: 'top-menu'}
)
span
| #{translate("contact_us")}
else
if child.url
+dropdown-menu-link-item(
href=child.url
class=child.class
event-tracking='menu-click'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: 'contact', location: 'top-menu'}
)
span
| #{translate("contact_us")}
else
li
if child.url
a(
href=child.url
class=child.class
event-tracking='menu-click'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: item.trackingKey, location: 'top-menu'}
) !{translate(child.text)}
else
event-segmentation={item: child.trackingKey, location: 'top-menu'}
) !{translate(child.text)}
else
+dropdown-menu-item
| !{translate(child.text)}
else
li(class=item.class)
+nav-item(class=item.class)
if item.url
a(
+nav-link(
href=item.url
class=item.class
event-tracking='menu-click'
@@ -162,8 +152,8 @@ nav.navbar.navbar-default.navbar-main(
if !getSessionUser()
// register link
if hasFeature('registration-page')
li.primary
a(
+nav-item.primary
+nav-link(
href='/register'
event-tracking='menu-click'
event-tracking-action='clicked'
@@ -173,8 +163,8 @@ nav.navbar.navbar-default.navbar-main(
) #{translate('sign_up')}
// login link
li
a(
+nav-item
+nav-link(
href='/login'
event-tracking='menu-click'
event-tracking-action='clicked'
@@ -185,33 +175,38 @@ nav.navbar.navbar-default.navbar-main(
// projects link and account menu
if getSessionUser()
li
a(href='/project') #{translate('Projects')}
li.dropdown
a.dropdown-toggle(
href='#'
role='button'
+nav-item
+nav-link(href='/project') #{translate('Projects')}
+nav-item.dropdown
button.dropdown-toggle(
aria-haspopup='true'
aria-expanded='false'
data-toggle='dropdown'
data-bs-toggle='dropdown'
role='menuitem'
event-tracking='menu-expand'
event-tracking-mb='true'
event-tracking-trigger='click'
event-segmentation={item: 'account', location: 'top-menu'}
)
| #{translate('Account')}
span.caret
ul.dropdown-menu
li
.subdued #{getSessionUser().email}
li.divider.hidden-xs.hidden-sm
li
a(href='/user/settings') #{translate('account_settings')}
+dropdown-menu.dropdown-menu-end
+dropdown-menu-item
.disabled.dropdown-item #{getSessionUser().email}
+dropdown-menu-divider
+dropdown-menu-link-item(href='/user/settings') #{translate('account_settings')}
if nav.showSubscriptionLink
li
a(href='/user/subscription') #{translate('subscription')}
li.divider.hidden-xs.hidden-sm
li
form(method='POST' action='/logout')
+dropdown-menu-link-item(href='/user/subscription') #{translate('subscription')}
+dropdown-menu-divider
+dropdown-menu-item
//-
The button is outside the form but still belongs to it via the form attribute. The reason to do
this is that if the button is inside the form, screen readers will not count it in the total
number of menu items.
button.btn-link.text-left.dropdown-menu-button.dropdown-item(
role='menuitem'
tabindex='-1'
form='logOutForm'
)
| #{translate('log_out')}
form(method='POST' action='/logout' id='logOutForm')
input(name='_csrf' type='hidden' value=csrfToken)
button.btn-link.text-left.dropdown-menu-button #{translate('log_out')}
@@ -1,38 +0,0 @@
footer.site-footer
- var showLanguagePicker = Object.keys(settings.i18n.subdomainLang).length > 1
- var hasCustomLeftNav = nav.left_footer && nav.left_footer.length > 0
.site-footer-content.hidden-print
.row
ul.site-footer-items.col-lg-9
if !settings.nav.hide_powered_by
li
//- year of Server Pro release, static
| © 2025
|
a(href='https://www.overleaf.com/for/enterprises') Powered by Overleaf
if showLanguagePicker || hasCustomLeftNav
li
strong.text-muted |
if showLanguagePicker
include language-picker-bootstrap-5
if showLanguagePicker && hasCustomLeftNav
li
strong.text-muted |
each item in nav.left_footer
li
if item.url
a(href=item.url class=item.class) !{translate(item.text)}
else
| !{item.text}
ul.site-footer-items.col-lg-3.text-end
each item in nav.right_footer
li
if item.url
a(href=item.url class=item.class aria-label=item.label) !{item.text}
else
| !{item.text}
@@ -3,10 +3,8 @@ footer.site-footer
- var hasCustomLeftNav = nav.left_footer && nav.left_footer.length > 0
.site-footer-content.hidden-print
.row
ul.col-md-9
if hasFeature('saas')
li © #{new Date().getFullYear()} Overleaf
else if !settings.nav.hide_powered_by
ul.site-footer-items.col-lg-9
if !settings.nav.hide_powered_by
li
//- year of Server Pro release, static
| © 2025
@@ -31,7 +29,7 @@ footer.site-footer
else
| !{item.text}
ul.col-md-3.text-right
ul.site-footer-items.col-lg-3.text-end
each item in nav.right_footer
li
if item.url
@@ -11,8 +11,7 @@ block content
.card.text-center
.card-body
.page-header
// TODO: Remove `team-invite-name` once we fully migrated to Bootstrap 5
h1.text-center !{translate("invited_to_group", {inviterName: inviterName, appName: appName }, [{name: 'span', attrs: {class: 'team-invite-name'}}])}
h1.text-center !{translate("invited_to_group", {inviterName: inviterName, appName: appName })}
if accountExists
div
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLNotification from '@/shared/components/ol/ol-notification'
import OLButton from '@/shared/components/ol/ol-button'
interface ChatFallbackErrorProps {
reconnect?: () => void
@@ -8,13 +8,13 @@ import {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
} from '@/shared/components/ol/ol-modal'
import Notification from '@/shared/components/notification'
import OLForm from '@/features/ui/components/ol/ol-form'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLFormLabel from '@/features/ui/components/ol/ol-form-label'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLForm from '@/shared/components/ol/ol-form'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLFormControl from '@/shared/components/ol/ol-form-control'
import OLFormLabel from '@/shared/components/ol/ol-form-label'
import OLButton from '@/shared/components/ol/ol-button'
import { Tag } from '../../../../../app/src/Features/Tags/types'
export default function CloneProjectModalContent({
@@ -1,6 +1,6 @@
import React, { memo, useCallback, useState } from 'react'
import CloneProjectModalContent from './clone-project-modal-content'
import OLModal from '@/features/ui/components/ol/ol-modal'
import OLModal from '@/shared/components/ol/ol-modal'
import { ClonedProject } from '../../../../../types/project/dashboard/api'
import { Tag } from '../../../../../app/src/Features/Tags/types'
@@ -1,7 +1,7 @@
import { FC } from 'react'
import { Tag as TagType } from '../../../../../app/src/Features/Tags/types'
import { getTagColor } from '@/features/project-list/util/tag'
import Tag from '@/features/ui/components/bootstrap-5/tag'
import Tag from '@/shared/components/tag'
export const CloneProjectTag: FC<{
tag: TagType
@@ -1,5 +1,5 @@
import useWaitForI18n from '@/shared/hooks/use-wait-for-i18n'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
import { Trans, useTranslation } from 'react-i18next'
import { Interstitial } from '@/shared/components/interstitial'
@@ -8,11 +8,11 @@ import {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLIconButton from '@/features/ui/components/ol/ol-icon-button'
} from '@/shared/components/ol/ol-modal'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import OLNotification from '@/shared/components/ol/ol-notification'
import OLButton from '@/shared/components/ol/ol-button'
import OLIconButton from '@/shared/components/ol/ol-icon-button'
import { learnedWords as initialLearnedWords } from '@/features/source-editor/extensions/spelling/learned-words'
type DictionaryModalContentProps = {
@@ -1,7 +1,7 @@
import React from 'react'
import DictionaryModalContent from './dictionary-modal-content'
import withErrorBoundary from '../../../infrastructure/error-boundary'
import OLModal from '@/features/ui/components/ol/ol-modal'
import OLModal from '@/shared/components/ol/ol-modal'
type DictionaryModalProps = {
show?: boolean
@@ -4,7 +4,7 @@ import { useProjectContext } from '../../../shared/context/project-context'
import * as eventTracking from '../../../infrastructure/event-tracking'
import { isSmallDevice } from '../../../infrastructure/event-tracking'
import MaterialIcon from '@/shared/components/material-icon'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
export default function DownloadPDF() {
const { t } = useTranslation()
@@ -6,7 +6,7 @@ import { FullSizeLoadingSpinner } from '@/shared/components/loading-spinner'
import { Offcanvas } from 'react-bootstrap'
import { EditorLeftMenuProvider } from './editor-left-menu-context'
import withErrorBoundary from '@/infrastructure/error-boundary'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
import { useTranslation } from 'react-i18next'
const EditorLeftMenuBody = lazy(() => import('./editor-left-menu-body'))
@@ -18,7 +18,7 @@ import SettingsSyntaxValidation from './settings/settings-syntax-validation'
import SettingsMathPreview from './settings/settings-math-preview'
import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
import { ElementType } from 'react'
import OLForm from '@/features/ui/components/ol/ol-form'
import OLForm from '@/shared/components/ol/ol-form'
const moduleSettings: Array<{
import: { default: ElementType }
@@ -1,9 +1,9 @@
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import DictionaryModal from '../../../dictionary/components/dictionary-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLFormLabel from '@/features/ui/components/ol/ol-form-label'
import OLButton from '@/shared/components/ol/ol-button'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLFormLabel from '@/shared/components/ol/ol-form-label'
export default function SettingsDictionary() {
const { t } = useTranslation()
@@ -1,6 +1,6 @@
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLFormLabel from '@/features/ui/components/ol/ol-form-label'
import OLFormSelect from '@/features/ui/components/ol/ol-form-select'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLFormLabel from '@/shared/components/ol/ol-form-label'
import OLFormSelect from '@/shared/components/ol/ol-form-select'
import { ChangeEventHandler, useCallback, useEffect, useRef } from 'react'
import { Spinner } from 'react-bootstrap'
import { useEditorLeftMenuContext } from '@/features/editor-left-menu/components/editor-left-menu-context'
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next'
import MaterialIcon from '@/shared/components/material-icon'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
function BackToEditorButton({ onClick }: { onClick: () => void }) {
const { t } = useTranslation()
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next'
import * as eventTracking from '../../../infrastructure/event-tracking'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import MaterialIcon from '@/shared/components/material-icon'
function BackToProjectsButton() {
@@ -1,7 +1,7 @@
import classNames from 'classnames'
import { useTranslation } from 'react-i18next'
import MaterialIcon from '@/shared/components/material-icon'
import OLBadge from '@/features/ui/components/ol/ol-badge'
import OLBadge from '@/shared/components/ol/ol-badge'
function ChatToggleButton({
chatIsOpen,
@@ -6,7 +6,7 @@ import {
DropdownMenu,
DropdownToggle,
DropdownToggleCustom,
} from '@/features/ui/components/bootstrap-5/dropdown-menu'
} from '@/shared/components/dropdown/dropdown-menu'
import { Trans, useTranslation } from 'react-i18next'
import {
IdeLayout,
@@ -17,7 +17,7 @@ import * as eventTracking from '../../../infrastructure/event-tracking'
import useEventListener from '../../../shared/hooks/use-event-listener'
import { DetachRole } from '@/shared/context/detach-context'
import MaterialIcon from '@/shared/components/material-icon'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
const isActiveDropdownItem = ({
iconFor,
@@ -6,9 +6,9 @@ import {
DropdownItem,
DropdownMenu,
DropdownToggle,
} from '@/features/ui/components/bootstrap-5/dropdown-menu'
} from '@/shared/components/dropdown/dropdown-menu'
import { getBackgroundColorForUserId } from '@/shared/utils/colors'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import MaterialIcon from '@/shared/components/material-icon'
import { OnlineUser } from '@/features/ide-react/context/online-users-context'
@@ -1,8 +1,8 @@
import { useEffect, useState, useRef } from 'react'
import { useTranslation } from 'react-i18next'
import classNames from 'classnames'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLFormControl from '@/shared/components/ol/ol-form-control'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import MaterialIcon from '@/shared/components/material-icon'
type ProjectNameEditableLabelProps = {
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next'
import * as eventTracking from '../../../infrastructure/event-tracking'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
function UpgradePrompt() {
const { t } = useTranslation()
@@ -1,5 +1,5 @@
import { useCallback } from 'react'
import OLButton from '../ui/components/ol/ol-button'
import OLButton from '../../shared/components/ol/ol-button'
import { useIdeRedesignSwitcherContext } from '../ide-react/context/ide-redesign-switcher-context'
import MaterialIcon from '@/shared/components/material-icon'
import { useTranslation } from 'react-i18next'
@@ -3,7 +3,7 @@ import ReactDOM from 'react-dom'
import {
Dropdown,
DropdownMenu,
} from '@/features/ui/components/bootstrap-5/dropdown-menu'
} from '@/shared/components/dropdown/dropdown-menu'
import { useFileTreeData } from '@/shared/context/file-tree-data-context'
import { useFileTreeMainContext } from '../contexts/file-tree-main'
@@ -1,4 +1,4 @@
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
export default function DangerMessage({
children,
@@ -6,10 +6,10 @@ import {
DuplicateFilenameError,
InvalidFilenameError,
} from '../../errors'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLFormLabel from '@/features/ui/components/ol/ol-form-label'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLFormLabel from '@/shared/components/ol/ol-form-label'
import OLFormControl from '@/shared/components/ol/ol-form-control'
import OLNotification from '@/shared/components/ol/ol-notification'
/**
* A form component that renders a text input with label,
@@ -2,8 +2,8 @@ import { useTranslation } from 'react-i18next'
import { useFileTreeCreateForm } from '../../contexts/file-tree-create-form'
import { useFileTreeActionable } from '../../contexts/file-tree-actionable'
import { useFileTreeData } from '../../../../shared/context/file-tree-data-context'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLButton from '@/shared/components/ol/ol-button'
import OLNotification from '@/shared/components/ol/ol-notification'
export default function FileTreeModalCreateFileFooter() {
const { valid } = useFileTreeCreateForm()
@@ -1,7 +1,7 @@
import classnames from 'classnames'
import { useFileTreeActionable } from '../../contexts/file-tree-actionable'
import * as eventTracking from '../../../../infrastructure/event-tracking'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
export default function FileTreeModalCreateFileMode({
mode,
@@ -4,7 +4,7 @@ import { useProjectContext } from '@/shared/context/project-context'
import { useCallback } from 'react'
import { syncDelete } from '@/features/file-tree/util/sync-mutation'
import { TFunction } from 'i18next'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
export type Conflict = {
entity: FileTreeEntity
@@ -19,11 +19,11 @@ import * as eventTracking from '../../../../../infrastructure/event-tracking'
import { File } from '@/features/source-editor/utils/file'
import { Project } from '../../../../../../../types/project'
import getMeta from '@/utils/meta'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLFormLabel from '@/features/ui/components/ol/ol-form-label'
import OLForm from '@/features/ui/components/ol/ol-form'
import OLFormSelect from '@/features/ui/components/ol/ol-form-select'
import OLButton from '@/shared/components/ol/ol-button'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLFormLabel from '@/shared/components/ol/ol-form-label'
import OLForm from '@/shared/components/ol/ol-form'
import OLFormSelect from '@/shared/components/ol/ol-form-select'
import { Spinner } from 'react-bootstrap'
export default function FileTreeImportFromProject() {
@@ -6,9 +6,9 @@ import { useFileTreeCreateName } from '../../../contexts/file-tree-create-name'
import { useFileTreeCreateForm } from '../../../contexts/file-tree-create-form'
import ErrorMessage from '../error-message'
import * as eventTracking from '../../../../../infrastructure/event-tracking'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLFormLabel from '@/features/ui/components/ol/ol-form-label'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLFormLabel from '@/shared/components/ol/ol-form-label'
import OLFormControl from '@/shared/components/ol/ol-form-control'
export default function FileTreeImportFromUrl() {
const { t } = useTranslation()
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next'
import { useLocation } from '../../../shared/hooks/use-location'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
function FileTreeError() {
const { t } = useTranslation()
@@ -6,7 +6,7 @@ import { useProjectContext } from '@/shared/context/project-context'
import {
DropdownDivider,
DropdownItem,
} from '@/features/ui/components/bootstrap-5/dropdown-menu'
} from '@/shared/components/dropdown/dropdown-menu'
import { useFileTreeActionable } from '../../contexts/file-tree-actionable'
function FileTreeItemMenuItems() {
@@ -2,9 +2,9 @@ import { useTranslation } from 'react-i18next'
import * as eventTracking from '../../../infrastructure/event-tracking'
import { useFileTreeActionable } from '../contexts/file-tree-actionable'
import { useFileTreeData } from '@/shared/context/file-tree-data-context'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import MaterialIcon from '@/shared/components/material-icon'
import OLButtonToolbar from '@/features/ui/components/ol/ol-button-toolbar'
import OLButtonToolbar from '@/shared/components/ol/ol-button-toolbar'
import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
import React, { ElementType } from 'react'
@@ -8,7 +8,7 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
} from '@/shared/components/ol/ol-modal'
export default function FileTreeModalCreateFile() {
const { t } = useTranslation()
@@ -9,8 +9,8 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
function FileTreeModalCreateFolder() {
const { t } = useTranslation()
@@ -6,9 +6,9 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLNotification from '@/features/ui/components/ol/ol-notification'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
import OLNotification from '@/shared/components/ol/ol-notification'
import { useFileTreeSelectable } from '../../contexts/file-tree-selectable'
function FileTreeModalDelete() {
@@ -13,8 +13,8 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
function FileTreeModalError() {
const { t } = useTranslation()
@@ -13,7 +13,7 @@ import { BinaryFile, hasProvider, LinkedFile } from '../types/binary-file'
import FileViewRefreshButton from './file-view-refresh-button'
import FileViewRefreshError from './file-view-refresh-error'
import MaterialIcon from '@/shared/components/material-icon'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
const tprFileViewInfo = importOverleafModules('tprFileViewInfo') as {
import: { TPRFileViewInfo: ElementType }
@@ -11,7 +11,7 @@ import { useProjectContext } from '@/shared/context/project-context'
import type { BinaryFile } from '../types/binary-file'
import { Nullable } from '../../../../../types/utils'
import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
import { sendMB } from '@/infrastructure/event-tracking'
import useIsMounted from '@/shared/hooks/use-is-mounted'
@@ -2,7 +2,7 @@ import type { ElementType } from 'react'
import { useTranslation } from 'react-i18next'
import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
import { BinaryFile } from '../types/binary-file'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
type FileViewRefreshErrorProps = {
file: BinaryFile
@@ -5,7 +5,7 @@ import withErrorBoundary from '@/infrastructure/error-boundary'
import useAbortController from '@/shared/hooks/use-abort-controller'
import LoadingSpinner from '@/shared/components/loading-spinner'
import Notification from '@/shared/components/notification'
import IconButton from '@/features/ui/components/bootstrap-5/icon-button'
import IconButton from '@/shared/components/button/icon-button'
import {
Card,
Row,
@@ -14,8 +14,8 @@ import {
FormLabel,
FormControl,
} from 'react-bootstrap'
import FormText from '@/features/ui/components/bootstrap-5/form/form-text'
import Button from '@/features/ui/components/bootstrap-5/button'
import FormText from '@/shared/components/form/form-text'
import Button from '@/shared/components/button/button'
import PoNumber from '@/features/group-management/components/add-seats/po-number'
import CostSummary from '@/features/group-management/components/add-seats/cost-summary'
import RequestStatus from '@/features/group-management/components/request-status'
@@ -1,8 +1,8 @@
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { FormControl, FormGroup, FormLabel } from 'react-bootstrap'
import FormText from '@/features/ui/components/bootstrap-5/form/form-text'
import OLFormCheckbox from '@/features/ui/components/ol/ol-form-checkbox'
import FormText from '@/shared/components/form/form-text'
import OLFormCheckbox from '@/shared/components/ol/ol-form-checkbox'
type PoNumberProps = {
error: string | undefined
@@ -1,4 +1,4 @@
import IconButton from '@/features/ui/components/bootstrap-5/icon-button'
import IconButton from '@/shared/components/button/icon-button'
type BackButtonProps = {
href: string
@@ -2,7 +2,7 @@ import { useTranslation } from 'react-i18next'
import getMeta from '@/utils/meta'
import useWaitForI18n from '@/shared/hooks/use-wait-for-i18n'
import { Card as BSCard, CardBody, Col, Row } from 'react-bootstrap'
import IconButton from '@/features/ui/components/bootstrap-5/icon-button'
import IconButton from '@/shared/components/button/icon-button'
type CardProps = {
children: React.ReactNode
@@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
export type APIError = {
message?: string
@@ -7,13 +7,13 @@ import ErrorAlert from './error-alert'
import MembersList from './members-table/members-list'
import { sendMB } from '../../../infrastructure/event-tracking'
import BackButton from '@/features/group-management/components/back-button'
import OLRow from '@/features/ui/components/ol/ol-row'
import OLCol from '@/features/ui/components/ol/ol-col'
import OLCard from '@/features/ui/components/ol/ol-card'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLFormText from '@/features/ui/components/ol/ol-form-text'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLRow from '@/shared/components/ol/ol-row'
import OLCol from '@/shared/components/ol/ol-col'
import OLCard from '@/shared/components/ol/ol-card'
import OLButton from '@/shared/components/ol/ol-button'
import OLFormControl from '@/shared/components/ol/ol-form-control'
import OLFormText from '@/shared/components/ol/ol-form-text'
import OLNotification from '@/shared/components/ol/ol-notification'
export default function GroupMembers() {
const { isReady } = useWaitForI18n()
@@ -8,16 +8,16 @@ import UserRow from './user-row'
import useUserSelection from '../hooks/use-user-selection'
import { User } from '../../../../../types/group-management/user'
import { debugConsole } from '@/utils/debugging'
import OLRow from '@/features/ui/components/ol/ol-row'
import OLCol from '@/features/ui/components/ol/ol-col'
import OLRow from '@/shared/components/ol/ol-row'
import OLCol from '@/shared/components/ol/ol-col'
import BackButton from '@/features/group-management/components/back-button'
import OLCard from '@/features/ui/components/ol/ol-card'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLFormText from '@/features/ui/components/ol/ol-form-text'
import OLTable from '@/features/ui/components/ol/ol-table'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLFormCheckbox from '@/features/ui/components/ol/ol-form-checkbox'
import OLCard from '@/shared/components/ol/ol-card'
import OLButton from '@/shared/components/ol/ol-button'
import OLFormControl from '@/shared/components/ol/ol-form-control'
import OLFormText from '@/shared/components/ol/ol-form-text'
import OLTable from '@/shared/components/ol/ol-table'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import OLFormCheckbox from '@/shared/components/ol/ol-form-checkbox'
type ManagersPaths = {
addMember: string
@@ -1,5 +1,5 @@
import { Trans, useTranslation } from 'react-i18next'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
import Card from '@/features/group-management/components/card'
import useWaitForI18n from '@/shared/hooks/use-wait-for-i18n'
@@ -10,7 +10,7 @@ import {
DropdownItem,
DropdownMenu,
DropdownToggle,
} from '@/features/ui/components/bootstrap-5/dropdown-menu'
} from '@/shared/components/dropdown/dropdown-menu'
import { User } from '../../../../../../types/group-management/user'
import useAsync from '@/shared/hooks/use-async'
import { type FetchError, postJSON } from '@/infrastructure/fetch-json'
@@ -18,7 +18,7 @@ import { GroupUserAlert } from '../../utils/types'
import { useGroupMembersContext } from '../../context/group-members-context'
import getMeta from '@/utils/meta'
import MaterialIcon from '@/shared/components/material-icon'
import DropdownListItem from '@/features/ui/components/bootstrap-5/dropdown-list-item'
import DropdownListItem from '@/shared/components/dropdown/dropdown-list-item'
import { Spinner } from 'react-bootstrap'
import { sendMB } from '@/infrastructure/event-tracking'
@@ -1,7 +1,7 @@
import { Trans } from 'react-i18next'
import type { GroupUserAlertVariant } from '../../utils/types'
import NotificationScrolledTo from '@/shared/components/notification-scrolled-to'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
type GroupUsersListAlertProps = {
variant: GroupUserAlertVariant
@@ -8,8 +8,8 @@ import SSOStatus from './sso-status'
import DropdownButton from './dropdown-button'
import SelectUserCheckbox from './select-user-checkbox'
import getMeta from '@/utils/meta'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLTag from '@/features/ui/components/ol/ol-tag'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import OLTag from '@/shared/components/ol/ol-tag'
import MaterialIcon from '@/shared/components/material-icon'
import classnames from 'classnames'
@@ -11,15 +11,15 @@ import SelectAllCheckbox from './select-all-checkbox'
import classNames from 'classnames'
import getMeta from '@/utils/meta'
import UnlinkUserModal from './unlink-user-modal'
import OLTable from '@/features/ui/components/ol/ol-table'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLTable from '@/shared/components/ol/ol-table'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import Pagination from '@/shared/components/pagination'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLForm from '@/features/ui/components/ol/ol-form'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLCol from '@/features/ui/components/ol/ol-col'
import OLFormControl from '@/shared/components/ol/ol-form-control'
import OLForm from '@/shared/components/ol/ol-form'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLCol from '@/shared/components/ol/ol-col'
import MaterialIcon from '@/shared/components/material-icon'
import OLRow from '@/features/ui/components/ol/ol-row'
import OLRow from '@/shared/components/ol/ol-row'
import { isNonEmptyString, NonEmptyString } from '@ol-types/helpers/string'
const USERS_DISPLAY_LIMIT = 50
@@ -10,13 +10,13 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLFormLabel from '@/features/ui/components/ol/ol-form-label'
import OLFormSelect from '@/features/ui/components/ol/ol-form-select'
} from '@/shared/components/ol/ol-modal'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLButton from '@/shared/components/ol/ol-button'
import OLNotification from '@/shared/components/ol/ol-notification'
import OLFormControl from '@/shared/components/ol/ol-form-control'
import OLFormLabel from '@/shared/components/ol/ol-form-label'
import OLFormSelect from '@/shared/components/ol/ol-form-select'
import { sendMB } from '@/infrastructure/event-tracking'
type OffboardManagedUserModalProps = {
@@ -10,12 +10,12 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLFormLabel from '@/features/ui/components/ol/ol-form-label'
} from '@/shared/components/ol/ol-modal'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLButton from '@/shared/components/ol/ol-button'
import OLNotification from '@/shared/components/ol/ol-notification'
import OLFormControl from '@/shared/components/ol/ol-form-control'
import OLFormLabel from '@/shared/components/ol/ol-form-label'
import { sendMB } from '@/infrastructure/event-tracking'
type RemoveManagedUserModalProps = {
@@ -1,7 +1,7 @@
import React, { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { useGroupMembersContext } from '../../context/group-members-context'
import OLFormCheckbox from '@/features/ui/components/ol/ol-form-checkbox'
import OLFormCheckbox from '@/shared/components/ol/ol-form-checkbox'
export default function SelectAllCheckbox() {
const { t } = useTranslation()
@@ -2,7 +2,7 @@ import { useTranslation } from 'react-i18next'
import type { User } from '../../../../../../types/group-management/user'
import { useGroupMembersContext } from '../../context/group-members-context'
import { useCallback } from 'react'
import OLFormCheckbox from '@/features/ui/components/ol/ol-form-checkbox'
import OLFormCheckbox from '@/shared/components/ol/ol-form-checkbox'
type ManagedUsersSelectUserCheckboxProps = {
user: User
@@ -13,8 +13,8 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
export type UnlinkUserModalProps = {
onClose: () => void
@@ -1,5 +1,5 @@
import { Trans, useTranslation } from 'react-i18next'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
import Card from '@/features/group-management/components/card'
function MissingBillingInformation() {
@@ -1,9 +1,9 @@
import { useTranslation } from 'react-i18next'
import { Card, CardBody, Row, Col } from 'react-bootstrap'
import Button from '@/features/ui/components/bootstrap-5/button'
import Button from '@/shared/components/button/button'
import MaterialIcon from '@/shared/components/material-icon'
import getMeta from '@/utils/meta'
import IconButton from '@/features/ui/components/bootstrap-5/icon-button'
import IconButton from '@/shared/components/button/icon-button'
import classnames from 'classnames'
type RequestStatusProps = {
@@ -1,5 +1,5 @@
import { Trans } from 'react-i18next'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
import Card from '@/features/group-management/components/card'
function SubtotalLimitExceeded() {
@@ -2,8 +2,8 @@ import getMeta from '@/utils/meta'
import { FetchError, postJSON } from '@/infrastructure/fetch-json'
import { useTranslation, Trans } from 'react-i18next'
import { Card, Row, Col } from 'react-bootstrap'
import IconButton from '@/features/ui/components/bootstrap-5/icon-button'
import Button from '@/features/ui/components/bootstrap-5/button'
import IconButton from '@/shared/components/button/icon-button'
import Button from '@/shared/components/button/button'
import UpgradeSubscriptionPlanDetails from './upgrade-subscription-plan-details'
import RequestStatus from '../request-status'
import UpgradeSummary, {
@@ -2,7 +2,7 @@ import moment from 'moment'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { User } from '../../../../../types/group-management/user'
import OLFormCheckbox from '@/features/ui/components/ol/ol-form-checkbox'
import OLFormCheckbox from '@/shared/components/ol/ol-form-checkbox'
import MaterialIcon from '@/shared/components/material-icon'
type GroupMemberRowProps = {
@@ -1,7 +1,7 @@
import { createRoot } from 'react-dom/client'
import getMeta from '@/utils/meta'
import { DefaultNavbarRoot } from '@/features/ui/components/bootstrap-5/navbar/default-navbar'
import Footer from '@/features/ui/components/bootstrap-5/footer/footer'
import { DefaultNavbarRoot } from '@/shared/components/navbar/default-navbar'
import Footer from '@/shared/components/footer/footer'
import { SplitTestProvider } from '@/shared/context/split-test-context'
const navbarElement = document.getElementById('navbar-container')
@@ -1,15 +1,15 @@
import { useTranslation } from 'react-i18next'
import { useEffect, useState } from 'react'
import OLForm from '@/features/ui/components/ol/ol-form'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLForm from '@/shared/components/ol/ol-form'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import ModalError from './modal-error'
import OLModal, {
OLModalBody,
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
import useAsync from '../../../../shared/hooks/use-async'
import useAbortController from '../../../../shared/hooks/use-abort-controller'
import useAddOrRemoveLabels from '../../hooks/use-add-or-remove-labels'
@@ -18,7 +18,7 @@ import { addLabel } from '../../services/api'
import { Label } from '../../services/types/label'
import { useRefWithAutoFocus } from '../../../../shared/hooks/use-ref-with-auto-focus'
import { debugConsole } from '@/utils/debugging'
import OLFormControl from '@/features/ui/components/ol/ol-form-control'
import OLFormControl from '@/shared/components/ol/ol-form-control'
type AddLabelModalProps = {
show: boolean
@@ -8,8 +8,8 @@ import { useUserContext } from '../../../../shared/context/user-context'
import useDropdownActiveItem from '../../hooks/use-dropdown-active-item'
import { useHistoryContext } from '../../context/history-context'
import { useEditorContext } from '../../../../shared/context/editor-context'
import OLPopover from '@/features/ui/components/ol/ol-popover'
import OLOverlay from '@/features/ui/components/ol/ol-overlay'
import OLPopover from '@/shared/components/ol/ol-popover'
import OLOverlay from '@/shared/components/ol/ol-overlay'
import Close from '@/shared/components/close'
import { Trans, useTranslation } from 'react-i18next'
import MaterialIcon from '@/shared/components/material-icon'
@@ -3,8 +3,8 @@ import {
Dropdown,
DropdownMenu,
DropdownToggle,
} from '@/features/ui/components/bootstrap-5/dropdown-menu'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
} from '@/shared/components/dropdown/dropdown-menu'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
type ActionDropdownProps = {
id: string
@@ -1,7 +1,7 @@
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import OLDropdownMenuItem from '@/features/ui/components/ol/ol-dropdown-menu-item'
import OLTagIcon from '@/features/ui/components/ol/icons/ol-tag-icon'
import OLDropdownMenuItem from '@/shared/components/ol/ol-dropdown-menu-item'
import OLTagIcon from '@/shared/components/ol/ol-tag-icon'
import AddLabelModal from '../../add-label-modal'
type AddLabelProps = {
@@ -1,7 +1,7 @@
import { useHistoryContext } from '../../../../context/history-context'
import { UpdateRange } from '../../../../services/types/update'
import { ReactNode } from 'react'
import OLDropdownMenuItem from '@/features/ui/components/ol/ol-dropdown-menu-item'
import OLDropdownMenuItem from '@/shared/components/ol/ol-dropdown-menu-item'
type CompareProps = {
comparisonRange: UpdateRange
@@ -1,7 +1,7 @@
import { useHistoryContext } from '../../../../context/history-context'
import { UpdateRange } from '../../../../services/types/update'
import { ReactNode } from 'react'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
type CompareProps = {
comparisonRange: UpdateRange
@@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next'
import OLDropdownMenuItem from '@/features/ui/components/ol/ol-dropdown-menu-item'
import OLDropdownMenuItem from '@/shared/components/ol/ol-dropdown-menu-item'
import MaterialIcon from '@/shared/components/material-icon'
type DownloadProps = {
@@ -1,5 +1,5 @@
import { useCallback, useState } from 'react'
import OLDropdownMenuItem from '@/features/ui/components/ol/ol-dropdown-menu-item'
import OLDropdownMenuItem from '@/shared/components/ol/ol-dropdown-menu-item'
import { useTranslation } from 'react-i18next'
import { RestoreProjectModal } from '../../../diff-view/modals/restore-project-modal'
import { useSplitTestContext } from '@/shared/context/split-test-context'
@@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
// Using this workaround due to inconsistent and improper error responses from the server
type ModalErrorProps = {
@@ -5,8 +5,8 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
} from '@/shared/components/ol/ol-modal'
import OLTooltip from '@/shared/components/ol/ol-tooltip'
import ModalError from './modal-error'
import useAbortController from '../../../../shared/hooks/use-abort-controller'
import useAsync from '../../../../shared/hooks/use-async'
@@ -18,9 +18,9 @@ import { LoadedLabel } from '../../services/types/label'
import { debugConsole } from '@/utils/debugging'
import { FormatTimeBasedOnYear } from '@/shared/components/format-time-based-on-year'
import { useEditorContext } from '@/shared/context/editor-context'
import OLTag from '@/features/ui/components/ol/ol-tag'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLTagIcon from '@/features/ui/components/ol/icons/ol-tag-icon'
import OLTag from '@/shared/components/ol/ol-tag'
import OLButton from '@/shared/components/ol/ol-button'
import OLTagIcon from '@/shared/components/ol/ol-tag-icon'
type TagProps = {
label: LoadedLabel
@@ -20,7 +20,7 @@ import {
} from '../../extensions/highlight-locations'
import { useTranslation } from 'react-i18next'
import { inlineBackground } from '../../../source-editor/extensions/inline-background'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
function extensions(themeOptions: Options): Extension[] {
return [
@@ -3,7 +3,7 @@ import { Diff } from '../../services/types/doc'
import DocumentDiffViewer from './document-diff-viewer'
import LoadingSpinner from '../../../../shared/components/loading-spinner'
import { useTranslation } from 'react-i18next'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
type MainProps = {
diff: Nullable<Diff>
@@ -5,8 +5,8 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
import { useTranslation } from 'react-i18next'
type RestoreFileConfirmModalProps = {
@@ -3,8 +3,8 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
import { useTranslation } from 'react-i18next'
export function RestoreFileErrorModal({
@@ -3,8 +3,8 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
import { useTranslation } from 'react-i18next'
export function RestoreProjectErrorModal({
@@ -3,10 +3,10 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
} from '@/shared/components/ol/ol-modal'
import { formatDate } from '@/utils/dates'
import { useCallback } from 'react'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
import { useTranslation } from 'react-i18next'
type RestoreProjectModalProps = {
@@ -1,4 +1,4 @@
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
import { useTranslation } from 'react-i18next'
import { useRestoreDeletedFile } from '../../../context/hooks/use-restore-deleted-file'
import type { HistoryContextValue } from '../../../context/types/history-context-value'
@@ -1,4 +1,4 @@
import OLButton from '@/features/ui/components/ol/ol-button'
import OLButton from '@/shared/components/ol/ol-button'
import { useTranslation } from 'react-i18next'
import type { HistoryContextValue } from '../../../context/types/history-context-value'
import withErrorBoundary from '@/infrastructure/error-boundary'
@@ -1,7 +1,7 @@
import classNames from 'classnames'
import type { ReactNode } from 'react'
import type { FileOperation } from '../../services/types/file-operation'
import OLTag from '@/features/ui/components/ol/ol-tag'
import OLTag from '@/shared/components/ol/ol-tag'
type FileTreeItemProps = {
name: string
@@ -6,10 +6,10 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLRow from '@/features/ui/components/ol/ol-row'
import OLCol from '@/features/ui/components/ol/ol-col'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
import OLRow from '@/shared/components/ol/ol-row'
import OLCol from '@/shared/components/ol/ol-col'
export default function HotkeysModal({
animation = true,
@@ -4,7 +4,7 @@ import { useConnectionContext } from '@/features/ide-react/context/connection-co
import { debugging } from '@/utils/debugging'
import { createPortal } from 'react-dom'
import { useGlobalAlertsContainer } from '@/features/ide-react/context/global-alerts-context'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLNotification from '@/shared/components/ol/ol-notification'
export function Alerts() {
const { t } = useTranslation()
@@ -1,8 +1,8 @@
import { useTranslation } from 'react-i18next'
import { useEffect, useState } from 'react'
import { secondsUntil } from '@/features/ide-react/connection/utils'
import OLNotification from '@/features/ui/components/ol/ol-notification'
import OLButton from '@/features/ui/components/ol/ol-button'
import OLNotification from '@/shared/components/ol/ol-notification'
import OLButton from '@/shared/components/ol/ol-button'
type LostConnectionAlertProps = {
reconnectAt: number
@@ -1,10 +1,10 @@
import OLButton from '@/features/ui/components/ol/ol-button'
import OLForm from '@/features/ui/components/ol/ol-form'
import OLFormCheckbox from '@/features/ui/components/ol/ol-form-checkbox'
import OLFormGroup from '@/features/ui/components/ol/ol-form-group'
import OLIconButton from '@/features/ui/components/ol/ol-icon-button'
import { OLToast } from '@/features/ui/components/ol/ol-toast'
import { OLToastContainer } from '@/features/ui/components/ol/ol-toast-container'
import OLButton from '@/shared/components/ol/ol-button'
import OLForm from '@/shared/components/ol/ol-form'
import OLFormCheckbox from '@/shared/components/ol/ol-form-checkbox'
import OLFormGroup from '@/shared/components/ol/ol-form-group'
import OLIconButton from '@/shared/components/ol/ol-icon-button'
import { OLToast } from '@/shared/components/ol/ol-toast'
import { OLToastContainer } from '@/shared/components/ol/ol-toast-container'
import { useEditorContext } from '@/shared/context/editor-context'
import useTutorial from '@/shared/hooks/promotions/use-tutorial'
import { useCallback, useEffect, useMemo, useState } from 'react'
@@ -1,10 +1,10 @@
import { OLToast, OLToastProps } from '@/features/ui/components/ol/ol-toast'
import { OLToast, OLToastProps } from '@/shared/components/ol/ol-toast'
import useEventListener from '@/shared/hooks/use-event-listener'
import { Fragment, ReactElement, useCallback, useState } from 'react'
import { debugConsole } from '@/utils/debugging'
import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
import { OLToastContainer } from '@/features/ui/components/ol/ol-toast-container'
import { OLToastContainer } from '@/shared/components/ol/ol-toast-container'
const moduleGeneratorsImport = importOverleafModules('toastGenerators') as {
import: { default: GlobalToastGeneratorEntry[] }
@@ -5,7 +5,7 @@ import OLModal, {
OLModalBody,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
} from '@/shared/components/ol/ol-modal'
// show modal when editor is forcefully disconnected
function ForceDisconnected() {
@@ -5,9 +5,9 @@ import OLModal, {
OLModalFooter,
OLModalHeader,
OLModalTitle,
} from '@/features/ui/components/ol/ol-modal'
import OLButton from '@/features/ui/components/ol/ol-button'
import { ButtonProps } from '@/features/ui/components/types/button-props'
} from '@/shared/components/ol/ol-modal'
import OLButton from '@/shared/components/ol/ol-button'
import { ButtonProps } from '@/shared/components/types/button-props'
export type GenericConfirmModalOwnProps = {
title: string

Some files were not shown because too many files have changed in this diff Show More