@uxda/appkit 1.0.66 → 1.0.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,51 +1,34 @@
1
1
  <template>
2
- <div class="consumption-view" :class="{ popupOpen }">
3
- <div class="header">
4
- <div class="header_card">
5
- <div class="clound-bean">
6
- <div class="bean-box spa-between">
7
- <div class="bean-img">
8
- <img
9
- class="bean-icon"
10
- src="https://cdn.ddjf.com/static/images/bpms-workBench/gold-bean.png" />
11
- <div class="bean-tag tag">云豆</div>
12
- </div>
13
- <div class="rule" @click="rulesPopupOpen = true">规则说明</div>
14
- </div>
15
- <div class="bean-counts spa-between">
16
- <div class="counts number">{{ balance.total || 0 }}</div>
17
- <div class="pay" @click="gotoRecharge">云豆充值</div>
18
- </div>
19
- </div>
20
- <div class="line"></div>
21
- <div
22
- class="small-clound-bean clound-bean"
23
- v-if="balance.privileges.length > 0">
24
- <div class="bean-box spa-between">
25
- <div class="bean-img">
26
- <div class="bean-tag">小云豆</div>
27
- </div>
28
- </div>
29
- <div class="bean-list">
30
- <template v-for="item in balance.privileges" :key="item">
31
- <div class="bean-list-item">
32
- <div class="counts number">
33
- {{ item.amount }}
34
- </div>
35
- <div class="title">
36
- {{ item.title }}
37
- </div>
38
- </div>
39
- </template>
40
- </div>
2
+ <div class="account-view" :class="{ popupOpen }">
3
+ <page-header color-mode="dark" title="我的账户"
4
+ :class="{'with-background': scrollY > 0}" />
5
+ <div class="row jusify-right">
6
+ <div class="small-bean-button" @click="onSecondBalanceButtonClick">
7
+ <label>小云豆余额</label>
8
+ </div>
9
+ </div>
10
+ <div class="balance">
11
+ <div class="bean-box spa-between">
12
+ <div class="bean-img">
13
+ <img
14
+ class="bean-icon"
15
+ src="https://cdn.ddjf.com/static/images/bpms-workBench/gold-bean.png" />
16
+ <div class="bean-tag tag">云豆</div>
41
17
  </div>
18
+ <div class="rule" @click="rulesPopupOpen = true">规则说明</div>
19
+ </div>
20
+ <div class="bean-counts spa-between">
21
+ <div class="counts number">{{ balance.total || 0 }}</div>
22
+ <div class="pay" @click="gotoRecharge">云豆充值</div>
42
23
  </div>
43
24
  </div>
44
- <div class="operation-title spa-between">
25
+ <div class="operation-title spa-between"
26
+ :class="{'with-shadow': scrollY > 0}"
27
+ :style="{top: `${safeArea.status + safeArea.nav}px`}">
45
28
  <div class="search-time">
46
29
  <div class="title">收支明细</div>
47
30
  <div class="time" @click="openDateFilter" v-show="filtering.dateFrom">
48
- <div class="text">{{ dataRangeDisplay }}</div>
31
+ <div class="text number">{{ dateRangeDisplay }}</div>
49
32
  <img
50
33
  style="margin-top: -2px"
51
34
  class="time-icon"
@@ -60,40 +43,35 @@
60
43
  </div>
61
44
  </div>
62
45
  <div class="operation-list">
63
- <div class="box" v-if="consumptionGroups.list.length > 0">
64
- <div class="box-detail" v-for="(item, index) in consumptionGroups.list" :key="index">
65
- <div class="title">{{ item.date }}</div>
46
+ <div class="box" v-if="consumptionGroups.length > 0">
47
+ <div class="box-detail" v-for="(item, index) in consumptionGroups" :key="index">
48
+ <div class="title number">{{ item.date }}</div>
66
49
  <div
67
50
  class="item"
68
51
  v-for="(it, i) in item.consumptions"
69
52
  :key="i">
70
53
  <div class="item-type">
71
- {{ it.type }}
54
+ {{ it.交易类型 }}
72
55
  </div>
73
56
  <div class="item-detail">
74
57
  <div class="item-info spa-between">
75
58
  <div>
76
59
  <div class="item-info-type">
77
- {{ it.position }}
60
+ {{ it.账户类型 }}
78
61
  </div>
79
62
  <div class="item-info-title">{{ it.title }}</div>
80
63
  </div>
81
64
  <div class="item-info-amount number">
