VTimeline.sass 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. @use 'sass:map'
  2. @use 'sass:math'
  3. @use '../../styles/settings'
  4. @use '../../styles/tools'
  5. @use './variables' as *
  6. @use './mixins' as *
  7. @include tools.layer('components')
  8. // VTimeline
  9. .v-timeline
  10. .v-timeline-divider__dot
  11. background: $timeline-dot-divider-background
  12. .v-timeline-divider__inner-dot
  13. background: $timeline-inner-dot-divider-background
  14. .v-timeline
  15. display: grid
  16. grid-auto-flow: dense
  17. position: relative
  18. @include horizontal(true)
  19. grid-column-gap: $timeline-item-padding
  20. width: 100%
  21. .v-timeline-item:nth-child(2n)
  22. .v-timeline-item__body
  23. grid-row: 3
  24. padding-block-start: $timeline-item-padding
  25. .v-timeline-item__opposite
  26. grid-row: 1
  27. padding-block-end: $timeline-item-padding
  28. align-self: flex-end
  29. .v-timeline-item:nth-child(2n+1)
  30. .v-timeline-item__body
  31. grid-row: 1
  32. padding-block-end: $timeline-item-padding
  33. align-self: flex-end
  34. .v-timeline-item__opposite
  35. grid-row: 3
  36. padding-block-start: $timeline-item-padding
  37. @include vertical(true)
  38. row-gap: $timeline-item-padding
  39. height: 100%
  40. @include timeline-first-item()
  41. padding-block-start: $timeline-item-padding
  42. @include timeline-last-item()
  43. padding-block-end: $timeline-item-padding
  44. .v-timeline-item:nth-child(2n)
  45. .v-timeline-item__body
  46. grid-column: 1
  47. padding-inline-end: $timeline-item-padding
  48. .v-timeline-item__opposite
  49. grid-column: 3
  50. padding-inline-start: $timeline-item-padding
  51. .v-timeline-item:nth-child(2n+1)
  52. .v-timeline-item__body
  53. grid-column: 3
  54. padding-inline-start: $timeline-item-padding
  55. .v-timeline-item__opposite
  56. grid-column: 1
  57. justify-self: flex-end
  58. padding-inline-end: $timeline-item-padding
  59. // VTimelineItem
  60. .v-timeline-item
  61. display: contents
  62. // VTimelineDivider
  63. .v-timeline-divider
  64. position: relative
  65. display: flex
  66. align-items: center
  67. @include horizontal
  68. flex-direction: row
  69. grid-row: 2
  70. width: 100%
  71. @include vertical
  72. height: 100%
  73. flex-direction: column
  74. grid-column: 2
  75. $timeline-line-size: calc(var(--v-timeline-line-size-base) + #{math.div($timeline-item-padding, 2)} - var(--v-timeline-line-inset))
  76. $timeline-line-start: math.div(-$timeline-item-padding, 2)
  77. $timeline-line-size-first-last: calc(var(--v-timeline-line-size-base) - var(--v-timeline-line-inset) + var(--v-timeline-line-size-offset))
  78. .v-timeline-divider__before
  79. background: $timeline-divider-line-background
  80. position: absolute
  81. @include horizontal
  82. height: $timeline-divider-line-thickness
  83. width: $timeline-line-size
  84. inset-inline-start: $timeline-line-start
  85. inset-inline-end: initial
  86. @include vertical
  87. height: $timeline-line-size
  88. width: $timeline-divider-line-thickness
  89. top: $timeline-line-start
  90. .v-timeline-divider__after
  91. background: $timeline-divider-line-background
  92. position: absolute
  93. @include horizontal
  94. height: $timeline-divider-line-thickness
  95. width: $timeline-line-size
  96. inset-inline-end: $timeline-line-start
  97. inset-inline-start: initial
  98. @include vertical
  99. height: $timeline-line-size
  100. width: $timeline-divider-line-thickness
  101. bottom: $timeline-line-start
  102. .v-timeline-item:first-child
  103. .v-timeline-divider__before
  104. @include vertical
  105. height: $timeline-line-size
  106. top: 0
  107. @include horizontal
  108. width: $timeline-line-size
  109. inset-inline-start: 0
  110. inset-inline-end: initial
  111. .v-timeline-divider__after
  112. @include vertical
  113. height: $timeline-line-size-first-last
  114. @include horizontal
  115. width: $timeline-line-size-first-last
  116. inset-inline-end: $timeline-line-start
  117. inset-inline-start: initial
  118. .v-timeline-item:last-child
  119. .v-timeline-divider__before
  120. @include vertical
  121. height: $timeline-line-size-first-last
  122. @include horizontal
  123. width: $timeline-line-size-first-last
  124. .v-timeline-divider__after
  125. @include vertical
  126. height: calc(var(--v-timeline-line-size-base) + #{math.div($timeline-item-padding, 2)} - var(--v-timeline-line-inset))
  127. bottom: 0
  128. @include horizontal
  129. width: calc(var(--v-timeline-line-size-base) + #{math.div($timeline-item-padding, 2)} - var(--v-timeline-line-inset))
  130. inset-inline-end: 0
  131. inset-inline-start: initial
  132. .v-timeline-item:only-child
  133. .v-timeline-divider__after
  134. @include vertical
  135. height: calc(var(--v-timeline-line-size-base) - var(--v-timeline-line-inset))
  136. .v-timeline-divider__dot
  137. z-index: 1
  138. flex-shrink: 0
  139. border-radius: $timeline-dot-border-radius
  140. display: flex
  141. justify-content: center
  142. align-items: center
  143. @include tools.elevation($timeline-divider-dot-elevation)
  144. @each $name, $multiplier in settings.$size-scales
  145. $size: $timeline-dot-size + (8 * $multiplier)
  146. &--size-#{$name}
  147. height: $size
  148. width: $size
  149. .v-timeline-divider__inner-dot
  150. height: calc(100% - #{map.get($timeline-dot-border-sizes, $name)})
  151. width: calc(100% - #{map.get($timeline-dot-border-sizes, $name)})
  152. .v-timeline-divider__inner-dot
  153. align-items: center
  154. border-radius: $timeline-dot-border-radius
  155. display: flex
  156. justify-content: center
  157. /** Modifiers **/
  158. // Justify
  159. .v-timeline--justify-center
  160. @include horizontal(true)
  161. grid-template-rows: $timeline-item-grid-template-center
  162. @include vertical(true)
  163. grid-template-columns: $timeline-item-grid-template-center
  164. .v-timeline--justify-auto
  165. @include horizontal(true)
  166. grid-template-rows: $timeline-item-grid-template-auto
  167. @include vertical(true)
  168. grid-template-columns: $timeline-item-grid-template-auto
  169. // Density
  170. .v-timeline--density-comfortable
  171. @include horizontal(true)
  172. height: 100%
  173. &.v-timeline--side-end
  174. grid-template-rows: $timeline-density-comfortable-grid-template-end
  175. &.v-timeline--side-start
  176. grid-template-rows: $timeline-density-comfortable-grid-template-start
  177. @include vertical(true)
  178. width: 100%
  179. &.v-timeline--side-end
  180. grid-template-columns: $timeline-density-comfortable-grid-template-end
  181. &.v-timeline--side-start
  182. grid-template-columns: $timeline-density-comfortable-grid-template-start
  183. .v-timeline--density-compact
  184. @include horizontal(true)
  185. &.v-timeline--side-end
  186. grid-template-rows: $timeline-density-compact-grid-template-end
  187. &.v-timeline--side-start
  188. grid-template-rows: $timeline-density-compact-grid-template-start
  189. .v-timeline-item__body
  190. grid-row: 1
  191. @include vertical(true)
  192. &.v-timeline--side-end
  193. grid-template-columns: $timeline-density-compact-grid-template-end
  194. &.v-timeline--side-start
  195. grid-template-columns: $timeline-density-compact-grid-template-start
  196. .v-timeline-item__body
  197. grid-column: 3
  198. // Side
  199. .v-timeline.v-timeline--side-end
  200. .v-timeline-item
  201. @include horizontal(true)
  202. .v-timeline-item__body
  203. grid-row: 3
  204. padding-block-end: initial
  205. padding-block-start: $timeline-item-padding
  206. .v-timeline-item__opposite
  207. grid-row: 1
  208. padding-block-end: $timeline-item-padding
  209. padding-block-start: initial
  210. @include vertical(true)
  211. .v-timeline-item__body
  212. grid-column: 3
  213. padding-inline-start: $timeline-item-padding
  214. padding-inline-end: initial
  215. justify-self: flex-start
  216. .v-timeline-item__opposite
  217. grid-column: 1
  218. justify-self: flex-end
  219. padding-inline-end: $timeline-item-padding
  220. padding-inline-start: initial
  221. .v-timeline.v-timeline--side-start
  222. .v-timeline-item
  223. @include horizontal(true)
  224. .v-timeline-item__body
  225. grid-row: 1
  226. padding-block-end: $timeline-item-padding
  227. padding-block-start: initial
  228. .v-timeline-item__opposite
  229. grid-row: 3
  230. padding-block-end: initial
  231. padding-block-start: $timeline-item-padding
  232. @include vertical(true)
  233. .v-timeline-item__body
  234. grid-column: 1
  235. justify-self: flex-end
  236. padding-inline-end: $timeline-item-padding
  237. .v-timeline-item__opposite
  238. grid-column: 3
  239. padding-inline-start: $timeline-item-padding
  240. justify-self: flex-start
  241. // Fill dot
  242. .v-timeline-divider--fill-dot
  243. .v-timeline-divider__inner-dot
  244. height: inherit
  245. width: inherit
  246. // Alignment
  247. .v-timeline--align-center
  248. --v-timeline-line-size-base: 50%
  249. --v-timeline-line-size-offset: 0px
  250. @include horizontal(true)
  251. justify-items: center
  252. .v-timeline-item__body
  253. padding-inline: math.div($timeline-item-padding, 2)
  254. .v-timeline-item__opposite
  255. padding-inline: math.div($timeline-item-padding, 2)
  256. .v-timeline-divider
  257. justify-content: center
  258. @include vertical(true)
  259. align-items: center
  260. .v-timeline-divider
  261. justify-content: center
  262. .v-timeline--align-start
  263. --v-timeline-line-size-base: 100%
  264. --v-timeline-line-size-offset: #{math.div($timeline-item-padding, 2)}
  265. $timeline-line-size-before: calc(var(--v-timeline-line-size-offset) + var(--v-timeline-dot-size) / 2 - var(--v-timeline-line-inset))
  266. $timeline-line-size-after: calc(var(--v-timeline-line-size-base) - var(--v-timeline-dot-size) / 2 + var(--v-timeline-line-size-offset) - var(--v-timeline-line-inset))
  267. .v-timeline-item:first-child
  268. .v-timeline-divider__before
  269. --v-timeline-line-size-offset: #{$timeline-item-padding}
  270. .v-timeline-divider__after
  271. --v-timeline-line-size-offset: -#{math.div($timeline-item-padding, 2)}
  272. .v-timeline-item:last-child
  273. .v-timeline-divider__after
  274. --v-timeline-line-size-offset: 0px
  275. @include horizontal(true)
  276. justify-items: flex-start
  277. .v-timeline-divider
  278. justify-content: flex-start
  279. .v-timeline-divider__before
  280. width: $timeline-line-size-before
  281. .v-timeline-divider__after
  282. width: $timeline-line-size-after
  283. @include vertical(true)
  284. align-items: flex-start
  285. .v-timeline-divider
  286. justify-content: flex-start
  287. .v-timeline-divider__before
  288. height: $timeline-line-size-before
  289. .v-timeline-divider__after
  290. height: $timeline-line-size-after
  291. // Truncate start
  292. .v-timeline--truncate-line-start
  293. .v-timeline-item:first-child
  294. .v-timeline-divider__before
  295. display: none
  296. .v-timeline-divider__after
  297. --v-timeline-line-size-offset: #{math.div($timeline-item-padding, 2)}
  298. @include vertical(true)
  299. @include timeline-first-item()
  300. padding-block-start: 0
  301. @include horizontal(true)
  302. @include timeline-first-item()
  303. padding-inline-start: 0
  304. // Truncate end
  305. .v-timeline--truncate-line-end
  306. .v-timeline-item:last-child
  307. .v-timeline-divider__after
  308. display: none
  309. .v-timeline-divider__before
  310. --v-timeline-line-size-offset: #{math.div($timeline-item-padding, 2)}
  311. @include vertical(true)
  312. @include timeline-last-item()
  313. padding-block-end: 0
  314. @include horizontal(true)
  315. @include timeline-last-item()
  316. padding-inline-end: 0