VListItem.sass 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. @use 'sass:list'
  2. @use 'sass:map'
  3. @use 'sass:math'
  4. @use '../../styles/settings'
  5. @use '../../styles/tools'
  6. @use './variables' as *
  7. @include tools.layer('components')
  8. .v-list-item
  9. align-items: center
  10. display: grid
  11. flex: none
  12. grid-template-areas: "prepend content append"
  13. grid-template-columns: max-content 1fr auto
  14. outline: none
  15. max-width: 100%
  16. padding: $list-item-padding
  17. position: relative
  18. text-decoration: none
  19. @include tools.border($list-item-border...)
  20. @include tools.states('.v-list-item__overlay')
  21. @include tools.rounded($list-item-border-radius)
  22. @include tools.variant($list-item-variants...)
  23. @supports selector(:focus-visible)
  24. &::after
  25. pointer-events: none
  26. border: 2px solid currentColor
  27. border-radius: 4px
  28. opacity: 0
  29. transition: opacity .2s ease-in-out
  30. @include tools.absolute(true)
  31. &:focus-visible::after
  32. opacity: calc(.15 * var(--v-theme-overlay-multiplier))
  33. &__prepend,
  34. &__append
  35. > .v-badge .v-icon,
  36. > .v-icon
  37. opacity: #{$list-item-icon-opacity}
  38. &--active
  39. .v-list-item__prepend,
  40. .v-list-item__append
  41. > .v-badge .v-icon,
  42. > .v-icon
  43. opacity: #{$list-item-icon-active-opacity}
  44. &:not(.v-list-item--link)
  45. .v-list-item__overlay
  46. opacity: calc(#{map.get(settings.$states, 'activated')} * var(--v-theme-overlay-multiplier))
  47. &--rounded
  48. @include tools.rounded($list-item-rounded-border-radius)
  49. &--disabled
  50. pointer-events: none
  51. user-select: none
  52. opacity: $list-disabled-opacity
  53. &--link
  54. cursor: pointer
  55. .v-navigation-drawer--rail:not(.v-navigation-drawer--expand-on-hover) &,
  56. .v-navigation-drawer--rail.v-navigation-drawer--expand-on-hover:not(.v-navigation-drawer--is-hovering) &
  57. .v-avatar
  58. --v-avatar-height: 24px
  59. .v-list-item__prepend
  60. align-items: center
  61. align-self: center
  62. display: flex
  63. grid-area: prepend
  64. > .v-badge,
  65. > .v-icon,
  66. > .v-tooltip
  67. ~ .v-list-item__spacer
  68. width: $list-item-icon-margin-start
  69. > .v-avatar,
  70. > .v-badge:is(:has(.v-avatar))
  71. ~ .v-list-item__spacer
  72. width: $list-item-avatar-margin-start
  73. .v-list-item--slim &
  74. > .v-badge,
  75. > .v-icon,
  76. > .v-tooltip
  77. ~ .v-list-item__spacer
  78. width: $list-item-slim-spacer-width
  79. > .v-avatar,
  80. > .v-badge:is(:has(.v-avatar))
  81. ~ .v-list-item__spacer
  82. width: $list-item-slim-avatar-spacer-width
  83. > .v-list-item-action ~ .v-list-item__spacer
  84. width: $list-item-slim-action-spacer-width
  85. .v-list-item--three-line &
  86. align-self: start
  87. .v-list-item__append
  88. align-self: center
  89. display: flex
  90. align-items: center
  91. grid-area: append
  92. .v-list-item__spacer
  93. order: -1
  94. transition: 150ms width settings.$standard-easing
  95. > .v-badge,
  96. > .v-icon,
  97. > .v-tooltip
  98. ~ .v-list-item__spacer
  99. width: $list-item-icon-margin-end
  100. > .v-avatar,
  101. > .v-badge:is(:has(.v-avatar))
  102. ~ .v-list-item__spacer
  103. width: $list-item-avatar-margin-end
  104. > .v-list-item-action ~ .v-list-item__spacer
  105. width: $list-item-action-spacer-width
  106. .v-list-item--slim &
  107. > .v-badge,
  108. > .v-icon,
  109. > .v-tooltip
  110. ~ .v-list-item__spacer
  111. width: $list-item-slim-spacer-width
  112. > .v-avatar,
  113. > .v-badge:is(:has(.v-avatar))
  114. ~ .v-list-item__spacer
  115. width: $list-item-slim-avatar-spacer-width
  116. > .v-list-item-action ~ .v-list-item__spacer
  117. width: $list-item-slim-action-spacer-width
  118. .v-list-item--three-line &
  119. align-self: start
  120. .v-list-item__content
  121. align-self: center
  122. grid-area: content
  123. overflow: hidden
  124. .v-list-item-action
  125. align-self: center
  126. display: flex
  127. align-items: center
  128. flex: none
  129. transition: inherit
  130. transition-property: height, width
  131. &--start
  132. margin-inline-end: $list-item-action-margin-end
  133. margin-inline-start: -$list-item-action-margin-start
  134. &--end
  135. margin-inline-start: $list-item-action-margin-start
  136. margin-inline-end: -$list-item-action-margin-end
  137. .v-list-item-media
  138. margin-top: $list-item-media-margin-top
  139. margin-bottom: $list-item-media-margin-bottom
  140. &--start
  141. margin-inline-end: $list-item-media-margin-end
  142. &--end
  143. margin-inline-start: $list-item-media-margin-start
  144. .v-list-item--two-line &
  145. margin-top: $list-item-media-two-line-margin-top
  146. margin-bottom: $list-item-media-two-line-margin-bottom
  147. .v-list-item--three-line &
  148. margin-top: $list-item-media-three-line-margin-top
  149. margin-bottom: $list-item-media-three-line-margin-bottom
  150. .v-list-item-subtitle
  151. -webkit-box-orient: vertical
  152. display: -webkit-box
  153. opacity: $list-item-subtitle-opacity
  154. overflow: hidden
  155. padding: $list-item-subtitle-padding
  156. text-overflow: ellipsis
  157. overflow-wrap: $list-item-subtitle-overflow-wrap
  158. word-break: $list-item-subtitle-word-break
  159. .v-list-item--one-line &
  160. -webkit-line-clamp: 1
  161. .v-list-item--two-line &
  162. -webkit-line-clamp: 2
  163. .v-list-item--three-line &
  164. -webkit-line-clamp: 3
  165. @include tools.typography($list-item-subtitle-typography...)
  166. .v-list-item--nav &
  167. @include tools.typography($list-item-nav-subtitle-typography...)
  168. .v-list-item-title
  169. hyphens: $list-item-title-hyphens
  170. overflow-wrap: $list-item-title-overflow-wrap
  171. overflow: hidden
  172. padding: $list-item-title-padding
  173. white-space: nowrap
  174. text-overflow: ellipsis
  175. word-break: $list-item-title-word-break
  176. word-wrap: $list-item-title-word-wrap
  177. @include tools.typography($list-item-title-typography...)
  178. .v-list-item--nav &
  179. @include tools.typography($list-item-nav-title-typography...)
  180. .v-list-item
  181. @at-root
  182. @include tools.density('v-list-item', $list-density) using ($modifier)
  183. min-height: $list-item-min-height + $modifier
  184. &.v-list-item--one-line
  185. $one-line-padding: (list.nth($list-item-padding, 1) + $modifier)
  186. min-height: $list-item-one-line-min-height + $modifier
  187. @if ($one-line-padding > 0)
  188. padding-top: $one-line-padding
  189. padding-bottom: $one-line-padding
  190. &.v-list-item--two-line
  191. $two-line-padding: (list.nth($list-item-two-line-padding, 1) + $modifier)
  192. min-height: $list-item-two-line-min-height + $modifier
  193. @if ($two-line-padding > 0)
  194. padding-top: $two-line-padding
  195. padding-bottom: $two-line-padding
  196. &.v-list-item--three-line
  197. $three-line-padding: (list.nth($list-item-three-line-padding, 1) + $modifier)
  198. min-height: $list-item-three-line-min-height + $modifier
  199. @if ($three-line-padding > 0)
  200. padding-top: $three-line-padding
  201. padding-bottom: $three-line-padding
  202. .v-list-item__prepend,
  203. .v-list-item__append
  204. padding-top: math.div($three-line-padding, 2)
  205. &:not(.v-list-item--nav)
  206. &.v-list-item--one-line
  207. padding-inline: list.nth($list-item-padding, 2)
  208. &.v-list-item--two-line
  209. padding-inline: list.nth($list-item-two-line-padding, 2)
  210. &.v-list-item--three-line
  211. padding-inline: list.nth($list-item-three-line-padding, 2)
  212. &--nav
  213. padding-inline: $list-nav-padding
  214. .v-list &
  215. &:not(:only-child)
  216. margin-bottom: $list-item-nav-margin-top
  217. .v-list-item__underlay
  218. position: absolute
  219. .v-list-item__overlay
  220. background-color: currentColor
  221. border-radius: inherit
  222. bottom: 0
  223. left: 0
  224. opacity: 0
  225. pointer-events: none
  226. position: absolute
  227. right: 0
  228. top: 0
  229. transition: opacity 0.2s ease-in-out
  230. .v-list-item--active.v-list-item--variant-elevated &
  231. --v-theme-overlay-multiplier: 0
  232. $base-padding: list.nth($list-item-padding, 2)
  233. .v-list
  234. --indent-padding: 0px
  235. &--nav
  236. --indent-padding: -#{$list-nav-padding}
  237. .v-list-group
  238. --list-indent-size: #{$list-indent-size}
  239. --parent-padding: var(--indent-padding)
  240. --prepend-width: #{$list-item-prepend-size}
  241. .v-list--slim &
  242. --prepend-width: #{$list-item-slim-prepend-size}
  243. &--fluid
  244. --list-indent-size: 0px
  245. &--prepend
  246. --parent-padding: calc(var(--indent-padding) + var(--prepend-width))
  247. &--fluid.v-list-group--prepend
  248. --parent-padding: var(--indent-padding)
  249. .v-list-group__items
  250. --indent-padding: calc(var(--parent-padding) + var(--list-indent-size))
  251. .v-list-group__items .v-list-item
  252. padding-inline-start: calc(#{$base-padding} + var(--indent-padding)) !important
  253. .v-list-group__header:not(.v-treeview-item--activatable-group-activator).v-list-item--active
  254. &:not(:focus-visible)
  255. .v-list-item__overlay
  256. opacity: 0
  257. &:hover
  258. .v-list-item__overlay
  259. opacity: calc(#{map.get(settings.$states, 'hover')} * var(--v-theme-overlay-multiplier))