82
- {{ it.direction == '支出' ? '-' : '+' }}{{ it.amount }}
65
+ {{ it.收入还是支出 == '支出' ? '-' : '+' }}{{ it.amount }}
83
66
  </div>
84
67
  </div>
85
68
  <div class="item-detail-remark">{{ it.description }}</div>
86
69
  </div>
87
70
  </div>
88
71
  </div>
89
- <div class="box-not-text">没有更多了</div>
90
- </div>
91
- <div v-else class="operations-empty">
92
- <img
93
- class="operations-empty-img"
94
- src="https://cdn.ddjf.com/static/images/fnfundkit/bean-no-thing.png" />
95
- <div class="operations-empty-text">暂无数据</div>
72
+ <div class="box-not-text" v-if="reachedLastPage">没有更多了</div>
96
73
  </div>
74
+ <empty-view v-else></empty-view>
97
75
  </div>
98
76
  </div>
99
77
  <nut-popup
@@ -112,30 +90,49 @@
112
90
  v-if="datePickerOpen"
113
91
  :from="filtering.dateFrom"
114
92
  :to="filtering.dateTo"
93
+ @reset="onDateReset"
115
94
  @complete="onDateFilterComplete"/>
116
95
  </nut-popup>
117
96
  <nut-popup
118
97
  position="bottom"
119
- :style="{ height: '70%' }"
98
+ :style="{ height: '75%' }"
120
99
  round
121
100
  :close-on-click-overlay="true"
122
101
  v-model:visible="filterOpen">
123
102
  <consumption-filter :modelValue="[
124
- filtering.position,
125
- filtering.direction,
126
- filtering.type,
103
+ filtering.账户类型,
104
+ filtering.收入还是支出,
105
+ filtering.交易类型,
106
+ filtering.权益类目
127
107
  ]" @complete="onFilterComplete" />
128
108
  </nut-popup>
109
+ <app-drawer
110
+ v-model="secondBalanceOpen"
111
+ title="小云豆余额">
112
+ <second-balance :data="balance.privileges" />
113
+ </app-drawer>
129
114
  </template>
130
115
 
131
116
  <script lang="ts" setup>
132
- import Taro, { useDidShow, usePageScroll, usePullDownRefresh } from '@tarojs/taro'
133
- import { computed, reactive, ref } from 'vue'
134
- import { endpoints, makeHttp } from '../api'
135
- import { ConsumptionFiltering, ConsumptionGroups, Balance } from '../types'
117
+ import Taro, { useDidShow, usePageScroll, usePullDownRefresh, useReachBottom } from '@tarojs/taro'
118
+ import { computed, onMounted, reactive, ref, watch } from 'vue'
119
+ import { endpoints, useHttp } from '../api'
120
+ import { 账户流水筛选项, Balance, ConsumptionGroup, 账户流水 } from '../types'
136
121
  import ConsumptionFilter from './ConsumptionFilter.vue'
137
122
  import DateFilter from './DateFilter.vue'
138
123
  import ConsumptionRules from './ConsumptionRules.vue'
124
+ import { AppDrawer, PageHeader, WithPaging } from '../../shared'
125
+ import SecondBalance from './SecondBalance.vue'
126
+ import dayjs from 'dayjs'
127
+ import EmptyView from '../../shared/components/EmptyView.vue'
128
+ import { useSafeArea } from '../../shared'
129
+
130
+ const safeArea = useSafeArea()
131
+
132
+ type AccountViewProps = {
133
+ app: string
134
+ }
135
+ const props = defineProps<AccountViewProps>()
139
136
 
140
137
  const emit = defineEmits(['recharge'])
141
138
 
@@ -144,14 +141,30 @@ const filterOpen = ref<boolean>(false)
144
141
  // 规则说明弹窗
145
142
  const rulesPopupOpen = ref<boolean>(false)
146
143
 
