create-m2m-bo-template-vue 1.0.7 → 1.0.9

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.
Files changed (33) hide show
  1. package/package.json +1 -1
  2. package/template/src/components/DataGrid/DataGrid.vue +1 -9
  3. package/template/src/pages/admin/AdminRolesPage.vue +1 -1
  4. package/template/src/pages/c2c/products/UserProductModerationPage.vue +1 -0
  5. package/template/src/pages/c2c/purchases/PurchaseActivityHistoryPage.vue +1 -1
  6. package/template/src/pages/c2c/purchases/PurchaseHistoryPage.vue +1 -1
  7. package/template/src/pages/c2c/sales/SalesActivityHistoryPage.vue +1 -1
  8. package/template/src/pages/c2c/sales/SalesTradesPage.vue +1 -1
  9. package/template/src/pages/c2c/sales/SellerListPage.vue +1 -1
  10. package/template/src/pages/c2c/sales/SellerProductsPage.vue +1 -1
  11. package/template/src/pages/cartconversion/CartConversionPage.vue +0 -24
  12. package/template/src/pages/common/ModulePlaceholderPage.vue +1 -1
  13. package/template/src/pages/cs/AdminMemosPage.vue +1 -1
  14. package/template/src/pages/cs/CsInquiriesPage.vue +1 -1
  15. package/template/src/pages/cs/ResponseTemplatesPage.vue +1 -1
  16. package/template/src/pages/inventory/InboundManagementPage.vue +1 -1
  17. package/template/src/pages/inventory/InventoryAdjustmentPage.vue +1 -1
  18. package/template/src/pages/inventory/InventoryAlertsPage.vue +1 -1
  19. package/template/src/pages/inventory/InventoryStatusPage.vue +1 -1
  20. package/template/src/pages/inventory/SafetyStockPage.vue +1 -1
  21. package/template/src/pages/inventory/StockMovementHistoryPage.vue +1 -1
  22. package/template/src/pages/inventory/StockOutboundManagementPage.vue +1 -1
  23. package/template/src/pages/logs/SecurityLogPage.vue +1 -1
  24. package/template/src/pages/notifications/NotificationDispatchPage.vue +1 -1
  25. package/template/src/pages/products/MinOrderQtyPage.vue +1 -0
  26. package/template/src/pages/products/PartnerPricingPage.vue +1 -0
  27. package/template/src/pages/products/ProductsListPage.vue +2 -1
  28. package/template/src/pages/products/SupplyPricePage.vue +1 -0
  29. package/template/src/pages/system/CommonCodesPage.vue +1 -1
  30. package/template/src/pages/system/IntegrationManagementPage.vue +1 -1
  31. package/template/src/pages/system/JobManagementPage.vue +1 -1
  32. package/template/src/pages/system/ServiceSettingsPage.vue +1 -1
  33. package/template/src/style.css +20 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-m2m-bo-template-vue",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Scaffolding CLI for the M2M back-office vue template.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -172,7 +172,6 @@ function cellFgColor(cell: Cell): string | undefined {
172
172
 
173
173
  const rootRef = ref<HTMLDivElement | null>(null);
174
174
  const internalSelected = ref<Set<string | number>>(new Set());
175
- const autoSelectable = ref(false);
176
175
  const pageSize = ref<number | null>(null);
177
176
  const currentPage = ref(1);
178
177
  const sortColumnIndex = ref<number | null>(props.defaultSortColumn ?? null);
@@ -186,19 +185,12 @@ function handlePageSize(event: Event) {
186
185
  currentPage.value = 1;
187
186
  }
188
187
 
189
- function updateAutoSelectable() {
190
- if (props.selectable !== undefined) return;
191
- autoSelectable.value = Boolean(rootRef.value?.ownerDocument.querySelector('[data-excel-download]'));
192
- }
193
-
194
188
  onMounted(() => {
195
189
  rootRef.value?.addEventListener(DATA_GRID_PAGE_SIZE_EVENT, handlePageSize);
196
- updateAutoSelectable();
197
190
  });
