diff --git a/src/components/settings/songTags/Entry.jsx b/src/components/settings/songTags/Entry.jsx
index c6e75c0c..0c4f8ffc 100644
--- a/src/components/settings/songTags/Entry.jsx
+++ b/src/components/settings/songTags/Entry.jsx
@@ -7,13 +7,13 @@ import { clearAlteration } from 'actions/alterations'
import { editSongTag } from 'actions/songTags'
import { CheckboxField, FormInline, HueField } from 'components/generics/Form'
import HighlighterQuery from 'components/generics/HighlighterQuery'
-import Notification, {
+import NotificationBar, {
NotifiableForTable,
-} from 'components/generics/Notification'
+} from 'components/generics/NotificationBar'
import { Checkmark } from 'components/generics/Shapes'
+import Slide from 'components/transitions/Slide'
import { Status } from 'reducers/alterationsResponse'
import { songTagPropType } from 'serverPropTypes/library'
-import { CSSTransitionLazy } from 'thirdpartyExtensions/ReactTransitionGroup'
export default function SongTagsEntry({ tag, editable }) {
const query = useSelector((state) => state.settings.songTags.data.query)
@@ -124,7 +124,7 @@ export default function SongTagsEntry({ tag, editable }) {
)
const colorForm = (
-
+
|
-
-
-
- {colorForm}
-
+ {colorForm}
|
diff --git a/src/components/settings/users/Entry.jsx b/src/components/settings/users/Entry.jsx
index f3362f11..33ce8008 100644
--- a/src/components/settings/users/Entry.jsx
+++ b/src/components/settings/users/Entry.jsx
@@ -6,14 +6,13 @@ import { clearAlteration } from 'actions/alterations'
import { deleteUser } from 'actions/users'
import ConfirmationBar from 'components/generics/ConfirmationBar'
import HighlighterQuery from 'components/generics/HighlighterQuery'
-import Notification, {
+import NotificationBar, {
NotifiableForTable,
-} from 'components/generics/Notification'
+} from 'components/generics/NotificationBar'
import PermissionText from 'components/generics/PermissionText'
import { Checkmark } from 'components/generics/Shapes'
import { IsNotSelf, IsUsersManager } from 'permissions/components/Users'
import { userPropType } from 'serverPropTypes/users'
-import { CSSTransitionLazy } from 'thirdpartyExtensions/ReactTransitionGroup'
export default function UsersEntry({ user }) {
const query = useSelector((state) => state.settings.users.list.data.query)
@@ -39,24 +38,14 @@ export default function UsersEntry({ user }) {
|
|
- {
+ dispatch(deleteUser(user.id))
}}
- >
- {
- dispatch(deleteUser(user.id))
- }}
- onCancel={() => {
- setConfirmDisplayed(false)
- }}
- />
-
-
+
+ {children}
+
+ )
+}
+
+Collapse.propTypes = {
+ in: PropTypes.bool,
+ duration: PropTypes.number,
+ horizontal: PropTypes.bool,
+ force: PropTypes.bool,
+ children: PropTypes.node,
+}
diff --git a/src/components/transitions/Slide.jsx b/src/components/transitions/Slide.jsx
new file mode 100644
index 00000000..e7074f0b
--- /dev/null
+++ b/src/components/transitions/Slide.jsx
@@ -0,0 +1,21 @@
+import PropTypes from 'prop-types'
+import { CSSTransition } from 'react-transitioning'
+
+export default function Slide({
+ in: inProp,
+ duration = 300,
+ children,
+ ...rest
+}) {
+ return (
+
+ {children}
+
+ )
+}
+
+Slide.propTypes = {
+ in: PropTypes.bool,
+ duration: PropTypes.number,
+ children: PropTypes.node,
+}
diff --git a/src/components/transitions/Swipe.jsx b/src/components/transitions/Swipe.jsx
new file mode 100644
index 00000000..e7ce2163
--- /dev/null
+++ b/src/components/transitions/Swipe.jsx
@@ -0,0 +1,21 @@
+import PropTypes from 'prop-types'
+import { CSSTransition } from 'react-transitioning'
+
+export default function Swipe({
+ in: inProp,
+ duration = 300,
+ children,
+ ...rest
+}) {
+ return (
+
+ {children}
+
+ )
+}
+
+Swipe.propTypes = {
+ in: PropTypes.bool,
+ duration: PropTypes.number,
+ children: PropTypes.node,
+}
diff --git a/src/contexts/listing.js b/src/contexts/listing.js
new file mode 100644
index 00000000..25dc1ccd
--- /dev/null
+++ b/src/contexts/listing.js
@@ -0,0 +1,3 @@
+import { createContext } from 'react'
+
+export const ListingNoTransitionContext = createContext(false)
diff --git a/src/style/abstracts/_shapes.scss b/src/style/abstracts/_shapes.scss
index 3f71fdc4..1532b488 100644
--- a/src/style/abstracts/_shapes.scss
+++ b/src/style/abstracts/_shapes.scss
@@ -10,6 +10,7 @@
@include preboot.square($width);
transform: translateX(-$width * 0.5) translateY(-$width * 0.5);
+ z-index: 100;
}
@mixin make-checkmark($background) {
diff --git a/src/style/abstracts/_transitions.scss b/src/style/abstracts/_transitions.scss
new file mode 100644
index 00000000..ac193bd5
--- /dev/null
+++ b/src/style/abstracts/_transitions.scss
@@ -0,0 +1,86 @@
+//
+// Dakara Project
+//
+// Transitions style file
+//
+
+// helper for creating transition styles
+// @param $name name of the transitiion
+// @param $property property to transition
+// @param $from value of the property before entered, and after exiting if $away is not set
+// @param $to value of the property after entered and before exiting
+// @param $away value of the property after exiting
+// @param $duration-enter timing of the entering step
+// @param $duration-exit timing of the exiting step
+// @param $enter enable enter step
+// @param $enter-active enable enterActive step
+// @param $enter-done enable enterDone step
+// @param $exit enable exit step
+// @param $exit-active enable exitActive step
+// @param $exit-done enable exitDone step
+@mixin make-transition(
+ $name,
+ $property,
+ $from,
+ $to,
+ $away: false,
+ $duration-enter: 300ms,
+ $duration-exit: 150ms,
+ $enter: true,
+ $enter-active: true,
+ $enter-done: true,
+ $exit: true,
+ $exit-active: true,
+ $exit-done: true
+) {
+ .transition {
+ @if ($enter) {
+ &.#{$name}-appear,
+ &.#{$name}-enter {
+ #{$property}: $from;
+
+ @if ($enter-active) {
+ &.#{$name}-appear-active,
+ &.#{$name}-enter-active {
+ #{$property}: $to;
+ transition: $property $duration-enter ease-out;
+ }
+ }
+ }
+ }
+
+ @if ($enter-done) {
+ &.#{$name}-appear-done,
+ &.#{$name}-enter-done {
+ #{$property}: $to;
+ }
+ }
+
+ @if ($exit) {
+ &.#{$name}-exit {
+ #{$property}: $to;
+
+ @if ($exit-active) {
+ &.#{$name}-exit-active {
+ @if ($away) {
+ #{$property}: $away;
+ } @else {
+ #{$property}: $from;
+ }
+ transition: $property $duration-exit ease-in;
+ }
+ }
+ }
+ }
+
+ @if ($exit-done) {
+ &.#{$name}-exit-done {
+ @if ($away) {
+ #{$property}: $away;
+ } @else {
+ #{$property}: $from;
+ }
+ }
+ }
+ }
+}
diff --git a/src/style/components/_index.scss b/src/style/components/_index.scss
index 2e383a42..b33a1824 100644
--- a/src/style/components/_index.scss
+++ b/src/style/components/_index.scss
@@ -19,4 +19,5 @@
@use 'navigation';
@use 'playlist';
@use 'settings';
+@use 'transitions';
@use 'user';
diff --git a/src/style/components/generics/_details.scss b/src/style/components/generics/_details.scss
index 9f736884..d55db4c5 100644
--- a/src/style/components/generics/_details.scss
+++ b/src/style/components/generics/_details.scss
@@ -108,24 +108,23 @@
> .border {
flex-grow: 1;
- // hide after about 4 lines
- max-height: 4.6em;
- overflow: hidden;
-
- &.reveal-enter-active {
- max-height: 10 * $height;
- transition: max-height 600ms ease-out;
- .paragraph {
- -webkit-line-clamp: none;
+ &.transition {
+ &.collapse-vertical-enter:not(.collapse-vertical-enter-active),
+ &.collapse-vertical-exit-done {
+ // hide after about 4 lines
+ max-height: 4.6em;
}
- }
- &.reveal-enter-done {
- max-height: unset;
+ &.collapse-vertical-enter-active {
+ max-height: 15 * $height;
+ }
- .paragraph {
- -webkit-line-clamp: none;
+ &.collapse-vertical-enter-active,
+ &.collapse-vertical-enter-done {
+ .paragraph {
+ -webkit-line-clamp: none;
+ }
}
}
}
diff --git a/src/style/components/generics/_form.scss b/src/style/components/generics/_form.scss
index b76918a8..ee08c5cb 100644
--- a/src/style/components/generics/_form.scss
+++ b/src/style/components/generics/_form.scss
@@ -158,24 +158,10 @@ $form-field-height: sizes.$row-height;
@include sizes.make-vertical-row-padding(horizontal);
}
- &.error-container-enter {
- max-height: 0;
- overflow-y: hidden;
-
- &.error-container-enter-active {
+ &.transitiion {
+ &.collapse-vertical-enter-active,
+ &.collapse-vertical-exit:not(.collapse-vertical-exit-active) {
max-height: calc(1em + #{sizes.$gap-vertical} * 2);
- transition: max-height 300ms ease-out;
- }
- }
-
- // notification transition disappearance
- &.error-container-exit {
- max-height: calc(1em + #{sizes.$gap-vertical} * 2);
-
- &.error-container-exit-active {
- max-height: 0;
- overflow-y: hidden;
- transition: max-height 100ms ease-out;
}
}
}
diff --git a/src/style/components/generics/_index.scss b/src/style/components/generics/_index.scss
index 9d8b69e2..0c783967 100644
--- a/src/style/components/generics/_index.scss
+++ b/src/style/components/generics/_index.scss
@@ -9,7 +9,7 @@
@use 'form';
@use 'listing';
@use 'navigator';
-@use 'notification';
+@use 'notification_bar';
@use 'permission_text';
@use 'searchbox';
@use 'shapes';
diff --git a/src/style/components/generics/_notification.scss b/src/style/components/generics/_notification_bar.scss
similarity index 78%
rename from src/style/components/generics/_notification.scss
rename to src/style/components/generics/_notification_bar.scss
index e7e3e3a9..2b41f628 100644
--- a/src/style/components/generics/_notification.scss
+++ b/src/style/components/generics/_notification_bar.scss
@@ -36,28 +36,7 @@
position: absolute;
top: 0;
width: 100%;
-
- // notification transition appearance
- &.notified-appear,
- &.notified-enter {
- left: 100%;
-
- &.notified-appear-active,
- &.notified-enter-active {
- left: 0;
- transition: left 300ms ease-out;
- }
- }
-
- // notification transition disappearance
- &.notified-exit {
- left: 0;
-
- &.notified-exit-active {
- left: 100%;
- transition: left 150ms ease-out;
- }
- }
+ z-index: 1000;
.notification {
display: flex;
diff --git a/src/style/components/generics/_searchbox.scss b/src/style/components/generics/_searchbox.scss
index c7a4a35e..1d2f1603 100644
--- a/src/style/components/generics/_searchbox.scss
+++ b/src/style/components/generics/_searchbox.scss
@@ -27,26 +27,17 @@
}
}
- .help {
- &.help-enter {
- max-height: 0;
- overflow: hidden;
+ .transition {
+ margin: 0;
- &.help-enter-active {
- max-height: (3 * sizes.$row-height);
- transition: max-height 300ms ease-out;
- }
+ &.collapse-vertical-enter.collapse-vertical-enter-active,
+ &.collapse-vertical-exit:not(.collapse-vertical-exit-active) {
+ max-height: 4 * sizes.$row-height;
}
+ }
- &.help-exit {
- max-height: (3 * sizes.$row-height);
- overflow: hidden;
-
- &.help-exit-active {
- max-height: 0;
- transition: max-height 150ms ease-out;
- }
- }
+ .help {
+ @include sizes.make-gap(padding, top);
q {
&::before,
diff --git a/src/style/components/generics/listing/_listing.scss b/src/style/components/generics/listing/_listing.scss
index 021c19dc..16aea4f6 100644
--- a/src/style/components/generics/listing/_listing.scss
+++ b/src/style/components/generics/listing/_listing.scss
@@ -88,48 +88,12 @@ $listing-entry-control-icon-size: sizes.$row-icon-font-size;
}
}
- // appearance transition
- &.add-remove-enter {
- max-height: 0;
- min-height: initial;
- overflow: hidden;
-
- &.add-remove-enter-active {
- max-height: $listing-entry-height;
- transition: max-height 300ms ease-out;
- }
- }
-
- // disappearance transition
- &.add-remove-exit {
- max-height: $listing-entry-height;
- min-height: initial;
- overflow: hidden;
-
- &.expanded {
- max-height: 15 * sizes.$subrow-height;
- }
-
- &.add-remove-exit-active {
- max-height: 0;
- transition: max-height 150ms ease-in;
-
- &.expanded {
- transition: max-height 300ms ease-in;
- }
-
- &.delayed {
- transition-delay: 500ms;
- }
- }
- }
-
.extra {
// remove list left padding
padding: 0;
}
- > .one-line {
+ .listing-entry-compact {
display: flex;
.expander {
@@ -176,53 +140,34 @@ $listing-entry-control-icon-size: sizes.$row-icon-font-size;
position: absolute;
right: 0;
}
-
- // appearance transition
- .add-remove-enter {
- max-width: 0;
- overflow: hidden;
-
- &.add-remove-enter-active {
- max-width: $listing-entry-height;
- transition: max-width 300ms ease-out;
- }
- }
-
- // disappearance transition
- .add-remove-exit {
- max-width: $listing-entry-height;
- overflow: hidden;
-
- &.add-remove-exit-active {
- max-width: 0;
- transition: max-width 150ms ease-in;
- }
- }
}
}
- > .expanded {
- @include sizes.make-gap(padding, vertical);
-
- &.expand-collapse-enter {
- max-height: 0;
- overflow: hidden;
-
- &.expand-collapse-enter-active {
- max-height: 15 * sizes.$subrow-height;
- transition: max-height 600ms ease-out;
+ // transition for the entry
+ &.transition {
+ &.expanded {
+ &.collapse-vertical-exit:not(.collapse-vertical-exit-active) {
+ max-height: 10 * sizes.$subrow-height;
}
}
- &.expand-collapse-exit {
- max-height: 15 * sizes.$subrow-height;
- overflow: hidden;
+ &.collapse-vertical-appear,
+ &.collapse-vertical-enter,
+ &.collapse-vertical-exit {
+ min-height: unset;
+ }
+ }
- &.expand-collapse-exit-active {
- max-height: 0;
- transition: max-height 300ms ease-in;
- }
+ // transition for the expanded entry
+ .transition {
+ &.collapse-vertical-enter.collapse-vertical-enter-active,
+ &.collapse-vertical-exit:not(.collapse-vertical-exit-active) {
+ max-height: 10 * sizes.$subrow-height;
}
+ }
+
+ .listing-entry-expanded {
+ @include sizes.make-gap(padding, vertical);
// space between every element
& > * + * {
diff --git a/src/style/components/karaoke/player/_manage_button.scss b/src/style/components/karaoke/player/_manage_button.scss
index 1768092f..6067cf60 100644
--- a/src/style/components/karaoke/player/_manage_button.scss
+++ b/src/style/components/karaoke/player/_manage_button.scss
@@ -2,8 +2,9 @@
overflow: hidden;
position: relative;
- &.managed-error .managed.managed-enter {
- left: -100%;
+ // transition for error
+ &.managed-error .transition.swipe-enter {
+ left: 100%;
}
.managed {
@@ -15,25 +16,5 @@
position: absolute;
top: 0;
width: 100%;
-
- // appearance transition
- &.managed-enter {
- left: 100%;
-
- &.managed-enter-active {
- left: 0;
- transition: left 150ms ease-out;
- }
- }
-
- // disappearance transition
- &.managed-exit {
- left: 0;
-
- &.managed-exit-active {
- left: -100%;
- transition: left 150ms ease-out;
- }
- }
}
}
diff --git a/src/style/components/karaoke/player/_notification.scss b/src/style/components/karaoke/player/_notification.scss
index 2ebc836b..5c036133 100644
--- a/src/style/components/karaoke/player/_notification.scss
+++ b/src/style/components/karaoke/player/_notification.scss
@@ -8,23 +8,10 @@
.player-notification {
.player-notified {
- &.player-notified-enter {
- max-height: 0;
- overflow-y: hidden;
-
- &.player-notified-enter-active {
+ &.transition {
+ &.collapse-vertical-enter-active,
+ &.collapse-vertical-exit:not(.collapse-vertical-exit-active) {
max-height: 3em;
- transition: max-height 300ms ease-out;
- }
- }
-
- &.player-notified-exit {
- max-height: 3em;
-
- &.player-notified-exit-active {
- max-height: 0;
- overflow-y: hidden;
- transition: max-height 150ms ease-in;
}
}
}
diff --git a/src/style/components/karaoke/player/_player.scss b/src/style/components/karaoke/player/_player.scss
index c723fc47..b2cc446b 100644
--- a/src/style/components/karaoke/player/_player.scss
+++ b/src/style/components/karaoke/player/_player.scss
@@ -36,6 +36,18 @@ $player-progressbar-height: 0.4rem;
}
}
+ .transition {
+ &.collapse-vertical-enter.collapse-vertical-enter-active,
+ &.collapse-vertical-exit:not(.collapse-vertical-exit-active) {
+ max-height: $player-controls-height + sizes.$gap-vertical;
+
+ @include support.make-smartphone {
+ max-height: $player-controls-height-smartphone +
+ sizes.$gap-vertical-smartphone;
+ }
+ }
+ }
+
// `controls` class: buttons to send commands to the player.
.controls {
@include sizes.make-gap(margin, bottom);
@@ -52,36 +64,6 @@ $player-progressbar-height: 0.4rem;
display: flex;
justify-content: flex-start;
}
-
- &.expand-enter {
- max-height: 0;
- overflow-y: hidden;
-
- &.expand-enter-active {
- max-height: $player-controls-height + sizes.$gap-vertical;
- transition: max-height 300ms ease-out;
-
- @include support.make-smartphone {
- max-height: $player-controls-height-smartphone +
- sizes.$gap-vertical-smartphone;
- }
- }
- }
-
- &.expand-exit {
- max-height: $player-controls-height + sizes.$gap-vertical;
- overflow-y: hidden;
-
- @include support.make-smartphone {
- max-height: $player-controls-height-smartphone +
- sizes.$gap-vertical-smartphone;
- }
-
- &.expand-exit-active {
- max-height: 0;
- transition: max-height 150ms ease-in;
- }
- }
}
// `progressbar` class: visual indicator of the song progression.
diff --git a/src/style/components/library/_artist.scss b/src/style/components/library/_artist.scss
index bfaa665b..4dc73cbb 100644
--- a/src/style/components/library/_artist.scss
+++ b/src/style/components/library/_artist.scss
@@ -7,7 +7,7 @@
@use '~/abstracts/sizes';
#artist-library {
- .one-line {
+ .listing-entry-compact {
.main {
.artist-widget {
flex-grow: 1;
diff --git a/src/style/components/library/_song.scss b/src/style/components/library/_song.scss
index f171b6f1..e0e920a4 100644
--- a/src/style/components/library/_song.scss
+++ b/src/style/components/library/_song.scss
@@ -20,7 +20,7 @@
// This list entry is not hoverizable, in order to make only the compact view
// react to hover.
#song-library {
- .one-line {
+ .listing-entry-compact {
.main {
position: relative;
diff --git a/src/style/components/library/_work.scss b/src/style/components/library/_work.scss
index f0dbbd8b..519f90a5 100644
--- a/src/style/components/library/_work.scss
+++ b/src/style/components/library/_work.scss
@@ -7,7 +7,7 @@
@use '~/abstracts/sizes';
#work-library {
- .one-line {
+ .listing-entry-compact {
.main {
.work-widget {
flex-grow: 1;
diff --git a/src/style/components/playlist/_queuing.scss b/src/style/components/playlist/_queuing.scss
index 617f5593..1389b395 100644
--- a/src/style/components/playlist/_queuing.scss
+++ b/src/style/components/playlist/_queuing.scss
@@ -13,25 +13,10 @@
gap: inherit;
overflow: hidden;
- // display transition appearance
- &.show-hide-appear,
- &.show-hide-enter {
- max-width: 0;
-
- &.show-hide-appear-active,
- &.show-hide-enter-active {
- max-width: 3 * sizes.$row-height;
- transition: max-width 300ms ease-out;
- }
- }
-
- // display transition disappearance
- &.show-hide-exit {
- max-width: 3 * sizes.$row-height;
-
- &.show-hide-exit-active {
- max-width: 0;
- transition: max-width 150ms ease-in;
+ &.transition {
+ &.collapse-horizontal-enter.collapse-horizontal-enter-active,
+ &.collapse-horizontal-exit:not(.collapse-horizontal-exit-active) {
+ max-width: calc(2 * sizes.$row-height + sizes.$gap-horizontal);
}
}
}
diff --git a/src/style/components/settings/_tokens.scss b/src/style/components/settings/_tokens.scss
index 6e60cac6..569e8bfb 100644
--- a/src/style/components/settings/_tokens.scss
+++ b/src/style/components/settings/_tokens.scss
@@ -9,31 +9,24 @@
#tokens {
.token-box {
- // approximate min and max height
- $token-player-min-height: calc(
- 1.25em + sizes.$row-height + sizes.$gap-vertical
- );
- $token-player-max-height: calc(
- 3 * sizes.$row-height + 2 * sizes.$gap-vertical
- );
-
- .token-player-enter {
- height: $token-player-min-height;
- overflow-y: hidden;
-
- &.token-player-enter-active {
- height: $token-player-max-height;
- transition: height 300ms ease-out;
+ .transition {
+ // stylelint-disable @stylistic/indentation
+ &.collapse-force-vertical-enter:not(
+ .collapse-force-vertical-enter-active
+ ),
+ // stylelint-enable @stylistic/indentation
+ &.collapse-force-vertical-exit-active {
+ height: calc(1.4em + sizes.$row-height + sizes.$gap-vertical);
}
- }
- .token-player-exit {
- height: $token-player-max-height;
- overflow-y: hidden;
+ &.collapse-force-vertical-enter-done,
+ &.collapse-force-vertical-exit-done {
+ height: unset;
+ }
- &.token-player-exit-active {
- height: $token-player-min-height;
- transition: height 150ms ease-out;
+ &.collapse-force-vertical-enter-active,
+ &.collapse-force-vertical-exit:not(.collapse-force-vertical-exit-active) {
+ height: calc(0.15em + 3 * sizes.$row-height + 2 * sizes.$gap-vertical);
}
}
}
diff --git a/src/style/components/transitions/_collapse.scss b/src/style/components/transitions/_collapse.scss
new file mode 100644
index 00000000..21e6ee5a
--- /dev/null
+++ b/src/style/components/transitions/_collapse.scss
@@ -0,0 +1,45 @@
+@use '~/abstracts/transitions';
+@use '~/abstracts/sizes';
+
+@include transitions.make-transition(
+ 'collapse-vertical',
+ max-height,
+ $from: 0,
+ $to: calc(sizes.$row-height),
+ $enter-done: false
+);
+
+@include transitions.make-transition(
+ 'collapse-force-vertical',
+ height,
+ $from: 0,
+ $to: calc(sizes.$row-height),
+ $enter-done: false
+);
+
+.transition {
+ &.collapse-vertical-appear,
+ &.collapse-vertical-enter,
+ &.collapse-vertical-exit,
+ &.collapse-force-vertical-appear,
+ &.collapse-force-vertical-enter,
+ &.collapse-force-vertical-exit {
+ overflow-y: hidden;
+ }
+}
+
+@include transitions.make-transition(
+ 'collapse-horizontal',
+ max-width,
+ $from: 0,
+ $to: calc(sizes.$row-height),
+ $enter-done: false
+);
+
+.transition {
+ &.collapse-horizontal-appear,
+ &.collapse-horizontal-enter,
+ &.collapse-horizontal-exit {
+ overflow-x: hidden;
+ }
+}
diff --git a/src/style/components/transitions/_index.scss b/src/style/components/transitions/_index.scss
new file mode 100644
index 00000000..ec63ca74
--- /dev/null
+++ b/src/style/components/transitions/_index.scss
@@ -0,0 +1,3 @@
+@use 'collapse';
+@use 'slide';
+@use 'swipe';
diff --git a/src/style/components/transitions/_slide.scss b/src/style/components/transitions/_slide.scss
new file mode 100644
index 00000000..c685cdc6
--- /dev/null
+++ b/src/style/components/transitions/_slide.scss
@@ -0,0 +1,3 @@
+@use '~/abstracts/transitions';
+
+@include transitions.make-transition('slide', left, $from: 100%, $to: 0);
diff --git a/src/style/components/transitions/_swipe.scss b/src/style/components/transitions/_swipe.scss
new file mode 100644
index 00000000..21e64f6d
--- /dev/null
+++ b/src/style/components/transitions/_swipe.scss
@@ -0,0 +1,11 @@
+@use '~/abstracts/transitions';
+
+@include transitions.make-transition(
+ 'swipe',
+ left,
+ $from: -100%,
+ $to: 0,
+ $away: 100%,
+ $duration-enter: 150ms,
+ $duration-exit: 150ms
+);
diff --git a/src/thirdpartyExtensions/ReactTransitionGroup.jsx b/src/thirdpartyExtensions/ReactTransitionGroup.jsx
deleted file mode 100644
index 5df252ff..00000000
--- a/src/thirdpartyExtensions/ReactTransitionGroup.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import PropTypes from 'prop-types'
-import { CSSTransition } from 'react-transition-group'
-
-/**
- * The CSSTransitionLazy component is a sanitized version of CSSTransition
- *
- * It is aimed to fix its dysfunctionnal behavior related in
- * https://github.com/reactjs/react-transition-group/issues/156
- * The problem is that the child component is always visible, either before the
- * enter transition starts or after the exit transition finishes. The solution
- * is to force the mounting of the children component only when the enter
- * transition is bound to start and its unmounting when the exit transition has
- * finished, hence resulting in a "lazy" mounting.
- *
- * The problem is present in the example of the OFFICIAL DOCUMENTATION, which
- * makes it plainly NOT WORKING. This demonstrates how STUPID devoloppers are in
- * the FUCKING JS COMMUNITY.
- */
-
-export const CSSTransitionLazy = ({ children, ...props }) => (
-
- {children}
-
-)
-CSSTransitionLazy.propTypes = {
- children: PropTypes.node,
-}
|