147
- const filtering = reactive<ConsumptionFiltering>({
148
- position: '全部',
149
- direction: '全部',
150
- type: '全部',
144
+ const filtering = reactive<账户流水筛选项>({
145
+ 账户类型: '全部',
146
+ 收入还是支出: '全部',
147
+ 交易类型: '全部',
148
+ 权益类目: '',
151
149
  dateFrom: '',
152
- dateTo: ''
150
+ dateTo: '',
151
+ page: 1,
152
+ pageSize: 20,
153
153
  })
154
154
 
155
+ const reachedLastPage = ref<boolean>(false)
156
+
157
+ /**
158
+ * 全新搜索
159
+ * 重置某些查询条件
160
+ */
161
+ function restartSearch () {
162
+ // 从第一页开始
163
+ filtering.page = 1
164
+ consumptionGroups.value = []
165
+ loadConsumptions()
166
+ }
167
+
155
168
  // 时间筛选
156
169
  const datePickerOpen = ref<boolean>(false)
157
170
 
@@ -159,18 +172,17 @@ function openDateFilter () {
159
172
  datePickerOpen.value = true
160
173
  }
161
174
 
162
- const dataRangeDisplay = computed(() => {
175
+ const dateRangeDisplay = computed(() => {
163
176
  let startTime = filtering.dateFrom?.replace(/-/g, '.').substring(2)
164
177
  let endTime = filtering.dateTo?.replace(/-/g, '.').substring(2)
165
178
  return startTime + ' - ' + endTime
166
179
  })
167
180
 
168
- const consumptionGroups = ref<ConsumptionGroups>({
169
- from: '',
170
- to: '',
171
- list: []
172
- })
181
+ const consumptionGroups = ref<ConsumptionGroup[]>([])
173
182
 
183
+ /**
184
+ * 余额数据
185
+ */
174
186
  const balance = ref<Balance>({
175
187
  total: 0,
176
188
  privileges: []
@@ -180,53 +192,99 @@ useDidShow(() => {
180
192
  Taro.setNavigationBarTitle({
181
193
  title: '我的账户',
182
194
  })
183
- loadConsumptions(true)
195
+ loadConsumptions()
184
196
  loadBalance()
185
197
  })
186
198
 
187
- async function loadConsumptions (firstTime?: boolean) {
188
- const $http = makeHttp()
199
+ function groupDataByDate (data: 账户流水[]): ConsumptionGroup[] {
200
+ // 按照日期分组
201
+ const groups: ConsumptionGroup[] = consumptionGroups.value || []
202
+ // [
203
+ // date: '2023-10-1',
204
+ // consumptions: []
205
+ // ]
206
+ // 组装成按日期分组
207
+ data.forEach(d => {
208
+ const date = dayjs(d.time).format('YYYY-MM-DD')
209
+ let group: ConsumptionGroup | undefined = groups.find(g => g.date === date)
210
+ if (!group) {
211
+ group = {
212
+ date,
213
+ consumptions: []
214
+ }
215
+ groups.push(group)
216
+ }
217
+ group.consumptions.push(d)
218
+ })
219
+ groups.sort((a, b) => a.date > b.date ? -1 : 1)
220
+ return groups
221
+ }
222
+
223
+ /**
224
+ * 请求账户流水
225
+ * @param append 搜索结果累加 上拉分页时
226
+ */
227
+ async function loadConsumptions (append: boolean = false) {
228
+ if (!append) {
229
+ consumptionGroups.value = []
230
+ }
231
+ const $http = useHttp()
189
232
  Taro.showLoading({
190
233
  title: `加载中...`,
191
234
  mask: true,
192
235
  })
193
- $http.get<ConsumptionGroups>(endpoints.getOperations, filtering).then(data => {
194
- consumptionGroups.value = data
195
- if (firstTime) {
196
- filtering.dateFrom = data.from
197
- filtering.dateTo = data.to
236
+ $http.get<WithPaging<账户流水[]>>(endpoints.获取账户流水, {
237
+ app: props.app,
238
+ ...filtering
239
+ }).then(response => {
240
+ consumptionGroups.value = groupDataByDate(response.data)
241
+ if (filtering.page >= response.totalPages) {
242
+ filtering.page = response.totalPages
243
+ reachedLastPage.value = true
244
+ } else {
245
+ reachedLastPage.value = false
198
246
  }
247
+ Taro.hideLoading()
199
248
  })
200
- Taro.hideLoading()
201
249
  }
202
250
 
251
+ /**
252
+ * 获取账户余额明细
253
+ */
203
254
  async function loadBalance() {
204
- const $http = makeHttp()
205
- $http.get<Balance>(endpoints.getBalance, {
255
+ const $http = useHttp()
256
+ $http.get<Balance>(endpoints.获取余额明细, {
257
+ app: props.app,
206
258
  }).then(data => {
207
259
  balance.value = data
208
260
  })
209
261
  }
210
262
 
211
263
  const onFilterComplete = (value) => {
212
- filtering.position = value[0]
213
- filtering.direction = value[1]
214
- filtering.type = value[2]
264
+ filtering.账户类型 = value[0]
265
+ filtering.收入还是支出 = value[1]
266
+ filtering.交易类型 = value[2]
267
+ filtering.权益类目 = value[3]
215
268
  filterOpen.value = false
216
- loadConsumptions()
269
+ restartSearch()
217
270
  }
218
271
 
219
272
  const onDateFilterComplete = (value) => {
220
273
  filtering.dateFrom = value.from
221
274
  filtering.dateTo = value.to
222
275
  datePickerOpen.value = false
223
- loadConsumptions()
276
+ restartSearch()
224
277
  }
225
278
 
226
279
  function gotoRecharge () {
227
280
  emit('recharge')
228
281
  }
229
282
 
283
+ function loadNextPage () {
284
+ filtering.page ++
285
+ loadConsumptions(true)
286
+ }
287
+
230
288
 
231
289
  const scrollY = ref<number>(0)
232
290
  usePageScroll((e) => {
@@ -247,132 +305,175 @@ usePullDownRefresh(() => {
247
305
  }, 500);
248
306
  })
249
307
 
308
+ /**
309
+ * 滑动到底部请求下一页并合并查询结果
310
+ */
311
+ useReachBottom(() => {
312
+ if (reachedLastPage.value) {
313
+ return false
314
+ }
315
+ loadNextPage()
316
+ })
317
+
250
318
  const popupOpen = computed(() => {
251
319
  return rulesPopupOpen.value || datePickerOpen.value || filterOpen.value
252
320
  })
321
+
322
+ const secondBalanceOpen = ref<boolean>(false)
323
+
324
+ function onSecondBalanceButtonClick () {
325
+ secondBalanceOpen.value = true
326
+ }
327
+
328
+ watch(secondBalanceOpen, () => {
329
+ Taro.setNavigationBarColor({
330
+ frontColor: secondBalanceOpen.value ? '#000000' : '#ffffff',
331
+ backgroundColor: '#ffffff',
332
+ animation: {
333
+ duration: 400,
334
+ timingFunc: 'easeIn'
335
+ }
336
+ })
337
+ })
338
+
339
+ function onDateReset () {
340
+ resetDateRange()
341
+ }
342
+
343
+ /**
344
+ * 充值筛选的起止时间
345
+ */
346
+ function resetDateRange () {
347
+ // 筛选的起止时间
348
+ filtering.dateTo = dayjs().format('YYYY-MM-DD')
349
+ filtering.dateFrom = dayjs().add(-3, 'M').format('YYYY-MM-DD')
350
+ }
351
+
352
+ onMounted(() => {
353
+ resetDateRange()
354
+ })
253
355
  </script>
254
356
 
255
357
  <style lang="scss">
256
- .consumption-view {
358
+ .account-view {
359
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzUwIiBoZWlnaHQ9IjQwNiIgdmlld0JveD0iMCAwIDc1MCA0MDYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0zODIuNSA0MDcuNUM1NzcuMzU3IDQwNy41IDc1My43ODggMzgxLjI0OCA4ODEuNTIxIDMzOC43OTFDOTQ1LjM4NiAzMTcuNTYzIDk5Ny4xMDQgMjkyLjI3NiAxMDMyLjg3IDI2NC4xNzFDMTA2OC42MiAyMzYuMDcxIDEwODguNSAyMDUuMDk3IDEwODguNSAxNzIuNUMxMDg4LjUgMTM5LjkwMyAxMDY4LjYyIDEwOC45MjkgMTAzMi44NyA4MC44Mjg5Qzk5Ny4xMDQgNTIuNzI0NSA5NDUuMzg2IDI3LjQzNjcgODgxLjUyMSA2LjIwODk4Qzc1My43ODggLTM2LjI0ODIgNTc3LjM1NyAtNjIuNSAzODIuNSAtNjIuNUMxODcuNjQzIC02Mi41IDExLjIxMjIgLTM2LjI0ODIgLTExNi41MjIgNi4yMDg5OEMtMTgwLjM4NiAyNy40MzY3IC0yMzIuMTA0IDUyLjcyNDUgLTI2Ny44NjcgODAuODI4OUMtMzAzLjYyNCAxMDguOTI5IC0zMjMuNSAxMzkuOTAzIC0zMjMuNSAxNzIuNUMtMzIzLjUgMjA1LjA5NyAtMzAzLjYyNCAyMzYuMDcxIC0yNjcuODY3IDI2NC4xNzFDLTIzMi4xMDQgMjkyLjI3NiAtMTgwLjM4NiAzMTcuNTYzIC0xMTYuNTIyIDMzOC43OTFDMTEuMjEyMiAzODEuMjQ4IDE4Ny42NDMgNDA3LjUgMzgyLjUgNDA3LjVaIiBmaWxsPSIjM0IzOTNDIiBzdHJva2U9ImJsYWNrIi8+Cjwvc3ZnPgo=");
360
+ background-position: center -200px;
361
+ background-repeat: no-repeat;
362
+ .page-header {
363
+ background-color: #3B393C;
364
+ position: sticky;
365
+ top: 0;
366
+ z-index: 1;
367
+ transition: background-color .3s;
368
+ &.with-background {
369
+ background-color: #3B393C;
370
+ }
371
+ }
257
372
  &.popupOpen {
258
373
  height: 100vh;
259
374
  overflow: hidden;
260
375
  }
261
376
  .spa-between {
262
- padding: 0 0 0 10px;
263
377
  display: flex;
264
378
  justify-content: space-between;
265
379
  align-items: center;
266
380
  }
267
- .header {
268
- position: relative;
269
- background: linear-gradient(187.18deg, #353535 10.04%, #433f46 90.21%);
270
- background-size: 100% 106px;
271
- padding-top: 20px;
272
- background-repeat: no-repeat;
273
- &_card {
274
- background: linear-gradient(104.85deg, #f4e2ce 1.88%, #debb9b 98.18%);
275
- border-radius: 15px;
276
- padding: 10px;
277
- margin: 0 15px;
278
- .clound-bean {
279
- .bean-box {
280
- font-size: 10px;
281
- .bean-img {
282
- display: flex;
283
- justify-content: flex-start;
284
- align-items: center;
285
- .bean-icon {
286
- display: block;
287
- font-size: 0;
288
- width: 20px;
289
- height: 20px;
290
- margin-right: 4px;
291
- }
292
- .bean-tag {
293
- color: #353535;
294
- height: 15px;
295
- line-height: 15px;
296
- border-radius: 30px 50px 50px 0px;
297
- background: rgba(#ff8320, 0.3);
298
- padding-left: 5px;
299
- padding-right: 10px;
300
- }
301
- .tag {
302
- background: #ff8320;
303
- color: #fff;
304
- }
305
- }
306
- .rule {
307
- color: #353535;
308
- opacity: 0.5;
309
- }
310
- }
311
- .bean-counts {
312
- margin-top: 5px;
313
- .counts {
314
- color: #3d3835;
315
- font-size: 32px;
316
- font-weight: 700;
317
- }
318
- .pay {
319
- padding: 0 20px;
320
- height: 32px;
321
- line-height: 32px;
322
- background: linear-gradient(
323
- 187.18deg,
324
- #353535 10.04%,
325
- #433f46 90.21%
326
- );
327
- border-radius: 16px;
328
- color: #e7caad;
329
- font-size: 15px;
330
- font-weight: 500;
331
- }
332
- }
381
+ .row {
382
+ display: flex;
383
+ flex-direction: row;
384
+ margin: 10px 15px;
385
+ }
386
+ .jusify-right {
387
+ justify-content: flex-end;
388
+ }
389
+ .small-bean-button {
390
+ height: 22px;
391
+ border-radius: 11px;
392
+ border: 1px solid #ffffff10;
393
+ background-color: #ffffff18;
394
+ display: inline-block;
395
+ padding: 0 10px;
396
+ line-height: 22px;
397
+ color: #E7CAAD;
398
+ font-size: 12px;
399
+ label {
400
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEwIDZMMTYgMTJMMTAgMThWNloiIGZpbGw9IiNFN0NBQUQiIHN0cm9rZT0iI0U3Q0FBRCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=");
401
+ padding-right: 18px;
402
+ background-repeat: no-repeat;
403
+ background-position: right center;
404
+ background-size: 16px;
405
+ }
406
+ }
407
+ .balance {
408
+ border-radius: 15px;
409
+ background: linear-gradient(105deg, #F4E2CE 1.88%, #DEBB9B 98.18%);
410
+ box-shadow: 0px -10px 9px -3px rgba(0, 0, 0, 0.33);
411
+ height: 112px;
412
+ padding: 20px;
413
+ margin: 0 15px;
414
+ box-sizing: border-box;
415
+ font-size: 10px;
416
+ .bean-img {
417
+ display: flex;
418
+ justify-content: flex-start;
419
+ align-items: center;
420
+ .bean-icon {
421
+ display: block;
422
+ font-size: 0;
423
+ width: 20px;
424
+ height: 20px;
425
+ margin-right: 4px;
333
426
  }
334
- .line {
335
- height: 3px;
336
- width: 100%;
337
- margin: 10px 0;
338
- background: linear-gradient(90deg, #e7c39f 0.84%, #e6c9ad 27.74%);
427
+ .bean-tag {
428
+ color: #353535;
429
+ height: 15px;
430
+ line-height: 15px;
431
+ border-radius: 30px 50px 50px 0px;
432
+ background: rgba(#ff8320, 0.3);
433
+ padding-left: 5px;
434
+ padding-right: 10px;
339
435
  }
340
- .small-clound-bean {
341
- margin-top: 20px;
342
- .bean-list {
343
- margin-top: 8px;
344
- display: flex;
345
- flex-wrap: wrap;
346
- &-item {
347
- width: 50%;
348
- line-height: 23px;
349
- padding-left: 10px;
350
- box-sizing: border-box;
351
- margin-bottom: 10px;
352
- .counts {
353
- color: #353535;
354
- font-size: 20px;
355
- font-weight: 700;
356
- }
357
- .title {
358
- color: #987356;
359
- font-weight: 400;
360
- font-size: 11px;
361
- }
362
- }
363
- &-item:nth-child(2n) {
364
- padding-left: 30px;
365
- }
366
- }
436
+ .tag {
437
+ background: #ff8320;
438
+ color: #fff;
367
439
  }
368
440
  }
441
+ .rule {
442
+ color: #353535;
443
+ opacity: 0.5;
444
+ }
445
+ }
446
+ .bean-counts {
447
+ margin-top: 12px;
448
+ .counts {
449
+ color: #3d3835;
450
+ font-size: 32px;
451
+ font-weight: 700;
452
+ }
453
+ .pay {
454
+ padding: 0 20px;
455
+ height: 32px;
456
+ line-height: 32px;
457
+ background: linear-gradient(
458
+ 187.18deg,
459
+ #353535 10.04%,
460
+ #433f46 90.21%
461
+ );
462
+ border-radius: 16px;
463
+ color: #e7caad;
464
+ font-size: 15px;
465
+ font-weight: 500;
466
+ }
369
467
  }
370
468
  .operation-title {
371
469
  padding: 10px 15px;
372
470
  background: #fff;
373
471
  position: sticky;
374
472
  z-index: 10;
375
- top: 0;
473
+ transition: box-shadow .3s;
474
+ &.with-shadow {
475
+ box-shadow: 0px 1px 10px 0px #99999933
476
+ }
376
477
  .text {
377
478
  color: #353535;
378
479
  font-size: 12px;
@@ -411,6 +512,7 @@ const popupOpen = computed(() => {
411
512
  }
412
513
  .operation-list {
413
514
  margin: 0 15px;
515
+ padding-bottom: 15px;
414
516
  .box {
415
517
  &-detail {
416
518
  .title {
@@ -422,7 +524,9 @@ const popupOpen = computed(() => {
422
524
  margin-bottom: 10px;
423
525
  }
424
526
  .item {
425
- box-shadow: 0px 5px 18px 2px #00000029;
527
+ border-radius: 5px;
528
+ background: rgba(255, 255, 255, 0.50);
529
+ box-shadow: 0px 2.5px 9.5px 2px rgba(0, 0, 0, 0.05);
426
530
  border-radius: 5px;
427
531
  padding: 12px 10px;
428
532
  display: flex;
@@ -479,28 +583,8 @@ const popupOpen = computed(() => {
479
583
  text-align: center;
480
584
  }
481
585
  }
482
- .operations-empty {
483
- display: flex;
484
- flex-direction: column;
485
- justify-content: center;
486
- align-items: center;
487
- margin-top: 80px;
488
- &-img {
489
- display: block;
490
- font-size: 0;
491
- width: 144px;
492
- height: 80px;
493
- }
494
- &-text {
495
- opacity: 0.4;
496
- color: #353535;
497
- font-size: 12px;
498
- line-height: 28px;
499
- }
500
- }
501
586
  }
502
587
  }
503
-
504
588
  .consumption-rules-popup {
505
589
  border-radius: 16px;
506
590
  width: 70%;