198
191
  onUnmounted(() => {
199
192
  rootRef.value?.removeEventListener(DATA_GRID_PAGE_SIZE_EVENT, handlePageSize);
200
193
  });
201
- watch(() => props.selectable, updateAutoSelectable);
202
194
 
203
195
  const totalPageCount = computed(() => (pageSize.value ? Math.max(1, Math.ceil(props.rows.length / pageSize.value)) : 1));
204
196
  watch(totalPageCount, (count) => {
@@ -214,7 +206,7 @@ watch(
214
206
  }
215
207
  );
216
208
 
217
- const effectiveSelectable = computed(() => props.selectable ?? autoSelectable.value);
209
+ const effectiveSelectable = computed(() => props.selectable ?? false);
218
210
  const pageStart = computed(() => (pageSize.value ? (currentPage.value - 1) * pageSize.value : 0));
219
211
  const visibleSourceRows = computed(() => (pageSize.value ? props.rows.slice(pageStart.value, pageStart.value + pageSize.value) : props.rows));
220
212
 
@@ -520,7 +520,7 @@ function dlgBtnStyle(kind: DialogButton['kind']) {
520
520
  v-for="[key, label] in TAB_OPTIONS"
521
521
  :key="key"
522
522
  type="button"
523
- :variant="tab === key ? 'primary-light' : 'secondary'"
523
+ variant="secondary"
524
524
  size="md"
525
525
  :class-names="[common.button, tab === key ? common['button_primary-light'] : common.button_secondary, common.size_md, tabShared.qfBtn, tab === key ? tabShared.quickActive : '']"
526
526
  @click="tab = key"
@@ -142,6 +142,7 @@ const rows = computed<GridRow[]>(() =>
142
142
  </ResultBar>
143
143
  </div>
144
144
  <DataGrid
145
+ selectable
145
146
  :columns="[
146
147
  { label: '사건번호 / 접수일' },
147
148
  { label: '상품' },
@@ -120,7 +120,7 @@ const rows = computed<GridRow[]>(() =>
120
120
  </ControlArea>
121
121
  <GridArea>
122
122
  <ResultBar :count="filtered.length" unit="건" hide-size-select>
123
- <PageSizeSelect :class="shared.pageSizeSelect">
123
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="50개씩">
124
124
  <option>50개씩</option>
125
125
  <option>100개씩</option>
126
126
  </PageSizeSelect>
@@ -143,7 +143,7 @@ const rows = computed<GridRow[]>(() =>
143
143
  </ControlArea>
144
144
  <GridArea>
145
145
  <ResultBar :count="filtered.length" unit="건" hide-size-select>
146
- <PageSizeSelect :class="shared.pageSizeSelect">
146
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
147
147
  <option>20개씩</option>
148
148
  <option>50개씩</option>
149
149
  </PageSizeSelect>
@@ -130,7 +130,7 @@ const rows = computed<GridRow[]>(() =>
130
130
  </ControlArea>
131
131
  <GridArea>
132
132
  <ResultBar :count="filtered.length" unit="건" hide-size-select>
133
- <PageSizeSelect :class="shared.pageSizeSelect">
133
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="50개씩">
134
134
  <option>50개씩</option>
135
135
  <option>100개씩</option>
136
136
  </PageSizeSelect>
@@ -138,7 +138,7 @@ const rows = computed<GridRow[]>(() =>
138
138
  </ControlArea>
139
139
  <GridArea>
140
140
  <ResultBar :count="filtered.length" unit="건" hide-size-select>
141
- <PageSizeSelect :class="shared.pageSizeSelect">
141
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
142
142
  <option>20개씩</option>
143
143
  <option>50개씩</option>
144
144
  </PageSizeSelect>
@@ -146,7 +146,7 @@ const rows = computed<GridRow[]>(() =>
146
146
  </ControlArea>
147
147
  <GridArea>
148
148
  <ResultBar :count="filtered.length" hide-size-select>
149
- <PageSizeSelect :class="shared.pageSizeSelect">
149
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
150
150
  <option>20개씩</option>
151
151
  <option>50개씩</option>
152
152
  </PageSizeSelect>
@@ -147,7 +147,7 @@ const rows = computed<GridRow[]>(() =>
147
147
  </ControlArea>
148
148
  <GridArea>
149
149
  <ResultBar :count="filtered.length" unit="개" hide-size-select>
150
- <PageSizeSelect :class="shared.pageSizeSelect">
150
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
151
151
  <option>20개씩</option>
152
152
  <option>50개씩</option>
153
153
  </PageSizeSelect>
@@ -1,14 +1,9 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, ref } from 'vue';
3
3
  import { useRouter } from 'vue-router';
4
- import { RotateCcw } from 'lucide-vue-next';
5
- import { Button } from 'm2m-uiux-vue/Button';
6
- import { Checkbox } from 'm2m-uiux-vue/Checkbox';
7
- import { Segmented } from 'm2m-uiux-vue/Segmented';
8
4
  import { ExcelDownloadButton } from '../../components/common';
9
5
  import { StatisticsBarChart } from '../../components/charts';
10
6
  import { downloadStatisticsReport } from '../../lib/statisticsReport';
11
- import DatePicker from '../../components/forms/DatePicker.vue';
12
7
  import shared from '../ops/opsShared.module.css';
13
8
  import styles from '../stats/TransactionStatsPage.module.css';
14
9
  import extra from './cartConversionExtra.module.css';
@@ -33,7 +28,6 @@ import {
33
28
  type DropoffThreshold,
34
29
  type Granularity,
35
30
  type PeriodAggregate,
36
- type QuickRange,
37
31
  } from './cartConversionData';
38
32
 
39
33
  type Tab = 'overview' | 'dropoff' | 'funnel';
@@ -42,7 +36,6 @@ const TABS: [Tab, string][] = [
42
36
  ['dropoff', '이탈 분석'],
43
37
  ['funnel', '구매 퍼널'],
44
38
  ];
45
- const QUICK_RANGES: QuickRange[] = ['오늘', '어제', '최근 7일', '최근 30일', '이번 달', '지난 달'];
46
39
  const METRICS = ['cartUsers', 'buyUsers', 'conversionRate'] as const;
47
40
  type Metric = (typeof METRICS)[number];
48
41
  const METRIC_LABEL: Record<Metric, string> = { cartUsers: '장바구니 사용자', buyUsers: '구매 사용자', conversionRate: '전환율' };
@@ -60,17 +53,6 @@ const granularity = ref<Granularity>('일별');
60
53
  const metric = ref<Metric>('cartUsers');
61
54
  const threshold = ref<DropoffThreshold>('24시간');
62
55
 
63
- function applyQuick(range: QuickRange) {
64
- const [s, e] = quickRangeDates(range);
65
- start.value = s;
66
- end.value = e;
67
- }
68
- function resetFilters() {
69
- channel.value = '전체';
70
- category.value = '전체';
71
- applyQuick('최근 30일');
72
- }
73
-
74
56
  const agg = computed<PeriodAggregate>(() => aggregate(start.value, end.value, channel.value, category.value));
75
57
  const prevRange = computed(() => previousPeriod(start.value, end.value));
76
58
  const prevStart = computed(() => prevRange.value[0]);
@@ -97,12 +79,6 @@ const steps = computed(() => funnelSteps(agg.value));
97
79
  const prevSteps = computed(() => funnelSteps(prevAgg.value));
98
80
  const finalConv = computed(() => (steps.value[0].count ? (steps.value[steps.value.length - 1].count / steps.value[0].count) * 100 : 0));
99
81
  const prevFinalConv = computed(() => (prevSteps.value[0].count ? (prevSteps.value[prevSteps.value.length - 1].count / prevSteps.value[0].count) * 100 : 0));
100
- const activeQuickRange = computed(() =>
101
- QUICK_RANGES.find((range) => {
102
- const [rangeStart, rangeEnd] = quickRangeDates(range);
103
- return rangeStart === start.value && rangeEnd === end.value;
104
- })
105
- );
106
82
 
107
83
  function deltaClass(deltaValue: number | undefined, positiveIsBad?: boolean) {
108
84
  if (deltaValue == null) return undefined;
@@ -389,7 +389,7 @@ function downloadAnalytics() {
389
389
  <span :class="styles.resultLabel">총 {{ filtered.length }}건</span>
390
390
  <div :class="styles.resultActions">
391
391
  <ExcelDownloadButton data-grid-download @click="download" />
392
- <PageSizeSelect :class="styles.pageSizeSelect">
392
+ <PageSizeSelect :class="styles.pageSizeSelect" default-value="20개씩">
393
393
  <option>20개씩</option>
394
394
  <option>50개씩</option>
395
395
  </PageSizeSelect>
@@ -396,7 +396,7 @@ function handleBulkFollowUpAssignee(event: Event) {
396
396
  <span :class="shared.resultLabel">총 {{ filtered.length }}건</span>
397
397
  <div :class="shared.resultActions">
398
398
  <ExcelDownloadButton @click="modal = 'download'" />
399
- <PageSizeSelect :class="shared.pageSizeSelect">
399
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
400
400
  <option>20개씩</option>
401
401
  <option>50개씩</option>
402
402
  </PageSizeSelect>
@@ -378,7 +378,7 @@ const metrics = computed(() => [
378
378
  <span :class="shared.resultLabel">총 {{ filtered.length }}건</span>
379
379
  <div :class="shared.resultActions">
380
380
  <ExcelDownloadButton @click="download(filtered)" />
381
- <PageSizeSelect :class="shared.pageSizeSelect">
381
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
382
382
  <option>20개씩</option>
383
383
  <option>50개씩</option>
384
384
  </PageSizeSelect>
@@ -367,7 +367,7 @@ function handleBulkStatusChange(event: Event) {
367
367
  <span :class="shared.resultLabel">총 {{ filtered.length }}건</span>
368
368
  <div :class="shared.resultActions">
369
369
  <ExcelDownloadButton @click="download(filtered)" />
370
- <PageSizeSelect :class="shared.pageSizeSelect">
370
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
371
371
  <option>20개씩</option>
372
372
  <option>50개씩</option>
373
373
  </PageSizeSelect>
@@ -506,7 +506,7 @@ const rows = computed<GridRow[]>(() =>
506
506
  <span :class="shared.resultLabel">총 {{ filtered.length }}건 · 도착/정상/재고 반영 수량 분리</span>
507
507
  <div :class="shared.resultActions">
508
508
  <ExcelDownloadButton data-grid-download @click="download" />
509
- <PageSizeSelect :class="shared.pageSizeSelect">
509
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
510
510
  <option>20개씩</option>
511
511
  <option>50개씩</option>
512
512
  </PageSizeSelect>
@@ -414,7 +414,7 @@ const detailRecord = computed(() => records.value.find((r) => r.id === detailId.
414
414
  <span :class="shared.resultLabel">총 {{ filtered.length }}건 · 조정 Record 기준</span>
415
415
  <div :class="shared.resultActions">
416
416
  <ExcelDownloadButton data-grid-download @click="download" />
417
- <PageSizeSelect :class="shared.pageSizeSelect">
417
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
418
418
  <option>20개씩</option>
419
419
  <option>50개씩</option>
420
420
  </PageSizeSelect>
@@ -238,7 +238,7 @@ const rows = computed<GridRow[]>(() =>
238
238
  <span :class="shared.resultLabel">총 {{ filtered.length }}개 알림 대상 SKU</span>
239
239
  <div :class="shared.resultActions">
240
240
  <ExcelDownloadButton />
241
- <PageSizeSelect aria-label="페이지당 표시 개수" :class="shared.pageSizeSelect">
241
+ <PageSizeSelect aria-label="페이지당 표시 개수" :class="shared.pageSizeSelect" default-value="20개씩">
242
242
  <option>20개씩</option>
243
243
  <option>50개씩</option>
244
244
  </PageSizeSelect>
@@ -471,7 +471,7 @@ const rows = computed<GridRow[]>(() =>
471
471
  <span :class="shared.resultLabel">총 {{ filtered.length }}건 · 상품 집계</span>
472
472
  <div :class="shared.resultActions">
473
473
  <ExcelDownloadButton @click="download(filtered)" />
474
- <PageSizeSelect :class="shared.pageSizeSelect">
474
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
475
475
  <option>20개씩</option>
476
476
  <option>50개씩</option>
477
477
  </PageSizeSelect>
@@ -215,7 +215,7 @@ const rows = computed<GridRow[]>(() =>
215
215
  <span :class="shared.resultLabel">총 {{ filtered.length }}개 SKU</span>
216
216
  <div :class="shared.resultActions">
217
217
  <ExcelDownloadButton />
218
- <PageSizeSelect aria-label="페이지당 표시 개수" :class="shared.pageSizeSelect">
218
+ <PageSizeSelect aria-label="페이지당 표시 개수" :class="shared.pageSizeSelect" default-value="20개씩">
219
219
  <option>20개씩</option>
220
220
  <option>50개씩</option>
221
221
  </PageSizeSelect>
@@ -309,7 +309,7 @@ const rows = computed<GridRow[]>(() =>
309
309
  <div :class="shared.resultActions">
310
310
  <span :class="styles.filterHint">수정·삭제·일괄 수량 변경 불가</span>
311
311
  <ExcelDownloadButton data-grid-download @click="exportOpen = true" />
312
- <PageSizeSelect :class="shared.pageSizeSelect">
312
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
313
313
  <option>20개씩</option>
314
314
  <option>50개씩</option>
315
315
  </PageSizeSelect>
@@ -493,7 +493,7 @@ const rows = computed<GridRow[]>(() =>
493
493
  <span :class="shared.resultLabel">총 {{ filtered.length }}건 · 재고 Transaction 기준</span>
494
494
  <div :class="shared.resultActions">
495
495
  <ExcelDownloadButton data-grid-download @click="download()" />
496
- <PageSizeSelect :class="shared.pageSizeSelect">
496
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
497
497
  <option>20개씩</option>
498
498
  <option>50개씩</option>
499
499
  </PageSizeSelect>
@@ -196,7 +196,7 @@ const rows = computed<GridRow[]>(() =>
196
196
  </span>
197
197
  <div :class="shared.resultActions">
198
198
  <ExcelDownloadButton @click="download" />
199
- <PageSizeSelect :class="shared.pageSizeSelect">
199
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="100개씩">
200
200
  <option>100개씩</option>
201
201
  <option>200개씩</option>
202
202
  </PageSizeSelect>
@@ -689,7 +689,7 @@ function closeMenu() {
689
689
  <span :class="shared.resultLabel">총 {{ filtered.length }}건</span>
690
690
  <div :class="shared.resultActions">
691
691
  <ExcelDownloadButton @click="download" />
692
- <PageSizeSelect :class="shared.pageSizeSelect">
692
+ <PageSizeSelect :class="shared.pageSizeSelect" default-value="20개씩">
693
693
  <option>20개씩</option>
694
694
  <option>50개씩</option>
695
695
  </PageSizeSelect>
@@ -240,6 +240,7 @@ function confirmEnd() {
240
240
 
241
241
  <div :class="styles.gridWrap">
242
242
  <DataGrid
243
+ selectable
243
244
  :columns="columns"
244
245
  :rows="rows"
245
246
  :grid-template="GRID_TEMPLATE"
@@ -247,6 +247,7 @@ function confirmEnd() {
247
247
 
248
248
  <div :class="styles.gridWrap">
249
249
  <DataGrid
250
+ selectable
250
251
  :columns="columns"
251
252
  :rows="rows"
252
253
  :grid-template="GRID_TEMPLATE"
@@ -317,7 +317,7 @@ function confirmSale() {
317
317
  />
318
318
  </label>
319
319
  <div :class="styles.spacer" />
320
- <Button type="button" variant="secondary" size="sm" class-names="detailFilterBtn">
320
+ <Button type="button" variant="secondary" size="sm" :class-names="styles.dashedBtn">
321
321
  <SlidersHorizontal :size="14" />
322
322
  상세 필터
323
323
  </Button>
@@ -349,6 +349,7 @@ function confirmSale() {
349
349
 
350
350
  <div :class="styles.gridWrap">
351
351
  <DataGrid
352
+ selectable
352
353
  :columns="COLUMNS"
353
354
  :rows="rows"
354
355
  :grid-template="GRID_TEMPLATE"
@@ -230,6 +230,7 @@ function confirmEnd() {
230
230
 
231
231
  <div :class="styles.gridWrap">
232
232
  <DataGrid
233
+ selectable
233
234
  :columns="COLUMNS"
234
235
  :rows="rows"
235
236
  :grid-template="GRID_TEMPLATE"
@@ -87,7 +87,7 @@ function toggleStatus() {
87
87
  v-for="status in QUICK_STATUSES"
88
88
  :key="status"
89
89
  type="button"
90
- :variant="quick === status ? 'primary-light' : 'secondary'"
90
+ variant="secondary"
91
91
  size="md"
92
92
  :class-names="[common.button, quick === status ? common['button_primary-light'] : common.button_secondary, common.size_md, shared.qfBtn, quick === status ? shared.quickActive : '']"
93
93
  @click="quick = status"
@@ -87,7 +87,7 @@ function toggleStatus() {
87
87
  v-for="status in QUICK_STATUSES"
88
88
  :key="status"
89
89
  type="button"
90
- :variant="quick === status ? 'primary-light' : 'secondary'"
90
+ variant="secondary"
91
91
  size="md"
92
92
  :class-names="[common.button, quick === status ? common['button_primary-light'] : common.button_secondary, common.size_md, shared.qfBtn, quick === status ? shared.quickActive : '']"
93
93
  @click="quick = status"
@@ -87,7 +87,7 @@ function toggleStatus() {
87
87
  v-for="status in QUICK_STATUSES"
88
88
  :key="status"
89
89
  type="button"
90
- :variant="quick === status ? 'primary-light' : 'secondary'"
90
+ variant="secondary"
91
91
  size="md"
92
92
  :class-names="[common.button, quick === status ? common['button_primary-light'] : common.button_secondary, common.size_md, shared.qfBtn, quick === status ? shared.quickActive : '']"
93
93
  @click="quick = status"
@@ -87,7 +87,7 @@ function toggleStatus() {
87
87
  v-for="status in QUICK_STATUSES"
88
88
  :key="status"
89
89
  type="button"
90
- :variant="quick === status ? 'primary-light' : 'secondary'"
90
+ variant="secondary"
91
91
  size="md"
92
92
  :class-names="[common.button, quick === status ? common['button_primary-light'] : common.button_secondary, common.size_md, shared.qfBtn, quick === status ? shared.quickActive : '']"
93
93
  @click="quick = status"
@@ -386,6 +386,25 @@ html[data-theme='dark'] {
386
386
  field-sizing: content;
387
387
  }
388
388
 
389
+ /* SearchField 내부 input의 테두리/배경/반경을 리셋하여 외부 컨테이너 테두리와 겹쳐 두 줄로 보이는 현상 완벽 방지 */
390
+ :where(
391
+ [class*="SearchField"],
392
+ [class*="searchField"],
393
+ [class*="field"],
394
+ [class*="control"]
395
+ )
396
+ input {
397
+ border: 0 !important;
398
+ border-radius: 0 !important;
399
+ outline: none !important;
400
+ box-shadow: none !important;
401
+ background: transparent !important;
402
+ width: 100% !important;
403
+ max-width: none !important;
404
+ height: 100% !important;
405
+ padding: 0 62px 0 10px !important;
406
+ }
407
+
389
408
  /* searchRow / filterRow1 내부의 form 태그도 flex 정렬 보장 */
390
409
  :where(
391
410
  [class*="filterBox"],
@@ -1133,7 +1152,7 @@ html[data-theme='dark'] {
1133
1152
 
1134
1153
  html,
1135
1154
  body,
1136
- #app {
1155
+ #root {
1137
1156
  height: 100%;
1138
1157
  overflow: hidden;
1139
1158
  }