index.styl 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. .media-upload
  2. border: 2px dashed var(--border-color)
  3. border-radius: var(--border-radius)
  4. transition: var(--transition-normal)
  5. overflow: hidden
  6. .media-upload__dropzone
  7. position: relative
  8. min-height: 200px
  9. display: flex
  10. align-items: center
  11. justify-content: center
  12. background: var(--color-light-10)
  13. cursor: pointer
  14. .theme-dark &
  15. background: var(--color-dark-50)
  16. &:hover
  17. border-color: var(--color-primary-50)
  18. background: var(--color-primary-10)
  19. &.media-upload__dropzone--dragging
  20. border-color: var(--color-primary)
  21. background: var(--color-primary-20)
  22. &.media-upload__dropzone--has-image
  23. min-height: 300px
  24. background: var(--color-white)
  25. .theme-dark &
  26. background: var(--color-dark)
  27. .media-upload__preview
  28. position: relative
  29. width: 100%
  30. height: 100%
  31. display: flex
  32. align-items: center
  33. justify-content: center
  34. padding: var(--spacing-md)
  35. .media-upload__image
  36. max-width: 100%
  37. max-height: 250px
  38. object-fit: contain
  39. border-radius: var(--border-radius-sm)
  40. .media-upload__preview-actions
  41. position: absolute
  42. top: var(--spacing-md)
  43. right: var(--spacing-md)
  44. display: flex
  45. gap: var(--spacing-sm)
  46. opacity: 0
  47. transition: var(--transition-fast)
  48. .media-upload__preview:hover &
  49. opacity: 1
  50. .media-upload__remove-btn,
  51. .media-upload__change-btn
  52. width: 36px
  53. height: 36px
  54. border: none
  55. border-radius: 50%
  56. display: flex
  57. align-items: center
  58. justify-content: center
  59. cursor: pointer
  60. font-size: var(--font-size-lg)
  61. transition: var(--transition-fast)
  62. .media-upload__remove-btn
  63. background: var(--color-danger)
  64. color: var(--color-white)
  65. &:hover
  66. background: var(--color-danger-50)
  67. transform: scale(1.1)
  68. .media-upload__change-btn
  69. background: var(--color-primary)
  70. color: var(--color-white)
  71. &:hover
  72. background: var(--color-primary-50)
  73. transform: scale(1.1)
  74. .media-upload__uploading
  75. display: flex
  76. flex-direction: column
  77. align-items: center
  78. gap: var(--spacing-md)
  79. color: var(--color-secondary)
  80. .media-upload__spinner
  81. width: 40px
  82. height: 40px
  83. border: 3px solid var(--color-primary-10)
  84. border-top: 3px solid var(--color-primary)
  85. border-radius: 50%
  86. animation: media-upload-spin 1s linear infinite
  87. @keyframes media-upload-spin
  88. 0%
  89. transform: rotate(0deg)
  90. 100%
  91. transform: rotate(360deg)
  92. .media-upload__empty
  93. display: flex
  94. flex-direction: column
  95. align-items: center
  96. gap: var(--spacing-md)
  97. padding: var(--spacing-xl)
  98. text-align: center
  99. .media-upload__icon
  100. font-size: 3rem
  101. opacity: 0.7
  102. .media-upload__title
  103. font-size: var(--font-size-lg)
  104. font-weight: var(--font-weight-semibold)
  105. color: var(--color-dark)
  106. margin: 0
  107. .theme-dark &
  108. color: var(--color-light)
  109. .media-upload__subtitle
  110. color: var(--color-secondary)
  111. margin: 0
  112. .media-upload__browse-btn
  113. padding: var(--spacing-sm) var(--spacing-lg)
  114. background: var(--color-primary)
  115. color: var(--color-white)
  116. border: none
  117. border-radius: var(--border-radius)
  118. cursor: pointer
  119. font-weight: var(--font-weight-medium)
  120. transition: var(--transition-fast)
  121. &:hover
  122. background: var(--color-primary-50)
  123. transform: translateY(-1px)
  124. .media-upload__hint
  125. font-size: var(--font-size-sm)
  126. color: var(--color-secondary)
  127. margin: 0
  128. .media-upload__input
  129. display: none
  130. .media-upload__file-info
  131. padding: var(--spacing-md)
  132. background: var(--color-light-10)
  133. border-top: 1px solid var(--border-color)
  134. .theme-dark &
  135. background: var(--color-dark-50)
  136. .media-upload__file-name
  137. font-weight: var(--font-weight-medium)
  138. margin-bottom: var(--spacing-xs)
  139. .media-upload__file-size
  140. font-size: var(--font-size-sm)
  141. color: var(--color-secondary)
  142. .media-upload__progress
  143. padding: var(--spacing-md)
  144. background: var(--color-light-10)
  145. border-top: 1px solid var(--border-color)
  146. .theme-dark &
  147. background: var(--color-dark-50)
  148. .media-upload__progress-bar
  149. height: 6px
  150. background: var(--color-light-50)
  151. border-radius: 3px
  152. overflow: hidden
  153. margin-bottom: var(--spacing-sm)
  154. .theme-dark &
  155. background: var(--color-dark-20)
  156. .media-upload__progress-fill
  157. height: 100%
  158. background: var(--color-primary)
  159. transition: width 0.3s ease
  160. border-radius: 3px
  161. .media-upload__progress-text
  162. font-size: var(--font-size-sm)
  163. color: var(--color-secondary)
  164. text-align: center
  165. display: block
  166. // Адаптивность
  167. @media (max-width: 768px)
  168. .media-upload__dropzone
  169. min-height: 150px
  170. &.media-upload__dropzone--has-image
  171. min-height: 250px
  172. .media-upload__preview-actions
  173. opacity: 1
  174. .media-upload__empty
  175. padding: var(--spacing-lg)
  176. .media-upload__icon
  177. font-size: 2rem