common/app/layout/slices/Slice.scala (895 lines of code) (raw):
package layout.slices
import layout.cards._
import layout._
sealed trait Slice {
val layout: SliceLayout
}
/* .________.________.________.________.
* |________|________|________|________|
* |________|________|________|________|
* |________|________|________|________|
*/
case object Ql3Ql3Ql3Ql3 extends Slice {
val layout = SliceLayout(
cssClassName = "q-ql-ql-ql",
columns = Seq(
Rows(
colSpan = 4,
columns = 4,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .________.________.________.________.
* |########|________|________|________|
* |########|________|________|________|
* |________|________|________|________|
*/
case object QuarterQlQlQl extends Slice {
val layout = SliceLayout(
cssClassName = "q-ql-ql-ql",
columns = Seq(
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
Rows(
colSpan = 3,
columns = 3,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .________.________.________.________.
* |########|########|________|________|
* |########|########|________|________|
* |________|________|________|________|
*/
case object QuarterQuarterQlQl extends Slice {
val layout = SliceLayout(
cssClassName = "q-q-ql-ql",
columns = Seq(
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
Rows(
colSpan = 2,
columns = 2,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
// Large single column collection hold all currently live Showcase single stories; not intended to be render as HTML
case object ShowcaseSingleStories extends Slice {
val layout = SliceLayout(
cssClassName = "q-q-q-ql",
columns = Seq(
Rows(
colSpan = 1,
columns = 1,
rows = 30,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .________.________.________.________.
* |########|########|########|________|
* |########|########|########|________|
* |________|________|________|________|
*/
case object QuarterQuarterQuarterQl extends Slice {
val layout = SliceLayout(
cssClassName = "q-q-q-ql",
columns = Seq(
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
Rows(
colSpan = 1,
columns = 1,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .________.________.________.________.
* |########|########|########|########|
* |########|########|########|########|
* |________|________|________|________|
*/
case object QuarterQuarterQuarterQuarter extends Slice {
val layout = SliceLayout(
cssClassName = "q-q-q-q",
columns = Seq(
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
),
)
}
/* ._________________.________.________.
* |#################|________|________|
* |#################|________|________|
* |#################|________|________|
* |_________________|________|________|
*/
case object HalfQl4Ql4 extends Slice {
val layout = SliceLayout(
cssClassName = "h-ql4-ql4",
columns = Seq(
SingleItem(
colSpan = 2,
ItemClasses(
mobile = MediaList,
tablet = Half,
),
),
Rows(
colSpan = 2,
columns = 2,
rows = 4,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* ._________________.________.________.
* |#################|########|########|
* |#################|########|########|
* |#################|########|########|
* |_________________|________|________|
*/
case object HalfQQ extends Slice {
val layout = SliceLayout(
cssClassName = "h-q-q",
columns = Seq(
SingleItem(
colSpan = 2,
ItemClasses(
mobile = Standard,
tablet = Half,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
),
)
}
/* .________.________.________.________.
* |#################|########|________|
* |#################|________|________|
* |#################|________|________|
* |_________________|________|________|
*/
case object HalfQuarterQl2Ql4 extends Slice {
val layout = SliceLayout(
cssClassName = "h-q_ql2-ql4",
columns = Seq(
SingleItem(
colSpan = 2,
itemClasses = ItemClasses(
mobile = Standard,
tablet = Half,
),
),
SplitColumn(
colSpan = 1,
topItemRows = 1,
topItemClasses = ItemClasses(
mobile = MediaList,
tablet = Standard,
),
bottomItemRows = 2,
bottomItemsClasses = ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
Rows(
colSpan = 1,
columns = 1,
rows = 5,
itemClasses = ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/** Basically the same as above but for when there is another slice above that has already degraded from a standard to a
* media list item. Editorial have asked that the first item in this slice then gets the media list behaviour as
* opposed to being a standard item at mobile.
*/
case object HalfQuarterQl2Ql4B extends Slice {
private val master = HalfQuarterQl2Ql4.layout
val layout = master.copy(columns = master.columns match {
case SingleItem(colSpan, itemClasses) +: t =>
SingleItem(colSpan, itemClasses.copy(mobile = MediaList)) +: t
})
}
/* ._________________._________________.
* |_________________|_________________|
* |_________________|_________________|
* |_________________|_________________|
* |_________________|_________________|
*/
case object Hl4Hl4 extends Slice {
val layout = SliceLayout(
cssClassName = "hl-hl",
columns = Seq(
Rows(
colSpan = 1,
columns = 2,
rows = 4,
ItemClasses(
mobile = ListItem,
tablet = MediaList,
),
),
),
)
}
/* .________.________._________________.
* |########|########| |
* |########|########|_________________|
* | | |_________________|
* |________|________|_________________|
*/
case object QuarterQuarterHl3 extends Slice {
val layout = SliceLayout(
cssClassName = "q-q-hl3",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
Rows(
colSpan = 2,
columns = 1,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = MediaList,
),
),
),
)
}
/* .________.________._________________.
* | |########|########|
* |_________________|########|########|
* |_________________| | |
* |_________________|________|________|
*/
case object Hl3QuarterQuarter extends Slice {
val layout = SliceLayout(
cssClassName = "hl3-q-q",
columns = Seq(
Rows(
colSpan = 2,
columns = 1,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = MediaList,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
),
)
}
/* ._________________.________.________.
* |_________________|########|########|
* |_________________|########|########|
* |_________________| | |
* |_________________|________|________|
*/
/*
* The order of this sequence is important.
* We use flex-direction(row-reverse) to maintain DOM hierarchy whilst having correct visual ordering.
* */
case object Hl4QuarterQuarter extends Slice {
val layout = SliceLayout(
cssClassName = "h14-q-q",
columns = Seq(
Rows(
colSpan = 2,
columns = 2,
rows = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
Rows(
colSpan = 2,
columns = 1,
rows = 4,
ItemClasses(
mobile = ListItem,
tablet = MediaList,
),
),
),
)
}
/* ._________________._________________.
* |_###_____________|#################|
* |_###_____________|#################|
* |_###_____________|#################|
* |_###_____________|_________________|
*/
/*
* The order of this sequence is important.
* We use flex-direction(row-reverse) to maintain DOM hierarchy whilst having correct visual ordering.
* */
case object Hl4Half extends Slice {
val layout = SliceLayout(
cssClassName = "hl4-h",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = Half,
),
),
Rows(
colSpan = 1,
columns = 1,
rows = 4,
ItemClasses(
mobile = MediaList,
tablet = MediaList,
),
),
),
)
}
/* ._________________._________________.
* |_###_____________| |
* |_###_____________| MPU |
* |_###_____________|_________________|
*/
/*
* The order of this sequence is important.
* We use flex-direction(row-reverse) to maintain DOM hierarchy whilst having correct visual ordering.
* */
case object Hl3Mpu extends Slice {
val layout = SliceLayout(
cssClassName = "hl3-mpu",
columns = Seq(
Rows(
colSpan = 1,
columns = 1,
rows = 3,
ItemClasses(
mobile = MediaList,
tablet = MediaList,
),
),
MPU(
colSpan = 1,
),
),
)
}
/** This is not actually used but is a reflection of Hl4Half, for the thumbnail display in the tool */
object HalfHl4 extends Slice {
val layout = Hl4Half.layout.copy(
columns = Hl4Half.layout.columns.reverse,
)
}
/** * VOLUME SLICES **
*/
/* .__________________________.________.
* | ##################|########|
* | ##################|########|
* | ##################|########|
* | ##################| |
* `--------------------------'--------'
*/
case object ThreeQuarterQuarter extends Slice {
val layout = SliceLayout(
cssClassName = "qqq-q",
columns = Seq(
SingleItem(
colSpan = 3,
ItemClasses(
mobile = Standard,
tablet = ThreeQuarters,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
),
)
}
/* .________.__________________________.
* |########|################## |
* |########|################## |
* |########|################## |
* | |################## |
* `--------'--------------------------'
*/
case object QuarterThreeQuarter extends Slice {
val layout = SliceLayout(
cssClassName = "q-qqq",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
SingleItem(
colSpan = 3,
ItemClasses(
mobile = Standard,
tablet = ThreeQuartersRight,
),
),
),
)
}
/* .__________________________.________.
* |##########################|########|
* |##########################|########|
* |##########################|########|
* |##########################| |
* |##########################| |
* |##########################| |
* |##########################| |
* |##########################| |
* `--------------------------'--------'
*/
case object ThreeQuarterTallQuarter extends Slice {
val layout = SliceLayout(
cssClassName = "qqqtall-q",
columns = Seq(
SingleItem(
colSpan = 3,
ItemClasses(
mobile = Standard,
tablet = ThreeQuartersTall,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Standard,
),
),
),
)
}
/* .__________________________.________.
* |##########################|########|
* |##########################|########|
* |##########################| |
* |##########################| |
* |##########################| |
* |##########################|--------|
* |##########################|########|
* |##########################|########|
* | | |
* | | |
* | | |
* `--------------------------'--------'
*/
case object ThreeQuarterTallQuarter2 extends Slice {
val layout = SliceLayout(
cssClassName = "qqqtall-q2",
columns = Seq(
SingleItem(
colSpan = 3,
ItemClasses(
mobile = Standard,
tablet = ThreeQuartersTall,
),
),
Rows(
colSpan = 1,
columns = 1,
rows = 2,
ItemClasses(
mobile = ListItem,
tablet = Standard,
),
),
),
)
}
/* .__________________________.________.
* |##########################|########|
* |##########################| |
* |##########################| |
* |##########################|--------|
* | | |
* | |--------|
* | | |
* `--------------------------'--------'
*/
case object ThreeQuarterTallQuarter1Ql2 extends Slice {
val layout = SliceLayout(
cssClassName = "qqqtall-q1-ql2",
columns = Seq(
SingleItem(
colSpan = 3,
ItemClasses(
mobile = Standard,
tablet = ThreeQuartersTall,
),
),
SplitColumn(
colSpan = 1,
topItemRows = 1,
topItemClasses = ItemClasses(
mobile = ListItem,
tablet = Standard,
),
bottomItemRows = 2,
bottomItemsClasses = ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .__________________________.________.
* |##########################|########|
* |##########################| |
* |##########################| |
* |##########################|--------|
* |##########################|########|
* |##########################| |
* |##########################| |
* |##########################|--------|
* | | |
* | |--------|
* | | |
* `--------------------------'--------'
*/
case object ThreeQuarterTallQuarter2Ql2 extends Slice {
val layout = SliceLayout(
cssClassName = "qqqtall-q2-ql2",
columns = Seq(
SingleItem(
colSpan = 3,
ItemClasses(
mobile = Standard,
tablet = ThreeQuartersTall,
),
),
SplitColumn(
colSpan = 1,
topItemRows = 2,
topItemClasses = ItemClasses(
mobile = ListItem,
tablet = Standard,
),
bottomItemRows = 2,
bottomItemsClasses = ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* ._________________._________________.
* |#################|#################|
* |#################|#################|
* |#################|#################|
* | | |
* `-----------------'-----------------'
*/
case object HalfHalf extends Slice {
val layout = SliceLayout(
cssClassName = "h-h",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = Half,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = Half,
),
),
),
)
}
/** Same as above, but doesn't give two large standard items on mobile view. Good for when you just need a container
* that supports two items, but you don't want it to be given an extreme treatment on mobile, i.e., in the story
* package and on tag page containers.
*/
case object HalfHalf2 extends Slice {
val layout = SliceLayout(
cssClassName = "h-h",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = Half,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Half,
),
),
),
)
}
/* .___________________________________.
* | #################|
* | #################|
* | #################|
* | #################|
* | #################|
* `-----------------------------------'
*/
case object FullMedia50 extends Slice {
val layout = SliceLayout(
cssClassName = "f",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = cards.FullMedia50,
),
),
),
)
}
/* .___________________________________.
* | ##########################|
* | ##########################|
* | ##########################|
* | ##########################|
* `-----------------------------------'
*/
case object FullMedia75 extends Slice {
val layout = SliceLayout(
cssClassName = "f",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = cards.FullMedia75,
),
),
),
)
}
/* .___________________________________.
* |###################################|
* |###################################|
* |###################################|
* | |
* `-----------------------------------'
*/
case object FullMedia100 extends Slice {
val layout = SliceLayout(
cssClassName = "mf",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = cards.FullMedia100,
),
),
),
)
}
/* .___________________________________.
* ##|###################################|##
* ##|###################################|##
* ##|###################################|##
* | |
* `-----------------------------------'
*/
case object Fluid extends Slice {
val layout = SliceLayout(
cssClassName = "mf",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = cards.Fluid,
tablet = cards.Fluid,
),
),
),
)
}
/** * LIST SLICES **
*/
/* .___________.___________.___________.
* |___________|___________| |
* |___________|___________| MPU! |
* |___________|___________|___________|
*/
case object TlTlMpu extends Slice {
val layout = SliceLayout(
cssClassName = "tl-tl-mpu",
columns = Seq(
Rows(
colSpan = 2,
columns = 2,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
MPU(
colSpan = 1,
),
),
)
}
/* .________.________.________.________.
* |________|________|________|________|
*/
case object Ql1Ql1Ql1Ql1 extends Slice {
val layout: SliceLayout = SliceLayout(
cssClassName = "ql-ql-ql-ql",
columns = Seq(
Rows(
colSpan = 4,
columns = 4,
rows = 1,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .________.________.________.________.
* |________|________|________|________|
* |________|________|________|________|
*/
case object Ql2Ql2Ql2Ql2 extends Slice {
val layout: SliceLayout = SliceLayout(
cssClassName = "ql-ql-ql-ql",
columns = Seq(
Rows(
colSpan = 4,
columns = 4,
rows = 2,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .___________.___________.___________.
* |___________|___________|___________|
* |___________|___________|___________|
*/
case object TlTlTl extends Slice {
val layout = SliceLayout(
cssClassName = "tl-tl-tl",
columns = Seq(
Rows(
colSpan = 1,
columns = 3,
rows = 2,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .___________.___________.___________.
* |_#########_|_#########_|_#########_|
* |_#########_|_#########_|_#########_|
* |_#########_|_#########_|_#########_|
* | | | |
* | | | |
* `-----------------------------------'
*/
case object TTT extends Slice {
val layout = SliceLayout(
cssClassName = "t-t-t",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = Third,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Third,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Third,
),
),
),
)
}
/* .___________.___________.___________.
* |_#########_|_#########_|___________|
* |_#########_|_#########_|___________|
* |_#########_|_#########_|___________|
* | | |___________|
* | | |___________|
* `-----------------------------------'
*/
case object TTTL4 extends Slice {
val layout = SliceLayout(
cssClassName = "t-t-tl4",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = Third,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Third,
),
),
Rows(
colSpan = 1,
columns = 1,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
),
)
}
/* .___________.___________.___________.
* |_#########_|___________| |
* |_#########_|___________| MPU! |
* |_#########_|___________| |
* | |___________| |
* | |___________| |
* `-----------------------------------'
*/
case object TTlMpu extends Slice {
val layout = SliceLayout(
cssClassName = "t-tl-mpu",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Third,
),
),
Rows(
colSpan = 1,
columns = 1,
rows = 3,
ItemClasses(
mobile = ListItem,
tablet = ListItem,
),
),
MPU(
colSpan = 1,
),
),
)
}
case object TTMpu extends Slice {
val layout = SliceLayout(
cssClassName = "t-t-mpu",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Third,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = Third,
),
),
MPU(
colSpan = 1,
),
),
)
}
/*
* The Highlights layout is used to display select features in the header for apps and web, notably via a carousel.
* The implementation on platforms effectively limits the display to 2-4 cards, with a peeking card.
* We don't limit the slice definition here to 4, because of how fronts are pressed in facia-press.
* This ensures the full number of cards get loaded by default, and can then be appropriately displayed by the carousel.
*
* Desktop:
* .____________.____________.____________.____________.____________.____________.
* | #####| #####| #####| #####| #####| #####|
* | #####| #####| #####| #####| #####| #####|
* | #####| #####| #####| #####| #####| #####|
* '-----------------------------------------------------------------------------'
*
* Mobile:
* .___________.___________.___________.___________.___________.___________.
* | | | | | | |
* | | | | | | |
* |_#########_|_#########_|_#########_|_#########_|_#########_|_#########_|
* |_#########_|_#########_|_#########_|_#########_|_#########_|_#########_|
* |_#########_|_#########_|_#########_|_#########_|_#########_|_#########_|
* `-----------------------------------------------------------------------'
*/
case object Highlights extends Slice {
val layout = SliceLayout(
cssClassName = "scrollable-highlights",
columns = Seq.fill(6)(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = MediaList,
),
),
),
)
}
/*
* Scrollable slice definitions
* These layouts are implemented via a carousel in DCR.
* But due to how fronts are pressed in facia-press, we need to provide a slice definition here.
* This ensures the intended number of cards get pressed in a collection.
*/
case object ScrollableSmall extends Slice {
val layout = SliceLayout(
cssClassName = "scrollable-small",
columns = Seq.fill(4)(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = MediaList,
tablet = MediaList,
),
),
),
)
}
case object ScrollableMedium extends Slice {
val layout = SliceLayout(
cssClassName = "scrollable-medium",
columns = Seq.fill(4)(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = Standard,
tablet = Standard,
),
),
),
)
}
case object ScrollableFeature extends Slice {
val layout = SliceLayout(
cssClassName = "scrollable-feature",
columns = Seq.fill(3)(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = cards.FullMedia100,
tablet = cards.FullMedia100,
),
),
),
)
}
/*
* The Static Feature container layout has two immersive style cards (full media)
*
* Desktop:
* .____________._____________.
* | ########## | ########## |
* | ########## | ########## |
* | ########## | ########## |
* | ########## | ########## |
* | ########## | ########## |
* '------------'-------------'
*
* Mobile:
* .____________.
* | ########## |
* | ########## |
* | ########## |
* | ########## |
* | ########## |
* '------------'
* | ########## |
* | ########## |
* | ########## |
* | ########## |
* | ########## |
* '------------'
*/
case object StaticFeature extends Slice {
val layout = SliceLayout(
cssClassName = "static-feature",
columns = Seq(
SingleItem(
colSpan = 1,
ItemClasses(
mobile = cards.FullMedia100,
tablet = cards.FullMedia100,
),
),
SingleItem(
colSpan = 1,
ItemClasses(
mobile = cards.FullMedia100,
tablet = cards.FullMedia100,
),
),
),
)
}